From 99abeea2e25af6ae2fb1fd425183de1e8bb66533 Mon Sep 17 00:00:00 2001 From: "HESU\\HESU" <1696136552@qq.com> Date: Fri, 14 Mar 2025 17:48:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 5 - composer.json.txt | 5 - composer.lock | 1813 ------ vendor/autoload.php | 25 - vendor/bin/carbon | 119 - vendor/bin/carbon.bat | 5 - vendor/brick/math/CHANGELOG.md | 479 -- vendor/brick/math/LICENSE | 20 - vendor/brick/math/composer.json | 39 - vendor/brick/math/psalm-baseline.xml | 70 - vendor/brick/math/src/BigDecimal.php | 792 --- vendor/brick/math/src/BigInteger.php | 1062 ---- vendor/brick/math/src/BigNumber.php | 515 -- vendor/brick/math/src/BigRational.php | 424 -- .../src/Exception/DivisionByZeroException.php | 35 - .../Exception/IntegerOverflowException.php | 23 - .../math/src/Exception/MathException.php | 12 - .../src/Exception/NegativeNumberException.php | 12 - .../src/Exception/NumberFormatException.php | 41 - .../Exception/RoundingNecessaryException.php | 19 - vendor/brick/math/src/Internal/Calculator.php | 668 --- .../Internal/Calculator/BcMathCalculator.php | 75 - .../src/Internal/Calculator/GmpCalculator.php | 125 - .../Internal/Calculator/NativeCalculator.php | 598 -- vendor/brick/math/src/RoundingMode.php | 98 - .../carbonphp/carbon-doctrine-types/LICENSE | 21 - .../carbonphp/carbon-doctrine-types/README.md | 14 - .../carbon-doctrine-types/composer.json | 36 - .../Carbon/Doctrine/CarbonDoctrineType.php | 16 - .../Carbon/Doctrine/CarbonImmutableType.php | 9 - .../src/Carbon/Doctrine/CarbonType.php | 9 - .../Carbon/Doctrine/CarbonTypeConverter.php | 131 - .../Doctrine/DateTimeDefaultPrecision.php | 30 - .../Carbon/Doctrine/DateTimeImmutableType.php | 32 - .../src/Carbon/Doctrine/DateTimeType.php | 24 - vendor/composer/ClassLoader.php | 579 -- vendor/composer/InstalledVersions.php | 378 -- vendor/composer/LICENSE | 21 - vendor/composer/autoload_classmap.php | 21 - vendor/composer/autoload_files.php | 20 - vendor/composer/autoload_namespaces.php | 9 - vendor/composer/autoload_psr4.php | 38 - vendor/composer/autoload_real.php | 50 - vendor/composer/autoload_static.php | 236 - vendor/composer/installed.json | 1884 ------- vendor/composer/installed.php | 299 - vendor/composer/platform_check.php | 26 - vendor/doctrine/inflector/LICENSE | 19 - vendor/doctrine/inflector/README.md | 7 - vendor/doctrine/inflector/composer.json | 41 - vendor/doctrine/inflector/docs/en/index.rst | 226 - .../Inflector/CachedWordInflector.php | 24 - .../GenericLanguageInflectorFactory.php | 66 - .../lib/Doctrine/Inflector/Inflector.php | 507 -- .../Doctrine/Inflector/InflectorFactory.php | 52 - .../lib/Doctrine/Inflector/Language.php | 19 - .../Inflector/LanguageInflectorFactory.php | 33 - .../Doctrine/Inflector/NoopWordInflector.php | 13 - .../Inflector/Rules/English/Inflectible.php | 184 - .../Rules/English/InflectorFactory.php | 21 - .../Inflector/Rules/English/Rules.php | 31 - .../Inflector/Rules/English/Uninflected.php | 189 - .../Inflector/Rules/French/Inflectible.php | 44 - .../Rules/French/InflectorFactory.php | 21 - .../Doctrine/Inflector/Rules/French/Rules.php | 31 - .../Inflector/Rules/French/Uninflected.php | 28 - .../Rules/NorwegianBokmal/Inflectible.php | 34 - .../NorwegianBokmal/InflectorFactory.php | 21 - .../Inflector/Rules/NorwegianBokmal/Rules.php | 31 - .../Rules/NorwegianBokmal/Uninflected.php | 30 - .../lib/Doctrine/Inflector/Rules/Pattern.php | 42 - .../lib/Doctrine/Inflector/Rules/Patterns.php | 34 - .../Rules/Portuguese/Inflectible.php | 98 - .../Rules/Portuguese/InflectorFactory.php | 21 - .../Inflector/Rules/Portuguese/Rules.php | 31 - .../Rules/Portuguese/Uninflected.php | 32 - .../lib/Doctrine/Inflector/Rules/Ruleset.php | 39 - .../Inflector/Rules/Spanish/Inflectible.php | 47 - .../Rules/Spanish/InflectorFactory.php | 21 - .../Inflector/Rules/Spanish/Rules.php | 31 - .../Inflector/Rules/Spanish/Uninflected.php | 30 - .../Doctrine/Inflector/Rules/Substitution.php | 30 - .../Inflector/Rules/Substitutions.php | 57 - .../Inflector/Rules/Transformation.php | 39 - .../Inflector/Rules/Transformations.php | 29 - .../Inflector/Rules/Turkish/Inflectible.php | 34 - .../Rules/Turkish/InflectorFactory.php | 21 - .../Inflector/Rules/Turkish/Rules.php | 31 - .../Inflector/Rules/Turkish/Uninflected.php | 30 - .../lib/Doctrine/Inflector/Rules/Word.php | 21 - .../Doctrine/Inflector/RulesetInflector.php | 56 - .../lib/Doctrine/Inflector/WordInflector.php | 10 - vendor/illuminate/collections/Arr.php | 970 ---- vendor/illuminate/collections/Collection.php | 1923 ------- vendor/illuminate/collections/Enumerable.php | 1311 ----- .../HigherOrderCollectionProxy.php | 68 - .../collections/ItemNotFoundException.php | 9 - vendor/illuminate/collections/LICENSE.md | 21 - .../illuminate/collections/LazyCollection.php | 1920 ------- .../MultipleItemsFoundException.php | 40 - .../collections/Traits/EnumeratesValues.php | 1188 ---- vendor/illuminate/collections/composer.json | 43 - vendor/illuminate/collections/functions.php | 27 - vendor/illuminate/collections/helpers.php | 257 - .../conditionable/HigherOrderWhenProxy.php | 109 - vendor/illuminate/conditionable/LICENSE.md | 21 - .../conditionable/Traits/Conditionable.php | 73 - vendor/illuminate/conditionable/composer.json | 33 - .../illuminate/container/Attributes/Auth.php | 30 - .../container/Attributes/Authenticated.php | 30 - .../illuminate/container/Attributes/Cache.php | 30 - .../container/Attributes/Config.php | 30 - .../container/Attributes/CurrentUser.php | 11 - vendor/illuminate/container/Attributes/DB.php | 11 - .../container/Attributes/Database.php | 30 - .../illuminate/container/Attributes/Log.php | 30 - .../container/Attributes/RouteParameter.php | 30 - .../container/Attributes/Storage.php | 30 - .../illuminate/container/Attributes/Tag.php | 30 - vendor/illuminate/container/BoundMethod.php | 217 - vendor/illuminate/container/Container.php | 1628 ------ .../container/ContextualBindingBuilder.php | 96 - .../container/EntryNotFoundException.php | 11 - vendor/illuminate/container/LICENSE.md | 21 - .../container/RewindableGenerator.php | 61 - vendor/illuminate/container/Util.php | 87 - vendor/illuminate/container/composer.json | 38 - .../contracts/Auth/Access/Authorizable.php | 15 - .../illuminate/contracts/Auth/Access/Gate.php | 150 - .../contracts/Auth/Authenticatable.php | 56 - .../contracts/Auth/CanResetPassword.php | 21 - vendor/illuminate/contracts/Auth/Factory.php | 22 - vendor/illuminate/contracts/Auth/Guard.php | 57 - .../Auth/Middleware/AuthenticatesRequests.php | 8 - .../contracts/Auth/MustVerifyEmail.php | 34 - .../contracts/Auth/PasswordBroker.php | 61 - .../contracts/Auth/PasswordBrokerFactory.php | 14 - .../contracts/Auth/StatefulGuard.php | 63 - .../contracts/Auth/SupportsBasicAuth.php | 24 - .../contracts/Auth/UserProvider.php | 59 - .../contracts/Broadcasting/Broadcaster.php | 35 - .../contracts/Broadcasting/Factory.php | 14 - .../Broadcasting/HasBroadcastChannel.php | 20 - .../contracts/Broadcasting/ShouldBeUnique.php | 8 - .../Broadcasting/ShouldBroadcast.php | 13 - .../Broadcasting/ShouldBroadcastNow.php | 8 - .../illuminate/contracts/Bus/Dispatcher.php | 66 - .../contracts/Bus/QueueingDispatcher.php | 30 - vendor/illuminate/contracts/Cache/Factory.php | 14 - vendor/illuminate/contracts/Cache/Lock.php | 46 - .../contracts/Cache/LockProvider.php | 25 - .../contracts/Cache/LockTimeoutException.php | 10 - .../illuminate/contracts/Cache/Repository.php | 116 - vendor/illuminate/contracts/Cache/Store.php | 92 - .../contracts/Concurrency/Driver.php | 19 - .../contracts/Config/Repository.php | 57 - .../contracts/Console/Application.php | 23 - .../contracts/Console/Isolatable.php | 8 - .../illuminate/contracts/Console/Kernel.php | 64 - .../Console/PromptsForMissingInput.php | 8 - .../Container/BindingResolutionException.php | 11 - .../Container/CircularDependencyException.php | 11 - .../contracts/Container/Container.php | 235 - .../Container/ContextualAttribute.php | 8 - .../Container/ContextualBindingBuilder.php | 39 - .../illuminate/contracts/Cookie/Factory.php | 47 - .../contracts/Cookie/QueueingFactory.php | 30 - .../contracts/Database/Eloquent/Builder.php | 14 - .../contracts/Database/Eloquent/Castable.php | 14 - .../Database/Eloquent/CastsAttributes.php | 34 - .../Eloquent/CastsInboundAttributes.php | 19 - .../Eloquent/DeviatesCastableAttributes.php | 28 - .../Eloquent/SerializesCastableAttributes.php | 19 - .../Eloquent/SupportsPartialRelations.php | 30 - .../Database/Events/MigrationEvent.php | 8 - .../contracts/Database/ModelIdentifier.php | 73 - .../contracts/Database/Query/Builder.php | 12 - .../Database/Query/ConditionExpression.php | 7 - .../contracts/Database/Query/Expression.php | 16 - .../contracts/Debug/ExceptionHandler.php | 48 - .../contracts/Debug/ShouldntReport.php | 8 - .../contracts/Encryption/DecryptException.php | 10 - .../contracts/Encryption/EncryptException.php | 10 - .../contracts/Encryption/Encrypter.php | 49 - .../contracts/Encryption/StringEncrypter.php | 26 - .../contracts/Events/Dispatcher.php | 82 - .../Events/ShouldDispatchAfterCommit.php | 8 - .../Events/ShouldHandleEventsAfterCommit.php | 8 - .../illuminate/contracts/Filesystem/Cloud.php | 14 - .../contracts/Filesystem/Factory.php | 14 - .../Filesystem/FileNotFoundException.php | 10 - .../contracts/Filesystem/Filesystem.php | 220 - .../Filesystem/LockTimeoutException.php | 10 - .../contracts/Foundation/Application.php | 254 - .../Foundation/CachesConfiguration.php | 27 - .../contracts/Foundation/CachesRoutes.php | 20 - .../Foundation/ExceptionRenderer.php | 14 - .../contracts/Foundation/MaintenanceMode.php | 35 - .../illuminate/contracts/Hashing/Hasher.php | 42 - vendor/illuminate/contracts/Http/Kernel.php | 37 - vendor/illuminate/contracts/LICENSE.md | 21 - .../illuminate/contracts/Mail/Attachable.php | 13 - vendor/illuminate/contracts/Mail/Factory.php | 14 - .../illuminate/contracts/Mail/MailQueue.php | 25 - vendor/illuminate/contracts/Mail/Mailable.php | 76 - vendor/illuminate/contracts/Mail/Mailer.php | 51 - .../contracts/Notifications/Dispatcher.php | 25 - .../contracts/Notifications/Factory.php | 32 - .../contracts/Pagination/CursorPaginator.php | 129 - .../Pagination/LengthAwarePaginator.php | 36 - .../contracts/Pagination/Paginator.php | 129 - vendor/illuminate/contracts/Pipeline/Hub.php | 15 - .../contracts/Pipeline/Pipeline.php | 40 - .../contracts/Process/InvokedProcess.php | 64 - .../contracts/Process/ProcessResult.php | 81 - .../contracts/Queue/ClearableQueue.php | 14 - .../Queue/EntityNotFoundException.php | 22 - .../contracts/Queue/EntityResolver.php | 15 - vendor/illuminate/contracts/Queue/Factory.php | 14 - vendor/illuminate/contracts/Queue/Job.php | 164 - vendor/illuminate/contracts/Queue/Monitor.php | 30 - vendor/illuminate/contracts/Queue/Queue.php | 99 - .../contracts/Queue/QueueableCollection.php | 34 - .../contracts/Queue/QueueableEntity.php | 27 - .../contracts/Queue/ShouldBeEncrypted.php | 8 - .../contracts/Queue/ShouldBeUnique.php | 8 - .../Queue/ShouldBeUniqueUntilProcessing.php | 8 - .../contracts/Queue/ShouldQueue.php | 8 - .../Queue/ShouldQueueAfterCommit.php | 8 - .../illuminate/contracts/Redis/Connection.php | 35 - .../illuminate/contracts/Redis/Connector.php | 25 - vendor/illuminate/contracts/Redis/Factory.php | 14 - .../Redis/LimiterTimeoutException.php | 10 - .../contracts/Routing/BindingRegistrar.php | 23 - .../contracts/Routing/Registrar.php | 105 - .../contracts/Routing/ResponseFactory.php | 155 - .../contracts/Routing/UrlGenerator.php | 113 - .../contracts/Routing/UrlRoutable.php | 39 - .../Middleware/AuthenticatesSessions.php | 8 - .../illuminate/contracts/Session/Session.php | 204 - .../contracts/Support/Arrayable.php | 17 - .../Support/CanBeEscapedWhenCastToString.php | 14 - .../contracts/Support/DeferrableProvider.php | 13 - .../Support/DeferringDisplayableValue.php | 13 - .../illuminate/contracts/Support/Htmlable.php | 13 - .../illuminate/contracts/Support/Jsonable.php | 14 - .../contracts/Support/MessageBag.php | 110 - .../contracts/Support/MessageProvider.php | 13 - .../contracts/Support/Renderable.php | 13 - .../contracts/Support/Responsable.php | 14 - .../contracts/Support/ValidatedData.php | 11 - .../Translation/HasLocalePreference.php | 13 - .../contracts/Translation/Loader.php | 40 - .../contracts/Translation/Translator.php | 42 - .../contracts/Validation/DataAwareRule.php | 14 - .../contracts/Validation/Factory.php | 46 - .../contracts/Validation/ImplicitRule.php | 11 - .../contracts/Validation/InvokableRule.php | 21 - .../illuminate/contracts/Validation/Rule.php | 25 - .../Validation/UncompromisedVerifier.php | 14 - .../Validation/ValidatesWhenResolved.php | 13 - .../contracts/Validation/ValidationRule.php | 18 - .../contracts/Validation/Validator.php | 65 - .../Validation/ValidatorAwareRule.php | 16 - vendor/illuminate/contracts/View/Engine.php | 15 - vendor/illuminate/contracts/View/Factory.php | 79 - vendor/illuminate/contracts/View/View.php | 31 - .../View/ViewCompilationException.php | 10 - vendor/illuminate/contracts/composer.json | 35 - .../illuminate/database/Capsule/Manager.php | 202 - .../database/ClassMorphViolationException.php | 29 - .../database/Concerns/BuildsQueries.php | 578 -- .../Concerns/BuildsWhereDateClauses.php | 250 - .../database/Concerns/CompilesJsonPaths.php | 65 - .../database/Concerns/ExplainsQueries.php | 24 - .../database/Concerns/ManagesTransactions.php | 353 -- .../database/Concerns/ParsesSearchPath.php | 25 - .../database/ConfigurationUrlParser.php | 10 - vendor/illuminate/database/Connection.php | 1698 ------ .../database/ConnectionInterface.php | 182 - .../database/ConnectionResolver.php | 92 - .../database/ConnectionResolverInterface.php | 29 - .../database/Connectors/ConnectionFactory.php | 282 - .../database/Connectors/Connector.php | 124 - .../Connectors/ConnectorInterface.php | 14 - .../database/Connectors/MariaDbConnector.php | 32 - .../database/Connectors/MySqlConnector.php | 154 - .../database/Connectors/PostgresConnector.php | 187 - .../database/Connectors/SQLiteConnector.php | 42 - .../Connectors/SqlServerConnector.php | 233 - .../Console/DatabaseInspectionCommand.php | 66 - .../illuminate/database/Console/DbCommand.php | 251 - .../database/Console/DumpCommand.php | 97 - .../Console/Factories/FactoryMakeCommand.php | 144 - .../Console/Factories/stubs/factory.stub | 23 - .../Console/Migrations/BaseCommand.php | 52 - .../Console/Migrations/FreshCommand.php | 149 - .../Console/Migrations/InstallCommand.php | 72 - .../Console/Migrations/MigrateCommand.php | 342 -- .../Console/Migrations/MigrateMakeCommand.php | 146 - .../Console/Migrations/RefreshCommand.php | 163 - .../Console/Migrations/ResetCommand.php | 96 - .../Console/Migrations/RollbackCommand.php | 93 - .../Console/Migrations/StatusCommand.php | 143 - .../Console/Migrations/TableGuesser.php | 37 - .../database/Console/MonitorCommand.php | 141 - .../database/Console/PruneCommand.php | 202 - .../database/Console/Seeds/SeedCommand.php | 140 - .../Console/Seeds/SeederMakeCommand.php | 92 - .../Console/Seeds/WithoutModelEvents.php | 19 - .../database/Console/Seeds/stubs/seeder.stub | 17 - .../database/Console/ShowCommand.php | 242 - .../database/Console/ShowModelCommand.php | 214 - .../database/Console/TableCommand.php | 264 - .../database/Console/WipeCommand.php | 116 - .../illuminate/database/DatabaseManager.php | 497 -- .../database/DatabaseServiceProvider.php | 113 - .../database/DatabaseTransactionRecord.php | 82 - .../database/DatabaseTransactionsManager.php | 248 - .../illuminate/database/DeadlockException.php | 10 - .../database/DetectsConcurrencyErrors.php | 37 - .../database/DetectsLostConnections.php | 86 - .../Eloquent/Attributes/CollectedBy.php | 19 - .../Eloquent/Attributes/ObservedBy.php | 19 - .../database/Eloquent/Attributes/ScopedBy.php | 19 - .../Eloquent/Attributes/UseFactory.php | 19 - .../BroadcastableModelEventOccurred.php | 145 - .../database/Eloquent/BroadcastsEvents.php | 197 - .../Eloquent/BroadcastsEventsAfterCommit.php | 18 - .../illuminate/database/Eloquent/Builder.php | 2218 -------- .../database/Eloquent/Casts/ArrayObject.php | 47 - .../database/Eloquent/Casts/AsArrayObject.php | 42 - .../database/Eloquent/Casts/AsCollection.php | 60 - .../Eloquent/Casts/AsEncryptedArrayObject.php | 45 - .../Eloquent/Casts/AsEncryptedCollection.php | 63 - .../Eloquent/Casts/AsEnumArrayObject.php | 97 - .../Eloquent/Casts/AsEnumCollection.php | 93 - .../database/Eloquent/Casts/AsStringable.php | 32 - .../database/Eloquent/Casts/Attribute.php | 105 - .../database/Eloquent/Casts/Json.php | 54 - .../database/Eloquent/Collection.php | 833 --- .../Eloquent/Concerns/GuardsAttributes.php | 260 - .../Eloquent/Concerns/HasAttributes.php | 2375 -------- .../database/Eloquent/Concerns/HasEvents.php | 461 -- .../Eloquent/Concerns/HasGlobalScopes.php | 139 - .../Eloquent/Concerns/HasRelationships.php | 997 ---- .../Eloquent/Concerns/HasTimestamps.php | 232 - .../database/Eloquent/Concerns/HasUlids.php | 31 - .../Eloquent/Concerns/HasUniqueIds.php | 57 - .../Eloquent/Concerns/HasUniqueStringIds.php | 108 - .../database/Eloquent/Concerns/HasUuids.php | 31 - .../Eloquent/Concerns/HasVersion7Uuids.php | 20 - .../Eloquent/Concerns/HidesAttributes.php | 124 - .../Concerns/PreventsCircularRecursion.php | 107 - .../Concerns/QueriesRelationships.php | 1061 ---- .../Factories/BelongsToManyRelationship.php | 76 - .../Factories/BelongsToRelationship.php | 97 - .../Eloquent/Factories/CrossJoinSequence.php | 26 - .../database/Eloquent/Factories/Factory.php | 991 ---- .../Eloquent/Factories/HasFactory.php | 62 - .../Eloquent/Factories/Relationship.php | 75 - .../database/Eloquent/Factories/Sequence.php | 63 - .../database/Eloquent/HasBuilder.php | 124 - .../database/Eloquent/HasCollection.php | 50 - .../Eloquent/HigherOrderBuilderProxy.php | 50 - .../Eloquent/InvalidCastException.php | 48 - .../Eloquent/JsonEncodingException.php | 49 - .../Eloquent/MassAssignmentException.php | 10 - .../database/Eloquent/MassPrunable.php | 48 - .../Eloquent/MissingAttributeException.php | 23 - vendor/illuminate/database/Eloquent/Model.php | 2438 -------- .../database/Eloquent/ModelInspector.php | 412 -- .../Eloquent/ModelNotFoundException.php | 69 - .../PendingHasThroughRelationship.php | 117 - .../illuminate/database/Eloquent/Prunable.php | 67 - .../database/Eloquent/QueueEntityResolver.php | 29 - .../Eloquent/RelationNotFoundException.php | 46 - .../database/Eloquent/Relations/BelongsTo.php | 383 -- .../Eloquent/Relations/BelongsToMany.php | 1657 ------ .../Eloquent/Relations/Concerns/AsPivot.php | 354 -- .../Relations/Concerns/CanBeOneOfMany.php | 332 -- .../Concerns/ComparesRelatedModels.php | 77 - .../Concerns/InteractsWithDictionary.php | 36 - .../Concerns/InteractsWithPivotTable.php | 694 --- .../Concerns/SupportsDefaultModels.php | 63 - .../Concerns/SupportsInverseRelations.php | 157 - .../database/Eloquent/Relations/HasMany.php | 60 - .../Eloquent/Relations/HasManyThrough.php | 74 - .../database/Eloquent/Relations/HasOne.php | 118 - .../Eloquent/Relations/HasOneOrMany.php | 579 -- .../Relations/HasOneOrManyThrough.php | 862 --- .../Eloquent/Relations/HasOneThrough.php | 67 - .../database/Eloquent/Relations/MorphMany.php | 69 - .../database/Eloquent/Relations/MorphOne.php | 122 - .../Eloquent/Relations/MorphOneOrMany.php | 181 - .../Eloquent/Relations/MorphPivot.php | 184 - .../database/Eloquent/Relations/MorphTo.php | 456 -- .../Eloquent/Relations/MorphToMany.php | 226 - .../database/Eloquent/Relations/Pivot.php | 25 - .../database/Eloquent/Relations/Relation.php | 550 -- vendor/illuminate/database/Eloquent/Scope.php | 15 - .../database/Eloquent/SoftDeletes.php | 292 - .../database/Eloquent/SoftDeletingScope.php | 167 - .../database/Events/ConnectionEstablished.php | 8 - .../database/Events/ConnectionEvent.php | 32 - .../database/Events/DatabaseBusy.php | 32 - .../database/Events/DatabaseRefreshed.php | 22 - .../database/Events/MigrationEnded.php | 8 - .../database/Events/MigrationEvent.php | 36 - .../database/Events/MigrationStarted.php | 8 - .../database/Events/MigrationsEnded.php | 8 - .../database/Events/MigrationsEvent.php | 35 - .../database/Events/MigrationsPruned.php | 43 - .../database/Events/MigrationsStarted.php | 8 - .../database/Events/ModelPruningFinished.php | 24 - .../database/Events/ModelPruningStarting.php | 24 - .../database/Events/ModelsPruned.php | 33 - .../database/Events/NoPendingMigrations.php | 26 - .../database/Events/QueryExecuted.php | 72 - .../database/Events/SchemaDumped.php | 41 - .../database/Events/SchemaLoaded.php | 41 - .../database/Events/StatementPrepared.php | 33 - .../database/Events/TransactionBeginning.php | 8 - .../database/Events/TransactionCommitted.php | 8 - .../database/Events/TransactionCommitting.php | 8 - .../database/Events/TransactionRolledBack.php | 8 - vendor/illuminate/database/Grammar.php | 316 -- vendor/illuminate/database/LICENSE.md | 21 - .../LazyLoadingViolationException.php | 39 - .../database/LostConnectionException.php | 10 - .../illuminate/database/MariaDbConnection.php | 102 - .../database/MigrationServiceProvider.php | 226 - .../DatabaseMigrationRepository.php | 239 - .../database/Migrations/Migration.php | 30 - .../database/Migrations/MigrationCreator.php | 231 - .../MigrationRepositoryInterface.php | 96 - .../database/Migrations/Migrator.php | 818 --- .../Migrations/stubs/migration.create.stub | 27 - .../database/Migrations/stubs/migration.stub | 24 - .../Migrations/stubs/migration.update.stub | 28 - .../MultipleColumnsSelectedException.php | 10 - .../MultipleRecordsFoundException.php | 40 - .../illuminate/database/MySqlConnection.php | 176 - .../database/PostgresConnection.php | 117 - vendor/illuminate/database/Query/Builder.php | 4394 --------------- .../illuminate/database/Query/Expression.php | 34 - .../database/Query/Grammars/Grammar.php | 1578 ------ .../Query/Grammars/MariaDbGrammar.php | 56 - .../database/Query/Grammars/MySqlGrammar.php | 527 -- .../Query/Grammars/PostgresGrammar.php | 828 --- .../database/Query/Grammars/SQLiteGrammar.php | 460 -- .../Query/Grammars/SqlServerGrammar.php | 585 -- .../illuminate/database/Query/IndexHint.php | 33 - .../illuminate/database/Query/JoinClause.php | 146 - .../database/Query/JoinLateralClause.php | 8 - .../Query/Processors/MariaDbProcessor.php | 8 - .../Query/Processors/MySqlProcessor.php | 117 - .../Query/Processors/PostgresProcessor.php | 171 - .../database/Query/Processors/Processor.php | 123 - .../Query/Processors/SQLiteProcessor.php | 115 - .../Query/Processors/SqlServerProcessor.php | 136 - vendor/illuminate/database/QueryException.php | 99 - vendor/illuminate/database/README.md | 69 - .../database/RecordNotFoundException.php | 10 - .../database/RecordsNotFoundException.php | 10 - .../illuminate/database/SQLiteConnection.php | 218 - .../SQLiteDatabaseDoesNotExistException.php | 28 - .../illuminate/database/Schema/Blueprint.php | 1889 ------- .../database/Schema/BlueprintState.php | 256 - vendor/illuminate/database/Schema/Builder.php | 620 --- .../database/Schema/ColumnDefinition.php | 38 - .../Schema/ForeignIdColumnDefinition.php | 57 - .../database/Schema/ForeignKeyDefinition.php | 96 - .../database/Schema/Grammars/Grammar.php | 408 -- .../Schema/Grammars/MariaDbGrammar.php | 58 - .../database/Schema/Grammars/MySqlGrammar.php | 1371 ----- .../Schema/Grammars/PostgresGrammar.php | 1235 ----- .../Schema/Grammars/SQLiteGrammar.php | 1183 ---- .../Schema/Grammars/SqlServerGrammar.php | 1072 ---- .../database/Schema/IndexDefinition.php | 16 - .../database/Schema/MariaDbBuilder.php | 8 - .../database/Schema/MariaDbSchemaState.php | 18 - .../database/Schema/MySqlBuilder.php | 168 - .../database/Schema/MySqlSchemaState.php | 177 - .../database/Schema/PostgresBuilder.php | 287 - .../database/Schema/PostgresSchemaState.php | 95 - .../database/Schema/SQLiteBuilder.php | 175 - .../database/Schema/SchemaState.php | 142 - .../database/Schema/SqlServerBuilder.php | 178 - .../database/Schema/SqliteSchemaState.php | 103 - vendor/illuminate/database/Seeder.php | 195 - .../database/SqlServerConnection.php | 149 - .../UniqueConstraintViolationException.php | 7 - vendor/illuminate/database/composer.json | 51 - vendor/illuminate/macroable/LICENSE.md | 21 - .../illuminate/macroable/Traits/Macroable.php | 128 - vendor/illuminate/macroable/composer.json | 33 - .../support/AggregateServiceProvider.php | 52 - vendor/illuminate/support/Benchmark.php | 69 - vendor/illuminate/support/Carbon.php | 36 - vendor/illuminate/support/Composer.php | 255 - .../support/ConfigurationUrlParser.php | 191 - vendor/illuminate/support/DateFactory.php | 231 - .../illuminate/support/DefaultProviders.php | 103 - .../support/Defer/DeferredCallback.php | 55 - .../Defer/DeferredCallbackCollection.php | 157 - vendor/illuminate/support/Env.php | 125 - .../support/Exceptions/MathException.php | 10 - vendor/illuminate/support/Facades/App.php | 159 - vendor/illuminate/support/Facades/Artisan.php | 39 - vendor/illuminate/support/Facades/Auth.php | 98 - vendor/illuminate/support/Facades/Blade.php | 62 - .../illuminate/support/Facades/Broadcast.php | 50 - vendor/illuminate/support/Facades/Bus.php | 100 - vendor/illuminate/support/Facades/Cache.php | 73 - .../support/Facades/Concurrency.php | 36 - vendor/illuminate/support/Facades/Config.php | 36 - vendor/illuminate/support/Facades/Context.php | 56 - vendor/illuminate/support/Facades/Cookie.php | 58 - vendor/illuminate/support/Facades/Crypt.php | 30 - vendor/illuminate/support/Facades/DB.php | 149 - vendor/illuminate/support/Facades/Date.php | 122 - vendor/illuminate/support/Facades/Event.php | 130 - .../illuminate/support/Facades/Exceptions.php | 68 - vendor/illuminate/support/Facades/Facade.php | 363 -- vendor/illuminate/support/Facades/File.php | 72 - vendor/illuminate/support/Facades/Gate.php | 48 - vendor/illuminate/support/Facades/Hash.php | 36 - vendor/illuminate/support/Facades/Http.php | 164 - vendor/illuminate/support/Facades/Lang.php | 48 - vendor/illuminate/support/Facades/Log.php | 51 - vendor/illuminate/support/Facades/Mail.php | 91 - .../support/Facades/Notification.php | 96 - .../support/Facades/ParallelTesting.php | 34 - .../illuminate/support/Facades/Password.php | 74 - .../illuminate/support/Facades/Pipeline.php | 37 - vendor/illuminate/support/Facades/Process.php | 75 - vendor/illuminate/support/Facades/Queue.php | 102 - .../support/Facades/RateLimiter.php | 34 - .../illuminate/support/Facades/Redirect.php | 39 - vendor/illuminate/support/Facades/Redis.php | 46 - vendor/illuminate/support/Facades/Request.php | 202 - .../illuminate/support/Facades/Response.php | 42 - vendor/illuminate/support/Facades/Route.php | 118 - .../illuminate/support/Facades/Schedule.php | 99 - vendor/illuminate/support/Facades/Schema.php | 80 - vendor/illuminate/support/Facades/Session.php | 87 - vendor/illuminate/support/Facades/Storage.php | 173 - vendor/illuminate/support/Facades/URL.php | 66 - .../illuminate/support/Facades/Validator.php | 34 - vendor/illuminate/support/Facades/View.php | 98 - vendor/illuminate/support/Facades/Vite.php | 48 - vendor/illuminate/support/Fluent.php | 299 - .../support/HigherOrderTapProxy.php | 38 - vendor/illuminate/support/HtmlString.php | 67 - .../illuminate/support/InteractsWithTime.php | 83 - vendor/illuminate/support/Js.php | 151 - vendor/illuminate/support/LICENSE.md | 21 - vendor/illuminate/support/Lottery.php | 281 - vendor/illuminate/support/Manager.php | 193 - vendor/illuminate/support/MessageBag.php | 444 -- .../support/MultipleInstanceManager.php | 228 - .../support/NamespacedItemResolver.php | 112 - vendor/illuminate/support/Number.php | 388 -- vendor/illuminate/support/Once.php | 100 - vendor/illuminate/support/Onceable.php | 78 - vendor/illuminate/support/Optional.php | 131 - vendor/illuminate/support/Pluralizer.php | 127 - .../support/Process/PhpExecutableFinder.php | 22 - vendor/illuminate/support/ProcessUtils.php | 69 - vendor/illuminate/support/Reflector.php | 170 - vendor/illuminate/support/ServiceProvider.php | 584 -- vendor/illuminate/support/Sleep.php | 544 -- vendor/illuminate/support/Str.php | 2048 ------- vendor/illuminate/support/Stringable.php | 1497 ----- .../support/Testing/Fakes/BatchFake.php | 169 - .../Testing/Fakes/BatchRepositoryFake.php | 163 - .../support/Testing/Fakes/BusFake.php | 901 --- .../Testing/Fakes/ChainedBatchTruthTest.php | 37 - .../support/Testing/Fakes/EventFake.php | 438 -- .../Testing/Fakes/ExceptionHandlerFake.php | 276 - .../illuminate/support/Testing/Fakes/Fake.php | 8 - .../support/Testing/Fakes/MailFake.php | 591 -- .../Testing/Fakes/NotificationFake.php | 401 -- .../Testing/Fakes/PendingBatchFake.php | 49 - .../Testing/Fakes/PendingChainFake.php | 56 - .../support/Testing/Fakes/PendingMailFake.php | 53 - .../support/Testing/Fakes/QueueFake.php | 616 -- vendor/illuminate/support/Timebox.php | 86 - .../support/Traits/CapsuleManagerTrait.php | 69 - vendor/illuminate/support/Traits/Dumpable.php | 30 - .../support/Traits/ForwardsCalls.php | 71 - .../support/Traits/InteractsWithData.php | 420 -- .../illuminate/support/Traits/Localizable.php | 34 - .../support/Traits/ReflectsClosures.php | 89 - vendor/illuminate/support/Traits/Tappable.php | 17 - vendor/illuminate/support/Uri.php | 391 -- vendor/illuminate/support/UriQueryString.php | 96 - vendor/illuminate/support/ValidatedInput.php | 241 - vendor/illuminate/support/ViewErrorBag.php | 131 - vendor/illuminate/support/composer.json | 64 - vendor/illuminate/support/functions.php | 53 - vendor/illuminate/support/helpers.php | 528 -- .../laravel/serializable-closure/LICENSE.md | 21 - vendor/laravel/serializable-closure/README.md | 73 - .../serializable-closure/composer.json | 53 - .../src/Contracts/Serializable.php | 20 - .../src/Contracts/Signer.php | 22 - .../Exceptions/InvalidSignatureException.php | 19 - .../Exceptions/MissingSecretKeyException.php | 19 - .../PhpVersionNotSupportedException.php | 19 - .../src/SerializableClosure.php | 126 - .../src/Serializers/Native.php | 526 -- .../src/Serializers/Signed.php | 91 - .../serializable-closure/src/Signers/Hmac.php | 53 - .../src/Support/ClosureScope.php | 22 - .../src/Support/ClosureStream.php | 181 - .../src/Support/ReflectionClosure.php | 1184 ---- .../src/Support/SelfReference.php | 24 - .../src/UnsignedSerializableClosure.php | 69 - vendor/nesbot/carbon/.phpstorm.meta.php | 10 - vendor/nesbot/carbon/LICENSE | 19 - vendor/nesbot/carbon/bin/carbon | 23 - vendor/nesbot/carbon/bin/carbon.bat | 4 - vendor/nesbot/carbon/composer.json | 126 - vendor/nesbot/carbon/extension.neon | 5 - .../MessageFormatterMapperStrongType.php | 28 - .../MessageFormatterMapperWeakType.php | 36 - .../lazy/Carbon/ProtectedDatePeriod.php | 73 - .../lazy/Carbon/TranslatorStrongType.php | 52 - .../carbon/lazy/Carbon/TranslatorWeakType.php | 32 - .../lazy/Carbon/UnprotectedDatePeriod.php | 20 - vendor/nesbot/carbon/readme.md | 190 - vendor/nesbot/carbon/sponsors.php | 234 - .../carbon/src/Carbon/AbstractTranslator.php | 411 -- vendor/nesbot/carbon/src/Carbon/Callback.php | 129 - vendor/nesbot/carbon/src/Carbon/Carbon.php | 847 --- .../src/Carbon/CarbonConverterInterface.php | 21 - .../carbon/src/Carbon/CarbonImmutable.php | 890 --- .../carbon/src/Carbon/CarbonInterface.php | 4934 ----------------- .../carbon/src/Carbon/CarbonInterval.php | 3402 ------------ .../nesbot/carbon/src/Carbon/CarbonPeriod.php | 2579 --------- .../src/Carbon/CarbonPeriodImmutable.php | 38 - .../carbon/src/Carbon/CarbonTimeZone.php | 322 -- .../nesbot/carbon/src/Carbon/Cli/Invoker.php | 40 - .../Exceptions/BadComparisonUnitException.php | 50 - .../BadFluentConstructorException.php | 51 - .../Exceptions/BadFluentSetterException.php | 51 - .../Exceptions/BadMethodCallException.php | 19 - .../Exceptions/EndLessPeriodException.php | 21 - .../src/Carbon/Exceptions/Exception.php | 19 - .../Carbon/Exceptions/ImmutableException.php | 50 - .../Exceptions/InvalidArgumentException.php | 19 - .../Exceptions/InvalidCastException.php | 21 - .../Exceptions/InvalidDateException.php | 69 - .../Exceptions/InvalidFormatException.php | 21 - .../Exceptions/InvalidIntervalException.php | 21 - .../Exceptions/InvalidPeriodDateException.php | 21 - .../InvalidPeriodParameterException.php | 21 - .../Exceptions/InvalidTimeZoneException.php | 21 - .../Exceptions/InvalidTypeException.php | 21 - .../Exceptions/NotACarbonClassException.php | 56 - .../Carbon/Exceptions/NotAPeriodException.php | 21 - .../Exceptions/NotLocaleAwareException.php | 34 - .../Carbon/Exceptions/OutOfRangeException.php | 103 - .../Carbon/Exceptions/ParseErrorException.php | 90 - .../Carbon/Exceptions/RuntimeException.php | 19 - .../src/Carbon/Exceptions/UnitException.php | 21 - .../Exceptions/UnitNotConfiguredException.php | 50 - .../Exceptions/UnknownGetterException.php | 51 - .../Exceptions/UnknownMethodException.php | 51 - .../Exceptions/UnknownSetterException.php | 51 - .../Exceptions/UnknownUnitException.php | 50 - .../Exceptions/UnreachableException.php | 21 - .../Exceptions/UnsupportedUnitException.php | 27 - vendor/nesbot/carbon/src/Carbon/Factory.php | 846 --- .../carbon/src/Carbon/FactoryImmutable.php | 192 - vendor/nesbot/carbon/src/Carbon/Lang/aa.php | 15 - .../nesbot/carbon/src/Carbon/Lang/aa_DJ.php | 44 - .../nesbot/carbon/src/Carbon/Lang/aa_ER.php | 28 - .../carbon/src/Carbon/Lang/aa_ER@saaho.php | 28 - .../nesbot/carbon/src/Carbon/Lang/aa_ET.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/af.php | 77 - .../nesbot/carbon/src/Carbon/Lang/af_NA.php | 28 - .../nesbot/carbon/src/Carbon/Lang/af_ZA.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/agq.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/agr.php | 15 - .../nesbot/carbon/src/Carbon/Lang/agr_PE.php | 44 - vendor/nesbot/carbon/src/Carbon/Lang/ak.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ak_GH.php | 40 - vendor/nesbot/carbon/src/Carbon/Lang/am.php | 15 - .../nesbot/carbon/src/Carbon/Lang/am_ET.php | 59 - vendor/nesbot/carbon/src/Carbon/Lang/an.php | 15 - .../nesbot/carbon/src/Carbon/Lang/an_ES.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/anp.php | 15 - .../nesbot/carbon/src/Carbon/Lang/anp_IN.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/ar.php | 93 - .../nesbot/carbon/src/Carbon/Lang/ar_AE.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_BH.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_DJ.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_DZ.php | 92 - .../nesbot/carbon/src/Carbon/Lang/ar_EG.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_EH.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_ER.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_IL.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_IN.php | 26 - .../nesbot/carbon/src/Carbon/Lang/ar_IQ.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_JO.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_KM.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_KW.php | 95 - .../nesbot/carbon/src/Carbon/Lang/ar_LB.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_LY.php | 92 - .../nesbot/carbon/src/Carbon/Lang/ar_MA.php | 92 - .../nesbot/carbon/src/Carbon/Lang/ar_MR.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_OM.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_PS.php | 18 - .../nesbot/carbon/src/Carbon/Lang/ar_QA.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_SA.php | 94 - .../nesbot/carbon/src/Carbon/Lang/ar_SD.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_SO.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_SS.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ar_SY.php | 29 - .../carbon/src/Carbon/Lang/ar_Shakl.php | 95 - .../nesbot/carbon/src/Carbon/Lang/ar_TD.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_TN.php | 91 - .../nesbot/carbon/src/Carbon/Lang/ar_YE.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/as.php | 15 - .../nesbot/carbon/src/Carbon/Lang/as_IN.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/asa.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/ast.php | 59 - .../nesbot/carbon/src/Carbon/Lang/ast_ES.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/ayc.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ayc_PE.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/az.php | 129 - .../nesbot/carbon/src/Carbon/Lang/az_AZ.php | 21 - .../nesbot/carbon/src/Carbon/Lang/az_Cyrl.php | 20 - .../nesbot/carbon/src/Carbon/Lang/az_IR.php | 27 - .../nesbot/carbon/src/Carbon/Lang/az_Latn.php | 29 - vendor/nesbot/carbon/src/Carbon/Lang/bas.php | 32 - vendor/nesbot/carbon/src/Carbon/Lang/be.php | 160 - .../nesbot/carbon/src/Carbon/Lang/be_BY.php | 22 - .../carbon/src/Carbon/Lang/be_BY@latin.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/bem.php | 15 - .../nesbot/carbon/src/Carbon/Lang/bem_ZM.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/ber.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ber_DZ.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ber_MA.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/bez.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/bg.php | 108 - .../nesbot/carbon/src/Carbon/Lang/bg_BG.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/bhb.php | 15 - .../nesbot/carbon/src/Carbon/Lang/bhb_IN.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/bho.php | 15 - .../nesbot/carbon/src/Carbon/Lang/bho_IN.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/bi.php | 15 - .../nesbot/carbon/src/Carbon/Lang/bi_VU.php | 54 - vendor/nesbot/carbon/src/Carbon/Lang/bm.php | 70 - vendor/nesbot/carbon/src/Carbon/Lang/bn.php | 100 - .../nesbot/carbon/src/Carbon/Lang/bn_BD.php | 27 - .../nesbot/carbon/src/Carbon/Lang/bn_IN.php | 26 - vendor/nesbot/carbon/src/Carbon/Lang/bo.php | 71 - .../nesbot/carbon/src/Carbon/Lang/bo_CN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/bo_IN.php | 29 - vendor/nesbot/carbon/src/Carbon/Lang/br.php | 74 - .../nesbot/carbon/src/Carbon/Lang/br_FR.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/brx.php | 15 - .../nesbot/carbon/src/Carbon/Lang/brx_IN.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/bs.php | 93 - .../nesbot/carbon/src/Carbon/Lang/bs_BA.php | 12 - .../nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php | 28 - .../nesbot/carbon/src/Carbon/Lang/bs_Latn.php | 13 - vendor/nesbot/carbon/src/Carbon/Lang/byn.php | 15 - .../nesbot/carbon/src/Carbon/Lang/byn_ER.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/ca.php | 117 - .../nesbot/carbon/src/Carbon/Lang/ca_AD.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ca_ES.php | 12 - .../carbon/src/Carbon/Lang/ca_ES_Valencia.php | 23 - .../nesbot/carbon/src/Carbon/Lang/ca_FR.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ca_IT.php | 13 - vendor/nesbot/carbon/src/Carbon/Lang/ccp.php | 28 - .../nesbot/carbon/src/Carbon/Lang/ccp_IN.php | 14 - vendor/nesbot/carbon/src/Carbon/Lang/ce.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ce_RU.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/cgg.php | 31 - vendor/nesbot/carbon/src/Carbon/Lang/chr.php | 15 - .../nesbot/carbon/src/Carbon/Lang/chr_US.php | 59 - vendor/nesbot/carbon/src/Carbon/Lang/ckb.php | 90 - vendor/nesbot/carbon/src/Carbon/Lang/cmn.php | 15 - .../nesbot/carbon/src/Carbon/Lang/cmn_TW.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/crh.php | 15 - .../nesbot/carbon/src/Carbon/Lang/crh_UA.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/cs.php | 124 - .../nesbot/carbon/src/Carbon/Lang/cs_CZ.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/csb.php | 15 - .../nesbot/carbon/src/Carbon/Lang/csb_PL.php | 41 - vendor/nesbot/carbon/src/Carbon/Lang/cu.php | 52 - vendor/nesbot/carbon/src/Carbon/Lang/cv.php | 65 - .../nesbot/carbon/src/Carbon/Lang/cv_RU.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/cy.php | 79 - .../nesbot/carbon/src/Carbon/Lang/cy_GB.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/da.php | 81 - .../nesbot/carbon/src/Carbon/Lang/da_DK.php | 12 - .../nesbot/carbon/src/Carbon/Lang/da_GL.php | 19 - vendor/nesbot/carbon/src/Carbon/Lang/dav.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/de.php | 135 - .../nesbot/carbon/src/Carbon/Lang/de_AT.php | 27 - .../nesbot/carbon/src/Carbon/Lang/de_BE.php | 20 - .../nesbot/carbon/src/Carbon/Lang/de_CH.php | 20 - .../nesbot/carbon/src/Carbon/Lang/de_DE.php | 16 - .../nesbot/carbon/src/Carbon/Lang/de_IT.php | 16 - .../nesbot/carbon/src/Carbon/Lang/de_LI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/de_LU.php | 20 - vendor/nesbot/carbon/src/Carbon/Lang/dje.php | 40 - vendor/nesbot/carbon/src/Carbon/Lang/doi.php | 15 - .../nesbot/carbon/src/Carbon/Lang/doi_IN.php | 32 - vendor/nesbot/carbon/src/Carbon/Lang/dsb.php | 15 - .../nesbot/carbon/src/Carbon/Lang/dsb_DE.php | 60 - vendor/nesbot/carbon/src/Carbon/Lang/dua.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/dv.php | 89 - .../nesbot/carbon/src/Carbon/Lang/dv_MV.php | 87 - vendor/nesbot/carbon/src/Carbon/Lang/dyo.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/dz.php | 15 - .../nesbot/carbon/src/Carbon/Lang/dz_BT.php | 44 - vendor/nesbot/carbon/src/Carbon/Lang/ebu.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/ee.php | 56 - .../nesbot/carbon/src/Carbon/Lang/ee_TG.php | 19 - vendor/nesbot/carbon/src/Carbon/Lang/el.php | 89 - .../nesbot/carbon/src/Carbon/Lang/el_CY.php | 19 - .../nesbot/carbon/src/Carbon/Lang/el_GR.php | 19 - vendor/nesbot/carbon/src/Carbon/Lang/en.php | 95 - .../nesbot/carbon/src/Carbon/Lang/en_001.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_150.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_AG.php | 20 - .../nesbot/carbon/src/Carbon/Lang/en_AI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_AS.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_AT.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_AU.php | 30 - .../nesbot/carbon/src/Carbon/Lang/en_BB.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_BE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_BI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_BM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_BS.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_BW.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_BZ.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_CA.php | 30 - .../nesbot/carbon/src/Carbon/Lang/en_CC.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_CH.php | 21 - .../nesbot/carbon/src/Carbon/Lang/en_CK.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_CM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_CX.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_CY.php | 27 - .../nesbot/carbon/src/Carbon/Lang/en_DE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_DG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_DK.php | 21 - .../nesbot/carbon/src/Carbon/Lang/en_DM.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_ER.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_FI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_FJ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_FK.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_FM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_GB.php | 29 - .../nesbot/carbon/src/Carbon/Lang/en_GD.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_GG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_GH.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_GI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_GM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_GU.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_GY.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_HK.php | 18 - .../nesbot/carbon/src/Carbon/Lang/en_IE.php | 30 - .../nesbot/carbon/src/Carbon/Lang/en_IL.php | 30 - .../nesbot/carbon/src/Carbon/Lang/en_IM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_IN.php | 25 - .../nesbot/carbon/src/Carbon/Lang/en_IO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_ISO.php | 22 - .../nesbot/carbon/src/Carbon/Lang/en_JE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_JM.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_KE.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_KI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_KN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_KY.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_LC.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_LR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_LS.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_MG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_MH.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_MO.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_MP.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_MS.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_MT.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_MU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_MW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_MY.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_NA.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_NF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_NG.php | 17 - .../nesbot/carbon/src/Carbon/Lang/en_NL.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_NR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_NU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_NZ.php | 30 - .../nesbot/carbon/src/Carbon/Lang/en_PG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_PH.php | 18 - .../nesbot/carbon/src/Carbon/Lang/en_PK.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_PN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_PR.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_PW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_RW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_SB.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_SC.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_SD.php | 15 - .../nesbot/carbon/src/Carbon/Lang/en_SE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_SG.php | 23 - .../nesbot/carbon/src/Carbon/Lang/en_SH.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_SI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_SL.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_SS.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_SX.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_SZ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_TC.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_TK.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_TO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_TT.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_TV.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_TZ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_UG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_UM.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_US.php | 14 - .../carbon/src/Carbon/Lang/en_US_Posix.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_VC.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_VG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_VI.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_VU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_WS.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_ZA.php | 25 - .../nesbot/carbon/src/Carbon/Lang/en_ZM.php | 20 - .../nesbot/carbon/src/Carbon/Lang/en_ZW.php | 14 - vendor/nesbot/carbon/src/Carbon/Lang/eo.php | 77 - vendor/nesbot/carbon/src/Carbon/Lang/es.php | 125 - .../nesbot/carbon/src/Carbon/Lang/es_419.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_AR.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_BO.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_BR.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_BZ.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_CL.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_CO.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_CR.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_CU.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_DO.php | 31 - .../nesbot/carbon/src/Carbon/Lang/es_EA.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_EC.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_ES.php | 16 - .../nesbot/carbon/src/Carbon/Lang/es_GQ.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_GT.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_HN.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_IC.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_MX.php | 20 - .../nesbot/carbon/src/Carbon/Lang/es_NI.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_PA.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_PE.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_PH.php | 22 - .../nesbot/carbon/src/Carbon/Lang/es_PR.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_PY.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_SV.php | 20 - .../nesbot/carbon/src/Carbon/Lang/es_US.php | 38 - .../nesbot/carbon/src/Carbon/Lang/es_UY.php | 21 - .../nesbot/carbon/src/Carbon/Lang/es_VE.php | 19 - vendor/nesbot/carbon/src/Carbon/Lang/et.php | 93 - .../nesbot/carbon/src/Carbon/Lang/et_EE.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/eu.php | 67 - .../nesbot/carbon/src/Carbon/Lang/eu_ES.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/ewo.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/fa.php | 84 - .../nesbot/carbon/src/Carbon/Lang/fa_AF.php | 21 - .../nesbot/carbon/src/Carbon/Lang/fa_IR.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/ff.php | 60 - .../nesbot/carbon/src/Carbon/Lang/ff_CM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ff_GN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ff_MR.php | 21 - .../nesbot/carbon/src/Carbon/Lang/ff_SN.php | 16 - vendor/nesbot/carbon/src/Carbon/Lang/fi.php | 88 - .../nesbot/carbon/src/Carbon/Lang/fi_FI.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/fil.php | 15 - .../nesbot/carbon/src/Carbon/Lang/fil_PH.php | 63 - vendor/nesbot/carbon/src/Carbon/Lang/fo.php | 69 - .../nesbot/carbon/src/Carbon/Lang/fo_DK.php | 19 - .../nesbot/carbon/src/Carbon/Lang/fo_FO.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/fr.php | 118 - .../nesbot/carbon/src/Carbon/Lang/fr_BE.php | 16 - .../nesbot/carbon/src/Carbon/Lang/fr_BF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_BI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_BJ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_BL.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_CA.php | 25 - .../nesbot/carbon/src/Carbon/Lang/fr_CD.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_CF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_CG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_CH.php | 24 - .../nesbot/carbon/src/Carbon/Lang/fr_CI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_CM.php | 14 - .../nesbot/carbon/src/Carbon/Lang/fr_DJ.php | 22 - .../nesbot/carbon/src/Carbon/Lang/fr_DZ.php | 23 - .../nesbot/carbon/src/Carbon/Lang/fr_FR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_GA.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_GF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_GN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_GP.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_GQ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_HT.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_KM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_LU.php | 20 - .../nesbot/carbon/src/Carbon/Lang/fr_MA.php | 15 - .../nesbot/carbon/src/Carbon/Lang/fr_MC.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_MF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_MG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_ML.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_MQ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_MR.php | 21 - .../nesbot/carbon/src/Carbon/Lang/fr_MU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_NC.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_NE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_PF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_PM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_RE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_RW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_SC.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_SN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_SY.php | 23 - .../nesbot/carbon/src/Carbon/Lang/fr_TD.php | 21 - .../nesbot/carbon/src/Carbon/Lang/fr_TG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_TN.php | 22 - .../nesbot/carbon/src/Carbon/Lang/fr_VU.php | 21 - .../nesbot/carbon/src/Carbon/Lang/fr_WF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_YT.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/fur.php | 15 - .../nesbot/carbon/src/Carbon/Lang/fur_IT.php | 39 - vendor/nesbot/carbon/src/Carbon/Lang/fy.php | 76 - .../nesbot/carbon/src/Carbon/Lang/fy_DE.php | 27 - .../nesbot/carbon/src/Carbon/Lang/fy_NL.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/ga.php | 75 - .../nesbot/carbon/src/Carbon/Lang/ga_IE.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/gd.php | 75 - .../nesbot/carbon/src/Carbon/Lang/gd_GB.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/gez.php | 15 - .../nesbot/carbon/src/Carbon/Lang/gez_ER.php | 56 - .../nesbot/carbon/src/Carbon/Lang/gez_ET.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/gl.php | 98 - .../nesbot/carbon/src/Carbon/Lang/gl_ES.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/gom.php | 15 - .../carbon/src/Carbon/Lang/gom_Latn.php | 77 - vendor/nesbot/carbon/src/Carbon/Lang/gsw.php | 49 - .../nesbot/carbon/src/Carbon/Lang/gsw_CH.php | 12 - .../nesbot/carbon/src/Carbon/Lang/gsw_FR.php | 20 - .../nesbot/carbon/src/Carbon/Lang/gsw_LI.php | 20 - vendor/nesbot/carbon/src/Carbon/Lang/gu.php | 82 - .../nesbot/carbon/src/Carbon/Lang/gu_IN.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/guz.php | 48 - vendor/nesbot/carbon/src/Carbon/Lang/gv.php | 15 - .../nesbot/carbon/src/Carbon/Lang/gv_GB.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/ha.php | 60 - .../nesbot/carbon/src/Carbon/Lang/ha_GH.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ha_NE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ha_NG.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/hak.php | 15 - .../nesbot/carbon/src/Carbon/Lang/hak_TW.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/haw.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/he.php | 86 - .../nesbot/carbon/src/Carbon/Lang/he_IL.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/hi.php | 82 - .../nesbot/carbon/src/Carbon/Lang/hi_IN.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/hif.php | 15 - .../nesbot/carbon/src/Carbon/Lang/hif_FJ.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/hne.php | 15 - .../nesbot/carbon/src/Carbon/Lang/hne_IN.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/hr.php | 99 - .../nesbot/carbon/src/Carbon/Lang/hr_BA.php | 32 - .../nesbot/carbon/src/Carbon/Lang/hr_HR.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/hsb.php | 15 - .../nesbot/carbon/src/Carbon/Lang/hsb_DE.php | 60 - vendor/nesbot/carbon/src/Carbon/Lang/ht.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ht_HT.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/hu.php | 118 - .../nesbot/carbon/src/Carbon/Lang/hu_HU.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/hy.php | 90 - .../nesbot/carbon/src/Carbon/Lang/hy_AM.php | 24 - vendor/nesbot/carbon/src/Carbon/Lang/i18n.php | 23 - vendor/nesbot/carbon/src/Carbon/Lang/ia.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ia_FR.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/id.php | 92 - .../nesbot/carbon/src/Carbon/Lang/id_ID.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/ig.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ig_NG.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/ii.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/ik.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ik_CA.php | 51 - vendor/nesbot/carbon/src/Carbon/Lang/in.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/is.php | 55 - .../nesbot/carbon/src/Carbon/Lang/is_IS.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/it.php | 111 - .../nesbot/carbon/src/Carbon/Lang/it_CH.php | 20 - .../nesbot/carbon/src/Carbon/Lang/it_IT.php | 16 - .../nesbot/carbon/src/Carbon/Lang/it_SM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/it_VA.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/iu.php | 15 - .../nesbot/carbon/src/Carbon/Lang/iu_CA.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/iw.php | 59 - vendor/nesbot/carbon/src/Carbon/Lang/ja.php | 98 - .../nesbot/carbon/src/Carbon/Lang/ja_JP.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/jgo.php | 14 - vendor/nesbot/carbon/src/Carbon/Lang/jmc.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/jv.php | 71 - vendor/nesbot/carbon/src/Carbon/Lang/ka.php | 204 - .../nesbot/carbon/src/Carbon/Lang/ka_GE.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/kab.php | 15 - .../nesbot/carbon/src/Carbon/Lang/kab_DZ.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/kam.php | 51 - vendor/nesbot/carbon/src/Carbon/Lang/kde.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/kea.php | 49 - vendor/nesbot/carbon/src/Carbon/Lang/khq.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/ki.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/kk.php | 103 - .../nesbot/carbon/src/Carbon/Lang/kk_KZ.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/kkj.php | 14 - vendor/nesbot/carbon/src/Carbon/Lang/kl.php | 15 - .../nesbot/carbon/src/Carbon/Lang/kl_GL.php | 64 - vendor/nesbot/carbon/src/Carbon/Lang/kln.php | 32 - vendor/nesbot/carbon/src/Carbon/Lang/km.php | 71 - .../nesbot/carbon/src/Carbon/Lang/km_KH.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/kn.php | 75 - .../nesbot/carbon/src/Carbon/Lang/kn_IN.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/ko.php | 84 - .../nesbot/carbon/src/Carbon/Lang/ko_KP.php | 14 - .../nesbot/carbon/src/Carbon/Lang/ko_KR.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/kok.php | 15 - .../nesbot/carbon/src/Carbon/Lang/kok_IN.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/ks.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ks_IN.php | 52 - .../src/Carbon/Lang/ks_IN@devanagari.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/ksb.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/ksf.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/ksh.php | 57 - vendor/nesbot/carbon/src/Carbon/Lang/ku.php | 57 - .../nesbot/carbon/src/Carbon/Lang/ku_TR.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/kw.php | 15 - .../nesbot/carbon/src/Carbon/Lang/kw_GB.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/ky.php | 106 - .../nesbot/carbon/src/Carbon/Lang/ky_KG.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/lag.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/lb.php | 85 - .../nesbot/carbon/src/Carbon/Lang/lb_LU.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/lg.php | 15 - .../nesbot/carbon/src/Carbon/Lang/lg_UG.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/li.php | 15 - .../nesbot/carbon/src/Carbon/Lang/li_NL.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/lij.php | 15 - .../nesbot/carbon/src/Carbon/Lang/lij_IT.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/lkt.php | 42 - vendor/nesbot/carbon/src/Carbon/Lang/ln.php | 60 - .../nesbot/carbon/src/Carbon/Lang/ln_AO.php | 17 - .../nesbot/carbon/src/Carbon/Lang/ln_CD.php | 16 - .../nesbot/carbon/src/Carbon/Lang/ln_CF.php | 17 - .../nesbot/carbon/src/Carbon/Lang/ln_CG.php | 17 - vendor/nesbot/carbon/src/Carbon/Lang/lo.php | 62 - .../nesbot/carbon/src/Carbon/Lang/lo_LA.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/lrc.php | 18 - .../nesbot/carbon/src/Carbon/Lang/lrc_IQ.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/lt.php | 132 - .../nesbot/carbon/src/Carbon/Lang/lt_LT.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/lu.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/luo.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/luy.php | 58 - vendor/nesbot/carbon/src/Carbon/Lang/lv.php | 177 - .../nesbot/carbon/src/Carbon/Lang/lv_LV.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/lzh.php | 15 - .../nesbot/carbon/src/Carbon/Lang/lzh_TW.php | 57 - vendor/nesbot/carbon/src/Carbon/Lang/mag.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mag_IN.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/mai.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mai_IN.php | 52 - vendor/nesbot/carbon/src/Carbon/Lang/mas.php | 52 - .../nesbot/carbon/src/Carbon/Lang/mas_TZ.php | 14 - vendor/nesbot/carbon/src/Carbon/Lang/mer.php | 44 - vendor/nesbot/carbon/src/Carbon/Lang/mfe.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mfe_MU.php | 54 - vendor/nesbot/carbon/src/Carbon/Lang/mg.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mg_MG.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/mgh.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/mgo.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/mhr.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mhr_RU.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/mi.php | 66 - .../nesbot/carbon/src/Carbon/Lang/mi_NZ.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/miq.php | 15 - .../nesbot/carbon/src/Carbon/Lang/miq_NI.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/mjw.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mjw_IN.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/mk.php | 110 - .../nesbot/carbon/src/Carbon/Lang/mk_MK.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/ml.php | 76 - .../nesbot/carbon/src/Carbon/Lang/ml_IN.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/mn.php | 116 - .../nesbot/carbon/src/Carbon/Lang/mn_MN.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/mni.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mni_IN.php | 36 - vendor/nesbot/carbon/src/Carbon/Lang/mo.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/mr.php | 86 - .../nesbot/carbon/src/Carbon/Lang/mr_IN.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/ms.php | 104 - .../nesbot/carbon/src/Carbon/Lang/ms_BN.php | 22 - .../nesbot/carbon/src/Carbon/Lang/ms_MY.php | 18 - .../nesbot/carbon/src/Carbon/Lang/ms_SG.php | 22 - vendor/nesbot/carbon/src/Carbon/Lang/mt.php | 65 - .../nesbot/carbon/src/Carbon/Lang/mt_MT.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/mua.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/my.php | 70 - .../nesbot/carbon/src/Carbon/Lang/my_MM.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/mzn.php | 25 - vendor/nesbot/carbon/src/Carbon/Lang/nan.php | 15 - .../nesbot/carbon/src/Carbon/Lang/nan_TW.php | 56 - .../carbon/src/Carbon/Lang/nan_TW@latin.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/naq.php | 52 - vendor/nesbot/carbon/src/Carbon/Lang/nb.php | 84 - .../nesbot/carbon/src/Carbon/Lang/nb_NO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/nb_SJ.php | 18 - vendor/nesbot/carbon/src/Carbon/Lang/nd.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/nds.php | 15 - .../nesbot/carbon/src/Carbon/Lang/nds_DE.php | 60 - .../nesbot/carbon/src/Carbon/Lang/nds_NL.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/ne.php | 82 - .../nesbot/carbon/src/Carbon/Lang/ne_IN.php | 25 - .../nesbot/carbon/src/Carbon/Lang/ne_NP.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/nhn.php | 15 - .../nesbot/carbon/src/Carbon/Lang/nhn_MX.php | 51 - vendor/nesbot/carbon/src/Carbon/Lang/niu.php | 15 - .../nesbot/carbon/src/Carbon/Lang/niu_NU.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/nl.php | 113 - .../nesbot/carbon/src/Carbon/Lang/nl_AW.php | 27 - .../nesbot/carbon/src/Carbon/Lang/nl_BE.php | 27 - .../nesbot/carbon/src/Carbon/Lang/nl_BQ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/nl_CW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/nl_NL.php | 24 - .../nesbot/carbon/src/Carbon/Lang/nl_SR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/nl_SX.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/nmg.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/nn.php | 78 - .../nesbot/carbon/src/Carbon/Lang/nn_NO.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/nnh.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/no.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/nr.php | 15 - .../nesbot/carbon/src/Carbon/Lang/nr_ZA.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/nso.php | 15 - .../nesbot/carbon/src/Carbon/Lang/nso_ZA.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/nus.php | 36 - vendor/nesbot/carbon/src/Carbon/Lang/nyn.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/oc.php | 101 - .../nesbot/carbon/src/Carbon/Lang/oc_FR.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/om.php | 61 - .../nesbot/carbon/src/Carbon/Lang/om_ET.php | 12 - .../nesbot/carbon/src/Carbon/Lang/om_KE.php | 14 - vendor/nesbot/carbon/src/Carbon/Lang/or.php | 15 - .../nesbot/carbon/src/Carbon/Lang/or_IN.php | 51 - vendor/nesbot/carbon/src/Carbon/Lang/os.php | 15 - .../nesbot/carbon/src/Carbon/Lang/os_RU.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/pa.php | 76 - .../nesbot/carbon/src/Carbon/Lang/pa_Arab.php | 26 - .../nesbot/carbon/src/Carbon/Lang/pa_Guru.php | 27 - .../nesbot/carbon/src/Carbon/Lang/pa_IN.php | 19 - .../nesbot/carbon/src/Carbon/Lang/pa_PK.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/pap.php | 39 - .../nesbot/carbon/src/Carbon/Lang/pap_AW.php | 16 - .../nesbot/carbon/src/Carbon/Lang/pap_CW.php | 16 - vendor/nesbot/carbon/src/Carbon/Lang/pl.php | 113 - .../nesbot/carbon/src/Carbon/Lang/pl_PL.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/prg.php | 52 - vendor/nesbot/carbon/src/Carbon/Lang/ps.php | 55 - .../nesbot/carbon/src/Carbon/Lang/ps_AF.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/pt.php | 111 - .../nesbot/carbon/src/Carbon/Lang/pt_AO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_BR.php | 39 - .../nesbot/carbon/src/Carbon/Lang/pt_CH.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_CV.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_GQ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_GW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_LU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_MO.php | 20 - .../nesbot/carbon/src/Carbon/Lang/pt_MZ.php | 14 - .../nesbot/carbon/src/Carbon/Lang/pt_PT.php | 27 - .../nesbot/carbon/src/Carbon/Lang/pt_ST.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_TL.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/qu.php | 22 - .../nesbot/carbon/src/Carbon/Lang/qu_BO.php | 14 - .../nesbot/carbon/src/Carbon/Lang/qu_EC.php | 14 - vendor/nesbot/carbon/src/Carbon/Lang/quz.php | 15 - .../nesbot/carbon/src/Carbon/Lang/quz_PE.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/raj.php | 15 - .../nesbot/carbon/src/Carbon/Lang/raj_IN.php | 48 - vendor/nesbot/carbon/src/Carbon/Lang/rm.php | 51 - vendor/nesbot/carbon/src/Carbon/Lang/rn.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/ro.php | 77 - .../nesbot/carbon/src/Carbon/Lang/ro_MD.php | 21 - .../nesbot/carbon/src/Carbon/Lang/ro_RO.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/rof.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/ru.php | 174 - .../nesbot/carbon/src/Carbon/Lang/ru_BY.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ru_KG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ru_KZ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ru_MD.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ru_RU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ru_UA.php | 20 - vendor/nesbot/carbon/src/Carbon/Lang/rw.php | 15 - .../nesbot/carbon/src/Carbon/Lang/rw_RW.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/rwk.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/sa.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sa_IN.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/sah.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sah_RU.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/saq.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/sat.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sat_IN.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/sbp.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/sc.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sc_IT.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/sd.php | 81 - .../nesbot/carbon/src/Carbon/Lang/sd_IN.php | 26 - .../src/Carbon/Lang/sd_IN@devanagari.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/se.php | 73 - .../nesbot/carbon/src/Carbon/Lang/se_FI.php | 27 - .../nesbot/carbon/src/Carbon/Lang/se_NO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/se_SE.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/seh.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/ses.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/sg.php | 52 - vendor/nesbot/carbon/src/Carbon/Lang/sgs.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sgs_LT.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/sh.php | 58 - vendor/nesbot/carbon/src/Carbon/Lang/shi.php | 57 - .../carbon/src/Carbon/Lang/shi_Latn.php | 33 - .../carbon/src/Carbon/Lang/shi_Tfng.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/shn.php | 15 - .../nesbot/carbon/src/Carbon/Lang/shn_MM.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/shs.php | 15 - .../nesbot/carbon/src/Carbon/Lang/shs_CA.php | 39 - vendor/nesbot/carbon/src/Carbon/Lang/si.php | 78 - .../nesbot/carbon/src/Carbon/Lang/si_LK.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/sid.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sid_ET.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/sk.php | 160 - .../nesbot/carbon/src/Carbon/Lang/sk_SK.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/sl.php | 129 - .../nesbot/carbon/src/Carbon/Lang/sl_SI.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/sm.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sm_WS.php | 54 - vendor/nesbot/carbon/src/Carbon/Lang/smn.php | 57 - vendor/nesbot/carbon/src/Carbon/Lang/sn.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/so.php | 74 - .../nesbot/carbon/src/Carbon/Lang/so_DJ.php | 20 - .../nesbot/carbon/src/Carbon/Lang/so_ET.php | 16 - .../nesbot/carbon/src/Carbon/Lang/so_KE.php | 16 - .../nesbot/carbon/src/Carbon/Lang/so_SO.php | 16 - vendor/nesbot/carbon/src/Carbon/Lang/sq.php | 79 - .../nesbot/carbon/src/Carbon/Lang/sq_AL.php | 12 - .../nesbot/carbon/src/Carbon/Lang/sq_MK.php | 19 - .../nesbot/carbon/src/Carbon/Lang/sq_XK.php | 19 - vendor/nesbot/carbon/src/Carbon/Lang/sr.php | 98 - .../nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php | 97 - .../carbon/src/Carbon/Lang/sr_Cyrl_BA.php | 33 - .../carbon/src/Carbon/Lang/sr_Cyrl_ME.php | 103 - .../carbon/src/Carbon/Lang/sr_Cyrl_XK.php | 24 - .../nesbot/carbon/src/Carbon/Lang/sr_Latn.php | 12 - .../carbon/src/Carbon/Lang/sr_Latn_BA.php | 33 - .../carbon/src/Carbon/Lang/sr_Latn_ME.php | 61 - .../carbon/src/Carbon/Lang/sr_Latn_XK.php | 24 - .../nesbot/carbon/src/Carbon/Lang/sr_ME.php | 12 - .../nesbot/carbon/src/Carbon/Lang/sr_RS.php | 16 - .../carbon/src/Carbon/Lang/sr_RS@latin.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/ss.php | 78 - .../nesbot/carbon/src/Carbon/Lang/ss_ZA.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/st.php | 15 - .../nesbot/carbon/src/Carbon/Lang/st_ZA.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/sv.php | 87 - .../nesbot/carbon/src/Carbon/Lang/sv_AX.php | 19 - .../nesbot/carbon/src/Carbon/Lang/sv_FI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/sv_SE.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/sw.php | 74 - .../nesbot/carbon/src/Carbon/Lang/sw_CD.php | 17 - .../nesbot/carbon/src/Carbon/Lang/sw_KE.php | 27 - .../nesbot/carbon/src/Carbon/Lang/sw_TZ.php | 28 - .../nesbot/carbon/src/Carbon/Lang/sw_UG.php | 17 - vendor/nesbot/carbon/src/Carbon/Lang/szl.php | 15 - .../nesbot/carbon/src/Carbon/Lang/szl_PL.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/ta.php | 97 - .../nesbot/carbon/src/Carbon/Lang/ta_IN.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ta_LK.php | 28 - .../nesbot/carbon/src/Carbon/Lang/ta_MY.php | 28 - .../nesbot/carbon/src/Carbon/Lang/ta_SG.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/tcy.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tcy_IN.php | 40 - vendor/nesbot/carbon/src/Carbon/Lang/te.php | 89 - .../nesbot/carbon/src/Carbon/Lang/te_IN.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/teo.php | 28 - .../nesbot/carbon/src/Carbon/Lang/teo_KE.php | 14 - vendor/nesbot/carbon/src/Carbon/Lang/tet.php | 64 - vendor/nesbot/carbon/src/Carbon/Lang/tg.php | 104 - .../nesbot/carbon/src/Carbon/Lang/tg_TJ.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/th.php | 73 - .../nesbot/carbon/src/Carbon/Lang/th_TH.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/the.php | 15 - .../nesbot/carbon/src/Carbon/Lang/the_NP.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/ti.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ti_ER.php | 56 - .../nesbot/carbon/src/Carbon/Lang/ti_ET.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/tig.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tig_ER.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/tk.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tk_TM.php | 67 - vendor/nesbot/carbon/src/Carbon/Lang/tl.php | 61 - .../nesbot/carbon/src/Carbon/Lang/tl_PH.php | 18 - vendor/nesbot/carbon/src/Carbon/Lang/tlh.php | 72 - vendor/nesbot/carbon/src/Carbon/Lang/tn.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tn_ZA.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/to.php | 15 - .../nesbot/carbon/src/Carbon/Lang/to_TO.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/tpi.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tpi_PG.php | 56 - vendor/nesbot/carbon/src/Carbon/Lang/tr.php | 121 - .../nesbot/carbon/src/Carbon/Lang/tr_CY.php | 23 - .../nesbot/carbon/src/Carbon/Lang/tr_TR.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/ts.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ts_ZA.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/tt.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tt_RU.php | 39 - .../carbon/src/Carbon/Lang/tt_RU@iqtelif.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/twq.php | 14 - vendor/nesbot/carbon/src/Carbon/Lang/tzl.php | 65 - vendor/nesbot/carbon/src/Carbon/Lang/tzm.php | 57 - .../carbon/src/Carbon/Lang/tzm_Latn.php | 64 - vendor/nesbot/carbon/src/Carbon/Lang/ug.php | 84 - .../nesbot/carbon/src/Carbon/Lang/ug_CN.php | 17 - vendor/nesbot/carbon/src/Carbon/Lang/uk.php | 190 - .../nesbot/carbon/src/Carbon/Lang/uk_UA.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/unm.php | 15 - .../nesbot/carbon/src/Carbon/Lang/unm_US.php | 58 - vendor/nesbot/carbon/src/Carbon/Lang/ur.php | 94 - .../nesbot/carbon/src/Carbon/Lang/ur_IN.php | 26 - .../nesbot/carbon/src/Carbon/Lang/ur_PK.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/uz.php | 85 - .../nesbot/carbon/src/Carbon/Lang/uz_Arab.php | 28 - .../nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php | 20 - .../nesbot/carbon/src/Carbon/Lang/uz_Latn.php | 74 - .../nesbot/carbon/src/Carbon/Lang/uz_UZ.php | 27 - .../carbon/src/Carbon/Lang/uz_UZ@cyrillic.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/vai.php | 35 - .../carbon/src/Carbon/Lang/vai_Latn.php | 27 - .../carbon/src/Carbon/Lang/vai_Vaii.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/ve.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ve_ZA.php | 50 - vendor/nesbot/carbon/src/Carbon/Lang/vi.php | 76 - .../nesbot/carbon/src/Carbon/Lang/vi_VN.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/vo.php | 52 - vendor/nesbot/carbon/src/Carbon/Lang/vun.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/wa.php | 15 - .../nesbot/carbon/src/Carbon/Lang/wa_BE.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/wae.php | 15 - .../nesbot/carbon/src/Carbon/Lang/wae_CH.php | 31 - vendor/nesbot/carbon/src/Carbon/Lang/wal.php | 15 - .../nesbot/carbon/src/Carbon/Lang/wal_ET.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/wo.php | 15 - .../nesbot/carbon/src/Carbon/Lang/wo_SN.php | 39 - vendor/nesbot/carbon/src/Carbon/Lang/xh.php | 15 - .../nesbot/carbon/src/Carbon/Lang/xh_ZA.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/xog.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/yav.php | 28 - vendor/nesbot/carbon/src/Carbon/Lang/yi.php | 15 - .../nesbot/carbon/src/Carbon/Lang/yi_US.php | 55 - vendor/nesbot/carbon/src/Carbon/Lang/yo.php | 65 - .../nesbot/carbon/src/Carbon/Lang/yo_BJ.php | 28 - .../nesbot/carbon/src/Carbon/Lang/yo_NG.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/yue.php | 15 - .../nesbot/carbon/src/Carbon/Lang/yue_HK.php | 28 - .../carbon/src/Carbon/Lang/yue_Hans.php | 12 - .../carbon/src/Carbon/Lang/yue_Hant.php | 12 - vendor/nesbot/carbon/src/Carbon/Lang/yuw.php | 15 - .../nesbot/carbon/src/Carbon/Lang/yuw_PG.php | 27 - vendor/nesbot/carbon/src/Carbon/Lang/zgh.php | 80 - vendor/nesbot/carbon/src/Carbon/Lang/zh.php | 29 - .../nesbot/carbon/src/Carbon/Lang/zh_CN.php | 33 - .../nesbot/carbon/src/Carbon/Lang/zh_HK.php | 12 - .../nesbot/carbon/src/Carbon/Lang/zh_Hans.php | 102 - .../carbon/src/Carbon/Lang/zh_Hans_HK.php | 12 - .../carbon/src/Carbon/Lang/zh_Hans_MO.php | 12 - .../carbon/src/Carbon/Lang/zh_Hans_SG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/zh_Hant.php | 104 - .../carbon/src/Carbon/Lang/zh_Hant_HK.php | 12 - .../carbon/src/Carbon/Lang/zh_Hant_MO.php | 12 - .../carbon/src/Carbon/Lang/zh_Hant_TW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/zh_MO.php | 21 - .../nesbot/carbon/src/Carbon/Lang/zh_SG.php | 26 - .../nesbot/carbon/src/Carbon/Lang/zh_TW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/zh_YUE.php | 20 - vendor/nesbot/carbon/src/Carbon/Lang/zu.php | 15 - .../nesbot/carbon/src/Carbon/Lang/zu_ZA.php | 55 - vendor/nesbot/carbon/src/Carbon/Language.php | 271 - .../src/Carbon/Laravel/ServiceProvider.php | 129 - .../carbon/src/Carbon/List/languages.php | 1241 ----- .../nesbot/carbon/src/Carbon/List/regions.php | 292 - .../MessageFormatterMapper.php | 46 - vendor/nesbot/carbon/src/Carbon/Month.php | 79 - .../src/Carbon/PHPStan/MacroExtension.php | 137 - .../Carbon/PHPStan/MacroMethodReflection.php | 124 - .../carbon/src/Carbon/Traits/Boundaries.php | 469 -- .../nesbot/carbon/src/Carbon/Traits/Cast.php | 48 - .../carbon/src/Carbon/Traits/Comparison.php | 1333 ----- .../carbon/src/Carbon/Traits/Converter.php | 556 -- .../carbon/src/Carbon/Traits/Creator.php | 938 ---- .../nesbot/carbon/src/Carbon/Traits/Date.php | 2971 ---------- .../Traits/DeprecatedPeriodProperties.php | 83 - .../carbon/src/Carbon/Traits/Difference.php | 855 --- .../src/Carbon/Traits/IntervalRounding.php | 59 - .../carbon/src/Carbon/Traits/IntervalStep.php | 94 - .../carbon/src/Carbon/Traits/LocalFactory.php | 67 - .../carbon/src/Carbon/Traits/Localization.php | 728 --- .../nesbot/carbon/src/Carbon/Traits/Macro.php | 109 - .../src/Carbon/Traits/MagicParameter.php | 35 - .../nesbot/carbon/src/Carbon/Traits/Mixin.php | 208 - .../carbon/src/Carbon/Traits/Modifiers.php | 476 -- .../carbon/src/Carbon/Traits/Mutability.php | 69 - .../Carbon/Traits/ObjectInitialisation.php | 24 - .../carbon/src/Carbon/Traits/Options.php | 213 - .../carbon/src/Carbon/Traits/Rounding.php | 226 - .../src/Carbon/Traits/Serialization.php | 318 -- .../src/Carbon/Traits/StaticLocalization.php | 81 - .../src/Carbon/Traits/StaticOptions.php | 164 - .../nesbot/carbon/src/Carbon/Traits/Test.php | 185 - .../carbon/src/Carbon/Traits/Timestamp.php | 191 - .../src/Carbon/Traits/ToStringFormat.php | 52 - .../nesbot/carbon/src/Carbon/Traits/Units.php | 469 -- .../nesbot/carbon/src/Carbon/Traits/Week.php | 223 - .../nesbot/carbon/src/Carbon/Translator.php | 34 - .../carbon/src/Carbon/TranslatorImmutable.php | 100 - .../Carbon/TranslatorStrongTypeInterface.php | 24 - vendor/nesbot/carbon/src/Carbon/Unit.php | 119 - vendor/nesbot/carbon/src/Carbon/WeekDay.php | 68 - .../nesbot/carbon/src/Carbon/WrapperClock.php | 187 - vendor/nikic/fast-route/.gitignore | 5 - vendor/nikic/fast-route/.hhconfig | 1 - vendor/nikic/fast-route/.travis.yml | 20 - vendor/nikic/fast-route/FastRoute.hhi | 126 - vendor/nikic/fast-route/LICENSE | 31 - vendor/nikic/fast-route/README.md | 313 -- vendor/nikic/fast-route/composer.json | 24 - vendor/nikic/fast-route/phpunit.xml | 24 - vendor/nikic/fast-route/psalm.xml | 28 - .../fast-route/src/BadRouteException.php | 7 - vendor/nikic/fast-route/src/DataGenerator.php | 26 - .../src/DataGenerator/CharCountBased.php | 31 - .../src/DataGenerator/GroupCountBased.php | 30 - .../src/DataGenerator/GroupPosBased.php | 27 - .../src/DataGenerator/MarkBased.php | 27 - .../src/DataGenerator/RegexBasedAbstract.php | 186 - vendor/nikic/fast-route/src/Dispatcher.php | 26 - .../src/Dispatcher/CharCountBased.php | 31 - .../src/Dispatcher/GroupCountBased.php | 31 - .../src/Dispatcher/GroupPosBased.php | 33 - .../fast-route/src/Dispatcher/MarkBased.php | 31 - .../src/Dispatcher/RegexBasedAbstract.php | 88 - vendor/nikic/fast-route/src/Route.php | 47 - .../nikic/fast-route/src/RouteCollector.php | 152 - vendor/nikic/fast-route/src/RouteParser.php | 37 - .../nikic/fast-route/src/RouteParser/Std.php | 87 - vendor/nikic/fast-route/src/bootstrap.php | 12 - vendor/nikic/fast-route/src/functions.php | 74 - .../test/Dispatcher/CharCountBasedTest.php | 16 - .../test/Dispatcher/DispatcherTest.php | 581 -- .../test/Dispatcher/GroupCountBasedTest.php | 16 - .../test/Dispatcher/GroupPosBasedTest.php | 16 - .../test/Dispatcher/MarkBasedTest.php | 24 - .../HackTypechecker/HackTypecheckerTest.php | 44 - .../HackTypechecker/fixtures/all_options.php | 29 - .../fixtures/empty_options.php | 11 - .../HackTypechecker/fixtures/no_options.php | 11 - .../fast-route/test/RouteCollectorTest.php | 108 - .../fast-route/test/RouteParser/StdTest.php | 154 - vendor/nikic/fast-route/test/bootstrap.php | 11 - vendor/psr/clock/CHANGELOG.md | 11 - vendor/psr/clock/LICENSE | 19 - vendor/psr/clock/README.md | 61 - vendor/psr/clock/composer.json | 21 - vendor/psr/clock/src/ClockInterface.php | 13 - vendor/psr/container/.gitignore | 3 - vendor/psr/container/LICENSE | 21 - vendor/psr/container/README.md | 13 - vendor/psr/container/composer.json | 27 - .../src/ContainerExceptionInterface.php | 12 - .../psr/container/src/ContainerInterface.php | 36 - .../src/NotFoundExceptionInterface.php | 10 - vendor/psr/log/LICENSE | 19 - vendor/psr/log/README.md | 58 - vendor/psr/log/composer.json | 26 - vendor/psr/log/src/AbstractLogger.php | 15 - .../psr/log/src/InvalidArgumentException.php | 7 - vendor/psr/log/src/LogLevel.php | 18 - vendor/psr/log/src/LoggerAwareInterface.php | 14 - vendor/psr/log/src/LoggerAwareTrait.php | 22 - vendor/psr/log/src/LoggerInterface.php | 98 - vendor/psr/log/src/LoggerTrait.php | 98 - vendor/psr/log/src/NullLogger.php | 26 - vendor/psr/simple-cache/.editorconfig | 12 - vendor/psr/simple-cache/LICENSE.md | 21 - vendor/psr/simple-cache/README.md | 8 - vendor/psr/simple-cache/composer.json | 25 - .../psr/simple-cache/src/CacheException.php | 10 - .../psr/simple-cache/src/CacheInterface.php | 114 - .../src/InvalidArgumentException.php | 13 - vendor/symfony/clock/CHANGELOG.md | 25 - vendor/symfony/clock/Clock.php | 89 - vendor/symfony/clock/ClockAwareTrait.php | 38 - vendor/symfony/clock/ClockInterface.php | 24 - vendor/symfony/clock/DatePoint.php | 169 - vendor/symfony/clock/LICENSE | 19 - vendor/symfony/clock/MockClock.php | 98 - vendor/symfony/clock/MonotonicClock.php | 93 - vendor/symfony/clock/NativeClock.php | 67 - vendor/symfony/clock/README.md | 47 - vendor/symfony/clock/Resources/now.php | 28 - .../clock/Test/ClockSensitiveTrait.php | 77 - vendor/symfony/clock/composer.json | 34 - .../deprecation-contracts/CHANGELOG.md | 5 - vendor/symfony/deprecation-contracts/LICENSE | 19 - .../symfony/deprecation-contracts/README.md | 26 - .../deprecation-contracts/composer.json | 35 - .../deprecation-contracts/function.php | 27 - vendor/symfony/polyfill-mbstring/LICENSE | 19 - vendor/symfony/polyfill-mbstring/Mbstring.php | 1045 ---- vendor/symfony/polyfill-mbstring/README.md | 13 - .../Resources/unidata/caseFolding.php | 119 - .../Resources/unidata/lowerCase.php | 1397 ----- .../Resources/unidata/titleCaseRegexp.php | 5 - .../Resources/unidata/upperCase.php | 1489 ----- .../symfony/polyfill-mbstring/bootstrap.php | 172 - .../symfony/polyfill-mbstring/bootstrap80.php | 167 - .../symfony/polyfill-mbstring/composer.json | 38 - vendor/symfony/polyfill-php83/LICENSE | 19 - vendor/symfony/polyfill-php83/Php83.php | 197 - vendor/symfony/polyfill-php83/README.md | 22 - .../Resources/stubs/DateError.php | 16 - .../Resources/stubs/DateException.php | 16 - .../stubs/DateInvalidOperationException.php | 16 - .../stubs/DateInvalidTimeZoneException.php | 16 - .../DateMalformedIntervalStringException.php | 16 - .../DateMalformedPeriodStringException.php | 16 - .../stubs/DateMalformedStringException.php | 16 - .../Resources/stubs/DateObjectError.php | 16 - .../Resources/stubs/DateRangeError.php | 16 - .../Resources/stubs/Override.php | 20 - .../Resources/stubs/SQLite3Exception.php | 16 - vendor/symfony/polyfill-php83/bootstrap.php | 50 - vendor/symfony/polyfill-php83/bootstrap81.php | 22 - vendor/symfony/polyfill-php83/composer.json | 33 - .../translation-contracts/CHANGELOG.md | 5 - vendor/symfony/translation-contracts/LICENSE | 19 - .../LocaleAwareInterface.php | 29 - .../symfony/translation-contracts/README.md | 9 - .../Test/TranslatorTest.php | 385 -- .../TranslatableInterface.php | 20 - .../TranslatorInterface.php | 68 - .../translation-contracts/TranslatorTrait.php | 225 - .../translation-contracts/composer.json | 37 - vendor/symfony/translation/CHANGELOG.md | 230 - .../Catalogue/AbstractOperation.php | 183 - .../translation/Catalogue/MergeOperation.php | 69 - .../Catalogue/OperationInterface.php | 61 - .../translation/Catalogue/TargetOperation.php | 83 - .../CatalogueMetadataAwareInterface.php | 44 - .../Command/TranslationLintCommand.php | 129 - .../Command/TranslationPullCommand.php | 176 - .../Command/TranslationPushCommand.php | 176 - .../translation/Command/TranslationTrait.php | 77 - .../translation/Command/XliffLintCommand.php | 288 - .../TranslationDataCollector.php | 146 - .../translation/DataCollectorTranslator.php | 130 - .../DataCollectorTranslatorPass.php | 36 - .../LoggingTranslatorPass.php | 59 - .../TranslationDumperPass.php | 35 - .../TranslationExtractorPass.php | 40 - .../DependencyInjection/TranslatorPass.php | 91 - .../TranslatorPathsPass.php | 142 - .../translation/Dumper/CsvFileDumper.php | 54 - .../translation/Dumper/DumperInterface.php | 30 - .../symfony/translation/Dumper/FileDumper.php | 101 - .../translation/Dumper/IcuResFileDumper.php | 95 - .../translation/Dumper/IniFileDumper.php | 39 - .../translation/Dumper/JsonFileDumper.php | 34 - .../translation/Dumper/MoFileDumper.php | 73 - .../translation/Dumper/PhpFileDumper.php | 32 - .../translation/Dumper/PoFileDumper.php | 131 - .../translation/Dumper/QtFileDumper.php | 55 - .../translation/Dumper/XliffFileDumper.php | 227 - .../translation/Dumper/YamlFileDumper.php | 54 - .../Exception/ExceptionInterface.php | 21 - .../Exception/IncompleteDsnException.php | 24 - .../Exception/InvalidArgumentException.php | 21 - .../Exception/InvalidResourceException.php | 21 - .../translation/Exception/LogicException.php | 21 - .../MissingRequiredOptionException.php | 25 - .../Exception/NotFoundResourceException.php | 21 - .../Exception/ProviderException.php | 43 - .../Exception/ProviderExceptionInterface.php | 23 - .../Exception/RuntimeException.php | 21 - .../Exception/UnsupportedSchemeException.php | 58 - .../Extractor/AbstractFileExtractor.php | 61 - .../translation/Extractor/ChainExtractor.php | 51 - .../Extractor/ExtractorInterface.php | 39 - .../translation/Extractor/PhpAstExtractor.php | 85 - .../Extractor/Visitor/AbstractVisitor.php | 135 - .../Extractor/Visitor/ConstraintVisitor.php | 112 - .../Extractor/Visitor/TransMethodVisitor.php | 65 - .../Visitor/TranslatableMessageVisitor.php | 65 - .../translation/Formatter/IntlFormatter.php | 57 - .../Formatter/IntlFormatterInterface.php | 27 - .../Formatter/MessageFormatter.php | 46 - .../Formatter/MessageFormatterInterface.php | 28 - .../translation/IdentityTranslator.php | 26 - vendor/symfony/translation/LICENSE | 19 - .../translation/Loader/ArrayLoader.php | 57 - .../translation/Loader/CsvFileLoader.php | 69 - .../symfony/translation/Loader/FileLoader.php | 57 - .../translation/Loader/IcuDatFileLoader.php | 58 - .../translation/Loader/IcuResFileLoader.php | 86 - .../translation/Loader/IniFileLoader.php | 25 - .../translation/Loader/JsonFileLoader.php | 51 - .../translation/Loader/LoaderInterface.php | 32 - .../translation/Loader/MoFileLoader.php | 138 - .../translation/Loader/PhpFileLoader.php | 35 - .../translation/Loader/PoFileLoader.php | 147 - .../translation/Loader/QtFileLoader.php | 78 - .../translation/Loader/XliffFileLoader.php | 248 - .../translation/Loader/YamlFileLoader.php | 51 - vendor/symfony/translation/LocaleSwitcher.php | 83 - .../symfony/translation/LoggingTranslator.php | 98 - .../symfony/translation/MessageCatalogue.php | 306 - .../translation/MessageCatalogueInterface.php | 122 - .../translation/MetadataAwareInterface.php | 44 - .../Provider/AbstractProviderFactory.php | 37 - vendor/symfony/translation/Provider/Dsn.php | 110 - .../Provider/FilteringProvider.php | 58 - .../translation/Provider/NullProvider.php | 39 - .../Provider/NullProviderFactory.php | 34 - .../Provider/ProviderFactoryInterface.php | 26 - .../Provider/ProviderInterface.php | 30 - .../TranslationProviderCollection.php | 57 - .../TranslationProviderCollectionFactory.php | 54 - .../PseudoLocalizationTranslator.php | 385 -- vendor/symfony/translation/README.md | 46 - .../translation/Reader/TranslationReader.php | 59 - .../Reader/TranslationReaderInterface.php | 27 - .../Resources/bin/translation-status.php | 274 - .../translation/Resources/data/parents.json | 142 - .../translation/Resources/functions.php | 22 - .../schemas/xliff-core-1.2-transitional.xsd | 2261 -------- .../Resources/schemas/xliff-core-2.0.xsd | 411 -- .../translation/Resources/schemas/xml.xsd | 309 -- .../Test/AbstractProviderFactoryTestCase.php | 79 - .../Test/IncompleteDsnTestTrait.php | 42 - .../Test/ProviderFactoryTestCase.php | 85 - .../translation/Test/ProviderTestCase.php | 84 - .../translation/TranslatableMessage.php | 56 - vendor/symfony/translation/Translator.php | 445 -- vendor/symfony/translation/TranslatorBag.php | 102 - .../translation/TranslatorBagInterface.php | 36 - .../translation/Util/ArrayConverter.php | 142 - .../symfony/translation/Util/XliffUtils.php | 191 - .../translation/Writer/TranslationWriter.php | 71 - .../Writer/TranslationWriterInterface.php | 33 - vendor/symfony/translation/composer.json | 60 - vendor/voku/portable-ascii/.deepsource.toml | 4 - vendor/voku/portable-ascii/CHANGELOG.md | 210 - vendor/voku/portable-ascii/LICENSE.txt | 19 - vendor/voku/portable-ascii/README.md | 451 -- vendor/voku/portable-ascii/composer.json | 37 - .../portable-ascii/src/voku/helper/ASCII.php | 1424 ----- .../voku/helper/data/ascii_by_languages.php | 2950 ---------- .../helper/data/ascii_extras_by_languages.php | 759 --- .../helper/data/ascii_language_max_key.php | 65 - .../src/voku/helper/data/ascii_ord.php | 1 - .../src/voku/helper/data/x000.php | 16 - .../src/voku/helper/data/x001.php | 1 - .../src/voku/helper/data/x002.php | 1 - .../src/voku/helper/data/x003.php | 1 - .../src/voku/helper/data/x004.php | 1 - .../src/voku/helper/data/x005.php | 1 - .../src/voku/helper/data/x006.php | 1 - .../src/voku/helper/data/x007.php | 1 - .../src/voku/helper/data/x009.php | 1 - .../src/voku/helper/data/x00a.php | 1 - .../src/voku/helper/data/x00b.php | 1 - .../src/voku/helper/data/x00c.php | 1 - .../src/voku/helper/data/x00d.php | 1 - .../src/voku/helper/data/x00e.php | 1 - .../src/voku/helper/data/x00f.php | 1 - .../src/voku/helper/data/x010.php | 1 - .../src/voku/helper/data/x011.php | 1 - .../src/voku/helper/data/x012.php | 1 - .../src/voku/helper/data/x013.php | 1 - .../src/voku/helper/data/x014.php | 1 - .../src/voku/helper/data/x015.php | 1 - .../src/voku/helper/data/x016.php | 1 - .../src/voku/helper/data/x017.php | 1 - .../src/voku/helper/data/x018.php | 1 - .../src/voku/helper/data/x01d.php | 1 - .../src/voku/helper/data/x01e.php | 1 - .../src/voku/helper/data/x01f.php | 1 - .../src/voku/helper/data/x020.php | 4 - .../src/voku/helper/data/x021.php | 1 - .../src/voku/helper/data/x022.php | 1 - .../src/voku/helper/data/x023.php | 1 - .../src/voku/helper/data/x024.php | 1 - .../src/voku/helper/data/x025.php | 1 - .../src/voku/helper/data/x026.php | 1 - .../src/voku/helper/data/x027.php | 1 - .../src/voku/helper/data/x028.php | 1 - .../src/voku/helper/data/x029.php | 1 - .../src/voku/helper/data/x02a.php | 1 - .../src/voku/helper/data/x02c.php | 1 - .../src/voku/helper/data/x02e.php | 1 - .../src/voku/helper/data/x02f.php | 1 - .../src/voku/helper/data/x030.php | 9 - .../src/voku/helper/data/x031.php | 1 - .../src/voku/helper/data/x032.php | 1 - .../src/voku/helper/data/x033.php | 1 - .../src/voku/helper/data/x04d.php | 1 - .../src/voku/helper/data/x04e.php | 1 - .../src/voku/helper/data/x04f.php | 1 - .../src/voku/helper/data/x050.php | 1 - .../src/voku/helper/data/x051.php | 1 - .../src/voku/helper/data/x052.php | 1 - .../src/voku/helper/data/x053.php | 1 - .../src/voku/helper/data/x054.php | 1 - .../src/voku/helper/data/x055.php | 1 - .../src/voku/helper/data/x056.php | 1 - .../src/voku/helper/data/x057.php | 1 - .../src/voku/helper/data/x058.php | 1 - .../src/voku/helper/data/x059.php | 1 - .../src/voku/helper/data/x05a.php | 1 - .../src/voku/helper/data/x05b.php | 1 - .../src/voku/helper/data/x05c.php | 1 - .../src/voku/helper/data/x05d.php | 1 - .../src/voku/helper/data/x05e.php | 1 - .../src/voku/helper/data/x05f.php | 1 - .../src/voku/helper/data/x060.php | 1 - .../src/voku/helper/data/x061.php | 1 - .../src/voku/helper/data/x062.php | 1 - .../src/voku/helper/data/x063.php | 1 - .../src/voku/helper/data/x064.php | 1 - .../src/voku/helper/data/x065.php | 1 - .../src/voku/helper/data/x066.php | 1 - .../src/voku/helper/data/x067.php | 1 - .../src/voku/helper/data/x068.php | 1 - .../src/voku/helper/data/x069.php | 1 - .../src/voku/helper/data/x06a.php | 1 - .../src/voku/helper/data/x06b.php | 1 - .../src/voku/helper/data/x06c.php | 1 - .../src/voku/helper/data/x06d.php | 1 - .../src/voku/helper/data/x06e.php | 1 - .../src/voku/helper/data/x06f.php | 1 - .../src/voku/helper/data/x070.php | 1 - .../src/voku/helper/data/x071.php | 1 - .../src/voku/helper/data/x072.php | 1 - .../src/voku/helper/data/x073.php | 1 - .../src/voku/helper/data/x074.php | 1 - .../src/voku/helper/data/x075.php | 1 - .../src/voku/helper/data/x076.php | 1 - .../src/voku/helper/data/x077.php | 1 - .../src/voku/helper/data/x078.php | 1 - .../src/voku/helper/data/x079.php | 1 - .../src/voku/helper/data/x07a.php | 1 - .../src/voku/helper/data/x07b.php | 1 - .../src/voku/helper/data/x07c.php | 1 - .../src/voku/helper/data/x07d.php | 1 - .../src/voku/helper/data/x07e.php | 1 - .../src/voku/helper/data/x07f.php | 1 - .../src/voku/helper/data/x080.php | 1 - .../src/voku/helper/data/x081.php | 1 - .../src/voku/helper/data/x082.php | 1 - .../src/voku/helper/data/x083.php | 1 - .../src/voku/helper/data/x084.php | 1 - .../src/voku/helper/data/x085.php | 1 - .../src/voku/helper/data/x086.php | 1 - .../src/voku/helper/data/x087.php | 1 - .../src/voku/helper/data/x088.php | 1 - .../src/voku/helper/data/x089.php | 1 - .../src/voku/helper/data/x08a.php | 1 - .../src/voku/helper/data/x08b.php | 1 - .../src/voku/helper/data/x08c.php | 1 - .../src/voku/helper/data/x08d.php | 1 - .../src/voku/helper/data/x08e.php | 1 - .../src/voku/helper/data/x08f.php | 1 - .../src/voku/helper/data/x090.php | 1 - .../src/voku/helper/data/x091.php | 1 - .../src/voku/helper/data/x092.php | 1 - .../src/voku/helper/data/x093.php | 1 - .../src/voku/helper/data/x094.php | 1 - .../src/voku/helper/data/x095.php | 1 - .../src/voku/helper/data/x096.php | 1 - .../src/voku/helper/data/x097.php | 1 - .../src/voku/helper/data/x098.php | 1 - .../src/voku/helper/data/x099.php | 1 - .../src/voku/helper/data/x09a.php | 1 - .../src/voku/helper/data/x09b.php | 1 - .../src/voku/helper/data/x09c.php | 1 - .../src/voku/helper/data/x09d.php | 1 - .../src/voku/helper/data/x09e.php | 1 - .../src/voku/helper/data/x09f.php | 1 - .../src/voku/helper/data/x0a0.php | 1 - .../src/voku/helper/data/x0a1.php | 1 - .../src/voku/helper/data/x0a2.php | 1 - .../src/voku/helper/data/x0a3.php | 1 - .../src/voku/helper/data/x0a4.php | 1 - .../src/voku/helper/data/x0ac.php | 1 - .../src/voku/helper/data/x0ad.php | 1 - .../src/voku/helper/data/x0ae.php | 1 - .../src/voku/helper/data/x0af.php | 1 - .../src/voku/helper/data/x0b0.php | 1 - .../src/voku/helper/data/x0b1.php | 1 - .../src/voku/helper/data/x0b2.php | 1 - .../src/voku/helper/data/x0b3.php | 1 - .../src/voku/helper/data/x0b4.php | 1 - .../src/voku/helper/data/x0b5.php | 1 - .../src/voku/helper/data/x0b6.php | 1 - .../src/voku/helper/data/x0b7.php | 1 - .../src/voku/helper/data/x0b8.php | 1 - .../src/voku/helper/data/x0b9.php | 1 - .../src/voku/helper/data/x0ba.php | 1 - .../src/voku/helper/data/x0bb.php | 1 - .../src/voku/helper/data/x0bc.php | 1 - .../src/voku/helper/data/x0bd.php | 1 - .../src/voku/helper/data/x0be.php | 1 - .../src/voku/helper/data/x0bf.php | 1 - .../src/voku/helper/data/x0c0.php | 1 - .../src/voku/helper/data/x0c1.php | 1 - .../src/voku/helper/data/x0c2.php | 1 - .../src/voku/helper/data/x0c3.php | 1 - .../src/voku/helper/data/x0c4.php | 1 - .../src/voku/helper/data/x0c5.php | 1 - .../src/voku/helper/data/x0c6.php | 1 - .../src/voku/helper/data/x0c7.php | 1 - .../src/voku/helper/data/x0c8.php | 1 - .../src/voku/helper/data/x0c9.php | 1 - .../src/voku/helper/data/x0ca.php | 1 - .../src/voku/helper/data/x0cb.php | 1 - .../src/voku/helper/data/x0cc.php | 1 - .../src/voku/helper/data/x0cd.php | 1 - .../src/voku/helper/data/x0ce.php | 1 - .../src/voku/helper/data/x0cf.php | 1 - .../src/voku/helper/data/x0d0.php | 1 - .../src/voku/helper/data/x0d1.php | 1 - .../src/voku/helper/data/x0d2.php | 1 - .../src/voku/helper/data/x0d3.php | 1 - .../src/voku/helper/data/x0d4.php | 1 - .../src/voku/helper/data/x0d5.php | 1 - .../src/voku/helper/data/x0d6.php | 1 - .../src/voku/helper/data/x0d7.php | 1 - .../src/voku/helper/data/x0f9.php | 1 - .../src/voku/helper/data/x0fa.php | 1 - .../src/voku/helper/data/x0fb.php | 1 - .../src/voku/helper/data/x0fc.php | 1 - .../src/voku/helper/data/x0fd.php | 1 - .../src/voku/helper/data/x0fe.php | 1 - .../src/voku/helper/data/x0ff.php | 1 - .../src/voku/helper/data/x1d4.php | 1 - .../src/voku/helper/data/x1d5.php | 4 - .../src/voku/helper/data/x1d6.php | 1 - .../src/voku/helper/data/x1d7.php | 1 - .../src/voku/helper/data/x1f1.php | 2 - vendor/webman/database/LICENSE | 21 - vendor/webman/database/README.md | 2 - vendor/webman/database/composer.json | 19 - .../webman/database/src/DatabaseManager.php | 82 - vendor/webman/database/src/Initializer.php | 113 - vendor/webman/database/src/Install.php | 91 - vendor/webman/database/src/Manager.php | 22 - .../webman/database/src/config/database.php | 30 - vendor/webman/database/src/support/Db.php | 38 - vendor/webman/database/src/support/Model.php | 264 - vendor/workerman/coroutine/.gitignore | 5 - vendor/workerman/coroutine/LICENSE | 21 - vendor/workerman/coroutine/README.md | 3 - vendor/workerman/coroutine/composer.json | 31 - vendor/workerman/coroutine/src/Barrier.php | 65 - .../src/Barrier/BarrierInterface.php | 39 - .../workerman/coroutine/src/Barrier/Fiber.php | 85 - .../coroutine/src/Barrier/Swoole.php | 39 - .../workerman/coroutine/src/Barrier/Swow.php | 39 - vendor/workerman/coroutine/src/Channel.php | 114 - .../src/Channel/ChannelInterface.php | 76 - .../workerman/coroutine/src/Channel/Fiber.php | 252 - .../coroutine/src/Channel/Memory.php | 69 - .../coroutine/src/Channel/Swoole.php | 98 - .../workerman/coroutine/src/Channel/Swow.php | 108 - vendor/workerman/coroutine/src/Context.php | 90 - .../src/Context/ContextInterface.php | 50 - .../workerman/coroutine/src/Context/Fiber.php | 107 - .../coroutine/src/Context/Swoole.php | 60 - .../workerman/coroutine/src/Context/Swow.php | 78 - vendor/workerman/coroutine/src/Coroutine.php | 129 - .../src/Coroutine/CoroutineInterface.php | 90 - .../coroutine/src/Coroutine/Fiber.php | 154 - .../coroutine/src/Coroutine/Swoole.php | 148 - .../coroutine/src/Coroutine/Swow.php | 91 - vendor/workerman/coroutine/src/Locker.php | 66 - vendor/workerman/coroutine/src/Parallel.php | 109 - vendor/workerman/coroutine/src/Pool.php | 386 -- .../workerman/coroutine/src/PoolInterface.php | 69 - .../src/Utils/DestructionWatcher.php | 67 - vendor/workerman/coroutine/src/WaitGroup.php | 77 - .../coroutine/src/WaitGroup/Fiber.php | 63 - .../coroutine/src/WaitGroup/Swoole.php | 63 - .../coroutine/src/WaitGroup/Swow.php | 64 - .../src/WaitGroup/WaitGroupInterface.php | 42 - vendor/workerman/coroutine/stubs/SwowStub.php | 36 - .../workerman/coroutine/tests/BarrierTest.php | 43 - .../workerman/coroutine/tests/ChannelTest.php | 313 -- .../workerman/coroutine/tests/ContextTest.php | 169 - .../coroutine/tests/CoroutineTest.php | 184 - .../coroutine/tests/FiberChannelTest.php | 346 -- .../workerman/coroutine/tests/LockerTest.php | 130 - .../coroutine/tests/ParallelTest.php | 302 - vendor/workerman/coroutine/tests/PoolTest.php | 398 -- .../coroutine/tests/WaitGroupTest.php | 56 - vendor/workerman/coroutine/tests/start.php | 98 - vendor/workerman/webman-framework/.gitignore | 5 - vendor/workerman/webman-framework/README.md | 5 - .../workerman/webman-framework/composer.json | 52 - .../src/Annotation/DisableDefaultRoute.php | 10 - .../src/Annotation/Middleware.php | 25 - vendor/workerman/webman-framework/src/App.php | 1048 ---- .../webman-framework/src/Bootstrap.php | 28 - .../workerman/webman-framework/src/Config.php | 296 - .../webman-framework/src/Container.php | 84 - .../webman-framework/src/Context.php | 24 - .../src/Exception/BusinessException.php | 117 - .../src/Exception/ExceptionHandler.php | 121 - .../Exception/ExceptionHandlerInterface.php | 35 - .../src/Exception/FileException.php | 25 - .../src/Exception/NotFoundException.php | 25 - .../workerman/webman-framework/src/File.php | 56 - .../webman-framework/src/Http/Request.php | 409 -- .../webman-framework/src/Http/Response.php | 87 - .../webman-framework/src/Http/UploadFile.php | 111 - .../webman-framework/src/Install.php | 78 - .../webman-framework/src/Middleware.php | 141 - .../src/MiddlewareInterface.php | 30 - .../workerman/webman-framework/src/Route.php | 572 -- .../webman-framework/src/Route/Route.php | 199 - .../src/Session/FileSessionHandler.php | 26 - .../Session/RedisClusterSessionHandler.php | 22 - .../src/Session/RedisSessionHandler.php | 26 - .../workerman/webman-framework/src/Util.php | 44 - .../workerman/webman-framework/src/View.php | 27 - .../workerman/webman-framework/src/start.php | 5 - .../webman-framework/src/support/App.php | 167 - .../src/support/Container.php | 48 - .../webman-framework/src/support/Context.php | 25 - .../webman-framework/src/support/Log.php | 139 - .../webman-framework/src/support/Plugin.php | 102 - .../webman-framework/src/support/Request.php | 24 - .../webman-framework/src/support/Response.php | 24 - .../src/support/Translation.php | 107 - .../webman-framework/src/support/View.php | 35 - .../annotation/DisableDefaultRoute.php | 10 - .../src/support/annotation/Middleware.php | 11 - .../src/support/bootstrap.php | 139 - .../src/support/bootstrap/Session.php | 61 - .../support/exception/BusinessException.php | 24 - .../src/support/exception/Handler.php | 43 - .../support/exception/InputTypeException.php | 24 - .../support/exception/InputValueException.php | 24 - .../exception/MissingInputException.php | 46 - .../support/exception/NotFoundException.php | 20 - .../exception/PageNotFoundException.php | 93 - .../webman-framework/src/support/helpers.php | 672 --- .../src/support/view/Blade.php | 84 - .../webman-framework/src/support/view/Raw.php | 79 - .../src/support/view/ThinkPHP.php | 87 - .../src/support/view/Twig.php | 87 - .../webman-framework/src/windows.php | 136 - vendor/workerman/workerman/MIT-LICENSE.txt | 21 - vendor/workerman/workerman/README.md | 477 -- vendor/workerman/workerman/SECURITY.md | 6 - vendor/workerman/workerman/composer.json | 60 - .../src/Connection/AsyncTcpConnection.php | 441 -- .../src/Connection/AsyncUdpConnection.php | 210 - .../src/Connection/ConnectionInterface.php | 187 - .../src/Connection/TcpConnection.php | 1152 ---- .../src/Connection/UdpConnection.php | 224 - vendor/workerman/workerman/src/Events/Ev.php | 238 - .../workerman/workerman/src/Events/Event.php | 294 - .../workerman/src/Events/EventInterface.php | 143 - .../workerman/workerman/src/Events/Fiber.php | 276 - .../workerman/workerman/src/Events/Select.php | 490 -- .../workerman/workerman/src/Events/Swoole.php | 298 - .../workerman/workerman/src/Events/Swow.php | 303 - .../workerman/src/Protocols/Frame.php | 66 - .../workerman/src/Protocols/Http.php | 306 - .../workerman/src/Protocols/Http/Chunk.php | 37 - .../workerman/src/Protocols/Http/Request.php | 769 --- .../workerman/src/Protocols/Http/Response.php | 475 -- .../src/Protocols/Http/ServerSentEvents.php | 56 - .../workerman/src/Protocols/Http/Session.php | 454 -- .../Http/Session/FileSessionHandler.php | 209 - .../Session/RedisClusterSessionHandler.php | 55 - .../Http/Session/RedisSessionHandler.php | 166 - .../Http/Session/SessionHandlerInterface.php | 117 - .../workerman/src/Protocols/Http/mime.types | 91 - .../src/Protocols/ProtocolInterface.php | 55 - .../workerman/src/Protocols/Text.php | 76 - .../workerman/src/Protocols/Websocket.php | 524 -- .../workerman/workerman/src/Protocols/Ws.php | 470 -- vendor/workerman/workerman/src/Timer.php | 273 - vendor/workerman/workerman/src/Worker.php | 2758 --------- webman.zip | Bin 2064018 -> 0 bytes 2119 files changed, 215448 deletions(-) delete mode 100644 composer.json delete mode 100644 composer.json.txt delete mode 100644 composer.lock delete mode 100644 vendor/autoload.php delete mode 100644 vendor/bin/carbon delete mode 100644 vendor/bin/carbon.bat delete mode 100644 vendor/brick/math/CHANGELOG.md delete mode 100644 vendor/brick/math/LICENSE delete mode 100644 vendor/brick/math/composer.json delete mode 100644 vendor/brick/math/psalm-baseline.xml delete mode 100644 vendor/brick/math/src/BigDecimal.php delete mode 100644 vendor/brick/math/src/BigInteger.php delete mode 100644 vendor/brick/math/src/BigNumber.php delete mode 100644 vendor/brick/math/src/BigRational.php delete mode 100644 vendor/brick/math/src/Exception/DivisionByZeroException.php delete mode 100644 vendor/brick/math/src/Exception/IntegerOverflowException.php delete mode 100644 vendor/brick/math/src/Exception/MathException.php delete mode 100644 vendor/brick/math/src/Exception/NegativeNumberException.php delete mode 100644 vendor/brick/math/src/Exception/NumberFormatException.php delete mode 100644 vendor/brick/math/src/Exception/RoundingNecessaryException.php delete mode 100644 vendor/brick/math/src/Internal/Calculator.php delete mode 100644 vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php delete mode 100644 vendor/brick/math/src/Internal/Calculator/GmpCalculator.php delete mode 100644 vendor/brick/math/src/Internal/Calculator/NativeCalculator.php delete mode 100644 vendor/brick/math/src/RoundingMode.php delete mode 100644 vendor/carbonphp/carbon-doctrine-types/LICENSE delete mode 100644 vendor/carbonphp/carbon-doctrine-types/README.md delete mode 100644 vendor/carbonphp/carbon-doctrine-types/composer.json delete mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php delete mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonImmutableType.php delete mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonType.php delete mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonTypeConverter.php delete mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php delete mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeImmutableType.php delete mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php delete mode 100644 vendor/composer/ClassLoader.php delete mode 100644 vendor/composer/InstalledVersions.php delete mode 100644 vendor/composer/LICENSE delete mode 100644 vendor/composer/autoload_classmap.php delete mode 100644 vendor/composer/autoload_files.php delete mode 100644 vendor/composer/autoload_namespaces.php delete mode 100644 vendor/composer/autoload_psr4.php delete mode 100644 vendor/composer/autoload_real.php delete mode 100644 vendor/composer/autoload_static.php delete mode 100644 vendor/composer/installed.json delete mode 100644 vendor/composer/installed.php delete mode 100644 vendor/composer/platform_check.php delete mode 100644 vendor/doctrine/inflector/LICENSE delete mode 100644 vendor/doctrine/inflector/README.md delete mode 100644 vendor/doctrine/inflector/composer.json delete mode 100644 vendor/doctrine/inflector/docs/en/index.rst delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Language.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php delete mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php delete mode 100644 vendor/illuminate/collections/Arr.php delete mode 100644 vendor/illuminate/collections/Collection.php delete mode 100644 vendor/illuminate/collections/Enumerable.php delete mode 100644 vendor/illuminate/collections/HigherOrderCollectionProxy.php delete mode 100644 vendor/illuminate/collections/ItemNotFoundException.php delete mode 100644 vendor/illuminate/collections/LICENSE.md delete mode 100644 vendor/illuminate/collections/LazyCollection.php delete mode 100644 vendor/illuminate/collections/MultipleItemsFoundException.php delete mode 100644 vendor/illuminate/collections/Traits/EnumeratesValues.php delete mode 100644 vendor/illuminate/collections/composer.json delete mode 100644 vendor/illuminate/collections/functions.php delete mode 100644 vendor/illuminate/collections/helpers.php delete mode 100644 vendor/illuminate/conditionable/HigherOrderWhenProxy.php delete mode 100644 vendor/illuminate/conditionable/LICENSE.md delete mode 100644 vendor/illuminate/conditionable/Traits/Conditionable.php delete mode 100644 vendor/illuminate/conditionable/composer.json delete mode 100644 vendor/illuminate/container/Attributes/Auth.php delete mode 100644 vendor/illuminate/container/Attributes/Authenticated.php delete mode 100644 vendor/illuminate/container/Attributes/Cache.php delete mode 100644 vendor/illuminate/container/Attributes/Config.php delete mode 100644 vendor/illuminate/container/Attributes/CurrentUser.php delete mode 100644 vendor/illuminate/container/Attributes/DB.php delete mode 100644 vendor/illuminate/container/Attributes/Database.php delete mode 100644 vendor/illuminate/container/Attributes/Log.php delete mode 100644 vendor/illuminate/container/Attributes/RouteParameter.php delete mode 100644 vendor/illuminate/container/Attributes/Storage.php delete mode 100644 vendor/illuminate/container/Attributes/Tag.php delete mode 100644 vendor/illuminate/container/BoundMethod.php delete mode 100644 vendor/illuminate/container/Container.php delete mode 100644 vendor/illuminate/container/ContextualBindingBuilder.php delete mode 100644 vendor/illuminate/container/EntryNotFoundException.php delete mode 100644 vendor/illuminate/container/LICENSE.md delete mode 100644 vendor/illuminate/container/RewindableGenerator.php delete mode 100644 vendor/illuminate/container/Util.php delete mode 100644 vendor/illuminate/container/composer.json delete mode 100644 vendor/illuminate/contracts/Auth/Access/Authorizable.php delete mode 100644 vendor/illuminate/contracts/Auth/Access/Gate.php delete mode 100644 vendor/illuminate/contracts/Auth/Authenticatable.php delete mode 100644 vendor/illuminate/contracts/Auth/CanResetPassword.php delete mode 100644 vendor/illuminate/contracts/Auth/Factory.php delete mode 100644 vendor/illuminate/contracts/Auth/Guard.php delete mode 100644 vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php delete mode 100644 vendor/illuminate/contracts/Auth/MustVerifyEmail.php delete mode 100644 vendor/illuminate/contracts/Auth/PasswordBroker.php delete mode 100644 vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php delete mode 100644 vendor/illuminate/contracts/Auth/StatefulGuard.php delete mode 100644 vendor/illuminate/contracts/Auth/SupportsBasicAuth.php delete mode 100644 vendor/illuminate/contracts/Auth/UserProvider.php delete mode 100644 vendor/illuminate/contracts/Broadcasting/Broadcaster.php delete mode 100644 vendor/illuminate/contracts/Broadcasting/Factory.php delete mode 100644 vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php delete mode 100644 vendor/illuminate/contracts/Broadcasting/ShouldBeUnique.php delete mode 100644 vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php delete mode 100644 vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php delete mode 100644 vendor/illuminate/contracts/Bus/Dispatcher.php delete mode 100644 vendor/illuminate/contracts/Bus/QueueingDispatcher.php delete mode 100644 vendor/illuminate/contracts/Cache/Factory.php delete mode 100644 vendor/illuminate/contracts/Cache/Lock.php delete mode 100644 vendor/illuminate/contracts/Cache/LockProvider.php delete mode 100644 vendor/illuminate/contracts/Cache/LockTimeoutException.php delete mode 100644 vendor/illuminate/contracts/Cache/Repository.php delete mode 100644 vendor/illuminate/contracts/Cache/Store.php delete mode 100644 vendor/illuminate/contracts/Concurrency/Driver.php delete mode 100644 vendor/illuminate/contracts/Config/Repository.php delete mode 100644 vendor/illuminate/contracts/Console/Application.php delete mode 100644 vendor/illuminate/contracts/Console/Isolatable.php delete mode 100644 vendor/illuminate/contracts/Console/Kernel.php delete mode 100644 vendor/illuminate/contracts/Console/PromptsForMissingInput.php delete mode 100644 vendor/illuminate/contracts/Container/BindingResolutionException.php delete mode 100644 vendor/illuminate/contracts/Container/CircularDependencyException.php delete mode 100644 vendor/illuminate/contracts/Container/Container.php delete mode 100644 vendor/illuminate/contracts/Container/ContextualAttribute.php delete mode 100644 vendor/illuminate/contracts/Container/ContextualBindingBuilder.php delete mode 100644 vendor/illuminate/contracts/Cookie/Factory.php delete mode 100644 vendor/illuminate/contracts/Cookie/QueueingFactory.php delete mode 100644 vendor/illuminate/contracts/Database/Eloquent/Builder.php delete mode 100644 vendor/illuminate/contracts/Database/Eloquent/Castable.php delete mode 100644 vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php delete mode 100644 vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php delete mode 100644 vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php delete mode 100644 vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php delete mode 100644 vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php delete mode 100644 vendor/illuminate/contracts/Database/Events/MigrationEvent.php delete mode 100644 vendor/illuminate/contracts/Database/ModelIdentifier.php delete mode 100644 vendor/illuminate/contracts/Database/Query/Builder.php delete mode 100644 vendor/illuminate/contracts/Database/Query/ConditionExpression.php delete mode 100644 vendor/illuminate/contracts/Database/Query/Expression.php delete mode 100644 vendor/illuminate/contracts/Debug/ExceptionHandler.php delete mode 100644 vendor/illuminate/contracts/Debug/ShouldntReport.php delete mode 100644 vendor/illuminate/contracts/Encryption/DecryptException.php delete mode 100644 vendor/illuminate/contracts/Encryption/EncryptException.php delete mode 100644 vendor/illuminate/contracts/Encryption/Encrypter.php delete mode 100644 vendor/illuminate/contracts/Encryption/StringEncrypter.php delete mode 100644 vendor/illuminate/contracts/Events/Dispatcher.php delete mode 100644 vendor/illuminate/contracts/Events/ShouldDispatchAfterCommit.php delete mode 100644 vendor/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php delete mode 100644 vendor/illuminate/contracts/Filesystem/Cloud.php delete mode 100644 vendor/illuminate/contracts/Filesystem/Factory.php delete mode 100644 vendor/illuminate/contracts/Filesystem/FileNotFoundException.php delete mode 100644 vendor/illuminate/contracts/Filesystem/Filesystem.php delete mode 100644 vendor/illuminate/contracts/Filesystem/LockTimeoutException.php delete mode 100644 vendor/illuminate/contracts/Foundation/Application.php delete mode 100644 vendor/illuminate/contracts/Foundation/CachesConfiguration.php delete mode 100644 vendor/illuminate/contracts/Foundation/CachesRoutes.php delete mode 100644 vendor/illuminate/contracts/Foundation/ExceptionRenderer.php delete mode 100644 vendor/illuminate/contracts/Foundation/MaintenanceMode.php delete mode 100644 vendor/illuminate/contracts/Hashing/Hasher.php delete mode 100644 vendor/illuminate/contracts/Http/Kernel.php delete mode 100644 vendor/illuminate/contracts/LICENSE.md delete mode 100644 vendor/illuminate/contracts/Mail/Attachable.php delete mode 100644 vendor/illuminate/contracts/Mail/Factory.php delete mode 100644 vendor/illuminate/contracts/Mail/MailQueue.php delete mode 100644 vendor/illuminate/contracts/Mail/Mailable.php delete mode 100644 vendor/illuminate/contracts/Mail/Mailer.php delete mode 100644 vendor/illuminate/contracts/Notifications/Dispatcher.php delete mode 100644 vendor/illuminate/contracts/Notifications/Factory.php delete mode 100644 vendor/illuminate/contracts/Pagination/CursorPaginator.php delete mode 100644 vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php delete mode 100644 vendor/illuminate/contracts/Pagination/Paginator.php delete mode 100644 vendor/illuminate/contracts/Pipeline/Hub.php delete mode 100644 vendor/illuminate/contracts/Pipeline/Pipeline.php delete mode 100644 vendor/illuminate/contracts/Process/InvokedProcess.php delete mode 100644 vendor/illuminate/contracts/Process/ProcessResult.php delete mode 100644 vendor/illuminate/contracts/Queue/ClearableQueue.php delete mode 100644 vendor/illuminate/contracts/Queue/EntityNotFoundException.php delete mode 100644 vendor/illuminate/contracts/Queue/EntityResolver.php delete mode 100644 vendor/illuminate/contracts/Queue/Factory.php delete mode 100644 vendor/illuminate/contracts/Queue/Job.php delete mode 100644 vendor/illuminate/contracts/Queue/Monitor.php delete mode 100644 vendor/illuminate/contracts/Queue/Queue.php delete mode 100644 vendor/illuminate/contracts/Queue/QueueableCollection.php delete mode 100644 vendor/illuminate/contracts/Queue/QueueableEntity.php delete mode 100644 vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php delete mode 100644 vendor/illuminate/contracts/Queue/ShouldBeUnique.php delete mode 100644 vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php delete mode 100644 vendor/illuminate/contracts/Queue/ShouldQueue.php delete mode 100644 vendor/illuminate/contracts/Queue/ShouldQueueAfterCommit.php delete mode 100644 vendor/illuminate/contracts/Redis/Connection.php delete mode 100644 vendor/illuminate/contracts/Redis/Connector.php delete mode 100644 vendor/illuminate/contracts/Redis/Factory.php delete mode 100644 vendor/illuminate/contracts/Redis/LimiterTimeoutException.php delete mode 100644 vendor/illuminate/contracts/Routing/BindingRegistrar.php delete mode 100644 vendor/illuminate/contracts/Routing/Registrar.php delete mode 100644 vendor/illuminate/contracts/Routing/ResponseFactory.php delete mode 100644 vendor/illuminate/contracts/Routing/UrlGenerator.php delete mode 100644 vendor/illuminate/contracts/Routing/UrlRoutable.php delete mode 100644 vendor/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php delete mode 100644 vendor/illuminate/contracts/Session/Session.php delete mode 100644 vendor/illuminate/contracts/Support/Arrayable.php delete mode 100644 vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php delete mode 100644 vendor/illuminate/contracts/Support/DeferrableProvider.php delete mode 100644 vendor/illuminate/contracts/Support/DeferringDisplayableValue.php delete mode 100644 vendor/illuminate/contracts/Support/Htmlable.php delete mode 100644 vendor/illuminate/contracts/Support/Jsonable.php delete mode 100644 vendor/illuminate/contracts/Support/MessageBag.php delete mode 100644 vendor/illuminate/contracts/Support/MessageProvider.php delete mode 100644 vendor/illuminate/contracts/Support/Renderable.php delete mode 100644 vendor/illuminate/contracts/Support/Responsable.php delete mode 100644 vendor/illuminate/contracts/Support/ValidatedData.php delete mode 100644 vendor/illuminate/contracts/Translation/HasLocalePreference.php delete mode 100644 vendor/illuminate/contracts/Translation/Loader.php delete mode 100644 vendor/illuminate/contracts/Translation/Translator.php delete mode 100644 vendor/illuminate/contracts/Validation/DataAwareRule.php delete mode 100644 vendor/illuminate/contracts/Validation/Factory.php delete mode 100644 vendor/illuminate/contracts/Validation/ImplicitRule.php delete mode 100644 vendor/illuminate/contracts/Validation/InvokableRule.php delete mode 100644 vendor/illuminate/contracts/Validation/Rule.php delete mode 100644 vendor/illuminate/contracts/Validation/UncompromisedVerifier.php delete mode 100644 vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php delete mode 100644 vendor/illuminate/contracts/Validation/ValidationRule.php delete mode 100644 vendor/illuminate/contracts/Validation/Validator.php delete mode 100644 vendor/illuminate/contracts/Validation/ValidatorAwareRule.php delete mode 100644 vendor/illuminate/contracts/View/Engine.php delete mode 100644 vendor/illuminate/contracts/View/Factory.php delete mode 100644 vendor/illuminate/contracts/View/View.php delete mode 100644 vendor/illuminate/contracts/View/ViewCompilationException.php delete mode 100644 vendor/illuminate/contracts/composer.json delete mode 100644 vendor/illuminate/database/Capsule/Manager.php delete mode 100644 vendor/illuminate/database/ClassMorphViolationException.php delete mode 100644 vendor/illuminate/database/Concerns/BuildsQueries.php delete mode 100644 vendor/illuminate/database/Concerns/BuildsWhereDateClauses.php delete mode 100644 vendor/illuminate/database/Concerns/CompilesJsonPaths.php delete mode 100644 vendor/illuminate/database/Concerns/ExplainsQueries.php delete mode 100644 vendor/illuminate/database/Concerns/ManagesTransactions.php delete mode 100644 vendor/illuminate/database/Concerns/ParsesSearchPath.php delete mode 100644 vendor/illuminate/database/ConfigurationUrlParser.php delete mode 100644 vendor/illuminate/database/Connection.php delete mode 100644 vendor/illuminate/database/ConnectionInterface.php delete mode 100644 vendor/illuminate/database/ConnectionResolver.php delete mode 100644 vendor/illuminate/database/ConnectionResolverInterface.php delete mode 100644 vendor/illuminate/database/Connectors/ConnectionFactory.php delete mode 100644 vendor/illuminate/database/Connectors/Connector.php delete mode 100644 vendor/illuminate/database/Connectors/ConnectorInterface.php delete mode 100644 vendor/illuminate/database/Connectors/MariaDbConnector.php delete mode 100644 vendor/illuminate/database/Connectors/MySqlConnector.php delete mode 100644 vendor/illuminate/database/Connectors/PostgresConnector.php delete mode 100644 vendor/illuminate/database/Connectors/SQLiteConnector.php delete mode 100644 vendor/illuminate/database/Connectors/SqlServerConnector.php delete mode 100644 vendor/illuminate/database/Console/DatabaseInspectionCommand.php delete mode 100644 vendor/illuminate/database/Console/DbCommand.php delete mode 100644 vendor/illuminate/database/Console/DumpCommand.php delete mode 100644 vendor/illuminate/database/Console/Factories/FactoryMakeCommand.php delete mode 100644 vendor/illuminate/database/Console/Factories/stubs/factory.stub delete mode 100644 vendor/illuminate/database/Console/Migrations/BaseCommand.php delete mode 100644 vendor/illuminate/database/Console/Migrations/FreshCommand.php delete mode 100644 vendor/illuminate/database/Console/Migrations/InstallCommand.php delete mode 100644 vendor/illuminate/database/Console/Migrations/MigrateCommand.php delete mode 100644 vendor/illuminate/database/Console/Migrations/MigrateMakeCommand.php delete mode 100644 vendor/illuminate/database/Console/Migrations/RefreshCommand.php delete mode 100644 vendor/illuminate/database/Console/Migrations/ResetCommand.php delete mode 100644 vendor/illuminate/database/Console/Migrations/RollbackCommand.php delete mode 100644 vendor/illuminate/database/Console/Migrations/StatusCommand.php delete mode 100644 vendor/illuminate/database/Console/Migrations/TableGuesser.php delete mode 100644 vendor/illuminate/database/Console/MonitorCommand.php delete mode 100644 vendor/illuminate/database/Console/PruneCommand.php delete mode 100644 vendor/illuminate/database/Console/Seeds/SeedCommand.php delete mode 100644 vendor/illuminate/database/Console/Seeds/SeederMakeCommand.php delete mode 100644 vendor/illuminate/database/Console/Seeds/WithoutModelEvents.php delete mode 100644 vendor/illuminate/database/Console/Seeds/stubs/seeder.stub delete mode 100644 vendor/illuminate/database/Console/ShowCommand.php delete mode 100644 vendor/illuminate/database/Console/ShowModelCommand.php delete mode 100644 vendor/illuminate/database/Console/TableCommand.php delete mode 100644 vendor/illuminate/database/Console/WipeCommand.php delete mode 100644 vendor/illuminate/database/DatabaseManager.php delete mode 100644 vendor/illuminate/database/DatabaseServiceProvider.php delete mode 100644 vendor/illuminate/database/DatabaseTransactionRecord.php delete mode 100644 vendor/illuminate/database/DatabaseTransactionsManager.php delete mode 100644 vendor/illuminate/database/DeadlockException.php delete mode 100644 vendor/illuminate/database/DetectsConcurrencyErrors.php delete mode 100644 vendor/illuminate/database/DetectsLostConnections.php delete mode 100644 vendor/illuminate/database/Eloquent/Attributes/CollectedBy.php delete mode 100644 vendor/illuminate/database/Eloquent/Attributes/ObservedBy.php delete mode 100644 vendor/illuminate/database/Eloquent/Attributes/ScopedBy.php delete mode 100644 vendor/illuminate/database/Eloquent/Attributes/UseFactory.php delete mode 100644 vendor/illuminate/database/Eloquent/BroadcastableModelEventOccurred.php delete mode 100644 vendor/illuminate/database/Eloquent/BroadcastsEvents.php delete mode 100644 vendor/illuminate/database/Eloquent/BroadcastsEventsAfterCommit.php delete mode 100644 vendor/illuminate/database/Eloquent/Builder.php delete mode 100644 vendor/illuminate/database/Eloquent/Casts/ArrayObject.php delete mode 100644 vendor/illuminate/database/Eloquent/Casts/AsArrayObject.php delete mode 100644 vendor/illuminate/database/Eloquent/Casts/AsCollection.php delete mode 100644 vendor/illuminate/database/Eloquent/Casts/AsEncryptedArrayObject.php delete mode 100644 vendor/illuminate/database/Eloquent/Casts/AsEncryptedCollection.php delete mode 100644 vendor/illuminate/database/Eloquent/Casts/AsEnumArrayObject.php delete mode 100644 vendor/illuminate/database/Eloquent/Casts/AsEnumCollection.php delete mode 100644 vendor/illuminate/database/Eloquent/Casts/AsStringable.php delete mode 100644 vendor/illuminate/database/Eloquent/Casts/Attribute.php delete mode 100644 vendor/illuminate/database/Eloquent/Casts/Json.php delete mode 100644 vendor/illuminate/database/Eloquent/Collection.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/GuardsAttributes.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/HasAttributes.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/HasEvents.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/HasGlobalScopes.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/HasRelationships.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/HasTimestamps.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/HasUlids.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/HasUniqueIds.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/HasUniqueStringIds.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/HasUuids.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/HasVersion7Uuids.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/HidesAttributes.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/PreventsCircularRecursion.php delete mode 100644 vendor/illuminate/database/Eloquent/Concerns/QueriesRelationships.php delete mode 100644 vendor/illuminate/database/Eloquent/Factories/BelongsToManyRelationship.php delete mode 100644 vendor/illuminate/database/Eloquent/Factories/BelongsToRelationship.php delete mode 100644 vendor/illuminate/database/Eloquent/Factories/CrossJoinSequence.php delete mode 100644 vendor/illuminate/database/Eloquent/Factories/Factory.php delete mode 100644 vendor/illuminate/database/Eloquent/Factories/HasFactory.php delete mode 100644 vendor/illuminate/database/Eloquent/Factories/Relationship.php delete mode 100644 vendor/illuminate/database/Eloquent/Factories/Sequence.php delete mode 100644 vendor/illuminate/database/Eloquent/HasBuilder.php delete mode 100644 vendor/illuminate/database/Eloquent/HasCollection.php delete mode 100644 vendor/illuminate/database/Eloquent/HigherOrderBuilderProxy.php delete mode 100644 vendor/illuminate/database/Eloquent/InvalidCastException.php delete mode 100644 vendor/illuminate/database/Eloquent/JsonEncodingException.php delete mode 100644 vendor/illuminate/database/Eloquent/MassAssignmentException.php delete mode 100644 vendor/illuminate/database/Eloquent/MassPrunable.php delete mode 100644 vendor/illuminate/database/Eloquent/MissingAttributeException.php delete mode 100644 vendor/illuminate/database/Eloquent/Model.php delete mode 100644 vendor/illuminate/database/Eloquent/ModelInspector.php delete mode 100644 vendor/illuminate/database/Eloquent/ModelNotFoundException.php delete mode 100644 vendor/illuminate/database/Eloquent/PendingHasThroughRelationship.php delete mode 100644 vendor/illuminate/database/Eloquent/Prunable.php delete mode 100644 vendor/illuminate/database/Eloquent/QueueEntityResolver.php delete mode 100644 vendor/illuminate/database/Eloquent/RelationNotFoundException.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/BelongsTo.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/BelongsToMany.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/Concerns/AsPivot.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/Concerns/CanBeOneOfMany.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/Concerns/ComparesRelatedModels.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/Concerns/InteractsWithDictionary.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/Concerns/SupportsDefaultModels.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/Concerns/SupportsInverseRelations.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/HasMany.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/HasManyThrough.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/HasOne.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/HasOneOrMany.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/HasOneOrManyThrough.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/HasOneThrough.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/MorphMany.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/MorphOne.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/MorphOneOrMany.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/MorphPivot.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/MorphTo.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/MorphToMany.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/Pivot.php delete mode 100644 vendor/illuminate/database/Eloquent/Relations/Relation.php delete mode 100644 vendor/illuminate/database/Eloquent/Scope.php delete mode 100644 vendor/illuminate/database/Eloquent/SoftDeletes.php delete mode 100644 vendor/illuminate/database/Eloquent/SoftDeletingScope.php delete mode 100644 vendor/illuminate/database/Events/ConnectionEstablished.php delete mode 100644 vendor/illuminate/database/Events/ConnectionEvent.php delete mode 100644 vendor/illuminate/database/Events/DatabaseBusy.php delete mode 100644 vendor/illuminate/database/Events/DatabaseRefreshed.php delete mode 100644 vendor/illuminate/database/Events/MigrationEnded.php delete mode 100644 vendor/illuminate/database/Events/MigrationEvent.php delete mode 100644 vendor/illuminate/database/Events/MigrationStarted.php delete mode 100644 vendor/illuminate/database/Events/MigrationsEnded.php delete mode 100644 vendor/illuminate/database/Events/MigrationsEvent.php delete mode 100644 vendor/illuminate/database/Events/MigrationsPruned.php delete mode 100644 vendor/illuminate/database/Events/MigrationsStarted.php delete mode 100644 vendor/illuminate/database/Events/ModelPruningFinished.php delete mode 100644 vendor/illuminate/database/Events/ModelPruningStarting.php delete mode 100644 vendor/illuminate/database/Events/ModelsPruned.php delete mode 100644 vendor/illuminate/database/Events/NoPendingMigrations.php delete mode 100644 vendor/illuminate/database/Events/QueryExecuted.php delete mode 100644 vendor/illuminate/database/Events/SchemaDumped.php delete mode 100644 vendor/illuminate/database/Events/SchemaLoaded.php delete mode 100644 vendor/illuminate/database/Events/StatementPrepared.php delete mode 100644 vendor/illuminate/database/Events/TransactionBeginning.php delete mode 100644 vendor/illuminate/database/Events/TransactionCommitted.php delete mode 100644 vendor/illuminate/database/Events/TransactionCommitting.php delete mode 100644 vendor/illuminate/database/Events/TransactionRolledBack.php delete mode 100644 vendor/illuminate/database/Grammar.php delete mode 100644 vendor/illuminate/database/LICENSE.md delete mode 100644 vendor/illuminate/database/LazyLoadingViolationException.php delete mode 100644 vendor/illuminate/database/LostConnectionException.php delete mode 100644 vendor/illuminate/database/MariaDbConnection.php delete mode 100644 vendor/illuminate/database/MigrationServiceProvider.php delete mode 100644 vendor/illuminate/database/Migrations/DatabaseMigrationRepository.php delete mode 100644 vendor/illuminate/database/Migrations/Migration.php delete mode 100644 vendor/illuminate/database/Migrations/MigrationCreator.php delete mode 100644 vendor/illuminate/database/Migrations/MigrationRepositoryInterface.php delete mode 100644 vendor/illuminate/database/Migrations/Migrator.php delete mode 100644 vendor/illuminate/database/Migrations/stubs/migration.create.stub delete mode 100644 vendor/illuminate/database/Migrations/stubs/migration.stub delete mode 100644 vendor/illuminate/database/Migrations/stubs/migration.update.stub delete mode 100644 vendor/illuminate/database/MultipleColumnsSelectedException.php delete mode 100644 vendor/illuminate/database/MultipleRecordsFoundException.php delete mode 100644 vendor/illuminate/database/MySqlConnection.php delete mode 100644 vendor/illuminate/database/PostgresConnection.php delete mode 100644 vendor/illuminate/database/Query/Builder.php delete mode 100644 vendor/illuminate/database/Query/Expression.php delete mode 100644 vendor/illuminate/database/Query/Grammars/Grammar.php delete mode 100644 vendor/illuminate/database/Query/Grammars/MariaDbGrammar.php delete mode 100644 vendor/illuminate/database/Query/Grammars/MySqlGrammar.php delete mode 100644 vendor/illuminate/database/Query/Grammars/PostgresGrammar.php delete mode 100644 vendor/illuminate/database/Query/Grammars/SQLiteGrammar.php delete mode 100644 vendor/illuminate/database/Query/Grammars/SqlServerGrammar.php delete mode 100644 vendor/illuminate/database/Query/IndexHint.php delete mode 100644 vendor/illuminate/database/Query/JoinClause.php delete mode 100644 vendor/illuminate/database/Query/JoinLateralClause.php delete mode 100644 vendor/illuminate/database/Query/Processors/MariaDbProcessor.php delete mode 100644 vendor/illuminate/database/Query/Processors/MySqlProcessor.php delete mode 100644 vendor/illuminate/database/Query/Processors/PostgresProcessor.php delete mode 100644 vendor/illuminate/database/Query/Processors/Processor.php delete mode 100644 vendor/illuminate/database/Query/Processors/SQLiteProcessor.php delete mode 100644 vendor/illuminate/database/Query/Processors/SqlServerProcessor.php delete mode 100644 vendor/illuminate/database/QueryException.php delete mode 100644 vendor/illuminate/database/README.md delete mode 100644 vendor/illuminate/database/RecordNotFoundException.php delete mode 100644 vendor/illuminate/database/RecordsNotFoundException.php delete mode 100644 vendor/illuminate/database/SQLiteConnection.php delete mode 100644 vendor/illuminate/database/SQLiteDatabaseDoesNotExistException.php delete mode 100644 vendor/illuminate/database/Schema/Blueprint.php delete mode 100644 vendor/illuminate/database/Schema/BlueprintState.php delete mode 100644 vendor/illuminate/database/Schema/Builder.php delete mode 100644 vendor/illuminate/database/Schema/ColumnDefinition.php delete mode 100644 vendor/illuminate/database/Schema/ForeignIdColumnDefinition.php delete mode 100644 vendor/illuminate/database/Schema/ForeignKeyDefinition.php delete mode 100644 vendor/illuminate/database/Schema/Grammars/Grammar.php delete mode 100644 vendor/illuminate/database/Schema/Grammars/MariaDbGrammar.php delete mode 100644 vendor/illuminate/database/Schema/Grammars/MySqlGrammar.php delete mode 100644 vendor/illuminate/database/Schema/Grammars/PostgresGrammar.php delete mode 100644 vendor/illuminate/database/Schema/Grammars/SQLiteGrammar.php delete mode 100644 vendor/illuminate/database/Schema/Grammars/SqlServerGrammar.php delete mode 100644 vendor/illuminate/database/Schema/IndexDefinition.php delete mode 100644 vendor/illuminate/database/Schema/MariaDbBuilder.php delete mode 100644 vendor/illuminate/database/Schema/MariaDbSchemaState.php delete mode 100644 vendor/illuminate/database/Schema/MySqlBuilder.php delete mode 100644 vendor/illuminate/database/Schema/MySqlSchemaState.php delete mode 100644 vendor/illuminate/database/Schema/PostgresBuilder.php delete mode 100644 vendor/illuminate/database/Schema/PostgresSchemaState.php delete mode 100644 vendor/illuminate/database/Schema/SQLiteBuilder.php delete mode 100644 vendor/illuminate/database/Schema/SchemaState.php delete mode 100644 vendor/illuminate/database/Schema/SqlServerBuilder.php delete mode 100644 vendor/illuminate/database/Schema/SqliteSchemaState.php delete mode 100644 vendor/illuminate/database/Seeder.php delete mode 100644 vendor/illuminate/database/SqlServerConnection.php delete mode 100644 vendor/illuminate/database/UniqueConstraintViolationException.php delete mode 100644 vendor/illuminate/database/composer.json delete mode 100644 vendor/illuminate/macroable/LICENSE.md delete mode 100644 vendor/illuminate/macroable/Traits/Macroable.php delete mode 100644 vendor/illuminate/macroable/composer.json delete mode 100644 vendor/illuminate/support/AggregateServiceProvider.php delete mode 100644 vendor/illuminate/support/Benchmark.php delete mode 100644 vendor/illuminate/support/Carbon.php delete mode 100644 vendor/illuminate/support/Composer.php delete mode 100644 vendor/illuminate/support/ConfigurationUrlParser.php delete mode 100644 vendor/illuminate/support/DateFactory.php delete mode 100644 vendor/illuminate/support/DefaultProviders.php delete mode 100644 vendor/illuminate/support/Defer/DeferredCallback.php delete mode 100644 vendor/illuminate/support/Defer/DeferredCallbackCollection.php delete mode 100644 vendor/illuminate/support/Env.php delete mode 100644 vendor/illuminate/support/Exceptions/MathException.php delete mode 100644 vendor/illuminate/support/Facades/App.php delete mode 100644 vendor/illuminate/support/Facades/Artisan.php delete mode 100644 vendor/illuminate/support/Facades/Auth.php delete mode 100644 vendor/illuminate/support/Facades/Blade.php delete mode 100644 vendor/illuminate/support/Facades/Broadcast.php delete mode 100644 vendor/illuminate/support/Facades/Bus.php delete mode 100644 vendor/illuminate/support/Facades/Cache.php delete mode 100644 vendor/illuminate/support/Facades/Concurrency.php delete mode 100644 vendor/illuminate/support/Facades/Config.php delete mode 100644 vendor/illuminate/support/Facades/Context.php delete mode 100644 vendor/illuminate/support/Facades/Cookie.php delete mode 100644 vendor/illuminate/support/Facades/Crypt.php delete mode 100644 vendor/illuminate/support/Facades/DB.php delete mode 100644 vendor/illuminate/support/Facades/Date.php delete mode 100644 vendor/illuminate/support/Facades/Event.php delete mode 100644 vendor/illuminate/support/Facades/Exceptions.php delete mode 100644 vendor/illuminate/support/Facades/Facade.php delete mode 100644 vendor/illuminate/support/Facades/File.php delete mode 100644 vendor/illuminate/support/Facades/Gate.php delete mode 100644 vendor/illuminate/support/Facades/Hash.php delete mode 100644 vendor/illuminate/support/Facades/Http.php delete mode 100644 vendor/illuminate/support/Facades/Lang.php delete mode 100644 vendor/illuminate/support/Facades/Log.php delete mode 100644 vendor/illuminate/support/Facades/Mail.php delete mode 100644 vendor/illuminate/support/Facades/Notification.php delete mode 100644 vendor/illuminate/support/Facades/ParallelTesting.php delete mode 100644 vendor/illuminate/support/Facades/Password.php delete mode 100644 vendor/illuminate/support/Facades/Pipeline.php delete mode 100644 vendor/illuminate/support/Facades/Process.php delete mode 100644 vendor/illuminate/support/Facades/Queue.php delete mode 100644 vendor/illuminate/support/Facades/RateLimiter.php delete mode 100644 vendor/illuminate/support/Facades/Redirect.php delete mode 100644 vendor/illuminate/support/Facades/Redis.php delete mode 100644 vendor/illuminate/support/Facades/Request.php delete mode 100644 vendor/illuminate/support/Facades/Response.php delete mode 100644 vendor/illuminate/support/Facades/Route.php delete mode 100644 vendor/illuminate/support/Facades/Schedule.php delete mode 100644 vendor/illuminate/support/Facades/Schema.php delete mode 100644 vendor/illuminate/support/Facades/Session.php delete mode 100644 vendor/illuminate/support/Facades/Storage.php delete mode 100644 vendor/illuminate/support/Facades/URL.php delete mode 100644 vendor/illuminate/support/Facades/Validator.php delete mode 100644 vendor/illuminate/support/Facades/View.php delete mode 100644 vendor/illuminate/support/Facades/Vite.php delete mode 100644 vendor/illuminate/support/Fluent.php delete mode 100644 vendor/illuminate/support/HigherOrderTapProxy.php delete mode 100644 vendor/illuminate/support/HtmlString.php delete mode 100644 vendor/illuminate/support/InteractsWithTime.php delete mode 100644 vendor/illuminate/support/Js.php delete mode 100644 vendor/illuminate/support/LICENSE.md delete mode 100644 vendor/illuminate/support/Lottery.php delete mode 100644 vendor/illuminate/support/Manager.php delete mode 100644 vendor/illuminate/support/MessageBag.php delete mode 100644 vendor/illuminate/support/MultipleInstanceManager.php delete mode 100644 vendor/illuminate/support/NamespacedItemResolver.php delete mode 100644 vendor/illuminate/support/Number.php delete mode 100644 vendor/illuminate/support/Once.php delete mode 100644 vendor/illuminate/support/Onceable.php delete mode 100644 vendor/illuminate/support/Optional.php delete mode 100644 vendor/illuminate/support/Pluralizer.php delete mode 100644 vendor/illuminate/support/Process/PhpExecutableFinder.php delete mode 100644 vendor/illuminate/support/ProcessUtils.php delete mode 100644 vendor/illuminate/support/Reflector.php delete mode 100644 vendor/illuminate/support/ServiceProvider.php delete mode 100644 vendor/illuminate/support/Sleep.php delete mode 100644 vendor/illuminate/support/Str.php delete mode 100644 vendor/illuminate/support/Stringable.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/BatchFake.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/BusFake.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/ChainedBatchTruthTest.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/EventFake.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/ExceptionHandlerFake.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/Fake.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/MailFake.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/NotificationFake.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/PendingChainFake.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/PendingMailFake.php delete mode 100644 vendor/illuminate/support/Testing/Fakes/QueueFake.php delete mode 100644 vendor/illuminate/support/Timebox.php delete mode 100644 vendor/illuminate/support/Traits/CapsuleManagerTrait.php delete mode 100644 vendor/illuminate/support/Traits/Dumpable.php delete mode 100644 vendor/illuminate/support/Traits/ForwardsCalls.php delete mode 100644 vendor/illuminate/support/Traits/InteractsWithData.php delete mode 100644 vendor/illuminate/support/Traits/Localizable.php delete mode 100644 vendor/illuminate/support/Traits/ReflectsClosures.php delete mode 100644 vendor/illuminate/support/Traits/Tappable.php delete mode 100644 vendor/illuminate/support/Uri.php delete mode 100644 vendor/illuminate/support/UriQueryString.php delete mode 100644 vendor/illuminate/support/ValidatedInput.php delete mode 100644 vendor/illuminate/support/ViewErrorBag.php delete mode 100644 vendor/illuminate/support/composer.json delete mode 100644 vendor/illuminate/support/functions.php delete mode 100644 vendor/illuminate/support/helpers.php delete mode 100644 vendor/laravel/serializable-closure/LICENSE.md delete mode 100644 vendor/laravel/serializable-closure/README.md delete mode 100644 vendor/laravel/serializable-closure/composer.json delete mode 100644 vendor/laravel/serializable-closure/src/Contracts/Serializable.php delete mode 100644 vendor/laravel/serializable-closure/src/Contracts/Signer.php delete mode 100644 vendor/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.php delete mode 100644 vendor/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.php delete mode 100644 vendor/laravel/serializable-closure/src/Exceptions/PhpVersionNotSupportedException.php delete mode 100644 vendor/laravel/serializable-closure/src/SerializableClosure.php delete mode 100644 vendor/laravel/serializable-closure/src/Serializers/Native.php delete mode 100644 vendor/laravel/serializable-closure/src/Serializers/Signed.php delete mode 100644 vendor/laravel/serializable-closure/src/Signers/Hmac.php delete mode 100644 vendor/laravel/serializable-closure/src/Support/ClosureScope.php delete mode 100644 vendor/laravel/serializable-closure/src/Support/ClosureStream.php delete mode 100644 vendor/laravel/serializable-closure/src/Support/ReflectionClosure.php delete mode 100644 vendor/laravel/serializable-closure/src/Support/SelfReference.php delete mode 100644 vendor/laravel/serializable-closure/src/UnsignedSerializableClosure.php delete mode 100644 vendor/nesbot/carbon/.phpstorm.meta.php delete mode 100644 vendor/nesbot/carbon/LICENSE delete mode 100644 vendor/nesbot/carbon/bin/carbon delete mode 100644 vendor/nesbot/carbon/bin/carbon.bat delete mode 100644 vendor/nesbot/carbon/composer.json delete mode 100644 vendor/nesbot/carbon/extension.neon delete mode 100644 vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php delete mode 100644 vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php delete mode 100644 vendor/nesbot/carbon/lazy/Carbon/ProtectedDatePeriod.php delete mode 100644 vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php delete mode 100644 vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php delete mode 100644 vendor/nesbot/carbon/lazy/Carbon/UnprotectedDatePeriod.php delete mode 100644 vendor/nesbot/carbon/readme.md delete mode 100644 vendor/nesbot/carbon/sponsors.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Callback.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Carbon.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonInterface.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonInterval.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Factory.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agq.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agr.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ak.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/am.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/an.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/anp.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/as.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/asa.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ast.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ayc.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bas.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bem.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bez.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bg.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bhb.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bho.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bi.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bm.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/br.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/brx.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/byn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ccp.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ce.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cgg.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/chr.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ckb.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cmn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/crh.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cs.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/csb.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cu.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cv.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cy.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dav.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dje.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/doi.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dsb.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dua.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dv.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dyo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dz.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ebu.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ee.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_001.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_150.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_US.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_419.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_US.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/et.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eu.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ewo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fi.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fil.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fur.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ga.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gd.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gom.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gu.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/guz.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gv.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hak.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/haw.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/he.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hi.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hif.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hne.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hsb.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ht.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hu.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hy.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/i18n.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ia.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/id.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ig.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ii.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ik.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/in.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/is.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iu.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iw.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ja.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jgo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jmc.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jv.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ka.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kab.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kam.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kde.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kea.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/khq.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ki.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kk.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kkj.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kln.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/km.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kok.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksb.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksf.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksh.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ku.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kw.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ky.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lag.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lb.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lg.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/li.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lij.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lkt.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lrc.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lt.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lu.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/luo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/luy.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lv.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lzh.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mag.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mai.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mas.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mer.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mfe.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mg.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mgh.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mgo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mhr.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mi.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/miq.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mjw.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mk.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ml.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mni.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mr.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mt.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mua.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/my.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mzn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/naq.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nd.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nhn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/niu.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nmg.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nnh.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/no.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nr.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nso.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nus.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nyn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/oc.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/or.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/os.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/prg.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ps.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/quz.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/raj.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rm.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rof.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rw.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rwk.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sa.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sah.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/saq.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sat.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sbp.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sc.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/seh.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ses.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sg.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sgs.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sh.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shs.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/si.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sid.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sk.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sm.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/smn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ss.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/st.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/szl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tcy.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/te.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/teo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tet.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tg.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/th.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/the.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tig.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tk.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tlh.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/to.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tpi.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ts.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/twq.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzm.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ug.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uk.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/unm.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ve.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vi.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vun.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wa.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wae.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wal.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xh.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xog.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yav.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yi.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yuw.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zgh.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zu.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Language.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/List/languages.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/List/regions.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Month.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Cast.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Converter.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Creator.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Date.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Difference.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/LocalFactory.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Localization.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Macro.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Options.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/StaticOptions.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Test.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Units.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Week.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Translator.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/Unit.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/WeekDay.php delete mode 100644 vendor/nesbot/carbon/src/Carbon/WrapperClock.php delete mode 100644 vendor/nikic/fast-route/.gitignore delete mode 100644 vendor/nikic/fast-route/.hhconfig delete mode 100644 vendor/nikic/fast-route/.travis.yml delete mode 100644 vendor/nikic/fast-route/FastRoute.hhi delete mode 100644 vendor/nikic/fast-route/LICENSE delete mode 100644 vendor/nikic/fast-route/README.md delete mode 100644 vendor/nikic/fast-route/composer.json delete mode 100644 vendor/nikic/fast-route/phpunit.xml delete mode 100644 vendor/nikic/fast-route/psalm.xml delete mode 100644 vendor/nikic/fast-route/src/BadRouteException.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator/MarkBased.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher/MarkBased.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php delete mode 100644 vendor/nikic/fast-route/src/Route.php delete mode 100644 vendor/nikic/fast-route/src/RouteCollector.php delete mode 100644 vendor/nikic/fast-route/src/RouteParser.php delete mode 100644 vendor/nikic/fast-route/src/RouteParser/Std.php delete mode 100644 vendor/nikic/fast-route/src/bootstrap.php delete mode 100644 vendor/nikic/fast-route/src/functions.php delete mode 100644 vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php delete mode 100644 vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php delete mode 100644 vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php delete mode 100644 vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php delete mode 100644 vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php delete mode 100644 vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php delete mode 100644 vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php delete mode 100644 vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php delete mode 100644 vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php delete mode 100644 vendor/nikic/fast-route/test/RouteCollectorTest.php delete mode 100644 vendor/nikic/fast-route/test/RouteParser/StdTest.php delete mode 100644 vendor/nikic/fast-route/test/bootstrap.php delete mode 100644 vendor/psr/clock/CHANGELOG.md delete mode 100644 vendor/psr/clock/LICENSE delete mode 100644 vendor/psr/clock/README.md delete mode 100644 vendor/psr/clock/composer.json delete mode 100644 vendor/psr/clock/src/ClockInterface.php delete mode 100644 vendor/psr/container/.gitignore delete mode 100644 vendor/psr/container/LICENSE delete mode 100644 vendor/psr/container/README.md delete mode 100644 vendor/psr/container/composer.json delete mode 100644 vendor/psr/container/src/ContainerExceptionInterface.php delete mode 100644 vendor/psr/container/src/ContainerInterface.php delete mode 100644 vendor/psr/container/src/NotFoundExceptionInterface.php delete mode 100644 vendor/psr/log/LICENSE delete mode 100644 vendor/psr/log/README.md delete mode 100644 vendor/psr/log/composer.json delete mode 100644 vendor/psr/log/src/AbstractLogger.php delete mode 100644 vendor/psr/log/src/InvalidArgumentException.php delete mode 100644 vendor/psr/log/src/LogLevel.php delete mode 100644 vendor/psr/log/src/LoggerAwareInterface.php delete mode 100644 vendor/psr/log/src/LoggerAwareTrait.php delete mode 100644 vendor/psr/log/src/LoggerInterface.php delete mode 100644 vendor/psr/log/src/LoggerTrait.php delete mode 100644 vendor/psr/log/src/NullLogger.php delete mode 100644 vendor/psr/simple-cache/.editorconfig delete mode 100644 vendor/psr/simple-cache/LICENSE.md delete mode 100644 vendor/psr/simple-cache/README.md delete mode 100644 vendor/psr/simple-cache/composer.json delete mode 100644 vendor/psr/simple-cache/src/CacheException.php delete mode 100644 vendor/psr/simple-cache/src/CacheInterface.php delete mode 100644 vendor/psr/simple-cache/src/InvalidArgumentException.php delete mode 100644 vendor/symfony/clock/CHANGELOG.md delete mode 100644 vendor/symfony/clock/Clock.php delete mode 100644 vendor/symfony/clock/ClockAwareTrait.php delete mode 100644 vendor/symfony/clock/ClockInterface.php delete mode 100644 vendor/symfony/clock/DatePoint.php delete mode 100644 vendor/symfony/clock/LICENSE delete mode 100644 vendor/symfony/clock/MockClock.php delete mode 100644 vendor/symfony/clock/MonotonicClock.php delete mode 100644 vendor/symfony/clock/NativeClock.php delete mode 100644 vendor/symfony/clock/README.md delete mode 100644 vendor/symfony/clock/Resources/now.php delete mode 100644 vendor/symfony/clock/Test/ClockSensitiveTrait.php delete mode 100644 vendor/symfony/clock/composer.json delete mode 100644 vendor/symfony/deprecation-contracts/CHANGELOG.md delete mode 100644 vendor/symfony/deprecation-contracts/LICENSE delete mode 100644 vendor/symfony/deprecation-contracts/README.md delete mode 100644 vendor/symfony/deprecation-contracts/composer.json delete mode 100644 vendor/symfony/deprecation-contracts/function.php delete mode 100644 vendor/symfony/polyfill-mbstring/LICENSE delete mode 100644 vendor/symfony/polyfill-mbstring/Mbstring.php delete mode 100644 vendor/symfony/polyfill-mbstring/README.md delete mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php delete mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php delete mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php delete mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php delete mode 100644 vendor/symfony/polyfill-mbstring/bootstrap.php delete mode 100644 vendor/symfony/polyfill-mbstring/bootstrap80.php delete mode 100644 vendor/symfony/polyfill-mbstring/composer.json delete mode 100644 vendor/symfony/polyfill-php83/LICENSE delete mode 100644 vendor/symfony/polyfill-php83/Php83.php delete mode 100644 vendor/symfony/polyfill-php83/README.md delete mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateError.php delete mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateException.php delete mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php delete mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php delete mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php delete mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php delete mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php delete mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php delete mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php delete mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/Override.php delete mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php delete mode 100644 vendor/symfony/polyfill-php83/bootstrap.php delete mode 100644 vendor/symfony/polyfill-php83/bootstrap81.php delete mode 100644 vendor/symfony/polyfill-php83/composer.json delete mode 100644 vendor/symfony/translation-contracts/CHANGELOG.md delete mode 100644 vendor/symfony/translation-contracts/LICENSE delete mode 100644 vendor/symfony/translation-contracts/LocaleAwareInterface.php delete mode 100644 vendor/symfony/translation-contracts/README.md delete mode 100644 vendor/symfony/translation-contracts/Test/TranslatorTest.php delete mode 100644 vendor/symfony/translation-contracts/TranslatableInterface.php delete mode 100644 vendor/symfony/translation-contracts/TranslatorInterface.php delete mode 100644 vendor/symfony/translation-contracts/TranslatorTrait.php delete mode 100644 vendor/symfony/translation-contracts/composer.json delete mode 100644 vendor/symfony/translation/CHANGELOG.md delete mode 100644 vendor/symfony/translation/Catalogue/AbstractOperation.php delete mode 100644 vendor/symfony/translation/Catalogue/MergeOperation.php delete mode 100644 vendor/symfony/translation/Catalogue/OperationInterface.php delete mode 100644 vendor/symfony/translation/Catalogue/TargetOperation.php delete mode 100644 vendor/symfony/translation/CatalogueMetadataAwareInterface.php delete mode 100644 vendor/symfony/translation/Command/TranslationLintCommand.php delete mode 100644 vendor/symfony/translation/Command/TranslationPullCommand.php delete mode 100644 vendor/symfony/translation/Command/TranslationPushCommand.php delete mode 100644 vendor/symfony/translation/Command/TranslationTrait.php delete mode 100644 vendor/symfony/translation/Command/XliffLintCommand.php delete mode 100644 vendor/symfony/translation/DataCollector/TranslationDataCollector.php delete mode 100644 vendor/symfony/translation/DataCollectorTranslator.php delete mode 100644 vendor/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php delete mode 100644 vendor/symfony/translation/DependencyInjection/LoggingTranslatorPass.php delete mode 100644 vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php delete mode 100644 vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php delete mode 100644 vendor/symfony/translation/DependencyInjection/TranslatorPass.php delete mode 100644 vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php delete mode 100644 vendor/symfony/translation/Dumper/CsvFileDumper.php delete mode 100644 vendor/symfony/translation/Dumper/DumperInterface.php delete mode 100644 vendor/symfony/translation/Dumper/FileDumper.php delete mode 100644 vendor/symfony/translation/Dumper/IcuResFileDumper.php delete mode 100644 vendor/symfony/translation/Dumper/IniFileDumper.php delete mode 100644 vendor/symfony/translation/Dumper/JsonFileDumper.php delete mode 100644 vendor/symfony/translation/Dumper/MoFileDumper.php delete mode 100644 vendor/symfony/translation/Dumper/PhpFileDumper.php delete mode 100644 vendor/symfony/translation/Dumper/PoFileDumper.php delete mode 100644 vendor/symfony/translation/Dumper/QtFileDumper.php delete mode 100644 vendor/symfony/translation/Dumper/XliffFileDumper.php delete mode 100644 vendor/symfony/translation/Dumper/YamlFileDumper.php delete mode 100644 vendor/symfony/translation/Exception/ExceptionInterface.php delete mode 100644 vendor/symfony/translation/Exception/IncompleteDsnException.php delete mode 100644 vendor/symfony/translation/Exception/InvalidArgumentException.php delete mode 100644 vendor/symfony/translation/Exception/InvalidResourceException.php delete mode 100644 vendor/symfony/translation/Exception/LogicException.php delete mode 100644 vendor/symfony/translation/Exception/MissingRequiredOptionException.php delete mode 100644 vendor/symfony/translation/Exception/NotFoundResourceException.php delete mode 100644 vendor/symfony/translation/Exception/ProviderException.php delete mode 100644 vendor/symfony/translation/Exception/ProviderExceptionInterface.php delete mode 100644 vendor/symfony/translation/Exception/RuntimeException.php delete mode 100644 vendor/symfony/translation/Exception/UnsupportedSchemeException.php delete mode 100644 vendor/symfony/translation/Extractor/AbstractFileExtractor.php delete mode 100644 vendor/symfony/translation/Extractor/ChainExtractor.php delete mode 100644 vendor/symfony/translation/Extractor/ExtractorInterface.php delete mode 100644 vendor/symfony/translation/Extractor/PhpAstExtractor.php delete mode 100644 vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php delete mode 100644 vendor/symfony/translation/Extractor/Visitor/ConstraintVisitor.php delete mode 100644 vendor/symfony/translation/Extractor/Visitor/TransMethodVisitor.php delete mode 100644 vendor/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php delete mode 100644 vendor/symfony/translation/Formatter/IntlFormatter.php delete mode 100644 vendor/symfony/translation/Formatter/IntlFormatterInterface.php delete mode 100644 vendor/symfony/translation/Formatter/MessageFormatter.php delete mode 100644 vendor/symfony/translation/Formatter/MessageFormatterInterface.php delete mode 100644 vendor/symfony/translation/IdentityTranslator.php delete mode 100644 vendor/symfony/translation/LICENSE delete mode 100644 vendor/symfony/translation/Loader/ArrayLoader.php delete mode 100644 vendor/symfony/translation/Loader/CsvFileLoader.php delete mode 100644 vendor/symfony/translation/Loader/FileLoader.php delete mode 100644 vendor/symfony/translation/Loader/IcuDatFileLoader.php delete mode 100644 vendor/symfony/translation/Loader/IcuResFileLoader.php delete mode 100644 vendor/symfony/translation/Loader/IniFileLoader.php delete mode 100644 vendor/symfony/translation/Loader/JsonFileLoader.php delete mode 100644 vendor/symfony/translation/Loader/LoaderInterface.php delete mode 100644 vendor/symfony/translation/Loader/MoFileLoader.php delete mode 100644 vendor/symfony/translation/Loader/PhpFileLoader.php delete mode 100644 vendor/symfony/translation/Loader/PoFileLoader.php delete mode 100644 vendor/symfony/translation/Loader/QtFileLoader.php delete mode 100644 vendor/symfony/translation/Loader/XliffFileLoader.php delete mode 100644 vendor/symfony/translation/Loader/YamlFileLoader.php delete mode 100644 vendor/symfony/translation/LocaleSwitcher.php delete mode 100644 vendor/symfony/translation/LoggingTranslator.php delete mode 100644 vendor/symfony/translation/MessageCatalogue.php delete mode 100644 vendor/symfony/translation/MessageCatalogueInterface.php delete mode 100644 vendor/symfony/translation/MetadataAwareInterface.php delete mode 100644 vendor/symfony/translation/Provider/AbstractProviderFactory.php delete mode 100644 vendor/symfony/translation/Provider/Dsn.php delete mode 100644 vendor/symfony/translation/Provider/FilteringProvider.php delete mode 100644 vendor/symfony/translation/Provider/NullProvider.php delete mode 100644 vendor/symfony/translation/Provider/NullProviderFactory.php delete mode 100644 vendor/symfony/translation/Provider/ProviderFactoryInterface.php delete mode 100644 vendor/symfony/translation/Provider/ProviderInterface.php delete mode 100644 vendor/symfony/translation/Provider/TranslationProviderCollection.php delete mode 100644 vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php delete mode 100644 vendor/symfony/translation/PseudoLocalizationTranslator.php delete mode 100644 vendor/symfony/translation/README.md delete mode 100644 vendor/symfony/translation/Reader/TranslationReader.php delete mode 100644 vendor/symfony/translation/Reader/TranslationReaderInterface.php delete mode 100644 vendor/symfony/translation/Resources/bin/translation-status.php delete mode 100644 vendor/symfony/translation/Resources/data/parents.json delete mode 100644 vendor/symfony/translation/Resources/functions.php delete mode 100644 vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd delete mode 100644 vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd delete mode 100644 vendor/symfony/translation/Resources/schemas/xml.xsd delete mode 100644 vendor/symfony/translation/Test/AbstractProviderFactoryTestCase.php delete mode 100644 vendor/symfony/translation/Test/IncompleteDsnTestTrait.php delete mode 100644 vendor/symfony/translation/Test/ProviderFactoryTestCase.php delete mode 100644 vendor/symfony/translation/Test/ProviderTestCase.php delete mode 100644 vendor/symfony/translation/TranslatableMessage.php delete mode 100644 vendor/symfony/translation/Translator.php delete mode 100644 vendor/symfony/translation/TranslatorBag.php delete mode 100644 vendor/symfony/translation/TranslatorBagInterface.php delete mode 100644 vendor/symfony/translation/Util/ArrayConverter.php delete mode 100644 vendor/symfony/translation/Util/XliffUtils.php delete mode 100644 vendor/symfony/translation/Writer/TranslationWriter.php delete mode 100644 vendor/symfony/translation/Writer/TranslationWriterInterface.php delete mode 100644 vendor/symfony/translation/composer.json delete mode 100644 vendor/voku/portable-ascii/.deepsource.toml delete mode 100644 vendor/voku/portable-ascii/CHANGELOG.md delete mode 100644 vendor/voku/portable-ascii/LICENSE.txt delete mode 100644 vendor/voku/portable-ascii/README.md delete mode 100644 vendor/voku/portable-ascii/composer.json delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/ASCII.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x000.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x001.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x002.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x003.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x004.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x005.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x006.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x007.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x009.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00a.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00b.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00c.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00d.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00e.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00f.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x010.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x011.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x012.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x013.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x014.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x015.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x016.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x017.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x018.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x01d.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x01e.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x01f.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x020.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x021.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x022.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x023.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x024.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x025.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x026.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x027.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x028.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x029.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02a.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02c.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02e.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02f.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x030.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x031.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x032.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x033.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x04d.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x04e.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x04f.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x050.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x051.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x052.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x053.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x054.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x055.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x056.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x057.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x058.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x059.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05a.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05b.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05c.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05d.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05e.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05f.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x060.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x061.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x062.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x063.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x064.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x065.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x066.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x067.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x068.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x069.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06a.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06b.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06c.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06d.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06e.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06f.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x070.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x071.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x072.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x073.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x074.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x075.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x076.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x077.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x078.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x079.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07a.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07b.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07c.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07d.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07e.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07f.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x080.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x081.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x082.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x083.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x084.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x085.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x086.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x087.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x088.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x089.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08a.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08b.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08c.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08d.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08e.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08f.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x090.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x091.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x092.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x093.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x094.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x095.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x096.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x097.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x098.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x099.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09a.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09b.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09c.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09d.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09e.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09f.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0af.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0be.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php delete mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php delete mode 100644 vendor/webman/database/LICENSE delete mode 100644 vendor/webman/database/README.md delete mode 100644 vendor/webman/database/composer.json delete mode 100644 vendor/webman/database/src/DatabaseManager.php delete mode 100644 vendor/webman/database/src/Initializer.php delete mode 100644 vendor/webman/database/src/Install.php delete mode 100644 vendor/webman/database/src/Manager.php delete mode 100644 vendor/webman/database/src/config/database.php delete mode 100644 vendor/webman/database/src/support/Db.php delete mode 100644 vendor/webman/database/src/support/Model.php delete mode 100644 vendor/workerman/coroutine/.gitignore delete mode 100644 vendor/workerman/coroutine/LICENSE delete mode 100644 vendor/workerman/coroutine/README.md delete mode 100644 vendor/workerman/coroutine/composer.json delete mode 100644 vendor/workerman/coroutine/src/Barrier.php delete mode 100644 vendor/workerman/coroutine/src/Barrier/BarrierInterface.php delete mode 100644 vendor/workerman/coroutine/src/Barrier/Fiber.php delete mode 100644 vendor/workerman/coroutine/src/Barrier/Swoole.php delete mode 100644 vendor/workerman/coroutine/src/Barrier/Swow.php delete mode 100644 vendor/workerman/coroutine/src/Channel.php delete mode 100644 vendor/workerman/coroutine/src/Channel/ChannelInterface.php delete mode 100644 vendor/workerman/coroutine/src/Channel/Fiber.php delete mode 100644 vendor/workerman/coroutine/src/Channel/Memory.php delete mode 100644 vendor/workerman/coroutine/src/Channel/Swoole.php delete mode 100644 vendor/workerman/coroutine/src/Channel/Swow.php delete mode 100644 vendor/workerman/coroutine/src/Context.php delete mode 100644 vendor/workerman/coroutine/src/Context/ContextInterface.php delete mode 100644 vendor/workerman/coroutine/src/Context/Fiber.php delete mode 100644 vendor/workerman/coroutine/src/Context/Swoole.php delete mode 100644 vendor/workerman/coroutine/src/Context/Swow.php delete mode 100644 vendor/workerman/coroutine/src/Coroutine.php delete mode 100644 vendor/workerman/coroutine/src/Coroutine/CoroutineInterface.php delete mode 100644 vendor/workerman/coroutine/src/Coroutine/Fiber.php delete mode 100644 vendor/workerman/coroutine/src/Coroutine/Swoole.php delete mode 100644 vendor/workerman/coroutine/src/Coroutine/Swow.php delete mode 100644 vendor/workerman/coroutine/src/Locker.php delete mode 100644 vendor/workerman/coroutine/src/Parallel.php delete mode 100644 vendor/workerman/coroutine/src/Pool.php delete mode 100644 vendor/workerman/coroutine/src/PoolInterface.php delete mode 100644 vendor/workerman/coroutine/src/Utils/DestructionWatcher.php delete mode 100644 vendor/workerman/coroutine/src/WaitGroup.php delete mode 100644 vendor/workerman/coroutine/src/WaitGroup/Fiber.php delete mode 100644 vendor/workerman/coroutine/src/WaitGroup/Swoole.php delete mode 100644 vendor/workerman/coroutine/src/WaitGroup/Swow.php delete mode 100644 vendor/workerman/coroutine/src/WaitGroup/WaitGroupInterface.php delete mode 100644 vendor/workerman/coroutine/stubs/SwowStub.php delete mode 100644 vendor/workerman/coroutine/tests/BarrierTest.php delete mode 100644 vendor/workerman/coroutine/tests/ChannelTest.php delete mode 100644 vendor/workerman/coroutine/tests/ContextTest.php delete mode 100644 vendor/workerman/coroutine/tests/CoroutineTest.php delete mode 100644 vendor/workerman/coroutine/tests/FiberChannelTest.php delete mode 100644 vendor/workerman/coroutine/tests/LockerTest.php delete mode 100644 vendor/workerman/coroutine/tests/ParallelTest.php delete mode 100644 vendor/workerman/coroutine/tests/PoolTest.php delete mode 100644 vendor/workerman/coroutine/tests/WaitGroupTest.php delete mode 100644 vendor/workerman/coroutine/tests/start.php delete mode 100644 vendor/workerman/webman-framework/.gitignore delete mode 100644 vendor/workerman/webman-framework/README.md delete mode 100644 vendor/workerman/webman-framework/composer.json delete mode 100644 vendor/workerman/webman-framework/src/Annotation/DisableDefaultRoute.php delete mode 100644 vendor/workerman/webman-framework/src/Annotation/Middleware.php delete mode 100644 vendor/workerman/webman-framework/src/App.php delete mode 100644 vendor/workerman/webman-framework/src/Bootstrap.php delete mode 100644 vendor/workerman/webman-framework/src/Config.php delete mode 100644 vendor/workerman/webman-framework/src/Container.php delete mode 100644 vendor/workerman/webman-framework/src/Context.php delete mode 100644 vendor/workerman/webman-framework/src/Exception/BusinessException.php delete mode 100644 vendor/workerman/webman-framework/src/Exception/ExceptionHandler.php delete mode 100644 vendor/workerman/webman-framework/src/Exception/ExceptionHandlerInterface.php delete mode 100644 vendor/workerman/webman-framework/src/Exception/FileException.php delete mode 100644 vendor/workerman/webman-framework/src/Exception/NotFoundException.php delete mode 100644 vendor/workerman/webman-framework/src/File.php delete mode 100644 vendor/workerman/webman-framework/src/Http/Request.php delete mode 100644 vendor/workerman/webman-framework/src/Http/Response.php delete mode 100644 vendor/workerman/webman-framework/src/Http/UploadFile.php delete mode 100644 vendor/workerman/webman-framework/src/Install.php delete mode 100644 vendor/workerman/webman-framework/src/Middleware.php delete mode 100644 vendor/workerman/webman-framework/src/MiddlewareInterface.php delete mode 100644 vendor/workerman/webman-framework/src/Route.php delete mode 100644 vendor/workerman/webman-framework/src/Route/Route.php delete mode 100644 vendor/workerman/webman-framework/src/Session/FileSessionHandler.php delete mode 100644 vendor/workerman/webman-framework/src/Session/RedisClusterSessionHandler.php delete mode 100644 vendor/workerman/webman-framework/src/Session/RedisSessionHandler.php delete mode 100644 vendor/workerman/webman-framework/src/Util.php delete mode 100644 vendor/workerman/webman-framework/src/View.php delete mode 100644 vendor/workerman/webman-framework/src/start.php delete mode 100644 vendor/workerman/webman-framework/src/support/App.php delete mode 100644 vendor/workerman/webman-framework/src/support/Container.php delete mode 100644 vendor/workerman/webman-framework/src/support/Context.php delete mode 100644 vendor/workerman/webman-framework/src/support/Log.php delete mode 100644 vendor/workerman/webman-framework/src/support/Plugin.php delete mode 100644 vendor/workerman/webman-framework/src/support/Request.php delete mode 100644 vendor/workerman/webman-framework/src/support/Response.php delete mode 100644 vendor/workerman/webman-framework/src/support/Translation.php delete mode 100644 vendor/workerman/webman-framework/src/support/View.php delete mode 100644 vendor/workerman/webman-framework/src/support/annotation/DisableDefaultRoute.php delete mode 100644 vendor/workerman/webman-framework/src/support/annotation/Middleware.php delete mode 100644 vendor/workerman/webman-framework/src/support/bootstrap.php delete mode 100644 vendor/workerman/webman-framework/src/support/bootstrap/Session.php delete mode 100644 vendor/workerman/webman-framework/src/support/exception/BusinessException.php delete mode 100644 vendor/workerman/webman-framework/src/support/exception/Handler.php delete mode 100644 vendor/workerman/webman-framework/src/support/exception/InputTypeException.php delete mode 100644 vendor/workerman/webman-framework/src/support/exception/InputValueException.php delete mode 100644 vendor/workerman/webman-framework/src/support/exception/MissingInputException.php delete mode 100644 vendor/workerman/webman-framework/src/support/exception/NotFoundException.php delete mode 100644 vendor/workerman/webman-framework/src/support/exception/PageNotFoundException.php delete mode 100644 vendor/workerman/webman-framework/src/support/helpers.php delete mode 100644 vendor/workerman/webman-framework/src/support/view/Blade.php delete mode 100644 vendor/workerman/webman-framework/src/support/view/Raw.php delete mode 100644 vendor/workerman/webman-framework/src/support/view/ThinkPHP.php delete mode 100644 vendor/workerman/webman-framework/src/support/view/Twig.php delete mode 100644 vendor/workerman/webman-framework/src/windows.php delete mode 100644 vendor/workerman/workerman/MIT-LICENSE.txt delete mode 100644 vendor/workerman/workerman/README.md delete mode 100644 vendor/workerman/workerman/SECURITY.md delete mode 100644 vendor/workerman/workerman/composer.json delete mode 100644 vendor/workerman/workerman/src/Connection/AsyncTcpConnection.php delete mode 100644 vendor/workerman/workerman/src/Connection/AsyncUdpConnection.php delete mode 100644 vendor/workerman/workerman/src/Connection/ConnectionInterface.php delete mode 100644 vendor/workerman/workerman/src/Connection/TcpConnection.php delete mode 100644 vendor/workerman/workerman/src/Connection/UdpConnection.php delete mode 100644 vendor/workerman/workerman/src/Events/Ev.php delete mode 100644 vendor/workerman/workerman/src/Events/Event.php delete mode 100644 vendor/workerman/workerman/src/Events/EventInterface.php delete mode 100644 vendor/workerman/workerman/src/Events/Fiber.php delete mode 100644 vendor/workerman/workerman/src/Events/Select.php delete mode 100644 vendor/workerman/workerman/src/Events/Swoole.php delete mode 100644 vendor/workerman/workerman/src/Events/Swow.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Frame.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Http.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Http/Chunk.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Http/Request.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Http/Response.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Http/ServerSentEvents.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Http/Session.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Http/Session/FileSessionHandler.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Http/Session/RedisClusterSessionHandler.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Http/Session/RedisSessionHandler.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Http/Session/SessionHandlerInterface.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Http/mime.types delete mode 100644 vendor/workerman/workerman/src/Protocols/ProtocolInterface.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Text.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Websocket.php delete mode 100644 vendor/workerman/workerman/src/Protocols/Ws.php delete mode 100644 vendor/workerman/workerman/src/Timer.php delete mode 100644 vendor/workerman/workerman/src/Worker.php delete mode 100644 webman.zip diff --git a/composer.json b/composer.json deleted file mode 100644 index cda8a37..0000000 --- a/composer.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "require": { - "webman/database": "v2.1.1" - } -} diff --git a/composer.json.txt b/composer.json.txt deleted file mode 100644 index 5553665..0000000 --- a/composer.json.txt +++ /dev/null @@ -1,5 +0,0 @@ -{ - "config": { - "disable-tls": false, - "secure-http": false} -} \ No newline at end of file diff --git a/composer.lock b/composer.lock deleted file mode 100644 index e78455c..0000000 --- a/composer.lock +++ /dev/null @@ -1,1813 +0,0 @@ -{ - "_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": "bada8bc7bcb18a93a92df0dd06295584", - "packages": [ - { - "name": "brick/math", - "version": "0.12.3", - "source": { - "type": "git", - "url": "https://github.com/brick/math.git", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^10.1", - "vimeo/psalm": "6.8.8" - }, - "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", - "bignumber", - "brick", - "decimal", - "integer", - "math", - "mathematics", - "rational" - ], - "support": { - "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.3" - }, - "funding": [ - { - "url": "https://github.com/BenMorel", - "type": "github" - } - ], - "time": "2025-02-28T13:11:00+00:00" - }, - { - "name": "carbonphp/carbon-doctrine-types", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "conflict": { - "doctrine/dbal": "<4.0.0 || >=5.0.0" - }, - "require-dev": { - "doctrine/dbal": "^4.0.0", - "nesbot/carbon": "^2.71.0 || ^3.0.0", - "phpunit/phpunit": "^10.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "KyleKatarn", - "email": "kylekatarnls@gmail.com" - } - ], - "description": "Types to use Carbon in Doctrine", - "keywords": [ - "carbon", - "date", - "datetime", - "doctrine", - "time" - ], - "support": { - "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/kylekatarnls", - "type": "github" - }, - { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", - "type": "tidelift" - } - ], - "time": "2024-02-09T16:56:22+00:00" - }, - { - "name": "doctrine/inflector", - "version": "2.0.10", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^11.0", - "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 || ^5.4" - }, - "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.10" - }, - "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": "2024-02-18T20:23:39+00:00" - }, - { - "name": "illuminate/collections", - "version": "v11.44.1", - "source": { - "type": "git", - "url": "https://github.com/illuminate/collections.git", - "reference": "48f5357348093bc8b94c691aa3ffc861d2ecc2a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/48f5357348093bc8b94c691aa3ffc861d2ecc2a0", - "reference": "48f5357348093bc8b94c691aa3ffc861d2ecc2a0", - "shasum": "" - }, - "require": { - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "php": "^8.2" - }, - "suggest": { - "symfony/var-dumper": "Required to use the dump method (^7.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Collections package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-02-28T16:55:51+00:00" - }, - { - "name": "illuminate/conditionable", - "version": "v11.44.1", - "source": { - "type": "git", - "url": "https://github.com/illuminate/conditionable.git", - "reference": "911df1bda950a3b799cf80671764e34eede131c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/conditionable/zipball/911df1bda950a3b799cf80671764e34eede131c6", - "reference": "911df1bda950a3b799cf80671764e34eede131c6", - "shasum": "" - }, - "require": { - "php": "^8.0.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Conditionable package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2024-11-21T16:28:56+00:00" - }, - { - "name": "illuminate/container", - "version": "v11.44.1", - "source": { - "type": "git", - "url": "https://github.com/illuminate/container.git", - "reference": "4dcc3fcbab92e734fc0c08d9cfd97f5a1aef18ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/container/zipball/4dcc3fcbab92e734fc0c08d9cfd97f5a1aef18ca", - "reference": "4dcc3fcbab92e734fc0c08d9cfd97f5a1aef18ca", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^11.0", - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1" - }, - "provide": { - "psr/container-implementation": "1.1|2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Container\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Container package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-02-10T14:20:57+00:00" - }, - { - "name": "illuminate/contracts", - "version": "v11.44.1", - "source": { - "type": "git", - "url": "https://github.com/illuminate/contracts.git", - "reference": "b350a3cd8450846325cb49e1cbc1293598b18898" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/b350a3cd8450846325cb49e1cbc1293598b18898", - "reference": "b350a3cd8450846325cb49e1cbc1293598b18898", - "shasum": "" - }, - "require": { - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1", - "psr/simple-cache": "^1.0|^2.0|^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Contracts\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Contracts package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-02-10T14:20:57+00:00" - }, - { - "name": "illuminate/database", - "version": "v11.44.1", - "source": { - "type": "git", - "url": "https://github.com/illuminate/database.git", - "reference": "131dcdfcc6c838115d5e58c77d4fe816f735dff8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/database/zipball/131dcdfcc6c838115d5e58c77d4fe816f735dff8", - "reference": "131dcdfcc6c838115d5e58c77d4fe816f735dff8", - "shasum": "" - }, - "require": { - "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", - "ext-pdo": "*", - "illuminate/collections": "^11.0", - "illuminate/container": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "illuminate/support": "^11.0", - "laravel/serializable-closure": "^1.3|^2.0", - "php": "^8.2" - }, - "suggest": { - "ext-filter": "Required to use the Postgres database driver.", - "fakerphp/faker": "Required to use the eloquent factory builder (^1.24).", - "illuminate/console": "Required to use the database commands (^11.0).", - "illuminate/events": "Required to use the observers with Eloquent (^11.0).", - "illuminate/filesystem": "Required to use the migrations (^11.0).", - "illuminate/pagination": "Required to paginate the result set (^11.0).", - "symfony/finder": "Required to use Eloquent model factories (^7.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Database\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Database package.", - "homepage": "https://laravel.com", - "keywords": [ - "database", - "laravel", - "orm", - "sql" - ], - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-02-21T13:01:45+00:00" - }, - { - "name": "illuminate/macroable", - "version": "v11.44.1", - "source": { - "type": "git", - "url": "https://github.com/illuminate/macroable.git", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", - "shasum": "" - }, - "require": { - "php": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Macroable package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2024-06-28T20:10:30+00:00" - }, - { - "name": "illuminate/support", - "version": "v11.44.1", - "source": { - "type": "git", - "url": "https://github.com/illuminate/support.git", - "reference": "d86d42ad0c75a020e0e4a7c734e9424ca86811cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/d86d42ad0c75a020e0e4a7c734e9424ca86811cc", - "reference": "d86d42ad0c75a020e0e4a7c734e9424ca86811cc", - "shasum": "" - }, - "require": { - "doctrine/inflector": "^2.0", - "ext-ctype": "*", - "ext-filter": "*", - "ext-mbstring": "*", - "illuminate/collections": "^11.0", - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "nesbot/carbon": "^2.72.6|^3.8.4", - "php": "^8.2", - "voku/portable-ascii": "^2.0.2" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "spatie/once": "*" - }, - "suggest": { - "illuminate/filesystem": "Required to use the Composer class (^11.0).", - "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.6).", - "league/uri": "Required to use the Uri class (^7.5.1).", - "ramsey/uuid": "Required to use Str::uuid() (^4.7).", - "symfony/process": "Required to use the Composer class (^7.0).", - "symfony/uid": "Required to use Str::ulid() (^7.0).", - "symfony/var-dumper": "Required to use the dd function (^7.0).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Support package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-02-23T14:20:22+00:00" - }, - { - "name": "laravel/serializable-closure", - "version": "v2.0.3", - "source": { - "type": "git", - "url": "https://github.com/laravel/serializable-closure.git", - "reference": "f379c13663245f7aa4512a7869f62eb14095f23f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f379c13663245f7aa4512a7869f62eb14095f23f", - "reference": "f379c13663245f7aa4512a7869f62eb14095f23f", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "illuminate/support": "^10.0|^11.0|^12.0", - "nesbot/carbon": "^2.67|^3.0", - "pestphp/pest": "^2.36|^3.0", - "phpstan/phpstan": "^2.0", - "symfony/var-dumper": "^6.2.0|^7.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.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": "2025-02-11T15:03:05+00:00" - }, - { - "name": "nesbot/carbon", - "version": "3.8.6", - "source": { - "type": "git", - "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ff2f20cf83bd4d503720632ce8a426dc747bf7fd", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd", - "shasum": "" - }, - "require": { - "carbonphp/carbon-doctrine-types": "<100.0", - "ext-json": "*", - "php": "^8.1", - "psr/clock": "^1.0", - "symfony/clock": "^6.3 || ^7.0", - "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" - }, - "provide": { - "psr/clock-implementation": "1.0" - }, - "require-dev": { - "doctrine/dbal": "^3.6.3 || ^4.0", - "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.57.2", - "kylekatarnls/multi-tester": "^2.5.3", - "ondrejmirtes/better-reflection": "^6.25.0.4", - "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.11.2", - "phpunit/phpunit": "^10.5.20", - "squizlabs/php_codesniffer": "^3.9.0" - }, - "bin": [ - "bin/carbon" - ], - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - }, - "branch-alias": { - "dev-2.x": "2.x-dev", - "dev-master": "3.x-dev" - } - }, - "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/CarbonPHP/carbon/issues", - "source": "https://github.com/CarbonPHP/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": "2025-02-20T17:33:38+00:00" - }, - { - "name": "nikic/fast-route", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/FastRoute.git", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|~5.7" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "FastRoute\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov", - "email": "nikic@php.net" - } - ], - "description": "Fast request router for PHP", - "keywords": [ - "router", - "routing" - ], - "support": { - "issues": "https://github.com/nikic/FastRoute/issues", - "source": "https://github.com/nikic/FastRoute/tree/master" - }, - "time": "2018-02-13T20:26:39+00:00" - }, - { - "name": "psr/clock", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Clock\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", - "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" - ], - "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" - }, - "time": "2022-11-25T14:36:26+00:00" - }, - { - "name": "psr/container", - "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/log", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "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.2" - }, - "time": "2024-09-11T13:17:53+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": "symfony/clock", - "version": "v7.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/clock.git", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" - }, - "provide": { - "psr/clock-implementation": "1.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/now.php" - ], - "psr-4": { - "Symfony\\Component\\Clock\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Decouples applications from the system clock", - "homepage": "https://symfony.com", - "keywords": [ - "clock", - "psr20", - "time" - ], - "support": { - "source": "https://github.com/symfony/clock/tree/v7.2.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-25T14:21:43+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } - }, - "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.5.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": "2024-09-25T14:20:29+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "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.31.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, - { - "name": "symfony/polyfill-php83", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, - "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.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, - { - "name": "symfony/translation", - "version": "v7.2.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/283856e6981286cc0d800b53bd5703e8e363f05a", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" - }, - "conflict": { - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<6.4", - "symfony/yaml": "<6.4" - }, - "provide": { - "symfony/translation-implementation": "2.3|3.0" - }, - "require-dev": { - "nikic/php-parser": "^4.18|^5.0", - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" - }, - "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/v7.2.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-02-13T10:27:23+00:00" - }, - { - "name": "symfony/translation-contracts", - "version": "v3.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } - }, - "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.5.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": "2024-09-25T14:20:29+00:00" - }, - { - "name": "voku/portable-ascii", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", - "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": "https://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.3" - }, - "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": "2024-11-21T01:49:47+00:00" - }, - { - "name": "webman/database", - "version": "v2.1.1", - "source": { - "type": "git", - "url": "https://github.com/webman-php/database.git", - "reference": "360e42db6d1a6625ea55241a882a4244b84e72a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webman-php/database/zipball/360e42db6d1a6625ea55241a882a4244b84e72a0", - "reference": "360e42db6d1a6625ea55241a882a4244b84e72a0", - "shasum": "" - }, - "require": { - "illuminate/database": "^10.0 || ^11.0", - "laravel/serializable-closure": "^1.0 || ^2.0", - "workerman/webman-framework": "^2.1 || dev-master" - }, - "type": "library", - "autoload": { - "psr-4": { - "support\\": "src/support", - "Webman\\Database\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Webman database", - "support": { - "issues": "https://github.com/webman-php/database/issues", - "source": "https://github.com/webman-php/database/tree/v2.1.1" - }, - "time": "2025-02-06T09:00:41+00:00" - }, - { - "name": "workerman/coroutine", - "version": "v1.1.3", - "source": { - "type": "git", - "url": "https://github.com/workerman-php/coroutine.git", - "reference": "df8fc428967d512a74a8a7d80355c1d40228c9fa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/workerman-php/coroutine/zipball/df8fc428967d512a74a8a7d80355c1d40228c9fa", - "reference": "df8fc428967d512a74a8a7d80355c1d40228c9fa", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^11.0", - "psr/log": "*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Workerman\\": "src", - "Workerman\\Coroutine\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Workerman coroutine", - "support": { - "issues": "https://github.com/workerman-php/coroutine/issues", - "source": "https://github.com/workerman-php/coroutine/tree/v1.1.3" - }, - "time": "2025-02-17T03:34:21+00:00" - }, - { - "name": "workerman/webman-framework", - "version": "v2.1.2", - "source": { - "type": "git", - "url": "https://github.com/walkor/webman-framework.git", - "reference": "f803bd867f07bb0929faef060b59a19a44186bfc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/walkor/webman-framework/zipball/f803bd867f07bb0929faef060b59a19a44186bfc", - "reference": "f803bd867f07bb0929faef060b59a19a44186bfc", - "shasum": "" - }, - "require": { - "ext-json": "*", - "nikic/fast-route": "^1.3", - "php": ">=8.1", - "psr/container": ">=1.0", - "psr/log": "^3.0", - "workerman/workerman": "^5.1 || dev-master" - }, - "suggest": { - "ext-event": "For better performance. " - }, - "type": "library", - "autoload": { - "files": [ - "./src/support/helpers.php" - ], - "psr-4": { - "Webman\\": "./src", - "Support\\": "./src/support", - "support\\": "./src/support", - "Support\\View\\": "./src/support/view", - "Support\\Bootstrap\\": "./src/support/bootstrap", - "Support\\Exception\\": "./src/support/exception" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "walkor", - "email": "walkor@workerman.net", - "homepage": "https://www.workerman.net", - "role": "Developer" - } - ], - "description": "High performance HTTP Service Framework.", - "homepage": "https://www.workerman.net", - "keywords": [ - "High Performance", - "http service" - ], - "support": { - "email": "walkor@workerman.net", - "forum": "https://wenda.workerman.net/", - "issues": "https://github.com/walkor/webman/issues", - "source": "https://github.com/walkor/webman-framework", - "wiki": "https://doc.workerman.net/" - }, - "time": "2025-03-10T11:52:22+00:00" - }, - { - "name": "workerman/workerman", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/walkor/workerman.git", - "reference": "5ce17bc71dfdad0e9eba8cd658342da793d2f581" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/walkor/workerman/zipball/5ce17bc71dfdad0e9eba8cd658342da793d2f581", - "reference": "5ce17bc71dfdad0e9eba8cd658342da793d2f581", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": ">=8.1", - "workerman/coroutine": "^1.1 || dev-main" - }, - "conflict": { - "ext-swow": "realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if ( - (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) - || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) - ) { - return include("phpvfscomposer://" . __DIR__ . '/..'.'/nesbot/carbon/bin/carbon'); - } -} - -return include __DIR__ . '/..'.'/nesbot/carbon/bin/carbon'; diff --git a/vendor/bin/carbon.bat b/vendor/bin/carbon.bat deleted file mode 100644 index 806cf15..0000000 --- a/vendor/bin/carbon.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/carbon -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/brick/math/CHANGELOG.md b/vendor/brick/math/CHANGELOG.md deleted file mode 100644 index 4b47b48..0000000 --- a/vendor/brick/math/CHANGELOG.md +++ /dev/null @@ -1,479 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -## [0.12.3](https://github.com/brick/math/releases/tag/0.12.3) - 2025-02-28 - -✨ **New features** - -- `BigDecimal::getPrecision()` Returns the number of significant digits in a decimal number - -## [0.12.2](https://github.com/brick/math/releases/tag/0.12.2) - 2025-02-26 - -⚡️ **Performance improvements** - -- Division in `NativeCalculator` is now faster for small divisors, thanks to [@Izumi-kun](https://github.com/Izumi-kun) in [#87](https://github.com/brick/math/pull/87). - -👌 **Improvements** - -- Add missing `RoundingNecessaryException` to the `@throws` annotation of `BigNumber::of()` - -## [0.12.1](https://github.com/brick/math/releases/tag/0.12.1) - 2023-11-29 - -⚡️ **Performance improvements** - -- `BigNumber::of()` is now faster, thanks to [@SebastienDug](https://github.com/SebastienDug) in [#77](https://github.com/brick/math/pull/77). - -## [0.12.0](https://github.com/brick/math/releases/tag/0.12.0) - 2023-11-26 - -💥 **Breaking changes** - -- Minimum PHP version is now 8.1 -- `RoundingMode` is now an `enum`; if you're type-hinting rounding modes, you need to type-hint against `RoundingMode` instead of `int` now -- `BigNumber` classes do not implement the `Serializable` interface anymore (they use the [new custom object serialization mechanism](https://wiki.php.net/rfc/custom_object_serialization)) -- The following breaking changes only affect you if you're creating your own `BigNumber` subclasses: - - the return type of `BigNumber::of()` is now `static` - - `BigNumber` has a new abstract method `from()` - - all `public` and `protected` functions of `BigNumber` are now `final` - -## [0.11.0](https://github.com/brick/math/releases/tag/0.11.0) - 2023-01-16 - -💥 **Breaking changes** - -- Minimum PHP version is now 8.0 -- Methods accepting a union of types are now strongly typed* -- `MathException` now extends `Exception` instead of `RuntimeException` - -* You may now run into type errors if you were passing `Stringable` objects to `of()` or any of the methods -internally calling `of()`, with `strict_types` enabled. You can fix this by casting `Stringable` objects to `string` -first. - -## [0.10.2](https://github.com/brick/math/releases/tag/0.10.2) - 2022-08-11 - -👌 **Improvements** - -- `BigRational::toFloat()` now simplifies the fraction before performing division (#73) thanks to @olsavmic - -## [0.10.1](https://github.com/brick/math/releases/tag/0.10.1) - 2022-08-02 - -✨ **New features** - -- `BigInteger::gcdMultiple()` returns the GCD of multiple `BigInteger` numbers - -## [0.10.0](https://github.com/brick/math/releases/tag/0.10.0) - 2022-06-18 - -💥 **Breaking changes** - -- Minimum PHP version is now 7.4 - -## [0.9.3](https://github.com/brick/math/releases/tag/0.9.3) - 2021-08-15 - -🚀 **Compatibility with PHP 8.1** - -- Support for custom object serialization; this removes a warning on PHP 8.1 due to the `Serializable` interface being deprecated (#60) thanks @TRowbotham - -## [0.9.2](https://github.com/brick/math/releases/tag/0.9.2) - 2021-01-20 - -🐛 **Bug fix** - -- Incorrect results could be returned when using the BCMath calculator, with a default scale set with `bcscale()`, on PHP >= 7.2 (#55). - -## [0.9.1](https://github.com/brick/math/releases/tag/0.9.1) - 2020-08-19 - -✨ **New features** - -- `BigInteger::not()` returns the bitwise `NOT` value - -🐛 **Bug fixes** - -- `BigInteger::toBytes()` could return an incorrect binary representation for some numbers -- The bitwise operations `and()`, `or()`, `xor()` on `BigInteger` could return an incorrect result when the GMP extension is not available - -## [0.9.0](https://github.com/brick/math/releases/tag/0.9.0) - 2020-08-18 - -👌 **Improvements** - -- `BigNumber::of()` now accepts `.123` and `123.` formats, both of which return a `BigDecimal` - -💥 **Breaking changes** - -- Deprecated method `BigInteger::powerMod()` has been removed - use `modPow()` instead -- Deprecated method `BigInteger::parse()` has been removed - use `fromBase()` instead - -## [0.8.17](https://github.com/brick/math/releases/tag/0.8.17) - 2020-08-19 - -🐛 **Bug fix** - -- `BigInteger::toBytes()` could return an incorrect binary representation for some numbers -- The bitwise operations `and()`, `or()`, `xor()` on `BigInteger` could return an incorrect result when the GMP extension is not available - -## [0.8.16](https://github.com/brick/math/releases/tag/0.8.16) - 2020-08-18 - -🚑 **Critical fix** - -- This version reintroduces the deprecated `BigInteger::parse()` method, that has been removed by mistake in version `0.8.9` and should have lasted for the whole `0.8` release cycle. - -✨ **New features** - -- `BigInteger::modInverse()` calculates a modular multiplicative inverse -- `BigInteger::fromBytes()` creates a `BigInteger` from a byte string -- `BigInteger::toBytes()` converts a `BigInteger` to a byte string -- `BigInteger::randomBits()` creates a pseudo-random `BigInteger` of a given bit length -- `BigInteger::randomRange()` creates a pseudo-random `BigInteger` between two bounds - -💩 **Deprecations** - -- `BigInteger::powerMod()` is now deprecated in favour of `modPow()` - -## [0.8.15](https://github.com/brick/math/releases/tag/0.8.15) - 2020-04-15 - -🐛 **Fixes** - -- added missing `ext-json` requirement, due to `BigNumber` implementing `JsonSerializable` - -⚡️ **Optimizations** - -- additional optimization in `BigInteger::remainder()` - -## [0.8.14](https://github.com/brick/math/releases/tag/0.8.14) - 2020-02-18 - -✨ **New features** - -- `BigInteger::getLowestSetBit()` returns the index of the rightmost one bit - -## [0.8.13](https://github.com/brick/math/releases/tag/0.8.13) - 2020-02-16 - -✨ **New features** - -- `BigInteger::isEven()` tests whether the number is even -- `BigInteger::isOdd()` tests whether the number is odd -- `BigInteger::testBit()` tests if a bit is set -- `BigInteger::getBitLength()` returns the number of bits in the minimal representation of the number - -## [0.8.12](https://github.com/brick/math/releases/tag/0.8.12) - 2020-02-03 - -🛠️ **Maintenance release** - -Classes are now annotated for better static analysis with [psalm](https://psalm.dev/). - -This is a maintenance release: no bug fixes, no new features, no breaking changes. - -## [0.8.11](https://github.com/brick/math/releases/tag/0.8.11) - 2020-01-23 - -✨ **New feature** - -`BigInteger::powerMod()` performs a power-with-modulo operation. Useful for crypto. - -## [0.8.10](https://github.com/brick/math/releases/tag/0.8.10) - 2020-01-21 - -✨ **New feature** - -`BigInteger::mod()` returns the **modulo** of two numbers. The *modulo* differs from the *remainder* when the signs of the operands are different. - -## [0.8.9](https://github.com/brick/math/releases/tag/0.8.9) - 2020-01-08 - -⚡️ **Performance improvements** - -A few additional optimizations in `BigInteger` and `BigDecimal` when one of the operands can be returned as is. Thanks to @tomtomsen in #24. - -## [0.8.8](https://github.com/brick/math/releases/tag/0.8.8) - 2019-04-25 - -🐛 **Bug fixes** - -- `BigInteger::toBase()` could return an empty string for zero values (BCMath & Native calculators only, GMP calculator unaffected) - -✨ **New features** - -- `BigInteger::toArbitraryBase()` converts a number to an arbitrary base, using a custom alphabet -- `BigInteger::fromArbitraryBase()` converts a string in an arbitrary base, using a custom alphabet, back to a number - -These methods can be used as the foundation to convert strings between different bases/alphabets, using BigInteger as an intermediate representation. - -💩 **Deprecations** - -- `BigInteger::parse()` is now deprecated in favour of `fromBase()` - -`BigInteger::fromBase()` works the same way as `parse()`, with 2 minor differences: - -- the `$base` parameter is required, it does not default to `10` -- it throws a `NumberFormatException` instead of an `InvalidArgumentException` when the number is malformed - -## [0.8.7](https://github.com/brick/math/releases/tag/0.8.7) - 2019-04-20 - -**Improvements** - -- Safer conversion from `float` when using custom locales -- **Much faster** `NativeCalculator` implementation 🚀 - -You can expect **at least a 3x performance improvement** for common arithmetic operations when using the library on systems without GMP or BCMath; it gets exponentially faster on multiplications with a high number of digits. This is due to calculations now being performed on whole blocks of digits (the block size depending on the platform, 32-bit or 64-bit) instead of digit-by-digit as before. - -## [0.8.6](https://github.com/brick/math/releases/tag/0.8.6) - 2019-04-11 - -**New method** - -`BigNumber::sum()` returns the sum of one or more numbers. - -## [0.8.5](https://github.com/brick/math/releases/tag/0.8.5) - 2019-02-12 - -**Bug fix**: `of()` factory methods could fail when passing a `float` in environments using a `LC_NUMERIC` locale with a decimal separator other than `'.'` (#20). - -Thanks @manowark 👍 - -## [0.8.4](https://github.com/brick/math/releases/tag/0.8.4) - 2018-12-07 - -**New method** - -`BigDecimal::sqrt()` calculates the square root of a decimal number, to a given scale. - -## [0.8.3](https://github.com/brick/math/releases/tag/0.8.3) - 2018-12-06 - -**New method** - -`BigInteger::sqrt()` calculates the square root of a number (thanks @peter279k). - -**New exception** - -`NegativeNumberException` is thrown when calling `sqrt()` on a negative number. - -## [0.8.2](https://github.com/brick/math/releases/tag/0.8.2) - 2018-11-08 - -**Performance update** - -- Further improvement of `toInt()` performance -- `NativeCalculator` can now perform some multiplications more efficiently - -## [0.8.1](https://github.com/brick/math/releases/tag/0.8.1) - 2018-11-07 - -Performance optimization of `toInt()` methods. - -## [0.8.0](https://github.com/brick/math/releases/tag/0.8.0) - 2018-10-13 - -**Breaking changes** - -The following deprecated methods have been removed. Use the new method name instead: - -| Method removed | Replacement method | -| --- | --- | -| `BigDecimal::getIntegral()` | `BigDecimal::getIntegralPart()` | -| `BigDecimal::getFraction()` | `BigDecimal::getFractionalPart()` | - ---- - -**New features** - -`BigInteger` has been augmented with 5 new methods for bitwise operations: - -| New method | Description | -| --- | --- | -| `and()` | performs a bitwise `AND` operation on two numbers | -| `or()` | performs a bitwise `OR` operation on two numbers | -| `xor()` | performs a bitwise `XOR` operation on two numbers | -| `shiftedLeft()` | returns the number shifted left by a number of bits | -| `shiftedRight()` | returns the number shifted right by a number of bits | - -Thanks to @DASPRiD 👍 - -## [0.7.3](https://github.com/brick/math/releases/tag/0.7.3) - 2018-08-20 - -**New method:** `BigDecimal::hasNonZeroFractionalPart()` - -**Renamed/deprecated methods:** - -- `BigDecimal::getIntegral()` has been renamed to `getIntegralPart()` and is now deprecated -- `BigDecimal::getFraction()` has been renamed to `getFractionalPart()` and is now deprecated - -## [0.7.2](https://github.com/brick/math/releases/tag/0.7.2) - 2018-07-21 - -**Performance update** - -`BigInteger::parse()` and `toBase()` now use GMP's built-in base conversion features when available. - -## [0.7.1](https://github.com/brick/math/releases/tag/0.7.1) - 2018-03-01 - -This is a maintenance release, no code has been changed. - -- When installed with `--no-dev`, the autoloader does not autoload tests anymore -- Tests and other files unnecessary for production are excluded from the dist package - -This will help make installations more compact. - -## [0.7.0](https://github.com/brick/math/releases/tag/0.7.0) - 2017-10-02 - -Methods renamed: - -- `BigNumber:sign()` has been renamed to `getSign()` -- `BigDecimal::unscaledValue()` has been renamed to `getUnscaledValue()` -- `BigDecimal::scale()` has been renamed to `getScale()` -- `BigDecimal::integral()` has been renamed to `getIntegral()` -- `BigDecimal::fraction()` has been renamed to `getFraction()` -- `BigRational::numerator()` has been renamed to `getNumerator()` -- `BigRational::denominator()` has been renamed to `getDenominator()` - -Classes renamed: - -- `ArithmeticException` has been renamed to `MathException` - -## [0.6.2](https://github.com/brick/math/releases/tag/0.6.2) - 2017-10-02 - -The base class for all exceptions is now `MathException`. -`ArithmeticException` has been deprecated, and will be removed in 0.7.0. - -## [0.6.1](https://github.com/brick/math/releases/tag/0.6.1) - 2017-10-02 - -A number of methods have been renamed: - -- `BigNumber:sign()` is deprecated; use `getSign()` instead -- `BigDecimal::unscaledValue()` is deprecated; use `getUnscaledValue()` instead -- `BigDecimal::scale()` is deprecated; use `getScale()` instead -- `BigDecimal::integral()` is deprecated; use `getIntegral()` instead -- `BigDecimal::fraction()` is deprecated; use `getFraction()` instead -- `BigRational::numerator()` is deprecated; use `getNumerator()` instead -- `BigRational::denominator()` is deprecated; use `getDenominator()` instead - -The old methods will be removed in version 0.7.0. - -## [0.6.0](https://github.com/brick/math/releases/tag/0.6.0) - 2017-08-25 - -- Minimum PHP version is now [7.1](https://gophp71.org/); for PHP 5.6 and PHP 7.0 support, use version `0.5` -- Deprecated method `BigDecimal::withScale()` has been removed; use `toScale()` instead -- Method `BigNumber::toInteger()` has been renamed to `toInt()` - -## [0.5.4](https://github.com/brick/math/releases/tag/0.5.4) - 2016-10-17 - -`BigNumber` classes now implement [JsonSerializable](http://php.net/manual/en/class.jsonserializable.php). -The JSON output is always a string. - -## [0.5.3](https://github.com/brick/math/releases/tag/0.5.3) - 2016-03-31 - -This is a bugfix release. Dividing by a negative power of 1 with the same scale as the dividend could trigger an incorrect optimization which resulted in a wrong result. See #6. - -## [0.5.2](https://github.com/brick/math/releases/tag/0.5.2) - 2015-08-06 - -The `$scale` parameter of `BigDecimal::dividedBy()` is now optional again. - -## [0.5.1](https://github.com/brick/math/releases/tag/0.5.1) - 2015-07-05 - -**New method: `BigNumber::toScale()`** - -This allows to convert any `BigNumber` to a `BigDecimal` with a given scale, using rounding if necessary. - -## [0.5.0](https://github.com/brick/math/releases/tag/0.5.0) - 2015-07-04 - -**New features** -- Common `BigNumber` interface for all classes, with the following methods: - - `sign()` and derived methods (`isZero()`, `isPositive()`, ...) - - `compareTo()` and derived methods (`isEqualTo()`, `isGreaterThan()`, ...) that work across different `BigNumber` types - - `toBigInteger()`, `toBigDecimal()`, `toBigRational`() conversion methods - - `toInteger()` and `toFloat()` conversion methods to native types -- Unified `of()` behaviour: every class now accepts any type of number, provided that it can be safely converted to the current type -- New method: `BigDecimal::exactlyDividedBy()`; this method automatically computes the scale of the result, provided that the division yields a finite number of digits -- New methods: `BigRational::quotient()` and `remainder()` -- Fine-grained exceptions: `DivisionByZeroException`, `RoundingNecessaryException`, `NumberFormatException` -- Factory methods `zero()`, `one()` and `ten()` available in all classes -- Rounding mode reintroduced in `BigInteger::dividedBy()` - -This release also comes with many performance improvements. - ---- - -**Breaking changes** -- `BigInteger`: - - `getSign()` is renamed to `sign()` - - `toString()` is renamed to `toBase()` - - `BigInteger::dividedBy()` now throws an exception by default if the remainder is not zero; use `quotient()` to get the previous behaviour -- `BigDecimal`: - - `getSign()` is renamed to `sign()` - - `getUnscaledValue()` is renamed to `unscaledValue()` - - `getScale()` is renamed to `scale()` - - `getIntegral()` is renamed to `integral()` - - `getFraction()` is renamed to `fraction()` - - `divideAndRemainder()` is renamed to `quotientAndRemainder()` - - `dividedBy()` now takes a **mandatory** `$scale` parameter **before** the rounding mode - - `toBigInteger()` does not accept a `$roundingMode` parameter anymore - - `toBigRational()` does not simplify the fraction anymore; explicitly add `->simplified()` to get the previous behaviour -- `BigRational`: - - `getSign()` is renamed to `sign()` - - `getNumerator()` is renamed to `numerator()` - - `getDenominator()` is renamed to `denominator()` - - `of()` is renamed to `nd()`, while `parse()` is renamed to `of()` -- Miscellaneous: - - `ArithmeticException` is moved to an `Exception\` sub-namespace - - `of()` factory methods now throw `NumberFormatException` instead of `InvalidArgumentException` - -## [0.4.3](https://github.com/brick/math/releases/tag/0.4.3) - 2016-03-31 - -Backport of two bug fixes from the 0.5 branch: -- `BigInteger::parse()` did not always throw `InvalidArgumentException` as expected -- Dividing by a negative power of 1 with the same scale as the dividend could trigger an incorrect optimization which resulted in a wrong result. See #6. - -## [0.4.2](https://github.com/brick/math/releases/tag/0.4.2) - 2015-06-16 - -New method: `BigDecimal::stripTrailingZeros()` - -## [0.4.1](https://github.com/brick/math/releases/tag/0.4.1) - 2015-06-12 - -Introducing a `BigRational` class, to perform calculations on fractions of any size. - -## [0.4.0](https://github.com/brick/math/releases/tag/0.4.0) - 2015-06-12 - -Rounding modes have been removed from `BigInteger`, and are now a concept specific to `BigDecimal`. - -`BigInteger::dividedBy()` now always returns the quotient of the division. - -## [0.3.5](https://github.com/brick/math/releases/tag/0.3.5) - 2016-03-31 - -Backport of two bug fixes from the 0.5 branch: - -- `BigInteger::parse()` did not always throw `InvalidArgumentException` as expected -- Dividing by a negative power of 1 with the same scale as the dividend could trigger an incorrect optimization which resulted in a wrong result. See #6. - -## [0.3.4](https://github.com/brick/math/releases/tag/0.3.4) - 2015-06-11 - -New methods: -- `BigInteger::remainder()` returns the remainder of a division only -- `BigInteger::gcd()` returns the greatest common divisor of two numbers - -## [0.3.3](https://github.com/brick/math/releases/tag/0.3.3) - 2015-06-07 - -Fix `toString()` not handling negative numbers. - -## [0.3.2](https://github.com/brick/math/releases/tag/0.3.2) - 2015-06-07 - -`BigInteger` and `BigDecimal` now have a `getSign()` method that returns: -- `-1` if the number is negative -- `0` if the number is zero -- `1` if the number is positive - -## [0.3.1](https://github.com/brick/math/releases/tag/0.3.1) - 2015-06-05 - -Minor performance improvements - -## [0.3.0](https://github.com/brick/math/releases/tag/0.3.0) - 2015-06-04 - -The `$roundingMode` and `$scale` parameters have been swapped in `BigDecimal::dividedBy()`. - -## [0.2.2](https://github.com/brick/math/releases/tag/0.2.2) - 2015-06-04 - -Stronger immutability guarantee for `BigInteger` and `BigDecimal`. - -So far, it would have been possible to break immutability of these classes by calling the `unserialize()` internal function. This release fixes that. - -## [0.2.1](https://github.com/brick/math/releases/tag/0.2.1) - 2015-06-02 - -Added `BigDecimal::divideAndRemainder()` - -## [0.2.0](https://github.com/brick/math/releases/tag/0.2.0) - 2015-05-22 - -- `min()` and `max()` do not accept an `array` anymore, but a variable number of parameters -- **minimum PHP version is now 5.6** -- continuous integration with PHP 7 - -## [0.1.1](https://github.com/brick/math/releases/tag/0.1.1) - 2014-09-01 - -- Added `BigInteger::power()` -- Added HHVM support - -## [0.1.0](https://github.com/brick/math/releases/tag/0.1.0) - 2014-08-31 - -First beta release. - diff --git a/vendor/brick/math/LICENSE b/vendor/brick/math/LICENSE deleted file mode 100644 index f9b724f..0000000 --- a/vendor/brick/math/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013-present Benjamin Morel - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/brick/math/composer.json b/vendor/brick/math/composer.json deleted file mode 100644 index f400aa4..0000000 --- a/vendor/brick/math/composer.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "brick/math", - "description": "Arbitrary-precision arithmetic library", - "type": "library", - "keywords": [ - "Brick", - "Math", - "Mathematics", - "Arbitrary-precision", - "Arithmetic", - "BigInteger", - "BigDecimal", - "BigRational", - "BigNumber", - "Bignum", - "Decimal", - "Rational", - "Integer" - ], - "license": "MIT", - "require": { - "php": "^8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.1", - "php-coveralls/php-coveralls": "^2.2", - "vimeo/psalm": "6.8.8" - }, - "autoload": { - "psr-4": { - "Brick\\Math\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Brick\\Math\\Tests\\": "tests/" - } - } -} diff --git a/vendor/brick/math/psalm-baseline.xml b/vendor/brick/math/psalm-baseline.xml deleted file mode 100644 index 112adf4..0000000 --- a/vendor/brick/math/psalm-baseline.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/brick/math/src/BigDecimal.php b/vendor/brick/math/src/BigDecimal.php deleted file mode 100644 index 21d1c4a..0000000 --- a/vendor/brick/math/src/BigDecimal.php +++ /dev/null @@ -1,792 +0,0 @@ -value = $value; - $this->scale = $scale; - } - - /** - * @psalm-pure - */ - #[Override] - protected static function from(BigNumber $number): static - { - return $number->toBigDecimal(); - } - - /** - * Creates a BigDecimal from an unscaled value and a scale. - * - * Example: `(12345, 3)` will result in the BigDecimal `12.345`. - * - * @param BigNumber|int|float|string $value The unscaled value. Must be convertible to a BigInteger. - * @param int $scale The scale of the number, positive or zero. - * - * @throws \InvalidArgumentException If the scale is negative. - * - * @psalm-pure - */ - public static function ofUnscaledValue(BigNumber|int|float|string $value, int $scale = 0) : BigDecimal - { - if ($scale < 0) { - throw new \InvalidArgumentException('The scale cannot be negative.'); - } - - return new BigDecimal((string) BigInteger::of($value), $scale); - } - - /** - * Returns a BigDecimal representing zero, with a scale of zero. - * - * @psalm-pure - */ - public static function zero() : BigDecimal - { - /** - * @psalm-suppress ImpureStaticVariable - * @var BigDecimal|null $zero - */ - static $zero; - - if ($zero === null) { - $zero = new BigDecimal('0'); - } - - return $zero; - } - - /** - * Returns a BigDecimal representing one, with a scale of zero. - * - * @psalm-pure - */ - public static function one() : BigDecimal - { - /** - * @psalm-suppress ImpureStaticVariable - * @var BigDecimal|null $one - */ - static $one; - - if ($one === null) { - $one = new BigDecimal('1'); - } - - return $one; - } - - /** - * Returns a BigDecimal representing ten, with a scale of zero. - * - * @psalm-pure - */ - public static function ten() : BigDecimal - { - /** - * @psalm-suppress ImpureStaticVariable - * @var BigDecimal|null $ten - */ - static $ten; - - if ($ten === null) { - $ten = new BigDecimal('10'); - } - - return $ten; - } - - /** - * Returns the sum of this number and the given one. - * - * The result has a scale of `max($this->scale, $that->scale)`. - * - * @param BigNumber|int|float|string $that The number to add. Must be convertible to a BigDecimal. - * - * @throws MathException If the number is not valid, or is not convertible to a BigDecimal. - */ - public function plus(BigNumber|int|float|string $that) : BigDecimal - { - $that = BigDecimal::of($that); - - if ($that->value === '0' && $that->scale <= $this->scale) { - return $this; - } - - if ($this->value === '0' && $this->scale <= $that->scale) { - return $that; - } - - [$a, $b] = $this->scaleValues($this, $that); - - $value = Calculator::get()->add($a, $b); - $scale = $this->scale > $that->scale ? $this->scale : $that->scale; - - return new BigDecimal($value, $scale); - } - - /** - * Returns the difference of this number and the given one. - * - * The result has a scale of `max($this->scale, $that->scale)`. - * - * @param BigNumber|int|float|string $that The number to subtract. Must be convertible to a BigDecimal. - * - * @throws MathException If the number is not valid, or is not convertible to a BigDecimal. - */ - public function minus(BigNumber|int|float|string $that) : BigDecimal - { - $that = BigDecimal::of($that); - - if ($that->value === '0' && $that->scale <= $this->scale) { - return $this; - } - - [$a, $b] = $this->scaleValues($this, $that); - - $value = Calculator::get()->sub($a, $b); - $scale = $this->scale > $that->scale ? $this->scale : $that->scale; - - return new BigDecimal($value, $scale); - } - - /** - * Returns the product of this number and the given one. - * - * The result has a scale of `$this->scale + $that->scale`. - * - * @param BigNumber|int|float|string $that The multiplier. Must be convertible to a BigDecimal. - * - * @throws MathException If the multiplier is not a valid number, or is not convertible to a BigDecimal. - */ - public function multipliedBy(BigNumber|int|float|string $that) : BigDecimal - { - $that = BigDecimal::of($that); - - if ($that->value === '1' && $that->scale === 0) { - return $this; - } - - if ($this->value === '1' && $this->scale === 0) { - return $that; - } - - $value = Calculator::get()->mul($this->value, $that->value); - $scale = $this->scale + $that->scale; - - return new BigDecimal($value, $scale); - } - - /** - * Returns the result of the division of this number by the given one, at the given scale. - * - * @param BigNumber|int|float|string $that The divisor. - * @param int|null $scale The desired scale, or null to use the scale of this number. - * @param RoundingMode $roundingMode An optional rounding mode, defaults to UNNECESSARY. - * - * @throws \InvalidArgumentException If the scale or rounding mode is invalid. - * @throws MathException If the number is invalid, is zero, or rounding was necessary. - */ - public function dividedBy(BigNumber|int|float|string $that, ?int $scale = null, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal - { - $that = BigDecimal::of($that); - - if ($that->isZero()) { - throw DivisionByZeroException::divisionByZero(); - } - - if ($scale === null) { - $scale = $this->scale; - } elseif ($scale < 0) { - throw new \InvalidArgumentException('Scale cannot be negative.'); - } - - if ($that->value === '1' && $that->scale === 0 && $scale === $this->scale) { - return $this; - } - - $p = $this->valueWithMinScale($that->scale + $scale); - $q = $that->valueWithMinScale($this->scale - $scale); - - $result = Calculator::get()->divRound($p, $q, $roundingMode); - - return new BigDecimal($result, $scale); - } - - /** - * Returns the exact result of the division of this number by the given one. - * - * The scale of the result is automatically calculated to fit all the fraction digits. - * - * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal. - * - * @throws MathException If the divisor is not a valid number, is not convertible to a BigDecimal, is zero, - * or the result yields an infinite number of digits. - */ - public function exactlyDividedBy(BigNumber|int|float|string $that) : BigDecimal - { - $that = BigDecimal::of($that); - - if ($that->value === '0') { - throw DivisionByZeroException::divisionByZero(); - } - - [, $b] = $this->scaleValues($this, $that); - - $d = \rtrim($b, '0'); - $scale = \strlen($b) - \strlen($d); - - $calculator = Calculator::get(); - - foreach ([5, 2] as $prime) { - for (;;) { - $lastDigit = (int) $d[-1]; - - if ($lastDigit % $prime !== 0) { - break; - } - - $d = $calculator->divQ($d, (string) $prime); - $scale++; - } - } - - return $this->dividedBy($that, $scale)->stripTrailingZeros(); - } - - /** - * Returns this number exponentiated to the given value. - * - * The result has a scale of `$this->scale * $exponent`. - * - * @throws \InvalidArgumentException If the exponent is not in the range 0 to 1,000,000. - */ - public function power(int $exponent) : BigDecimal - { - if ($exponent === 0) { - return BigDecimal::one(); - } - - if ($exponent === 1) { - return $this; - } - - if ($exponent < 0 || $exponent > Calculator::MAX_POWER) { - throw new \InvalidArgumentException(\sprintf( - 'The exponent %d is not in the range 0 to %d.', - $exponent, - Calculator::MAX_POWER - )); - } - - return new BigDecimal(Calculator::get()->pow($this->value, $exponent), $this->scale * $exponent); - } - - /** - * Returns the quotient of the division of this number by the given one. - * - * The quotient has a scale of `0`. - * - * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal. - * - * @throws MathException If the divisor is not a valid decimal number, or is zero. - */ - public function quotient(BigNumber|int|float|string $that) : BigDecimal - { - $that = BigDecimal::of($that); - - if ($that->isZero()) { - throw DivisionByZeroException::divisionByZero(); - } - - $p = $this->valueWithMinScale($that->scale); - $q = $that->valueWithMinScale($this->scale); - - $quotient = Calculator::get()->divQ($p, $q); - - return new BigDecimal($quotient, 0); - } - - /** - * Returns the remainder of the division of this number by the given one. - * - * The remainder has a scale of `max($this->scale, $that->scale)`. - * - * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal. - * - * @throws MathException If the divisor is not a valid decimal number, or is zero. - */ - public function remainder(BigNumber|int|float|string $that) : BigDecimal - { - $that = BigDecimal::of($that); - - if ($that->isZero()) { - throw DivisionByZeroException::divisionByZero(); - } - - $p = $this->valueWithMinScale($that->scale); - $q = $that->valueWithMinScale($this->scale); - - $remainder = Calculator::get()->divR($p, $q); - - $scale = $this->scale > $that->scale ? $this->scale : $that->scale; - - return new BigDecimal($remainder, $scale); - } - - /** - * Returns the quotient and remainder of the division of this number by the given one. - * - * The quotient has a scale of `0`, and the remainder has a scale of `max($this->scale, $that->scale)`. - * - * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigDecimal. - * - * @return BigDecimal[] An array containing the quotient and the remainder. - * - * @psalm-return array{BigDecimal, BigDecimal} - * - * @throws MathException If the divisor is not a valid decimal number, or is zero. - */ - public function quotientAndRemainder(BigNumber|int|float|string $that) : array - { - $that = BigDecimal::of($that); - - if ($that->isZero()) { - throw DivisionByZeroException::divisionByZero(); - } - - $p = $this->valueWithMinScale($that->scale); - $q = $that->valueWithMinScale($this->scale); - - [$quotient, $remainder] = Calculator::get()->divQR($p, $q); - - $scale = $this->scale > $that->scale ? $this->scale : $that->scale; - - $quotient = new BigDecimal($quotient, 0); - $remainder = new BigDecimal($remainder, $scale); - - return [$quotient, $remainder]; - } - - /** - * Returns the square root of this number, rounded down to the given number of decimals. - * - * @throws \InvalidArgumentException If the scale is negative. - * @throws NegativeNumberException If this number is negative. - */ - public function sqrt(int $scale) : BigDecimal - { - if ($scale < 0) { - throw new \InvalidArgumentException('Scale cannot be negative.'); - } - - if ($this->value === '0') { - return new BigDecimal('0', $scale); - } - - if ($this->value[0] === '-') { - throw new NegativeNumberException('Cannot calculate the square root of a negative number.'); - } - - $value = $this->value; - $addDigits = 2 * $scale - $this->scale; - - if ($addDigits > 0) { - // add zeros - $value .= \str_repeat('0', $addDigits); - } elseif ($addDigits < 0) { - // trim digits - if (-$addDigits >= \strlen($this->value)) { - // requesting a scale too low, will always yield a zero result - return new BigDecimal('0', $scale); - } - - $value = \substr($value, 0, $addDigits); - } - - $value = Calculator::get()->sqrt($value); - - return new BigDecimal($value, $scale); - } - - /** - * Returns a copy of this BigDecimal with the decimal point moved $n places to the left. - */ - public function withPointMovedLeft(int $n) : BigDecimal - { - if ($n === 0) { - return $this; - } - - if ($n < 0) { - return $this->withPointMovedRight(-$n); - } - - return new BigDecimal($this->value, $this->scale + $n); - } - - /** - * Returns a copy of this BigDecimal with the decimal point moved $n places to the right. - */ - public function withPointMovedRight(int $n) : BigDecimal - { - if ($n === 0) { - return $this; - } - - if ($n < 0) { - return $this->withPointMovedLeft(-$n); - } - - $value = $this->value; - $scale = $this->scale - $n; - - if ($scale < 0) { - if ($value !== '0') { - $value .= \str_repeat('0', -$scale); - } - $scale = 0; - } - - return new BigDecimal($value, $scale); - } - - /** - * Returns a copy of this BigDecimal with any trailing zeros removed from the fractional part. - */ - public function stripTrailingZeros() : BigDecimal - { - if ($this->scale === 0) { - return $this; - } - - $trimmedValue = \rtrim($this->value, '0'); - - if ($trimmedValue === '') { - return BigDecimal::zero(); - } - - $trimmableZeros = \strlen($this->value) - \strlen($trimmedValue); - - if ($trimmableZeros === 0) { - return $this; - } - - if ($trimmableZeros > $this->scale) { - $trimmableZeros = $this->scale; - } - - $value = \substr($this->value, 0, -$trimmableZeros); - $scale = $this->scale - $trimmableZeros; - - return new BigDecimal($value, $scale); - } - - /** - * Returns the absolute value of this number. - */ - public function abs() : BigDecimal - { - return $this->isNegative() ? $this->negated() : $this; - } - - /** - * Returns the negated value of this number. - */ - public function negated() : BigDecimal - { - return new BigDecimal(Calculator::get()->neg($this->value), $this->scale); - } - - #[Override] - public function compareTo(BigNumber|int|float|string $that) : int - { - $that = BigNumber::of($that); - - if ($that instanceof BigInteger) { - $that = $that->toBigDecimal(); - } - - if ($that instanceof BigDecimal) { - [$a, $b] = $this->scaleValues($this, $that); - - return Calculator::get()->cmp($a, $b); - } - - return - $that->compareTo($this); - } - - #[Override] - public function getSign() : int - { - return ($this->value === '0') ? 0 : (($this->value[0] === '-') ? -1 : 1); - } - - public function getUnscaledValue() : BigInteger - { - return self::newBigInteger($this->value); - } - - public function getScale() : int - { - return $this->scale; - } - - /** - * Returns the number of significant digits in the number. - * - * This is the number of digits to both sides of the decimal point, stripped of leading zeros. - * The sign has no impact on the result. - * - * Examples: - * 0 => 0 - * 0.0 => 0 - * 123 => 3 - * 123.456 => 6 - * 0.00123 => 3 - * 0.0012300 => 5 - */ - public function getPrecision(): int - { - $value = $this->value; - - if ($value === '0') { - return 0; - } - - $length = \strlen($value); - - return ($value[0] === '-') ? $length - 1 : $length; - } - - /** - * Returns a string representing the integral part of this decimal number. - * - * Example: `-123.456` => `-123`. - */ - public function getIntegralPart() : string - { - if ($this->scale === 0) { - return $this->value; - } - - $value = $this->getUnscaledValueWithLeadingZeros(); - - return \substr($value, 0, -$this->scale); - } - - /** - * Returns a string representing the fractional part of this decimal number. - * - * If the scale is zero, an empty string is returned. - * - * Examples: `-123.456` => '456', `123` => ''. - */ - public function getFractionalPart() : string - { - if ($this->scale === 0) { - return ''; - } - - $value = $this->getUnscaledValueWithLeadingZeros(); - - return \substr($value, -$this->scale); - } - - /** - * Returns whether this decimal number has a non-zero fractional part. - */ - public function hasNonZeroFractionalPart() : bool - { - return $this->getFractionalPart() !== \str_repeat('0', $this->scale); - } - - #[Override] - public function toBigInteger() : BigInteger - { - $zeroScaleDecimal = $this->scale === 0 ? $this : $this->dividedBy(1, 0); - - return self::newBigInteger($zeroScaleDecimal->value); - } - - #[Override] - public function toBigDecimal() : BigDecimal - { - return $this; - } - - #[Override] - public function toBigRational() : BigRational - { - $numerator = self::newBigInteger($this->value); - $denominator = self::newBigInteger('1' . \str_repeat('0', $this->scale)); - - return self::newBigRational($numerator, $denominator, false); - } - - #[Override] - public function toScale(int $scale, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal - { - if ($scale === $this->scale) { - return $this; - } - - return $this->dividedBy(BigDecimal::one(), $scale, $roundingMode); - } - - #[Override] - public function toInt() : int - { - return $this->toBigInteger()->toInt(); - } - - #[Override] - public function toFloat() : float - { - return (float) (string) $this; - } - - #[Override] - public function __toString() : string - { - if ($this->scale === 0) { - return $this->value; - } - - $value = $this->getUnscaledValueWithLeadingZeros(); - - return \substr($value, 0, -$this->scale) . '.' . \substr($value, -$this->scale); - } - - /** - * This method is required for serializing the object and SHOULD NOT be accessed directly. - * - * @internal - * - * @return array{value: string, scale: int} - */ - public function __serialize(): array - { - return ['value' => $this->value, 'scale' => $this->scale]; - } - - /** - * This method is only here to allow unserializing the object and cannot be accessed directly. - * - * @internal - * @psalm-suppress RedundantPropertyInitializationCheck - * - * @param array{value: string, scale: int} $data - * - * @throws \LogicException - */ - public function __unserialize(array $data): void - { - if (isset($this->value)) { - throw new \LogicException('__unserialize() is an internal function, it must not be called directly.'); - } - - $this->value = $data['value']; - $this->scale = $data['scale']; - } - - /** - * Puts the internal values of the given decimal numbers on the same scale. - * - * @return array{string, string} The scaled integer values of $x and $y. - */ - private function scaleValues(BigDecimal $x, BigDecimal $y) : array - { - $a = $x->value; - $b = $y->value; - - if ($b !== '0' && $x->scale > $y->scale) { - $b .= \str_repeat('0', $x->scale - $y->scale); - } elseif ($a !== '0' && $x->scale < $y->scale) { - $a .= \str_repeat('0', $y->scale - $x->scale); - } - - return [$a, $b]; - } - - private function valueWithMinScale(int $scale) : string - { - $value = $this->value; - - if ($this->value !== '0' && $scale > $this->scale) { - $value .= \str_repeat('0', $scale - $this->scale); - } - - return $value; - } - - /** - * Adds leading zeros if necessary to the unscaled value to represent the full decimal number. - */ - private function getUnscaledValueWithLeadingZeros() : string - { - $value = $this->value; - $targetLength = $this->scale + 1; - $negative = ($value[0] === '-'); - $length = \strlen($value); - - if ($negative) { - $length--; - } - - if ($length >= $targetLength) { - return $this->value; - } - - if ($negative) { - $value = \substr($value, 1); - } - - $value = \str_pad($value, $targetLength, '0', STR_PAD_LEFT); - - if ($negative) { - $value = '-' . $value; - } - - return $value; - } -} diff --git a/vendor/brick/math/src/BigInteger.php b/vendor/brick/math/src/BigInteger.php deleted file mode 100644 index 7242481..0000000 --- a/vendor/brick/math/src/BigInteger.php +++ /dev/null @@ -1,1062 +0,0 @@ -value = $value; - } - - /** - * @psalm-pure - */ - #[Override] - protected static function from(BigNumber $number): static - { - return $number->toBigInteger(); - } - - /** - * Creates a number from a string in a given base. - * - * The string can optionally be prefixed with the `+` or `-` sign. - * - * Bases greater than 36 are not supported by this method, as there is no clear consensus on which of the lowercase - * or uppercase characters should come first. Instead, this method accepts any base up to 36, and does not - * differentiate lowercase and uppercase characters, which are considered equal. - * - * For bases greater than 36, and/or custom alphabets, use the fromArbitraryBase() method. - * - * @param string $number The number to convert, in the given base. - * @param int $base The base of the number, between 2 and 36. - * - * @throws NumberFormatException If the number is empty, or contains invalid chars for the given base. - * @throws \InvalidArgumentException If the base is out of range. - * - * @psalm-pure - */ - public static function fromBase(string $number, int $base) : BigInteger - { - if ($number === '') { - throw new NumberFormatException('The number cannot be empty.'); - } - - if ($base < 2 || $base > 36) { - throw new \InvalidArgumentException(\sprintf('Base %d is not in range 2 to 36.', $base)); - } - - if ($number[0] === '-') { - $sign = '-'; - $number = \substr($number, 1); - } elseif ($number[0] === '+') { - $sign = ''; - $number = \substr($number, 1); - } else { - $sign = ''; - } - - if ($number === '') { - throw new NumberFormatException('The number cannot be empty.'); - } - - $number = \ltrim($number, '0'); - - if ($number === '') { - // The result will be the same in any base, avoid further calculation. - return BigInteger::zero(); - } - - if ($number === '1') { - // The result will be the same in any base, avoid further calculation. - return new BigInteger($sign . '1'); - } - - $pattern = '/[^' . \substr(Calculator::ALPHABET, 0, $base) . ']/'; - - if (\preg_match($pattern, \strtolower($number), $matches) === 1) { - throw new NumberFormatException(\sprintf('"%s" is not a valid character in base %d.', $matches[0], $base)); - } - - if ($base === 10) { - // The number is usable as is, avoid further calculation. - return new BigInteger($sign . $number); - } - - $result = Calculator::get()->fromBase($number, $base); - - return new BigInteger($sign . $result); - } - - /** - * Parses a string containing an integer in an arbitrary base, using a custom alphabet. - * - * Because this method accepts an alphabet with any character, including dash, it does not handle negative numbers. - * - * @param string $number The number to parse. - * @param string $alphabet The alphabet, for example '01' for base 2, or '01234567' for base 8. - * - * @throws NumberFormatException If the given number is empty or contains invalid chars for the given alphabet. - * @throws \InvalidArgumentException If the alphabet does not contain at least 2 chars. - * - * @psalm-pure - */ - public static function fromArbitraryBase(string $number, string $alphabet) : BigInteger - { - if ($number === '') { - throw new NumberFormatException('The number cannot be empty.'); - } - - $base = \strlen($alphabet); - - if ($base < 2) { - throw new \InvalidArgumentException('The alphabet must contain at least 2 chars.'); - } - - $pattern = '/[^' . \preg_quote($alphabet, '/') . ']/'; - - if (\preg_match($pattern, $number, $matches) === 1) { - throw NumberFormatException::charNotInAlphabet($matches[0]); - } - - $number = Calculator::get()->fromArbitraryBase($number, $alphabet, $base); - - return new BigInteger($number); - } - - /** - * Translates a string of bytes containing the binary representation of a BigInteger into a BigInteger. - * - * The input string is assumed to be in big-endian byte-order: the most significant byte is in the zeroth element. - * - * If `$signed` is true, the input is assumed to be in two's-complement representation, and the leading bit is - * interpreted as a sign bit. If `$signed` is false, the input is interpreted as an unsigned number, and the - * resulting BigInteger will always be positive or zero. - * - * This method can be used to retrieve a number exported by `toBytes()`, as long as the `$signed` flags match. - * - * @param string $value The byte string. - * @param bool $signed Whether to interpret as a signed number in two's-complement representation with a leading - * sign bit. - * - * @throws NumberFormatException If the string is empty. - */ - public static function fromBytes(string $value, bool $signed = true) : BigInteger - { - if ($value === '') { - throw new NumberFormatException('The byte string must not be empty.'); - } - - $twosComplement = false; - - if ($signed) { - $x = \ord($value[0]); - - if (($twosComplement = ($x >= 0x80))) { - $value = ~$value; - } - } - - $number = self::fromBase(\bin2hex($value), 16); - - if ($twosComplement) { - return $number->plus(1)->negated(); - } - - return $number; - } - - /** - * Generates a pseudo-random number in the range 0 to 2^numBits - 1. - * - * Using the default random bytes generator, this method is suitable for cryptographic use. - * - * @psalm-param (callable(int): string)|null $randomBytesGenerator - * - * @param int $numBits The number of bits. - * @param callable|null $randomBytesGenerator A function that accepts a number of bytes as an integer, and returns a - * string of random bytes of the given length. Defaults to the - * `random_bytes()` function. - * - * @throws \InvalidArgumentException If $numBits is negative. - */ - public static function randomBits(int $numBits, ?callable $randomBytesGenerator = null) : BigInteger - { - if ($numBits < 0) { - throw new \InvalidArgumentException('The number of bits cannot be negative.'); - } - - if ($numBits === 0) { - return BigInteger::zero(); - } - - if ($randomBytesGenerator === null) { - $randomBytesGenerator = random_bytes(...); - } - - /** @var int<1, max> $byteLength */ - $byteLength = \intdiv($numBits - 1, 8) + 1; - - $extraBits = ($byteLength * 8 - $numBits); - $bitmask = \chr(0xFF >> $extraBits); - - $randomBytes = $randomBytesGenerator($byteLength); - $randomBytes[0] = $randomBytes[0] & $bitmask; - - return self::fromBytes($randomBytes, false); - } - - /** - * Generates a pseudo-random number between `$min` and `$max`. - * - * Using the default random bytes generator, this method is suitable for cryptographic use. - * - * @psalm-param (callable(int): string)|null $randomBytesGenerator - * - * @param BigNumber|int|float|string $min The lower bound. Must be convertible to a BigInteger. - * @param BigNumber|int|float|string $max The upper bound. Must be convertible to a BigInteger. - * @param callable|null $randomBytesGenerator A function that accepts a number of bytes as an integer, - * and returns a string of random bytes of the given length. - * Defaults to the `random_bytes()` function. - * - * @throws MathException If one of the parameters cannot be converted to a BigInteger, - * or `$min` is greater than `$max`. - */ - public static function randomRange( - BigNumber|int|float|string $min, - BigNumber|int|float|string $max, - ?callable $randomBytesGenerator = null - ) : BigInteger { - $min = BigInteger::of($min); - $max = BigInteger::of($max); - - if ($min->isGreaterThan($max)) { - throw new MathException('$min cannot be greater than $max.'); - } - - if ($min->isEqualTo($max)) { - return $min; - } - - $diff = $max->minus($min); - $bitLength = $diff->getBitLength(); - - // try until the number is in range (50% to 100% chance of success) - do { - $randomNumber = self::randomBits($bitLength, $randomBytesGenerator); - } while ($randomNumber->isGreaterThan($diff)); - - return $randomNumber->plus($min); - } - - /** - * Returns a BigInteger representing zero. - * - * @psalm-pure - */ - public static function zero() : BigInteger - { - /** - * @psalm-suppress ImpureStaticVariable - * @var BigInteger|null $zero - */ - static $zero; - - if ($zero === null) { - $zero = new BigInteger('0'); - } - - return $zero; - } - - /** - * Returns a BigInteger representing one. - * - * @psalm-pure - */ - public static function one() : BigInteger - { - /** - * @psalm-suppress ImpureStaticVariable - * @var BigInteger|null $one - */ - static $one; - - if ($one === null) { - $one = new BigInteger('1'); - } - - return $one; - } - - /** - * Returns a BigInteger representing ten. - * - * @psalm-pure - */ - public static function ten() : BigInteger - { - /** - * @psalm-suppress ImpureStaticVariable - * @var BigInteger|null $ten - */ - static $ten; - - if ($ten === null) { - $ten = new BigInteger('10'); - } - - return $ten; - } - - public static function gcdMultiple(BigInteger $a, BigInteger ...$n): BigInteger - { - $result = $a; - - foreach ($n as $next) { - $result = $result->gcd($next); - - if ($result->isEqualTo(1)) { - return $result; - } - } - - return $result; - } - - /** - * Returns the sum of this number and the given one. - * - * @param BigNumber|int|float|string $that The number to add. Must be convertible to a BigInteger. - * - * @throws MathException If the number is not valid, or is not convertible to a BigInteger. - */ - public function plus(BigNumber|int|float|string $that) : BigInteger - { - $that = BigInteger::of($that); - - if ($that->value === '0') { - return $this; - } - - if ($this->value === '0') { - return $that; - } - - $value = Calculator::get()->add($this->value, $that->value); - - return new BigInteger($value); - } - - /** - * Returns the difference of this number and the given one. - * - * @param BigNumber|int|float|string $that The number to subtract. Must be convertible to a BigInteger. - * - * @throws MathException If the number is not valid, or is not convertible to a BigInteger. - */ - public function minus(BigNumber|int|float|string $that) : BigInteger - { - $that = BigInteger::of($that); - - if ($that->value === '0') { - return $this; - } - - $value = Calculator::get()->sub($this->value, $that->value); - - return new BigInteger($value); - } - - /** - * Returns the product of this number and the given one. - * - * @param BigNumber|int|float|string $that The multiplier. Must be convertible to a BigInteger. - * - * @throws MathException If the multiplier is not a valid number, or is not convertible to a BigInteger. - */ - public function multipliedBy(BigNumber|int|float|string $that) : BigInteger - { - $that = BigInteger::of($that); - - if ($that->value === '1') { - return $this; - } - - if ($this->value === '1') { - return $that; - } - - $value = Calculator::get()->mul($this->value, $that->value); - - return new BigInteger($value); - } - - /** - * Returns the result of the division of this number by the given one. - * - * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger. - * @param RoundingMode $roundingMode An optional rounding mode, defaults to UNNECESSARY. - * - * @throws MathException If the divisor is not a valid number, is not convertible to a BigInteger, is zero, - * or RoundingMode::UNNECESSARY is used and the remainder is not zero. - */ - public function dividedBy(BigNumber|int|float|string $that, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigInteger - { - $that = BigInteger::of($that); - - if ($that->value === '1') { - return $this; - } - - if ($that->value === '0') { - throw DivisionByZeroException::divisionByZero(); - } - - $result = Calculator::get()->divRound($this->value, $that->value, $roundingMode); - - return new BigInteger($result); - } - - /** - * Returns this number exponentiated to the given value. - * - * @throws \InvalidArgumentException If the exponent is not in the range 0 to 1,000,000. - */ - public function power(int $exponent) : BigInteger - { - if ($exponent === 0) { - return BigInteger::one(); - } - - if ($exponent === 1) { - return $this; - } - - if ($exponent < 0 || $exponent > Calculator::MAX_POWER) { - throw new \InvalidArgumentException(\sprintf( - 'The exponent %d is not in the range 0 to %d.', - $exponent, - Calculator::MAX_POWER - )); - } - - return new BigInteger(Calculator::get()->pow($this->value, $exponent)); - } - - /** - * Returns the quotient of the division of this number by the given one. - * - * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger. - * - * @throws DivisionByZeroException If the divisor is zero. - */ - public function quotient(BigNumber|int|float|string $that) : BigInteger - { - $that = BigInteger::of($that); - - if ($that->value === '1') { - return $this; - } - - if ($that->value === '0') { - throw DivisionByZeroException::divisionByZero(); - } - - $quotient = Calculator::get()->divQ($this->value, $that->value); - - return new BigInteger($quotient); - } - - /** - * Returns the remainder of the division of this number by the given one. - * - * The remainder, when non-zero, has the same sign as the dividend. - * - * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger. - * - * @throws DivisionByZeroException If the divisor is zero. - */ - public function remainder(BigNumber|int|float|string $that) : BigInteger - { - $that = BigInteger::of($that); - - if ($that->value === '1') { - return BigInteger::zero(); - } - - if ($that->value === '0') { - throw DivisionByZeroException::divisionByZero(); - } - - $remainder = Calculator::get()->divR($this->value, $that->value); - - return new BigInteger($remainder); - } - - /** - * Returns the quotient and remainder of the division of this number by the given one. - * - * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger. - * - * @return BigInteger[] An array containing the quotient and the remainder. - * - * @psalm-return array{BigInteger, BigInteger} - * - * @throws DivisionByZeroException If the divisor is zero. - */ - public function quotientAndRemainder(BigNumber|int|float|string $that) : array - { - $that = BigInteger::of($that); - - if ($that->value === '0') { - throw DivisionByZeroException::divisionByZero(); - } - - [$quotient, $remainder] = Calculator::get()->divQR($this->value, $that->value); - - return [ - new BigInteger($quotient), - new BigInteger($remainder) - ]; - } - - /** - * Returns the modulo of this number and the given one. - * - * The modulo operation yields the same result as the remainder operation when both operands are of the same sign, - * and may differ when signs are different. - * - * The result of the modulo operation, when non-zero, has the same sign as the divisor. - * - * @param BigNumber|int|float|string $that The divisor. Must be convertible to a BigInteger. - * - * @throws DivisionByZeroException If the divisor is zero. - */ - public function mod(BigNumber|int|float|string $that) : BigInteger - { - $that = BigInteger::of($that); - - if ($that->value === '0') { - throw DivisionByZeroException::modulusMustNotBeZero(); - } - - $value = Calculator::get()->mod($this->value, $that->value); - - return new BigInteger($value); - } - - /** - * Returns the modular multiplicative inverse of this BigInteger modulo $m. - * - * @throws DivisionByZeroException If $m is zero. - * @throws NegativeNumberException If $m is negative. - * @throws MathException If this BigInteger has no multiplicative inverse mod m (that is, this BigInteger - * is not relatively prime to m). - */ - public function modInverse(BigInteger $m) : BigInteger - { - if ($m->value === '0') { - throw DivisionByZeroException::modulusMustNotBeZero(); - } - - if ($m->isNegative()) { - throw new NegativeNumberException('Modulus must not be negative.'); - } - - if ($m->value === '1') { - return BigInteger::zero(); - } - - $value = Calculator::get()->modInverse($this->value, $m->value); - - if ($value === null) { - throw new MathException('Unable to compute the modInverse for the given modulus.'); - } - - return new BigInteger($value); - } - - /** - * Returns this number raised into power with modulo. - * - * This operation only works on positive numbers. - * - * @param BigNumber|int|float|string $exp The exponent. Must be positive or zero. - * @param BigNumber|int|float|string $mod The modulus. Must be strictly positive. - * - * @throws NegativeNumberException If any of the operands is negative. - * @throws DivisionByZeroException If the modulus is zero. - */ - public function modPow(BigNumber|int|float|string $exp, BigNumber|int|float|string $mod) : BigInteger - { - $exp = BigInteger::of($exp); - $mod = BigInteger::of($mod); - - if ($this->isNegative() || $exp->isNegative() || $mod->isNegative()) { - throw new NegativeNumberException('The operands cannot be negative.'); - } - - if ($mod->isZero()) { - throw DivisionByZeroException::modulusMustNotBeZero(); - } - - $result = Calculator::get()->modPow($this->value, $exp->value, $mod->value); - - return new BigInteger($result); - } - - /** - * Returns the greatest common divisor of this number and the given one. - * - * The GCD is always positive, unless both operands are zero, in which case it is zero. - * - * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number. - */ - public function gcd(BigNumber|int|float|string $that) : BigInteger - { - $that = BigInteger::of($that); - - if ($that->value === '0' && $this->value[0] !== '-') { - return $this; - } - - if ($this->value === '0' && $that->value[0] !== '-') { - return $that; - } - - $value = Calculator::get()->gcd($this->value, $that->value); - - return new BigInteger($value); - } - - /** - * Returns the integer square root number of this number, rounded down. - * - * The result is the largest x such that x² ≤ n. - * - * @throws NegativeNumberException If this number is negative. - */ - public function sqrt() : BigInteger - { - if ($this->value[0] === '-') { - throw new NegativeNumberException('Cannot calculate the square root of a negative number.'); - } - - $value = Calculator::get()->sqrt($this->value); - - return new BigInteger($value); - } - - /** - * Returns the absolute value of this number. - */ - public function abs() : BigInteger - { - return $this->isNegative() ? $this->negated() : $this; - } - - /** - * Returns the inverse of this number. - */ - public function negated() : BigInteger - { - return new BigInteger(Calculator::get()->neg($this->value)); - } - - /** - * Returns the integer bitwise-and combined with another integer. - * - * This method returns a negative BigInteger if and only if both operands are negative. - * - * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number. - */ - public function and(BigNumber|int|float|string $that) : BigInteger - { - $that = BigInteger::of($that); - - return new BigInteger(Calculator::get()->and($this->value, $that->value)); - } - - /** - * Returns the integer bitwise-or combined with another integer. - * - * This method returns a negative BigInteger if and only if either of the operands is negative. - * - * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number. - */ - public function or(BigNumber|int|float|string $that) : BigInteger - { - $that = BigInteger::of($that); - - return new BigInteger(Calculator::get()->or($this->value, $that->value)); - } - - /** - * Returns the integer bitwise-xor combined with another integer. - * - * This method returns a negative BigInteger if and only if exactly one of the operands is negative. - * - * @param BigNumber|int|float|string $that The operand. Must be convertible to an integer number. - */ - public function xor(BigNumber|int|float|string $that) : BigInteger - { - $that = BigInteger::of($that); - - return new BigInteger(Calculator::get()->xor($this->value, $that->value)); - } - - /** - * Returns the bitwise-not of this BigInteger. - */ - public function not() : BigInteger - { - return $this->negated()->minus(1); - } - - /** - * Returns the integer left shifted by a given number of bits. - */ - public function shiftedLeft(int $distance) : BigInteger - { - if ($distance === 0) { - return $this; - } - - if ($distance < 0) { - return $this->shiftedRight(- $distance); - } - - return $this->multipliedBy(BigInteger::of(2)->power($distance)); - } - - /** - * Returns the integer right shifted by a given number of bits. - */ - public function shiftedRight(int $distance) : BigInteger - { - if ($distance === 0) { - return $this; - } - - if ($distance < 0) { - return $this->shiftedLeft(- $distance); - } - - $operand = BigInteger::of(2)->power($distance); - - if ($this->isPositiveOrZero()) { - return $this->quotient($operand); - } - - return $this->dividedBy($operand, RoundingMode::UP); - } - - /** - * Returns the number of bits in the minimal two's-complement representation of this BigInteger, excluding a sign bit. - * - * For positive BigIntegers, this is equivalent to the number of bits in the ordinary binary representation. - * Computes (ceil(log2(this < 0 ? -this : this+1))). - */ - public function getBitLength() : int - { - if ($this->value === '0') { - return 0; - } - - if ($this->isNegative()) { - return $this->abs()->minus(1)->getBitLength(); - } - - return \strlen($this->toBase(2)); - } - - /** - * Returns the index of the rightmost (lowest-order) one bit in this BigInteger. - * - * Returns -1 if this BigInteger contains no one bits. - */ - public function getLowestSetBit() : int - { - $n = $this; - $bitLength = $this->getBitLength(); - - for ($i = 0; $i <= $bitLength; $i++) { - if ($n->isOdd()) { - return $i; - } - - $n = $n->shiftedRight(1); - } - - return -1; - } - - /** - * Returns whether this number is even. - */ - public function isEven() : bool - { - return \in_array($this->value[-1], ['0', '2', '4', '6', '8'], true); - } - - /** - * Returns whether this number is odd. - */ - public function isOdd() : bool - { - return \in_array($this->value[-1], ['1', '3', '5', '7', '9'], true); - } - - /** - * Returns true if and only if the designated bit is set. - * - * Computes ((this & (1<shiftedRight($n)->isOdd(); - } - - #[Override] - public function compareTo(BigNumber|int|float|string $that) : int - { - $that = BigNumber::of($that); - - if ($that instanceof BigInteger) { - return Calculator::get()->cmp($this->value, $that->value); - } - - return - $that->compareTo($this); - } - - #[Override] - public function getSign() : int - { - return ($this->value === '0') ? 0 : (($this->value[0] === '-') ? -1 : 1); - } - - #[Override] - public function toBigInteger() : BigInteger - { - return $this; - } - - #[Override] - public function toBigDecimal() : BigDecimal - { - return self::newBigDecimal($this->value); - } - - #[Override] - public function toBigRational() : BigRational - { - return self::newBigRational($this, BigInteger::one(), false); - } - - #[Override] - public function toScale(int $scale, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal - { - return $this->toBigDecimal()->toScale($scale, $roundingMode); - } - - #[Override] - public function toInt() : int - { - $intValue = (int) $this->value; - - if ($this->value !== (string) $intValue) { - throw IntegerOverflowException::toIntOverflow($this); - } - - return $intValue; - } - - #[Override] - public function toFloat() : float - { - return (float) $this->value; - } - - /** - * Returns a string representation of this number in the given base. - * - * The output will always be lowercase for bases greater than 10. - * - * @throws \InvalidArgumentException If the base is out of range. - */ - public function toBase(int $base) : string - { - if ($base === 10) { - return $this->value; - } - - if ($base < 2 || $base > 36) { - throw new \InvalidArgumentException(\sprintf('Base %d is out of range [2, 36]', $base)); - } - - return Calculator::get()->toBase($this->value, $base); - } - - /** - * Returns a string representation of this number in an arbitrary base with a custom alphabet. - * - * Because this method accepts an alphabet with any character, including dash, it does not handle negative numbers; - * a NegativeNumberException will be thrown when attempting to call this method on a negative number. - * - * @param string $alphabet The alphabet, for example '01' for base 2, or '01234567' for base 8. - * - * @throws NegativeNumberException If this number is negative. - * @throws \InvalidArgumentException If the given alphabet does not contain at least 2 chars. - */ - public function toArbitraryBase(string $alphabet) : string - { - $base = \strlen($alphabet); - - if ($base < 2) { - throw new \InvalidArgumentException('The alphabet must contain at least 2 chars.'); - } - - if ($this->value[0] === '-') { - throw new NegativeNumberException(__FUNCTION__ . '() does not support negative numbers.'); - } - - return Calculator::get()->toArbitraryBase($this->value, $alphabet, $base); - } - - /** - * Returns a string of bytes containing the binary representation of this BigInteger. - * - * The string is in big-endian byte-order: the most significant byte is in the zeroth element. - * - * If `$signed` is true, the output will be in two's-complement representation, and a sign bit will be prepended to - * the output. If `$signed` is false, no sign bit will be prepended, and this method will throw an exception if the - * number is negative. - * - * The string will contain the minimum number of bytes required to represent this BigInteger, including a sign bit - * if `$signed` is true. - * - * This representation is compatible with the `fromBytes()` factory method, as long as the `$signed` flags match. - * - * @param bool $signed Whether to output a signed number in two's-complement representation with a leading sign bit. - * - * @throws NegativeNumberException If $signed is false, and the number is negative. - */ - public function toBytes(bool $signed = true) : string - { - if (! $signed && $this->isNegative()) { - throw new NegativeNumberException('Cannot convert a negative number to a byte string when $signed is false.'); - } - - $hex = $this->abs()->toBase(16); - - if (\strlen($hex) % 2 !== 0) { - $hex = '0' . $hex; - } - - $baseHexLength = \strlen($hex); - - if ($signed) { - if ($this->isNegative()) { - $bin = \hex2bin($hex); - assert($bin !== false); - - $hex = \bin2hex(~$bin); - $hex = self::fromBase($hex, 16)->plus(1)->toBase(16); - - $hexLength = \strlen($hex); - - if ($hexLength < $baseHexLength) { - $hex = \str_repeat('0', $baseHexLength - $hexLength) . $hex; - } - - if ($hex[0] < '8') { - $hex = 'FF' . $hex; - } - } else { - if ($hex[0] >= '8') { - $hex = '00' . $hex; - } - } - } - - return \hex2bin($hex); - } - - #[Override] - public function __toString() : string - { - return $this->value; - } - - /** - * This method is required for serializing the object and SHOULD NOT be accessed directly. - * - * @internal - * - * @return array{value: string} - */ - public function __serialize(): array - { - return ['value' => $this->value]; - } - - /** - * This method is only here to allow unserializing the object and cannot be accessed directly. - * - * @internal - * @psalm-suppress RedundantPropertyInitializationCheck - * - * @param array{value: string} $data - * - * @throws \LogicException - */ - public function __unserialize(array $data): void - { - if (isset($this->value)) { - throw new \LogicException('__unserialize() is an internal function, it must not be called directly.'); - } - - $this->value = $data['value']; - } -} diff --git a/vendor/brick/math/src/BigNumber.php b/vendor/brick/math/src/BigNumber.php deleted file mode 100644 index 5dabd31..0000000 --- a/vendor/brick/math/src/BigNumber.php +++ /dev/null @@ -1,515 +0,0 @@ -[\-\+])?' . - '(?[0-9]+)?' . - '(?\.)?' . - '(?[0-9]+)?' . - '(?:[eE](?[\-\+]?[0-9]+))?' . - '$/'; - - /** - * The regular expression used to parse rational numbers. - */ - private const PARSE_REGEXP_RATIONAL = - '/^' . - '(?[\-\+])?' . - '(?[0-9]+)' . - '\/?' . - '(?[0-9]+)' . - '$/'; - - /** - * Creates a BigNumber of the given value. - * - * The concrete return type is dependent on the given value, with the following rules: - * - * - BigNumber instances are returned as is - * - integer numbers are returned as BigInteger - * - floating point numbers are converted to a string then parsed as such - * - strings containing a `/` character are returned as BigRational - * - strings containing a `.` character or using an exponential notation are returned as BigDecimal - * - strings containing only digits with an optional leading `+` or `-` sign are returned as BigInteger - * - * @throws NumberFormatException If the format of the number is not valid. - * @throws DivisionByZeroException If the value represents a rational number with a denominator of zero. - * @throws RoundingNecessaryException If the value cannot be converted to an instance of the subclass without rounding. - * - * @psalm-pure - */ - final public static function of(BigNumber|int|float|string $value) : static - { - $value = self::_of($value); - - if (static::class === BigNumber::class) { - // https://github.com/vimeo/psalm/issues/10309 - assert($value instanceof static); - - return $value; - } - - return static::from($value); - } - - /** - * @throws NumberFormatException If the format of the number is not valid. - * @throws DivisionByZeroException If the value represents a rational number with a denominator of zero. - * - * @psalm-pure - */ - private static function _of(BigNumber|int|float|string $value) : BigNumber - { - if ($value instanceof BigNumber) { - return $value; - } - - if (\is_int($value)) { - return new BigInteger((string) $value); - } - - if (is_float($value)) { - $value = (string) $value; - } - - if (str_contains($value, '/')) { - // Rational number - if (\preg_match(self::PARSE_REGEXP_RATIONAL, $value, $matches, PREG_UNMATCHED_AS_NULL) !== 1) { - throw NumberFormatException::invalidFormat($value); - } - - $sign = $matches['sign']; - $numerator = $matches['numerator']; - $denominator = $matches['denominator']; - - assert($numerator !== null); - assert($denominator !== null); - - $numerator = self::cleanUp($sign, $numerator); - $denominator = self::cleanUp(null, $denominator); - - if ($denominator === '0') { - throw DivisionByZeroException::denominatorMustNotBeZero(); - } - - return new BigRational( - new BigInteger($numerator), - new BigInteger($denominator), - false - ); - } else { - // Integer or decimal number - if (\preg_match(self::PARSE_REGEXP_NUMERICAL, $value, $matches, PREG_UNMATCHED_AS_NULL) !== 1) { - throw NumberFormatException::invalidFormat($value); - } - - $sign = $matches['sign']; - $point = $matches['point']; - $integral = $matches['integral']; - $fractional = $matches['fractional']; - $exponent = $matches['exponent']; - - if ($integral === null && $fractional === null) { - throw NumberFormatException::invalidFormat($value); - } - - if ($integral === null) { - $integral = '0'; - } - - if ($point !== null || $exponent !== null) { - $fractional = ($fractional ?? ''); - $exponent = ($exponent !== null) ? (int)$exponent : 0; - - if ($exponent === PHP_INT_MIN || $exponent === PHP_INT_MAX) { - throw new NumberFormatException('Exponent too large.'); - } - - $unscaledValue = self::cleanUp($sign, $integral . $fractional); - - $scale = \strlen($fractional) - $exponent; - - if ($scale < 0) { - if ($unscaledValue !== '0') { - $unscaledValue .= \str_repeat('0', -$scale); - } - $scale = 0; - } - - return new BigDecimal($unscaledValue, $scale); - } - - $integral = self::cleanUp($sign, $integral); - - return new BigInteger($integral); - } - } - - /** - * Overridden by subclasses to convert a BigNumber to an instance of the subclass. - * - * @throws RoundingNecessaryException If the value cannot be converted. - * - * @psalm-pure - */ - abstract protected static function from(BigNumber $number): static; - - /** - * Proxy method to access BigInteger's protected constructor from sibling classes. - * - * @internal - * @psalm-pure - */ - final protected function newBigInteger(string $value) : BigInteger - { - return new BigInteger($value); - } - - /** - * Proxy method to access BigDecimal's protected constructor from sibling classes. - * - * @internal - * @psalm-pure - */ - final protected function newBigDecimal(string $value, int $scale = 0) : BigDecimal - { - return new BigDecimal($value, $scale); - } - - /** - * Proxy method to access BigRational's protected constructor from sibling classes. - * - * @internal - * @psalm-pure - */ - final protected function newBigRational(BigInteger $numerator, BigInteger $denominator, bool $checkDenominator) : BigRational - { - return new BigRational($numerator, $denominator, $checkDenominator); - } - - /** - * Returns the minimum of the given values. - * - * @param BigNumber|int|float|string ...$values The numbers to compare. All the numbers need to be convertible - * to an instance of the class this method is called on. - * - * @throws \InvalidArgumentException If no values are given. - * @throws MathException If an argument is not valid. - * - * @psalm-pure - */ - final public static function min(BigNumber|int|float|string ...$values) : static - { - $min = null; - - foreach ($values as $value) { - $value = static::of($value); - - if ($min === null || $value->isLessThan($min)) { - $min = $value; - } - } - - if ($min === null) { - throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.'); - } - - return $min; - } - - /** - * Returns the maximum of the given values. - * - * @param BigNumber|int|float|string ...$values The numbers to compare. All the numbers need to be convertible - * to an instance of the class this method is called on. - * - * @throws \InvalidArgumentException If no values are given. - * @throws MathException If an argument is not valid. - * - * @psalm-pure - */ - final public static function max(BigNumber|int|float|string ...$values) : static - { - $max = null; - - foreach ($values as $value) { - $value = static::of($value); - - if ($max === null || $value->isGreaterThan($max)) { - $max = $value; - } - } - - if ($max === null) { - throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.'); - } - - return $max; - } - - /** - * Returns the sum of the given values. - * - * @param BigNumber|int|float|string ...$values The numbers to add. All the numbers need to be convertible - * to an instance of the class this method is called on. - * - * @throws \InvalidArgumentException If no values are given. - * @throws MathException If an argument is not valid. - * - * @psalm-pure - */ - final public static function sum(BigNumber|int|float|string ...$values) : static - { - /** @var static|null $sum */ - $sum = null; - - foreach ($values as $value) { - $value = static::of($value); - - $sum = $sum === null ? $value : self::add($sum, $value); - } - - if ($sum === null) { - throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.'); - } - - return $sum; - } - - /** - * Adds two BigNumber instances in the correct order to avoid a RoundingNecessaryException. - * - * @todo This could be better resolved by creating an abstract protected method in BigNumber, and leaving to - * concrete classes the responsibility to perform the addition themselves or delegate it to the given number, - * depending on their ability to perform the operation. This will also require a version bump because we're - * potentially breaking custom BigNumber implementations (if any...) - * - * @psalm-pure - */ - private static function add(BigNumber $a, BigNumber $b) : BigNumber - { - if ($a instanceof BigRational) { - return $a->plus($b); - } - - if ($b instanceof BigRational) { - return $b->plus($a); - } - - if ($a instanceof BigDecimal) { - return $a->plus($b); - } - - if ($b instanceof BigDecimal) { - return $b->plus($a); - } - - /** @var BigInteger $a */ - - return $a->plus($b); - } - - /** - * Removes optional leading zeros and applies sign. - * - * @param string|null $sign The sign, '+' or '-', optional. Null is allowed for convenience and treated as '+'. - * @param string $number The number, validated as a non-empty string of digits. - * - * @psalm-pure - */ - private static function cleanUp(string|null $sign, string $number) : string - { - $number = \ltrim($number, '0'); - - if ($number === '') { - return '0'; - } - - return $sign === '-' ? '-' . $number : $number; - } - - /** - * Checks if this number is equal to the given one. - */ - final public function isEqualTo(BigNumber|int|float|string $that) : bool - { - return $this->compareTo($that) === 0; - } - - /** - * Checks if this number is strictly lower than the given one. - */ - final public function isLessThan(BigNumber|int|float|string $that) : bool - { - return $this->compareTo($that) < 0; - } - - /** - * Checks if this number is lower than or equal to the given one. - */ - final public function isLessThanOrEqualTo(BigNumber|int|float|string $that) : bool - { - return $this->compareTo($that) <= 0; - } - - /** - * Checks if this number is strictly greater than the given one. - */ - final public function isGreaterThan(BigNumber|int|float|string $that) : bool - { - return $this->compareTo($that) > 0; - } - - /** - * Checks if this number is greater than or equal to the given one. - */ - final public function isGreaterThanOrEqualTo(BigNumber|int|float|string $that) : bool - { - return $this->compareTo($that) >= 0; - } - - /** - * Checks if this number equals zero. - */ - final public function isZero() : bool - { - return $this->getSign() === 0; - } - - /** - * Checks if this number is strictly negative. - */ - final public function isNegative() : bool - { - return $this->getSign() < 0; - } - - /** - * Checks if this number is negative or zero. - */ - final public function isNegativeOrZero() : bool - { - return $this->getSign() <= 0; - } - - /** - * Checks if this number is strictly positive. - */ - final public function isPositive() : bool - { - return $this->getSign() > 0; - } - - /** - * Checks if this number is positive or zero. - */ - final public function isPositiveOrZero() : bool - { - return $this->getSign() >= 0; - } - - /** - * Returns the sign of this number. - * - * @psalm-return -1|0|1 - * - * @return int -1 if the number is negative, 0 if zero, 1 if positive. - */ - abstract public function getSign() : int; - - /** - * Compares this number to the given one. - * - * @psalm-return -1|0|1 - * - * @return int -1 if `$this` is lower than, 0 if equal to, 1 if greater than `$that`. - * - * @throws MathException If the number is not valid. - */ - abstract public function compareTo(BigNumber|int|float|string $that) : int; - - /** - * Converts this number to a BigInteger. - * - * @throws RoundingNecessaryException If this number cannot be converted to a BigInteger without rounding. - */ - abstract public function toBigInteger() : BigInteger; - - /** - * Converts this number to a BigDecimal. - * - * @throws RoundingNecessaryException If this number cannot be converted to a BigDecimal without rounding. - */ - abstract public function toBigDecimal() : BigDecimal; - - /** - * Converts this number to a BigRational. - */ - abstract public function toBigRational() : BigRational; - - /** - * Converts this number to a BigDecimal with the given scale, using rounding if necessary. - * - * @param int $scale The scale of the resulting `BigDecimal`. - * @param RoundingMode $roundingMode An optional rounding mode, defaults to UNNECESSARY. - * - * @throws RoundingNecessaryException If this number cannot be converted to the given scale without rounding. - * This only applies when RoundingMode::UNNECESSARY is used. - */ - abstract public function toScale(int $scale, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal; - - /** - * Returns the exact value of this number as a native integer. - * - * If this number cannot be converted to a native integer without losing precision, an exception is thrown. - * Note that the acceptable range for an integer depends on the platform and differs for 32-bit and 64-bit. - * - * @throws MathException If this number cannot be exactly converted to a native integer. - */ - abstract public function toInt() : int; - - /** - * Returns an approximation of this number as a floating-point value. - * - * Note that this method can discard information as the precision of a floating-point value - * is inherently limited. - * - * If the number is greater than the largest representable floating point number, positive infinity is returned. - * If the number is less than the smallest representable floating point number, negative infinity is returned. - */ - abstract public function toFloat() : float; - - /** - * Returns a string representation of this number. - * - * The output of this method can be parsed by the `of()` factory method; - * this will yield an object equal to this one, without any information loss. - */ - abstract public function __toString() : string; - - #[Override] - final public function jsonSerialize() : string - { - return $this->__toString(); - } -} diff --git a/vendor/brick/math/src/BigRational.php b/vendor/brick/math/src/BigRational.php deleted file mode 100644 index fc36e55..0000000 --- a/vendor/brick/math/src/BigRational.php +++ /dev/null @@ -1,424 +0,0 @@ -isZero()) { - throw DivisionByZeroException::denominatorMustNotBeZero(); - } - - if ($denominator->isNegative()) { - $numerator = $numerator->negated(); - $denominator = $denominator->negated(); - } - } - - $this->numerator = $numerator; - $this->denominator = $denominator; - } - - /** - * @psalm-pure - */ - #[Override] - protected static function from(BigNumber $number): static - { - return $number->toBigRational(); - } - - /** - * Creates a BigRational out of a numerator and a denominator. - * - * If the denominator is negative, the signs of both the numerator and the denominator - * will be inverted to ensure that the denominator is always positive. - * - * @param BigNumber|int|float|string $numerator The numerator. Must be convertible to a BigInteger. - * @param BigNumber|int|float|string $denominator The denominator. Must be convertible to a BigInteger. - * - * @throws NumberFormatException If an argument does not represent a valid number. - * @throws RoundingNecessaryException If an argument represents a non-integer number. - * @throws DivisionByZeroException If the denominator is zero. - * - * @psalm-pure - */ - public static function nd( - BigNumber|int|float|string $numerator, - BigNumber|int|float|string $denominator, - ) : BigRational { - $numerator = BigInteger::of($numerator); - $denominator = BigInteger::of($denominator); - - return new BigRational($numerator, $denominator, true); - } - - /** - * Returns a BigRational representing zero. - * - * @psalm-pure - */ - public static function zero() : BigRational - { - /** - * @psalm-suppress ImpureStaticVariable - * @var BigRational|null $zero - */ - static $zero; - - if ($zero === null) { - $zero = new BigRational(BigInteger::zero(), BigInteger::one(), false); - } - - return $zero; - } - - /** - * Returns a BigRational representing one. - * - * @psalm-pure - */ - public static function one() : BigRational - { - /** - * @psalm-suppress ImpureStaticVariable - * @var BigRational|null $one - */ - static $one; - - if ($one === null) { - $one = new BigRational(BigInteger::one(), BigInteger::one(), false); - } - - return $one; - } - - /** - * Returns a BigRational representing ten. - * - * @psalm-pure - */ - public static function ten() : BigRational - { - /** - * @psalm-suppress ImpureStaticVariable - * @var BigRational|null $ten - */ - static $ten; - - if ($ten === null) { - $ten = new BigRational(BigInteger::ten(), BigInteger::one(), false); - } - - return $ten; - } - - public function getNumerator() : BigInteger - { - return $this->numerator; - } - - public function getDenominator() : BigInteger - { - return $this->denominator; - } - - /** - * Returns the quotient of the division of the numerator by the denominator. - */ - public function quotient() : BigInteger - { - return $this->numerator->quotient($this->denominator); - } - - /** - * Returns the remainder of the division of the numerator by the denominator. - */ - public function remainder() : BigInteger - { - return $this->numerator->remainder($this->denominator); - } - - /** - * Returns the quotient and remainder of the division of the numerator by the denominator. - * - * @return BigInteger[] - * - * @psalm-return array{BigInteger, BigInteger} - */ - public function quotientAndRemainder() : array - { - return $this->numerator->quotientAndRemainder($this->denominator); - } - - /** - * Returns the sum of this number and the given one. - * - * @param BigNumber|int|float|string $that The number to add. - * - * @throws MathException If the number is not valid. - */ - public function plus(BigNumber|int|float|string $that) : BigRational - { - $that = BigRational::of($that); - - $numerator = $this->numerator->multipliedBy($that->denominator); - $numerator = $numerator->plus($that->numerator->multipliedBy($this->denominator)); - $denominator = $this->denominator->multipliedBy($that->denominator); - - return new BigRational($numerator, $denominator, false); - } - - /** - * Returns the difference of this number and the given one. - * - * @param BigNumber|int|float|string $that The number to subtract. - * - * @throws MathException If the number is not valid. - */ - public function minus(BigNumber|int|float|string $that) : BigRational - { - $that = BigRational::of($that); - - $numerator = $this->numerator->multipliedBy($that->denominator); - $numerator = $numerator->minus($that->numerator->multipliedBy($this->denominator)); - $denominator = $this->denominator->multipliedBy($that->denominator); - - return new BigRational($numerator, $denominator, false); - } - - /** - * Returns the product of this number and the given one. - * - * @param BigNumber|int|float|string $that The multiplier. - * - * @throws MathException If the multiplier is not a valid number. - */ - public function multipliedBy(BigNumber|int|float|string $that) : BigRational - { - $that = BigRational::of($that); - - $numerator = $this->numerator->multipliedBy($that->numerator); - $denominator = $this->denominator->multipliedBy($that->denominator); - - return new BigRational($numerator, $denominator, false); - } - - /** - * Returns the result of the division of this number by the given one. - * - * @param BigNumber|int|float|string $that The divisor. - * - * @throws MathException If the divisor is not a valid number, or is zero. - */ - public function dividedBy(BigNumber|int|float|string $that) : BigRational - { - $that = BigRational::of($that); - - $numerator = $this->numerator->multipliedBy($that->denominator); - $denominator = $this->denominator->multipliedBy($that->numerator); - - return new BigRational($numerator, $denominator, true); - } - - /** - * Returns this number exponentiated to the given value. - * - * @throws \InvalidArgumentException If the exponent is not in the range 0 to 1,000,000. - */ - public function power(int $exponent) : BigRational - { - if ($exponent === 0) { - $one = BigInteger::one(); - - return new BigRational($one, $one, false); - } - - if ($exponent === 1) { - return $this; - } - - return new BigRational( - $this->numerator->power($exponent), - $this->denominator->power($exponent), - false - ); - } - - /** - * Returns the reciprocal of this BigRational. - * - * The reciprocal has the numerator and denominator swapped. - * - * @throws DivisionByZeroException If the numerator is zero. - */ - public function reciprocal() : BigRational - { - return new BigRational($this->denominator, $this->numerator, true); - } - - /** - * Returns the absolute value of this BigRational. - */ - public function abs() : BigRational - { - return new BigRational($this->numerator->abs(), $this->denominator, false); - } - - /** - * Returns the negated value of this BigRational. - */ - public function negated() : BigRational - { - return new BigRational($this->numerator->negated(), $this->denominator, false); - } - - /** - * Returns the simplified value of this BigRational. - */ - public function simplified() : BigRational - { - $gcd = $this->numerator->gcd($this->denominator); - - $numerator = $this->numerator->quotient($gcd); - $denominator = $this->denominator->quotient($gcd); - - return new BigRational($numerator, $denominator, false); - } - - #[Override] - public function compareTo(BigNumber|int|float|string $that) : int - { - return $this->minus($that)->getSign(); - } - - #[Override] - public function getSign() : int - { - return $this->numerator->getSign(); - } - - #[Override] - public function toBigInteger() : BigInteger - { - $simplified = $this->simplified(); - - if (! $simplified->denominator->isEqualTo(1)) { - throw new RoundingNecessaryException('This rational number cannot be represented as an integer value without rounding.'); - } - - return $simplified->numerator; - } - - #[Override] - public function toBigDecimal() : BigDecimal - { - return $this->numerator->toBigDecimal()->exactlyDividedBy($this->denominator); - } - - #[Override] - public function toBigRational() : BigRational - { - return $this; - } - - #[Override] - public function toScale(int $scale, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal - { - return $this->numerator->toBigDecimal()->dividedBy($this->denominator, $scale, $roundingMode); - } - - #[Override] - public function toInt() : int - { - return $this->toBigInteger()->toInt(); - } - - #[Override] - public function toFloat() : float - { - $simplified = $this->simplified(); - return $simplified->numerator->toFloat() / $simplified->denominator->toFloat(); - } - - #[Override] - public function __toString() : string - { - $numerator = (string) $this->numerator; - $denominator = (string) $this->denominator; - - if ($denominator === '1') { - return $numerator; - } - - return $numerator . '/' . $denominator; - } - - /** - * This method is required for serializing the object and SHOULD NOT be accessed directly. - * - * @internal - * - * @return array{numerator: BigInteger, denominator: BigInteger} - */ - public function __serialize(): array - { - return ['numerator' => $this->numerator, 'denominator' => $this->denominator]; - } - - /** - * This method is only here to allow unserializing the object and cannot be accessed directly. - * - * @internal - * @psalm-suppress RedundantPropertyInitializationCheck - * - * @param array{numerator: BigInteger, denominator: BigInteger} $data - * - * @throws \LogicException - */ - public function __unserialize(array $data): void - { - if (isset($this->numerator)) { - throw new \LogicException('__unserialize() is an internal function, it must not be called directly.'); - } - - $this->numerator = $data['numerator']; - $this->denominator = $data['denominator']; - } -} diff --git a/vendor/brick/math/src/Exception/DivisionByZeroException.php b/vendor/brick/math/src/Exception/DivisionByZeroException.php deleted file mode 100644 index ce7769a..0000000 --- a/vendor/brick/math/src/Exception/DivisionByZeroException.php +++ /dev/null @@ -1,35 +0,0 @@ - 126) { - $char = \strtoupper(\dechex($ord)); - - if ($ord < 10) { - $char = '0' . $char; - } - } else { - $char = '"' . $char . '"'; - } - - return new self(\sprintf('Char %s is not a valid character in the given alphabet.', $char)); - } -} diff --git a/vendor/brick/math/src/Exception/RoundingNecessaryException.php b/vendor/brick/math/src/Exception/RoundingNecessaryException.php deleted file mode 100644 index 57bfcd8..0000000 --- a/vendor/brick/math/src/Exception/RoundingNecessaryException.php +++ /dev/null @@ -1,19 +0,0 @@ -init($a, $b); - - if ($aNeg && ! $bNeg) { - return -1; - } - - if ($bNeg && ! $aNeg) { - return 1; - } - - $aLen = \strlen($aDig); - $bLen = \strlen($bDig); - - if ($aLen < $bLen) { - $result = -1; - } elseif ($aLen > $bLen) { - $result = 1; - } else { - $result = $aDig <=> $bDig; - } - - return $aNeg ? -$result : $result; - } - - /** - * Adds two numbers. - */ - abstract public function add(string $a, string $b) : string; - - /** - * Subtracts two numbers. - */ - abstract public function sub(string $a, string $b) : string; - - /** - * Multiplies two numbers. - */ - abstract public function mul(string $a, string $b) : string; - - /** - * Returns the quotient of the division of two numbers. - * - * @param string $a The dividend. - * @param string $b The divisor, must not be zero. - * - * @return string The quotient. - */ - abstract public function divQ(string $a, string $b) : string; - - /** - * Returns the remainder of the division of two numbers. - * - * @param string $a The dividend. - * @param string $b The divisor, must not be zero. - * - * @return string The remainder. - */ - abstract public function divR(string $a, string $b) : string; - - /** - * Returns the quotient and remainder of the division of two numbers. - * - * @param string $a The dividend. - * @param string $b The divisor, must not be zero. - * - * @return array{string, string} An array containing the quotient and remainder. - */ - abstract public function divQR(string $a, string $b) : array; - - /** - * Exponentiates a number. - * - * @param string $a The base number. - * @param int $e The exponent, validated as an integer between 0 and MAX_POWER. - * - * @return string The power. - */ - abstract public function pow(string $a, int $e) : string; - - /** - * @param string $b The modulus; must not be zero. - */ - public function mod(string $a, string $b) : string - { - return $this->divR($this->add($this->divR($a, $b), $b), $b); - } - - /** - * Returns the modular multiplicative inverse of $x modulo $m. - * - * If $x has no multiplicative inverse mod m, this method must return null. - * - * This method can be overridden by the concrete implementation if the underlying library has built-in support. - * - * @param string $m The modulus; must not be negative or zero. - */ - public function modInverse(string $x, string $m) : ?string - { - if ($m === '1') { - return '0'; - } - - $modVal = $x; - - if ($x[0] === '-' || ($this->cmp($this->abs($x), $m) >= 0)) { - $modVal = $this->mod($x, $m); - } - - [$g, $x] = $this->gcdExtended($modVal, $m); - - if ($g !== '1') { - return null; - } - - return $this->mod($this->add($this->mod($x, $m), $m), $m); - } - - /** - * Raises a number into power with modulo. - * - * @param string $base The base number; must be positive or zero. - * @param string $exp The exponent; must be positive or zero. - * @param string $mod The modulus; must be strictly positive. - */ - abstract public function modPow(string $base, string $exp, string $mod) : string; - - /** - * Returns the greatest common divisor of the two numbers. - * - * This method can be overridden by the concrete implementation if the underlying library - * has built-in support for GCD calculations. - * - * @return string The GCD, always positive, or zero if both arguments are zero. - */ - public function gcd(string $a, string $b) : string - { - if ($a === '0') { - return $this->abs($b); - } - - if ($b === '0') { - return $this->abs($a); - } - - return $this->gcd($b, $this->divR($a, $b)); - } - - /** - * @return array{string, string, string} GCD, X, Y - */ - private function gcdExtended(string $a, string $b) : array - { - if ($a === '0') { - return [$b, '0', '1']; - } - - [$gcd, $x1, $y1] = $this->gcdExtended($this->mod($b, $a), $a); - - $x = $this->sub($y1, $this->mul($this->divQ($b, $a), $x1)); - $y = $x1; - - return [$gcd, $x, $y]; - } - - /** - * Returns the square root of the given number, rounded down. - * - * The result is the largest x such that x² ≤ n. - * The input MUST NOT be negative. - */ - abstract public function sqrt(string $n) : string; - - /** - * Converts a number from an arbitrary base. - * - * This method can be overridden by the concrete implementation if the underlying library - * has built-in support for base conversion. - * - * @param string $number The number, positive or zero, non-empty, case-insensitively validated for the given base. - * @param int $base The base of the number, validated from 2 to 36. - * - * @return string The converted number, following the Calculator conventions. - */ - public function fromBase(string $number, int $base) : string - { - return $this->fromArbitraryBase(\strtolower($number), self::ALPHABET, $base); - } - - /** - * Converts a number to an arbitrary base. - * - * This method can be overridden by the concrete implementation if the underlying library - * has built-in support for base conversion. - * - * @param string $number The number to convert, following the Calculator conventions. - * @param int $base The base to convert to, validated from 2 to 36. - * - * @return string The converted number, lowercase. - */ - public function toBase(string $number, int $base) : string - { - $negative = ($number[0] === '-'); - - if ($negative) { - $number = \substr($number, 1); - } - - $number = $this->toArbitraryBase($number, self::ALPHABET, $base); - - if ($negative) { - return '-' . $number; - } - - return $number; - } - - /** - * Converts a non-negative number in an arbitrary base using a custom alphabet, to base 10. - * - * @param string $number The number to convert, validated as a non-empty string, - * containing only chars in the given alphabet/base. - * @param string $alphabet The alphabet that contains every digit, validated as 2 chars minimum. - * @param int $base The base of the number, validated from 2 to alphabet length. - * - * @return string The number in base 10, following the Calculator conventions. - */ - final public function fromArbitraryBase(string $number, string $alphabet, int $base) : string - { - // remove leading "zeros" - $number = \ltrim($number, $alphabet[0]); - - if ($number === '') { - return '0'; - } - - // optimize for "one" - if ($number === $alphabet[1]) { - return '1'; - } - - $result = '0'; - $power = '1'; - - $base = (string) $base; - - for ($i = \strlen($number) - 1; $i >= 0; $i--) { - $index = \strpos($alphabet, $number[$i]); - - if ($index !== 0) { - $result = $this->add($result, ($index === 1) - ? $power - : $this->mul($power, (string) $index) - ); - } - - if ($i !== 0) { - $power = $this->mul($power, $base); - } - } - - return $result; - } - - /** - * Converts a non-negative number to an arbitrary base using a custom alphabet. - * - * @param string $number The number to convert, positive or zero, following the Calculator conventions. - * @param string $alphabet The alphabet that contains every digit, validated as 2 chars minimum. - * @param int $base The base to convert to, validated from 2 to alphabet length. - * - * @return string The converted number in the given alphabet. - */ - final public function toArbitraryBase(string $number, string $alphabet, int $base) : string - { - if ($number === '0') { - return $alphabet[0]; - } - - $base = (string) $base; - $result = ''; - - while ($number !== '0') { - [$number, $remainder] = $this->divQR($number, $base); - $remainder = (int) $remainder; - - $result .= $alphabet[$remainder]; - } - - return \strrev($result); - } - - /** - * Performs a rounded division. - * - * Rounding is performed when the remainder of the division is not zero. - * - * @param string $a The dividend. - * @param string $b The divisor, must not be zero. - * @param RoundingMode $roundingMode The rounding mode. - * - * @throws \InvalidArgumentException If the rounding mode is invalid. - * @throws RoundingNecessaryException If RoundingMode::UNNECESSARY is provided but rounding is necessary. - * - * @psalm-suppress ImpureFunctionCall - */ - final public function divRound(string $a, string $b, RoundingMode $roundingMode) : string - { - [$quotient, $remainder] = $this->divQR($a, $b); - - $hasDiscardedFraction = ($remainder !== '0'); - $isPositiveOrZero = ($a[0] === '-') === ($b[0] === '-'); - - $discardedFractionSign = function() use ($remainder, $b) : int { - $r = $this->abs($this->mul($remainder, '2')); - $b = $this->abs($b); - - return $this->cmp($r, $b); - }; - - $increment = false; - - switch ($roundingMode) { - case RoundingMode::UNNECESSARY: - if ($hasDiscardedFraction) { - throw RoundingNecessaryException::roundingNecessary(); - } - break; - - case RoundingMode::UP: - $increment = $hasDiscardedFraction; - break; - - case RoundingMode::DOWN: - break; - - case RoundingMode::CEILING: - $increment = $hasDiscardedFraction && $isPositiveOrZero; - break; - - case RoundingMode::FLOOR: - $increment = $hasDiscardedFraction && ! $isPositiveOrZero; - break; - - case RoundingMode::HALF_UP: - $increment = $discardedFractionSign() >= 0; - break; - - case RoundingMode::HALF_DOWN: - $increment = $discardedFractionSign() > 0; - break; - - case RoundingMode::HALF_CEILING: - $increment = $isPositiveOrZero ? $discardedFractionSign() >= 0 : $discardedFractionSign() > 0; - break; - - case RoundingMode::HALF_FLOOR: - $increment = $isPositiveOrZero ? $discardedFractionSign() > 0 : $discardedFractionSign() >= 0; - break; - - case RoundingMode::HALF_EVEN: - $lastDigit = (int) $quotient[-1]; - $lastDigitIsEven = ($lastDigit % 2 === 0); - $increment = $lastDigitIsEven ? $discardedFractionSign() > 0 : $discardedFractionSign() >= 0; - break; - - default: - throw new \InvalidArgumentException('Invalid rounding mode.'); - } - - if ($increment) { - return $this->add($quotient, $isPositiveOrZero ? '1' : '-1'); - } - - return $quotient; - } - - /** - * Calculates bitwise AND of two numbers. - * - * This method can be overridden by the concrete implementation if the underlying library - * has built-in support for bitwise operations. - */ - public function and(string $a, string $b) : string - { - return $this->bitwise('and', $a, $b); - } - - /** - * Calculates bitwise OR of two numbers. - * - * This method can be overridden by the concrete implementation if the underlying library - * has built-in support for bitwise operations. - */ - public function or(string $a, string $b) : string - { - return $this->bitwise('or', $a, $b); - } - - /** - * Calculates bitwise XOR of two numbers. - * - * This method can be overridden by the concrete implementation if the underlying library - * has built-in support for bitwise operations. - */ - public function xor(string $a, string $b) : string - { - return $this->bitwise('xor', $a, $b); - } - - /** - * Performs a bitwise operation on a decimal number. - * - * @param 'and'|'or'|'xor' $operator The operator to use. - * @param string $a The left operand. - * @param string $b The right operand. - */ - private function bitwise(string $operator, string $a, string $b) : string - { - [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b); - - $aBin = $this->toBinary($aDig); - $bBin = $this->toBinary($bDig); - - $aLen = \strlen($aBin); - $bLen = \strlen($bBin); - - if ($aLen > $bLen) { - $bBin = \str_repeat("\x00", $aLen - $bLen) . $bBin; - } elseif ($bLen > $aLen) { - $aBin = \str_repeat("\x00", $bLen - $aLen) . $aBin; - } - - if ($aNeg) { - $aBin = $this->twosComplement($aBin); - } - if ($bNeg) { - $bBin = $this->twosComplement($bBin); - } - - $value = match ($operator) { - 'and' => $aBin & $bBin, - 'or' => $aBin | $bBin, - 'xor' => $aBin ^ $bBin, - }; - - $negative = match ($operator) { - 'and' => $aNeg and $bNeg, - 'or' => $aNeg or $bNeg, - 'xor' => $aNeg xor $bNeg, - }; - - if ($negative) { - $value = $this->twosComplement($value); - } - - $result = $this->toDecimal($value); - - return $negative ? $this->neg($result) : $result; - } - - /** - * @param string $number A positive, binary number. - */ - private function twosComplement(string $number) : string - { - $xor = \str_repeat("\xff", \strlen($number)); - - $number ^= $xor; - - for ($i = \strlen($number) - 1; $i >= 0; $i--) { - $byte = \ord($number[$i]); - - if (++$byte !== 256) { - $number[$i] = \chr($byte); - break; - } - - $number[$i] = "\x00"; - - if ($i === 0) { - $number = "\x01" . $number; - } - } - - return $number; - } - - /** - * Converts a decimal number to a binary string. - * - * @param string $number The number to convert, positive or zero, only digits. - */ - private function toBinary(string $number) : string - { - $result = ''; - - while ($number !== '0') { - [$number, $remainder] = $this->divQR($number, '256'); - $result .= \chr((int) $remainder); - } - - return \strrev($result); - } - - /** - * Returns the positive decimal representation of a binary number. - * - * @param string $bytes The bytes representing the number. - */ - private function toDecimal(string $bytes) : string - { - $result = '0'; - $power = '1'; - - for ($i = \strlen($bytes) - 1; $i >= 0; $i--) { - $index = \ord($bytes[$i]); - - if ($index !== 0) { - $result = $this->add($result, ($index === 1) - ? $power - : $this->mul($power, (string) $index) - ); - } - - if ($i !== 0) { - $power = $this->mul($power, '256'); - } - } - - return $result; - } -} diff --git a/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php b/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php deleted file mode 100644 index 93a27ff..0000000 --- a/vendor/brick/math/src/Internal/Calculator/BcMathCalculator.php +++ /dev/null @@ -1,75 +0,0 @@ -maxDigits = match (PHP_INT_SIZE) { - 4 => 9, - 8 => 18, - default => throw new \RuntimeException('The platform is not 32-bit or 64-bit as expected.') - }; - } - - #[Override] - public function add(string $a, string $b) : string - { - /** - * @psalm-var numeric-string $a - * @psalm-var numeric-string $b - */ - $result = $a + $b; - - if (is_int($result)) { - return (string) $result; - } - - if ($a === '0') { - return $b; - } - - if ($b === '0') { - return $a; - } - - [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b); - - $result = $aNeg === $bNeg ? $this->doAdd($aDig, $bDig) : $this->doSub($aDig, $bDig); - - if ($aNeg) { - $result = $this->neg($result); - } - - return $result; - } - - #[Override] - public function sub(string $a, string $b) : string - { - return $this->add($a, $this->neg($b)); - } - - #[Override] - public function mul(string $a, string $b) : string - { - /** - * @psalm-var numeric-string $a - * @psalm-var numeric-string $b - */ - $result = $a * $b; - - if (is_int($result)) { - return (string) $result; - } - - if ($a === '0' || $b === '0') { - return '0'; - } - - if ($a === '1') { - return $b; - } - - if ($b === '1') { - return $a; - } - - if ($a === '-1') { - return $this->neg($b); - } - - if ($b === '-1') { - return $this->neg($a); - } - - [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b); - - $result = $this->doMul($aDig, $bDig); - - if ($aNeg !== $bNeg) { - $result = $this->neg($result); - } - - return $result; - } - - #[Override] - public function divQ(string $a, string $b) : string - { - return $this->divQR($a, $b)[0]; - } - - #[Override] - public function divR(string $a, string $b): string - { - return $this->divQR($a, $b)[1]; - } - - #[Override] - public function divQR(string $a, string $b) : array - { - if ($a === '0') { - return ['0', '0']; - } - - if ($a === $b) { - return ['1', '0']; - } - - if ($b === '1') { - return [$a, '0']; - } - - if ($b === '-1') { - return [$this->neg($a), '0']; - } - - /** @psalm-var numeric-string $a */ - $na = $a * 1; // cast to number - - if (is_int($na)) { - /** @psalm-var numeric-string $b */ - $nb = $b * 1; - - if (is_int($nb)) { - // the only division that may overflow is PHP_INT_MIN / -1, - // which cannot happen here as we've already handled a divisor of -1 above. - $q = intdiv($na, $nb); - $r = $na % $nb; - - return [ - (string) $q, - (string) $r - ]; - } - } - - [$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b); - - [$q, $r] = $this->doDiv($aDig, $bDig); - - if ($aNeg !== $bNeg) { - $q = $this->neg($q); - } - - if ($aNeg) { - $r = $this->neg($r); - } - - return [$q, $r]; - } - - #[Override] - public function pow(string $a, int $e) : string - { - if ($e === 0) { - return '1'; - } - - if ($e === 1) { - return $a; - } - - $odd = $e % 2; - $e -= $odd; - - $aa = $this->mul($a, $a); - - /** @psalm-suppress PossiblyInvalidArgument We're sure that $e / 2 is an int now */ - $result = $this->pow($aa, $e / 2); - - if ($odd === 1) { - $result = $this->mul($result, $a); - } - - return $result; - } - - /** - * Algorithm from: https://www.geeksforgeeks.org/modular-exponentiation-power-in-modular-arithmetic/ - */ - #[Override] - public function modPow(string $base, string $exp, string $mod) : string - { - // special case: the algorithm below fails with 0 power 0 mod 1 (returns 1 instead of 0) - if ($base === '0' && $exp === '0' && $mod === '1') { - return '0'; - } - - // special case: the algorithm below fails with power 0 mod 1 (returns 1 instead of 0) - if ($exp === '0' && $mod === '1') { - return '0'; - } - - $x = $base; - - $res = '1'; - - // numbers are positive, so we can use remainder instead of modulo - $x = $this->divR($x, $mod); - - while ($exp !== '0') { - if (in_array($exp[-1], ['1', '3', '5', '7', '9'])) { // odd - $res = $this->divR($this->mul($res, $x), $mod); - } - - $exp = $this->divQ($exp, '2'); - $x = $this->divR($this->mul($x, $x), $mod); - } - - return $res; - } - - /** - * Adapted from https://cp-algorithms.com/num_methods/roots_newton.html - */ - #[Override] - public function sqrt(string $n) : string - { - if ($n === '0') { - return '0'; - } - - // initial approximation - $x = \str_repeat('9', \intdiv(\strlen($n), 2) ?: 1); - - $decreased = false; - - for (;;) { - $nx = $this->divQ($this->add($x, $this->divQ($n, $x)), '2'); - - if ($x === $nx || $this->cmp($nx, $x) > 0 && $decreased) { - break; - } - - $decreased = $this->cmp($nx, $x) < 0; - $x = $nx; - } - - return $x; - } - - /** - * Performs the addition of two non-signed large integers. - */ - private function doAdd(string $a, string $b) : string - { - [$a, $b, $length] = $this->pad($a, $b); - - $carry = 0; - $result = ''; - - for ($i = $length - $this->maxDigits;; $i -= $this->maxDigits) { - $blockLength = $this->maxDigits; - - if ($i < 0) { - $blockLength += $i; - /** @psalm-suppress LoopInvalidation */ - $i = 0; - } - - /** @psalm-var numeric-string $blockA */ - $blockA = \substr($a, $i, $blockLength); - - /** @psalm-var numeric-string $blockB */ - $blockB = \substr($b, $i, $blockLength); - - $sum = (string) ($blockA + $blockB + $carry); - $sumLength = \strlen($sum); - - if ($sumLength > $blockLength) { - $sum = \substr($sum, 1); - $carry = 1; - } else { - if ($sumLength < $blockLength) { - $sum = \str_repeat('0', $blockLength - $sumLength) . $sum; - } - $carry = 0; - } - - $result = $sum . $result; - - if ($i === 0) { - break; - } - } - - if ($carry === 1) { - $result = '1' . $result; - } - - return $result; - } - - /** - * Performs the subtraction of two non-signed large integers. - */ - private function doSub(string $a, string $b) : string - { - if ($a === $b) { - return '0'; - } - - // Ensure that we always subtract to a positive result: biggest minus smallest. - $cmp = $this->doCmp($a, $b); - - $invert = ($cmp === -1); - - if ($invert) { - $c = $a; - $a = $b; - $b = $c; - } - - [$a, $b, $length] = $this->pad($a, $b); - - $carry = 0; - $result = ''; - - $complement = 10 ** $this->maxDigits; - - for ($i = $length - $this->maxDigits;; $i -= $this->maxDigits) { - $blockLength = $this->maxDigits; - - if ($i < 0) { - $blockLength += $i; - /** @psalm-suppress LoopInvalidation */ - $i = 0; - } - - /** @psalm-var numeric-string $blockA */ - $blockA = \substr($a, $i, $blockLength); - - /** @psalm-var numeric-string $blockB */ - $blockB = \substr($b, $i, $blockLength); - - $sum = $blockA - $blockB - $carry; - - if ($sum < 0) { - $sum += $complement; - $carry = 1; - } else { - $carry = 0; - } - - $sum = (string) $sum; - $sumLength = \strlen($sum); - - if ($sumLength < $blockLength) { - $sum = \str_repeat('0', $blockLength - $sumLength) . $sum; - } - - $result = $sum . $result; - - if ($i === 0) { - break; - } - } - - // Carry cannot be 1 when the loop ends, as a > b - assert($carry === 0); - - $result = \ltrim($result, '0'); - - if ($invert) { - $result = $this->neg($result); - } - - return $result; - } - - /** - * Performs the multiplication of two non-signed large integers. - */ - private function doMul(string $a, string $b) : string - { - $x = \strlen($a); - $y = \strlen($b); - - $maxDigits = \intdiv($this->maxDigits, 2); - $complement = 10 ** $maxDigits; - - $result = '0'; - - for ($i = $x - $maxDigits;; $i -= $maxDigits) { - $blockALength = $maxDigits; - - if ($i < 0) { - $blockALength += $i; - /** @psalm-suppress LoopInvalidation */ - $i = 0; - } - - $blockA = (int) \substr($a, $i, $blockALength); - - $line = ''; - $carry = 0; - - for ($j = $y - $maxDigits;; $j -= $maxDigits) { - $blockBLength = $maxDigits; - - if ($j < 0) { - $blockBLength += $j; - /** @psalm-suppress LoopInvalidation */ - $j = 0; - } - - $blockB = (int) \substr($b, $j, $blockBLength); - - $mul = $blockA * $blockB + $carry; - $value = $mul % $complement; - $carry = ($mul - $value) / $complement; - - $value = (string) $value; - $value = \str_pad($value, $maxDigits, '0', STR_PAD_LEFT); - - $line = $value . $line; - - if ($j === 0) { - break; - } - } - - if ($carry !== 0) { - $line = $carry . $line; - } - - $line = \ltrim($line, '0'); - - if ($line !== '') { - $line .= \str_repeat('0', $x - $blockALength - $i); - $result = $this->add($result, $line); - } - - if ($i === 0) { - break; - } - } - - return $result; - } - - /** - * Performs the division of two non-signed large integers. - * - * @return string[] The quotient and remainder. - */ - private function doDiv(string $a, string $b) : array - { - $cmp = $this->doCmp($a, $b); - - if ($cmp === -1) { - return ['0', $a]; - } - - $x = \strlen($a); - $y = \strlen($b); - - // we now know that a >= b && x >= y - - $q = '0'; // quotient - $r = $a; // remainder - $z = $y; // focus length, always $y or $y+1 - - /** @psalm-var numeric-string $b */ - $nb = $b * 1; // cast to number - // performance optimization in cases where the remainder will never cause int overflow - if (is_int(($nb - 1) * 10 + 9)) { - $r = (int) \substr($a, 0, $z - 1); - - for ($i = $z - 1; $i < $x; $i++) { - $n = $r * 10 + (int) $a[$i]; - /** @psalm-var int $nb */ - $q .= \intdiv($n, $nb); - $r = $n % $nb; - } - - return [\ltrim($q, '0') ?: '0', (string) $r]; - } - - for (;;) { - $focus = \substr($a, 0, $z); - - $cmp = $this->doCmp($focus, $b); - - if ($cmp === -1) { - if ($z === $x) { // remainder < dividend - break; - } - - $z++; - } - - $zeros = \str_repeat('0', $x - $z); - - $q = $this->add($q, '1' . $zeros); - $a = $this->sub($a, $b . $zeros); - - $r = $a; - - if ($r === '0') { // remainder == 0 - break; - } - - $x = \strlen($a); - - if ($x < $y) { // remainder < dividend - break; - } - - $z = $y; - } - - return [$q, $r]; - } - - /** - * Compares two non-signed large numbers. - * - * @psalm-return -1|0|1 - */ - private function doCmp(string $a, string $b) : int - { - $x = \strlen($a); - $y = \strlen($b); - - $cmp = $x <=> $y; - - if ($cmp !== 0) { - return $cmp; - } - - return \strcmp($a, $b) <=> 0; // enforce -1|0|1 - } - - /** - * Pads the left of one of the given numbers with zeros if necessary to make both numbers the same length. - * - * The numbers must only consist of digits, without leading minus sign. - * - * @return array{string, string, int} - */ - private function pad(string $a, string $b) : array - { - $x = \strlen($a); - $y = \strlen($b); - - if ($x > $y) { - $b = \str_repeat('0', $x - $y) . $b; - - return [$a, $b, $x]; - } - - if ($x < $y) { - $a = \str_repeat('0', $y - $x) . $a; - - return [$a, $b, $y]; - } - - return [$a, $b, $x]; - } -} diff --git a/vendor/brick/math/src/RoundingMode.php b/vendor/brick/math/src/RoundingMode.php deleted file mode 100644 index e8ee6a8..0000000 --- a/vendor/brick/math/src/RoundingMode.php +++ /dev/null @@ -1,98 +0,0 @@ -= 0.5; otherwise, behaves as for DOWN. - * Note that this is the rounding mode commonly taught at school. - */ - case HALF_UP; - - /** - * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. - * - * Behaves as for UP if the discarded fraction is > 0.5; otherwise, behaves as for DOWN. - */ - case HALF_DOWN; - - /** - * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round towards positive infinity. - * - * If the result is positive, behaves as for HALF_UP; if negative, behaves as for HALF_DOWN. - */ - case HALF_CEILING; - - /** - * Rounds towards "nearest neighbor" unless both neighbors are equidistant, in which case round towards negative infinity. - * - * If the result is positive, behaves as for HALF_DOWN; if negative, behaves as for HALF_UP. - */ - case HALF_FLOOR; - - /** - * Rounds towards the "nearest neighbor" unless both neighbors are equidistant, in which case rounds towards the even neighbor. - * - * Behaves as for HALF_UP if the digit to the left of the discarded fraction is odd; - * behaves as for HALF_DOWN if it's even. - * - * Note that this is the rounding mode that statistically minimizes - * cumulative error when applied repeatedly over a sequence of calculations. - * It is sometimes known as "Banker's rounding", and is chiefly used in the USA. - */ - case HALF_EVEN; -} diff --git a/vendor/carbonphp/carbon-doctrine-types/LICENSE b/vendor/carbonphp/carbon-doctrine-types/LICENSE deleted file mode 100644 index 2ee1671..0000000 --- a/vendor/carbonphp/carbon-doctrine-types/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Carbon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/carbonphp/carbon-doctrine-types/README.md b/vendor/carbonphp/carbon-doctrine-types/README.md deleted file mode 100644 index 5a18121..0000000 --- a/vendor/carbonphp/carbon-doctrine-types/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# carbonphp/carbon-doctrine-types - -Types to use Carbon in Doctrine - -## Documentation - -[Check how to use in the official Carbon documentation](https://carbon.nesbot.com/symfony/) - -This package is an externalization of [src/Carbon/Doctrine](https://github.com/briannesbitt/Carbon/tree/2.71.0/src/Carbon/Doctrine) -from `nestbot/carbon` package. - -Externalization allows to better deal with different versions of dbal. With -version 4.0 of dbal, it no longer sustainable to be compatible with all version -using a single code. diff --git a/vendor/carbonphp/carbon-doctrine-types/composer.json b/vendor/carbonphp/carbon-doctrine-types/composer.json deleted file mode 100644 index abf45c5..0000000 --- a/vendor/carbonphp/carbon-doctrine-types/composer.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "carbonphp/carbon-doctrine-types", - "description": "Types to use Carbon in Doctrine", - "type": "library", - "keywords": [ - "date", - "time", - "DateTime", - "Carbon", - "Doctrine" - ], - "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/dbal": "^4.0.0", - "nesbot/carbon": "^2.71.0 || ^3.0.0", - "phpunit/phpunit": "^10.3" - }, - "conflict": { - "doctrine/dbal": "<4.0.0 || >=5.0.0" - }, - "license": "MIT", - "autoload": { - "psr-4": { - "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" - } - }, - "authors": [ - { - "name": "KyleKatarn", - "email": "kylekatarnls@gmail.com" - } - ], - "minimum-stability": "dev" -} diff --git a/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php b/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php deleted file mode 100644 index a63a9b8..0000000 --- a/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php +++ /dev/null @@ -1,16 +0,0 @@ - - */ - protected function getCarbonClassName(): string - { - return Carbon::class; - } - - public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform): string - { - $precision = min( - $fieldDeclaration['precision'] ?? DateTimeDefaultPrecision::get(), - $this->getMaximumPrecision($platform), - ); - - $type = parent::getSQLDeclaration($fieldDeclaration, $platform); - - if (!$precision) { - return $type; - } - - if (str_contains($type, '(')) { - return preg_replace('/\(\d+\)/', "($precision)", $type); - } - - [$before, $after] = explode(' ', "$type "); - - return trim("$before($precision) $after"); - } - - /** - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string - { - if ($value === null) { - return $value; - } - - if ($value instanceof DateTimeInterface) { - return $value->format('Y-m-d H:i:s.u'); - } - - throw InvalidType::new( - $value, - static::class, - ['null', 'DateTime', 'Carbon'] - ); - } - - private function doConvertToPHPValue(mixed $value) - { - $class = $this->getCarbonClassName(); - - if ($value === null || is_a($value, $class)) { - return $value; - } - - if ($value instanceof DateTimeInterface) { - return $class::instance($value); - } - - $date = null; - $error = null; - - try { - $date = $class::parse($value); - } catch (Exception $exception) { - $error = $exception; - } - - if (!$date) { - throw ValueNotConvertible::new( - $value, - static::class, - 'Y-m-d H:i:s.u or any format supported by '.$class.'::parse()', - $error - ); - } - - return $date; - } - - private function getMaximumPrecision(AbstractPlatform $platform): int - { - if ($platform instanceof DB2Platform) { - return 12; - } - - if ($platform instanceof OraclePlatform) { - return 9; - } - - if ($platform instanceof SQLServerPlatform || $platform instanceof SQLitePlatform) { - return 3; - } - - return 6; - } -} diff --git a/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php b/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php deleted file mode 100644 index cd9896f..0000000 --- a/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php +++ /dev/null @@ -1,30 +0,0 @@ - */ - use CarbonTypeConverter; - - /** - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function convertToPHPValue(mixed $value, AbstractPlatform $platform): ?CarbonImmutable - { - return $this->doConvertToPHPValue($value); - } - - /** - * @return class-string - */ - protected function getCarbonClassName(): string - { - return CarbonImmutable::class; - } -} diff --git a/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php b/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php deleted file mode 100644 index 89e4b79..0000000 --- a/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php +++ /dev/null @@ -1,24 +0,0 @@ - */ - use CarbonTypeConverter; - - /** - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function convertToPHPValue(mixed $value, AbstractPlatform $platform): ?Carbon - { - return $this->doConvertToPHPValue($value); - } -} diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php deleted file mode 100644 index 7824d8f..0000000 --- a/vendor/composer/ClassLoader.php +++ /dev/null @@ -1,579 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see https://www.php-fig.org/psr/psr-0/ - * @see https://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - /** @var \Closure(string):void */ - private static $includeFile; - - /** @var string|null */ - private $vendorDir; - - // PSR-4 - /** - * @var array> - */ - private $prefixLengthsPsr4 = array(); - /** - * @var array> - */ - private $prefixDirsPsr4 = array(); - /** - * @var list - */ - private $fallbackDirsPsr4 = array(); - - // PSR-0 - /** - * List of PSR-0 prefixes - * - * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) - * - * @var array>> - */ - private $prefixesPsr0 = array(); - /** - * @var list - */ - private $fallbackDirsPsr0 = array(); - - /** @var bool */ - private $useIncludePath = false; - - /** - * @var array - */ - private $classMap = array(); - - /** @var bool */ - private $classMapAuthoritative = false; - - /** - * @var array - */ - private $missingClasses = array(); - - /** @var string|null */ - private $apcuPrefix; - - /** - * @var array - */ - private static $registeredLoaders = array(); - - /** - * @param string|null $vendorDir - */ - public function __construct($vendorDir = null) - { - $this->vendorDir = $vendorDir; - self::initializeIncludeClosure(); - } - - /** - * @return array> - */ - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); - } - - return array(); - } - - /** - * @return array> - */ - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - /** - * @return list - */ - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - /** - * @return list - */ - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - /** - * @return array Array of classname => path - */ - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - * - * @return void - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param list|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - * - * @return void - */ - public function add($prefix, $paths, $prepend = false) - { - $paths = (array) $paths; - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param list|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - $paths = (array) $paths; - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param list|string $paths The PSR-0 base directories - * - * @return void - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param list|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - * - * @return void - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - * - * @return void - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - * - * @return void - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - * - * @return void - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - - if (null === $this->vendorDir) { - return; - } - - if ($prepend) { - self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; - } else { - unset(self::$registeredLoaders[$this->vendorDir]); - self::$registeredLoaders[$this->vendorDir] = $this; - } - } - - /** - * Unregisters this instance as an autoloader. - * - * @return void - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - - if (null !== $this->vendorDir) { - unset(self::$registeredLoaders[$this->vendorDir]); - } - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return true|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - $includeFile = self::$includeFile; - $includeFile($file); - - return true; - } - - return null; - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - /** - * Returns the currently registered loaders keyed by their corresponding vendor directories. - * - * @return array - */ - public static function getRegisteredLoaders() - { - return self::$registeredLoaders; - } - - /** - * @param string $class - * @param string $ext - * @return string|false - */ - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } - - /** - * @return void - */ - private static function initializeIncludeClosure() - { - if (self::$includeFile !== null) { - return; - } - - /** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - */ - self::$includeFile = \Closure::bind(static function($file) { - include $file; - }, null, null); - } -} diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php deleted file mode 100644 index 6d29bff..0000000 --- a/vendor/composer/InstalledVersions.php +++ /dev/null @@ -1,378 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer; - -use Composer\Autoload\ClassLoader; -use Composer\Semver\VersionParser; - -/** - * This class is copied in every Composer installed project and available to all - * - * See also https://getcomposer.org/doc/07-runtime.md#installed-versions - * - * To require its presence, you can require `composer-runtime-api ^2.0` - * - * @final - */ -class InstalledVersions -{ - /** - * @var mixed[]|null - * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null - */ - private static $installed; - - /** - * @var bool - */ - private static $installedIsLocalDir; - - /** - * @var bool|null - */ - private static $canGetVendors; - - /** - * @var array[] - * @psalm-var array}> - */ - private static $installedByVendor = array(); - - /** - * Returns a list of all package names which are present, either by being installed, replaced or provided - * - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackages() - { - $packages = array(); - foreach (self::getInstalled() as $installed) { - $packages[] = array_keys($installed['versions']); - } - - if (1 === \count($packages)) { - return $packages[0]; - } - - return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); - } - - /** - * Returns a list of all package names with a specific type e.g. 'library' - * - * @param string $type - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackagesByType($type) - { - $packagesByType = array(); - - foreach (self::getInstalled() as $installed) { - foreach ($installed['versions'] as $name => $package) { - if (isset($package['type']) && $package['type'] === $type) { - $packagesByType[] = $name; - } - } - } - - return $packagesByType; - } - - /** - * Checks whether the given package is installed - * - * This also returns true if the package name is provided or replaced by another package - * - * @param string $packageName - * @param bool $includeDevRequirements - * @return bool - */ - public static function isInstalled($packageName, $includeDevRequirements = true) - { - foreach (self::getInstalled() as $installed) { - if (isset($installed['versions'][$packageName])) { - return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; - } - } - - return false; - } - - /** - * Checks whether the given package satisfies a version constraint - * - * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: - * - * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') - * - * @param VersionParser $parser Install composer/semver to have access to this class and functionality - * @param string $packageName - * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package - * @return bool - */ - public static function satisfies(VersionParser $parser, $packageName, $constraint) - { - $constraint = $parser->parseConstraints((string) $constraint); - $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); - - return $provided->matches($constraint); - } - - /** - * Returns a version constraint representing all the range(s) which are installed for a given package - * - * It is easier to use this via isInstalled() with the $constraint argument if you need to check - * whether a given version of a package is installed, and not just whether it exists - * - * @param string $packageName - * @return string Version constraint usable with composer/semver - */ - public static function getVersionRanges($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - $ranges = array(); - if (isset($installed['versions'][$packageName]['pretty_version'])) { - $ranges[] = $installed['versions'][$packageName]['pretty_version']; - } - if (array_key_exists('aliases', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); - } - if (array_key_exists('replaced', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); - } - if (array_key_exists('provided', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); - } - - return implode(' || ', $ranges); - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['version'])) { - return null; - } - - return $installed['versions'][$packageName]['version']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getPrettyVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['pretty_version'])) { - return null; - } - - return $installed['versions'][$packageName]['pretty_version']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference - */ - public static function getReference($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['reference'])) { - return null; - } - - return $installed['versions'][$packageName]['reference']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. - */ - public static function getInstallPath($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @return array - * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} - */ - public static function getRootPackage() - { - $installed = self::getInstalled(); - - return $installed[0]['root']; - } - - /** - * Returns the raw installed.php data for custom implementations - * - * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. - * @return array[] - * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} - */ - public static function getRawData() - { - @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); - - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (substr(__DIR__, -8, 1) !== 'C') { - self::$installed = include __DIR__ . '/installed.php'; - } else { - self::$installed = array(); - } - } - - return self::$installed; - } - - /** - * Returns the raw data of all installed.php which are currently loaded for custom implementations - * - * @return array[] - * @psalm-return list}> - */ - public static function getAllRawData() - { - return self::getInstalled(); - } - - /** - * Lets you reload the static array from another file - * - * This is only useful for complex integrations in which a project needs to use - * this class but then also needs to execute another project's autoloader in process, - * and wants to ensure both projects have access to their version of installed.php. - * - * A typical case would be PHPUnit, where it would need to make sure it reads all - * the data it needs from this class, then call reload() with - * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure - * the project in which it runs can then also use this class safely, without - * interference between PHPUnit's dependencies and the project's dependencies. - * - * @param array[] $data A vendor/composer/installed.php data set - * @return void - * - * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data - */ - public static function reload($data) - { - self::$installed = $data; - self::$installedByVendor = array(); - - // when using reload, we disable the duplicate protection to ensure that self::$installed data is - // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, - // so we have to assume it does not, and that may result in duplicate data being returned when listing - // all installed packages for example - self::$installedIsLocalDir = false; - } - - /** - * @return array[] - * @psalm-return list}> - */ - private static function getInstalled() - { - if (null === self::$canGetVendors) { - self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); - } - - $installed = array(); - $copiedLocalDir = false; - - if (self::$canGetVendors) { - $selfDir = strtr(__DIR__, '\\', '/'); - foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { - $vendorDir = strtr($vendorDir, '\\', '/'); - if (isset(self::$installedByVendor[$vendorDir])) { - $installed[] = self::$installedByVendor[$vendorDir]; - } elseif (is_file($vendorDir.'/composer/installed.php')) { - /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ - $required = require $vendorDir.'/composer/installed.php'; - self::$installedByVendor[$vendorDir] = $required; - $installed[] = $required; - if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { - self::$installed = $required; - self::$installedIsLocalDir = true; - } - } - if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { - $copiedLocalDir = true; - } - } - } - - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (substr(__DIR__, -8, 1) !== 'C') { - /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ - $required = require __DIR__ . '/installed.php'; - self::$installed = $required; - } else { - self::$installed = array(); - } - } - - if (self::$installed !== array() && !$copiedLocalDir) { - $installed[] = self::$installed; - } - - return $installed; - } -} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE deleted file mode 100644 index f27399a..0000000 --- a/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php deleted file mode 100644 index fff9c4f..0000000 --- a/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,21 +0,0 @@ - $vendorDir . '/composer/InstalledVersions.php', - 'DateError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateError.php', - 'DateException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateException.php', - 'DateInvalidOperationException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php', - 'DateInvalidTimeZoneException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php', - 'DateMalformedIntervalStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php', - 'DateMalformedPeriodStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php', - 'DateMalformedStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php', - 'DateObjectError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateObjectError.php', - 'DateRangeError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php', - 'Override' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/Override.php', - 'SQLite3Exception' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php', -); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php deleted file mode 100644 index afee2fc..0000000 --- a/vendor/composer/autoload_files.php +++ /dev/null @@ -1,20 +0,0 @@ - $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', - '23f09fe3194f8c2f70923f90d6702129' => $vendorDir . '/illuminate/collections/functions.php', - '60799491728b879e74601d83e38b2cad' => $vendorDir . '/illuminate/collections/helpers.php', - '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', - '662a729f963d39afe703c9d9b7ab4a8c' => $vendorDir . '/symfony/polyfill-php83/bootstrap.php', - '2203a247e6fda86070a5e4e07aed533a' => $vendorDir . '/symfony/clock/Resources/now.php', - 'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php', - 'f625ee536139dfb962a398b200bdb2bd' => $vendorDir . '/illuminate/support/functions.php', - '72579e7bd17821bb1321b87411366eae' => $vendorDir . '/illuminate/support/helpers.php', - '253c157292f75eb38082b5acb06f3f01' => $vendorDir . '/nikic/fast-route/src/functions.php', - 'd2136ff22b54ac75cd96a40e0022218e' => $vendorDir . '/workerman/webman-framework/src/support/helpers.php', -); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php deleted file mode 100644 index 15a2ff3..0000000 --- a/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,9 +0,0 @@ - array($vendorDir . '/voku/portable-ascii/src/voku'), - 'support\\' => array($vendorDir . '/webman/database/src/support', $vendorDir . '/workerman/webman-framework/src/support'), - 'Workerman\\Coroutine\\' => array($vendorDir . '/workerman/coroutine/src'), - 'Workerman\\' => array($vendorDir . '/workerman/workerman/src', $vendorDir . '/workerman/coroutine/src'), - 'Webman\\Database\\' => array($vendorDir . '/webman/database/src'), - 'Webman\\' => array($vendorDir . '/workerman/webman-framework/src'), - 'Symfony\\Polyfill\\Php83\\' => array($vendorDir . '/symfony/polyfill-php83'), - 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), - 'Symfony\\Contracts\\Translation\\' => array($vendorDir . '/symfony/translation-contracts'), - 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'), - 'Symfony\\Component\\Clock\\' => array($vendorDir . '/symfony/clock'), - 'Support\\View\\' => array($vendorDir . '/workerman/webman-framework/src/support/view'), - 'Support\\Exception\\' => array($vendorDir . '/workerman/webman-framework/src/support/exception'), - 'Support\\Bootstrap\\' => array($vendorDir . '/workerman/webman-framework/src/support/bootstrap'), - 'Support\\' => array($vendorDir . '/workerman/webman-framework/src/support'), - 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), - 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), - 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), - 'Psr\\Clock\\' => array($vendorDir . '/psr/clock/src'), - 'Laravel\\SerializableClosure\\' => array($vendorDir . '/laravel/serializable-closure/src'), - 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/support', $vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/macroable'), - 'Illuminate\\Database\\' => array($vendorDir . '/illuminate/database'), - 'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), - 'Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'), - 'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'), - 'Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector'), - 'Carbon\\Doctrine\\' => array($vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine'), - 'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'), - 'Brick\\Math\\' => array($vendorDir . '/brick/math/src'), -); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php deleted file mode 100644 index 8c80903..0000000 --- a/vendor/composer/autoload_real.php +++ /dev/null @@ -1,50 +0,0 @@ -register(true); - - $filesToLoad = \Composer\Autoload\ComposerStaticInitbada8bc7bcb18a93a92df0dd06295584::$files; - $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - - require $file; - } - }, null, null); - foreach ($filesToLoad as $fileIdentifier => $file) { - $requireFile($fileIdentifier, $file); - } - - return $loader; - } -} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php deleted file mode 100644 index 344d0e6..0000000 --- a/vendor/composer/autoload_static.php +++ /dev/null @@ -1,236 +0,0 @@ - __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', - '23f09fe3194f8c2f70923f90d6702129' => __DIR__ . '/..' . '/illuminate/collections/functions.php', - '60799491728b879e74601d83e38b2cad' => __DIR__ . '/..' . '/illuminate/collections/helpers.php', - '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', - '662a729f963d39afe703c9d9b7ab4a8c' => __DIR__ . '/..' . '/symfony/polyfill-php83/bootstrap.php', - '2203a247e6fda86070a5e4e07aed533a' => __DIR__ . '/..' . '/symfony/clock/Resources/now.php', - 'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php', - 'f625ee536139dfb962a398b200bdb2bd' => __DIR__ . '/..' . '/illuminate/support/functions.php', - '72579e7bd17821bb1321b87411366eae' => __DIR__ . '/..' . '/illuminate/support/helpers.php', - '253c157292f75eb38082b5acb06f3f01' => __DIR__ . '/..' . '/nikic/fast-route/src/functions.php', - 'd2136ff22b54ac75cd96a40e0022218e' => __DIR__ . '/..' . '/workerman/webman-framework/src/support/helpers.php', - ); - - public static $prefixLengthsPsr4 = array ( - 'v' => - array ( - 'voku\\' => 5, - ), - 's' => - array ( - 'support\\' => 8, - ), - 'W' => - array ( - 'Workerman\\Coroutine\\' => 20, - 'Workerman\\' => 10, - 'Webman\\Database\\' => 16, - 'Webman\\' => 7, - ), - 'S' => - array ( - 'Symfony\\Polyfill\\Php83\\' => 23, - 'Symfony\\Polyfill\\Mbstring\\' => 26, - 'Symfony\\Contracts\\Translation\\' => 30, - 'Symfony\\Component\\Translation\\' => 30, - 'Symfony\\Component\\Clock\\' => 24, - 'Support\\View\\' => 13, - 'Support\\Exception\\' => 18, - 'Support\\Bootstrap\\' => 18, - 'Support\\' => 8, - ), - 'P' => - array ( - 'Psr\\SimpleCache\\' => 16, - 'Psr\\Log\\' => 8, - 'Psr\\Container\\' => 14, - 'Psr\\Clock\\' => 10, - ), - 'L' => - array ( - 'Laravel\\SerializableClosure\\' => 28, - ), - 'I' => - array ( - 'Illuminate\\Support\\' => 19, - 'Illuminate\\Database\\' => 20, - 'Illuminate\\Contracts\\' => 21, - 'Illuminate\\Container\\' => 21, - ), - 'F' => - array ( - 'FastRoute\\' => 10, - ), - 'D' => - array ( - 'Doctrine\\Inflector\\' => 19, - ), - 'C' => - array ( - 'Carbon\\Doctrine\\' => 16, - 'Carbon\\' => 7, - ), - 'B' => - array ( - 'Brick\\Math\\' => 11, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'voku\\' => - array ( - 0 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku', - ), - 'support\\' => - array ( - 0 => __DIR__ . '/..' . '/webman/database/src/support', - 1 => __DIR__ . '/..' . '/workerman/webman-framework/src/support', - ), - 'Workerman\\Coroutine\\' => - array ( - 0 => __DIR__ . '/..' . '/workerman/coroutine/src', - ), - 'Workerman\\' => - array ( - 0 => __DIR__ . '/..' . '/workerman/workerman/src', - 1 => __DIR__ . '/..' . '/workerman/coroutine/src', - ), - 'Webman\\Database\\' => - array ( - 0 => __DIR__ . '/..' . '/webman/database/src', - ), - 'Webman\\' => - array ( - 0 => __DIR__ . '/..' . '/workerman/webman-framework/src', - ), - 'Symfony\\Polyfill\\Php83\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php83', - ), - 'Symfony\\Polyfill\\Mbstring\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', - ), - 'Symfony\\Contracts\\Translation\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/translation-contracts', - ), - 'Symfony\\Component\\Translation\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/translation', - ), - 'Symfony\\Component\\Clock\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/clock', - ), - 'Support\\View\\' => - array ( - 0 => __DIR__ . '/..' . '/workerman/webman-framework/src/support/view', - ), - 'Support\\Exception\\' => - array ( - 0 => __DIR__ . '/..' . '/workerman/webman-framework/src/support/exception', - ), - 'Support\\Bootstrap\\' => - array ( - 0 => __DIR__ . '/..' . '/workerman/webman-framework/src/support/bootstrap', - ), - 'Support\\' => - array ( - 0 => __DIR__ . '/..' . '/workerman/webman-framework/src/support', - ), - 'Psr\\SimpleCache\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/simple-cache/src', - ), - 'Psr\\Log\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/log/src', - ), - 'Psr\\Container\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/container/src', - ), - 'Psr\\Clock\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/clock/src', - ), - 'Laravel\\SerializableClosure\\' => - array ( - 0 => __DIR__ . '/..' . '/laravel/serializable-closure/src', - ), - 'Illuminate\\Support\\' => - array ( - 0 => __DIR__ . '/..' . '/illuminate/support', - 1 => __DIR__ . '/..' . '/illuminate/collections', - 2 => __DIR__ . '/..' . '/illuminate/conditionable', - 3 => __DIR__ . '/..' . '/illuminate/macroable', - ), - 'Illuminate\\Database\\' => - array ( - 0 => __DIR__ . '/..' . '/illuminate/database', - ), - 'Illuminate\\Contracts\\' => - array ( - 0 => __DIR__ . '/..' . '/illuminate/contracts', - ), - 'Illuminate\\Container\\' => - array ( - 0 => __DIR__ . '/..' . '/illuminate/container', - ), - 'FastRoute\\' => - array ( - 0 => __DIR__ . '/..' . '/nikic/fast-route/src', - ), - 'Doctrine\\Inflector\\' => - array ( - 0 => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector', - ), - 'Carbon\\Doctrine\\' => - array ( - 0 => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine', - ), - 'Carbon\\' => - array ( - 0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon', - ), - 'Brick\\Math\\' => - array ( - 0 => __DIR__ . '/..' . '/brick/math/src', - ), - ); - - public static $classMap = array ( - 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', - 'DateError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateError.php', - 'DateException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateException.php', - 'DateInvalidOperationException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php', - 'DateInvalidTimeZoneException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php', - 'DateMalformedIntervalStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php', - 'DateMalformedPeriodStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php', - 'DateMalformedStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php', - 'DateObjectError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateObjectError.php', - 'DateRangeError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php', - 'Override' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/Override.php', - 'SQLite3Exception' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInitbada8bc7bcb18a93a92df0dd06295584::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInitbada8bc7bcb18a93a92df0dd06295584::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInitbada8bc7bcb18a93a92df0dd06295584::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json deleted file mode 100644 index 068495b..0000000 --- a/vendor/composer/installed.json +++ /dev/null @@ -1,1884 +0,0 @@ -{ - "packages": [ - { - "name": "brick/math", - "version": "0.12.3", - "version_normalized": "0.12.3.0", - "source": { - "type": "git", - "url": "https://github.com/brick/math.git", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^10.1", - "vimeo/psalm": "6.8.8" - }, - "time": "2025-02-28T13:11:00+00:00", - "type": "library", - "installation-source": "dist", - "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", - "bignumber", - "brick", - "decimal", - "integer", - "math", - "mathematics", - "rational" - ], - "support": { - "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.3" - }, - "funding": [ - { - "url": "https://github.com/BenMorel", - "type": "github" - } - ], - "install-path": "../brick/math" - }, - { - "name": "carbonphp/carbon-doctrine-types", - "version": "3.2.0", - "version_normalized": "3.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "conflict": { - "doctrine/dbal": "<4.0.0 || >=5.0.0" - }, - "require-dev": { - "doctrine/dbal": "^4.0.0", - "nesbot/carbon": "^2.71.0 || ^3.0.0", - "phpunit/phpunit": "^10.3" - }, - "time": "2024-02-09T16:56:22+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "KyleKatarn", - "email": "kylekatarnls@gmail.com" - } - ], - "description": "Types to use Carbon in Doctrine", - "keywords": [ - "carbon", - "date", - "datetime", - "doctrine", - "time" - ], - "support": { - "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/kylekatarnls", - "type": "github" - }, - { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", - "type": "tidelift" - } - ], - "install-path": "../carbonphp/carbon-doctrine-types" - }, - { - "name": "doctrine/inflector", - "version": "2.0.10", - "version_normalized": "2.0.10.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^11.0", - "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 || ^5.4" - }, - "time": "2024-02-18T20:23:39+00:00", - "type": "library", - "installation-source": "dist", - "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.10" - }, - "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" - } - ], - "install-path": "../doctrine/inflector" - }, - { - "name": "illuminate/collections", - "version": "v11.44.1", - "version_normalized": "11.44.1.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/collections.git", - "reference": "48f5357348093bc8b94c691aa3ffc861d2ecc2a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/48f5357348093bc8b94c691aa3ffc861d2ecc2a0", - "reference": "48f5357348093bc8b94c691aa3ffc861d2ecc2a0", - "shasum": "" - }, - "require": { - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "php": "^8.2" - }, - "suggest": { - "symfony/var-dumper": "Required to use the dump method (^7.0)." - }, - "time": "2025-02-28T16:55:51+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Collections package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "install-path": "../illuminate/collections" - }, - { - "name": "illuminate/conditionable", - "version": "v11.44.1", - "version_normalized": "11.44.1.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/conditionable.git", - "reference": "911df1bda950a3b799cf80671764e34eede131c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/conditionable/zipball/911df1bda950a3b799cf80671764e34eede131c6", - "reference": "911df1bda950a3b799cf80671764e34eede131c6", - "shasum": "" - }, - "require": { - "php": "^8.0.2" - }, - "time": "2024-11-21T16:28:56+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Conditionable package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "install-path": "../illuminate/conditionable" - }, - { - "name": "illuminate/container", - "version": "v11.44.1", - "version_normalized": "11.44.1.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/container.git", - "reference": "4dcc3fcbab92e734fc0c08d9cfd97f5a1aef18ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/container/zipball/4dcc3fcbab92e734fc0c08d9cfd97f5a1aef18ca", - "reference": "4dcc3fcbab92e734fc0c08d9cfd97f5a1aef18ca", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^11.0", - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1" - }, - "provide": { - "psr/container-implementation": "1.1|2.0" - }, - "time": "2025-02-10T14:20:57+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Illuminate\\Container\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Container package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "install-path": "../illuminate/container" - }, - { - "name": "illuminate/contracts", - "version": "v11.44.1", - "version_normalized": "11.44.1.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/contracts.git", - "reference": "b350a3cd8450846325cb49e1cbc1293598b18898" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/b350a3cd8450846325cb49e1cbc1293598b18898", - "reference": "b350a3cd8450846325cb49e1cbc1293598b18898", - "shasum": "" - }, - "require": { - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1", - "psr/simple-cache": "^1.0|^2.0|^3.0" - }, - "time": "2025-02-10T14:20:57+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Illuminate\\Contracts\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Contracts package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "install-path": "../illuminate/contracts" - }, - { - "name": "illuminate/database", - "version": "v11.44.1", - "version_normalized": "11.44.1.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/database.git", - "reference": "131dcdfcc6c838115d5e58c77d4fe816f735dff8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/database/zipball/131dcdfcc6c838115d5e58c77d4fe816f735dff8", - "reference": "131dcdfcc6c838115d5e58c77d4fe816f735dff8", - "shasum": "" - }, - "require": { - "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", - "ext-pdo": "*", - "illuminate/collections": "^11.0", - "illuminate/container": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "illuminate/support": "^11.0", - "laravel/serializable-closure": "^1.3|^2.0", - "php": "^8.2" - }, - "suggest": { - "ext-filter": "Required to use the Postgres database driver.", - "fakerphp/faker": "Required to use the eloquent factory builder (^1.24).", - "illuminate/console": "Required to use the database commands (^11.0).", - "illuminate/events": "Required to use the observers with Eloquent (^11.0).", - "illuminate/filesystem": "Required to use the migrations (^11.0).", - "illuminate/pagination": "Required to paginate the result set (^11.0).", - "symfony/finder": "Required to use Eloquent model factories (^7.0)." - }, - "time": "2025-02-21T13:01:45+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Illuminate\\Database\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Database package.", - "homepage": "https://laravel.com", - "keywords": [ - "database", - "laravel", - "orm", - "sql" - ], - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "install-path": "../illuminate/database" - }, - { - "name": "illuminate/macroable", - "version": "v11.44.1", - "version_normalized": "11.44.1.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/macroable.git", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", - "shasum": "" - }, - "require": { - "php": "^8.2" - }, - "time": "2024-06-28T20:10:30+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Macroable package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "install-path": "../illuminate/macroable" - }, - { - "name": "illuminate/support", - "version": "v11.44.1", - "version_normalized": "11.44.1.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/support.git", - "reference": "d86d42ad0c75a020e0e4a7c734e9424ca86811cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/d86d42ad0c75a020e0e4a7c734e9424ca86811cc", - "reference": "d86d42ad0c75a020e0e4a7c734e9424ca86811cc", - "shasum": "" - }, - "require": { - "doctrine/inflector": "^2.0", - "ext-ctype": "*", - "ext-filter": "*", - "ext-mbstring": "*", - "illuminate/collections": "^11.0", - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "nesbot/carbon": "^2.72.6|^3.8.4", - "php": "^8.2", - "voku/portable-ascii": "^2.0.2" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "spatie/once": "*" - }, - "suggest": { - "illuminate/filesystem": "Required to use the Composer class (^11.0).", - "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.6).", - "league/uri": "Required to use the Uri class (^7.5.1).", - "ramsey/uuid": "Required to use Str::uuid() (^4.7).", - "symfony/process": "Required to use the Composer class (^7.0).", - "symfony/uid": "Required to use Str::ulid() (^7.0).", - "symfony/var-dumper": "Required to use the dd function (^7.0).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." - }, - "time": "2025-02-23T14:20:22+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Support package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "install-path": "../illuminate/support" - }, - { - "name": "laravel/serializable-closure", - "version": "v2.0.3", - "version_normalized": "2.0.3.0", - "source": { - "type": "git", - "url": "https://github.com/laravel/serializable-closure.git", - "reference": "f379c13663245f7aa4512a7869f62eb14095f23f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f379c13663245f7aa4512a7869f62eb14095f23f", - "reference": "f379c13663245f7aa4512a7869f62eb14095f23f", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "illuminate/support": "^10.0|^11.0|^12.0", - "nesbot/carbon": "^2.67|^3.0", - "pestphp/pest": "^2.36|^3.0", - "phpstan/phpstan": "^2.0", - "symfony/var-dumper": "^6.2.0|^7.0.0" - }, - "time": "2025-02-11T15:03:05+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "installation-source": "dist", - "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" - }, - "install-path": "../laravel/serializable-closure" - }, - { - "name": "nesbot/carbon", - "version": "3.8.6", - "version_normalized": "3.8.6.0", - "source": { - "type": "git", - "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ff2f20cf83bd4d503720632ce8a426dc747bf7fd", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd", - "shasum": "" - }, - "require": { - "carbonphp/carbon-doctrine-types": "<100.0", - "ext-json": "*", - "php": "^8.1", - "psr/clock": "^1.0", - "symfony/clock": "^6.3 || ^7.0", - "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" - }, - "provide": { - "psr/clock-implementation": "1.0" - }, - "require-dev": { - "doctrine/dbal": "^3.6.3 || ^4.0", - "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.57.2", - "kylekatarnls/multi-tester": "^2.5.3", - "ondrejmirtes/better-reflection": "^6.25.0.4", - "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.11.2", - "phpunit/phpunit": "^10.5.20", - "squizlabs/php_codesniffer": "^3.9.0" - }, - "time": "2025-02-20T17:33:38+00:00", - "bin": [ - "bin/carbon" - ], - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - }, - "branch-alias": { - "dev-2.x": "2.x-dev", - "dev-master": "3.x-dev" - } - }, - "installation-source": "dist", - "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/CarbonPHP/carbon/issues", - "source": "https://github.com/CarbonPHP/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" - } - ], - "install-path": "../nesbot/carbon" - }, - { - "name": "nikic/fast-route", - "version": "v1.3.0", - "version_normalized": "1.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/FastRoute.git", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|~5.7" - }, - "time": "2018-02-13T20:26:39+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "FastRoute\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov", - "email": "nikic@php.net" - } - ], - "description": "Fast request router for PHP", - "keywords": [ - "router", - "routing" - ], - "support": { - "issues": "https://github.com/nikic/FastRoute/issues", - "source": "https://github.com/nikic/FastRoute/tree/master" - }, - "install-path": "../nikic/fast-route" - }, - { - "name": "psr/clock", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0" - }, - "time": "2022-11-25T14:36:26+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Clock\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", - "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" - ], - "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" - }, - "install-path": "../psr/clock" - }, - { - "name": "psr/container", - "version": "2.0.2", - "version_normalized": "2.0.2.0", - "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" - }, - "time": "2021-11-05T16:47:00+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "installation-source": "dist", - "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" - }, - "install-path": "../psr/container" - }, - { - "name": "psr/log", - "version": "3.0.2", - "version_normalized": "3.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "time": "2024-09-11T13:17:53+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "installation-source": "dist", - "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.2" - }, - "install-path": "../psr/log" - }, - { - "name": "psr/simple-cache", - "version": "3.0.0", - "version_normalized": "3.0.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" - }, - "time": "2021-10-29T13:26:27+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "installation-source": "dist", - "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" - }, - "install-path": "../psr/simple-cache" - }, - { - "name": "symfony/clock", - "version": "v7.2.0", - "version_normalized": "7.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/clock.git", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" - }, - "provide": { - "psr/clock-implementation": "1.0" - }, - "time": "2024-09-25T14:21:43+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "Resources/now.php" - ], - "psr-4": { - "Symfony\\Component\\Clock\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Decouples applications from the system clock", - "homepage": "https://symfony.com", - "keywords": [ - "clock", - "psr20", - "time" - ], - "support": { - "source": "https://github.com/symfony/clock/tree/v7.2.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" - } - ], - "install-path": "../symfony/clock" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.5.1", - "version_normalized": "3.5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "time": "2024-09-25T14:20:29+00:00", - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } - }, - "installation-source": "dist", - "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.5.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" - } - ], - "install-path": "../symfony/deprecation-contracts" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "time": "2024-09-09T11:45:10+00:00", - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "installation-source": "dist", - "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.31.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" - } - ], - "install-path": "../symfony/polyfill-mbstring" - }, - { - "name": "symfony/polyfill-php83", - "version": "v1.31.0", - "version_normalized": "1.31.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "time": "2024-09-09T11:45:10+00:00", - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, - "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.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.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" - } - ], - "install-path": "../symfony/polyfill-php83" - }, - { - "name": "symfony/translation", - "version": "v7.2.4", - "version_normalized": "7.2.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/283856e6981286cc0d800b53bd5703e8e363f05a", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" - }, - "conflict": { - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<6.4", - "symfony/yaml": "<6.4" - }, - "provide": { - "symfony/translation-implementation": "2.3|3.0" - }, - "require-dev": { - "nikic/php-parser": "^4.18|^5.0", - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" - }, - "time": "2025-02-13T10:27:23+00:00", - "type": "library", - "installation-source": "dist", - "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/v7.2.4" - }, - "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" - } - ], - "install-path": "../symfony/translation" - }, - { - "name": "symfony/translation-contracts", - "version": "v3.5.1", - "version_normalized": "3.5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "time": "2024-09-25T14:20:29+00:00", - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } - }, - "installation-source": "dist", - "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.5.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" - } - ], - "install-path": "../symfony/translation-contracts" - }, - { - "name": "voku/portable-ascii", - "version": "2.0.3", - "version_normalized": "2.0.3.0", - "source": { - "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", - "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" - }, - "time": "2024-11-21T01:49:47+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "voku\\": "src/voku/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lars Moelleken", - "homepage": "https://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.3" - }, - "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" - } - ], - "install-path": "../voku/portable-ascii" - }, - { - "name": "webman/database", - "version": "v2.1.1", - "version_normalized": "2.1.1.0", - "source": { - "type": "git", - "url": "https://github.com/webman-php/database.git", - "reference": "360e42db6d1a6625ea55241a882a4244b84e72a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webman-php/database/zipball/360e42db6d1a6625ea55241a882a4244b84e72a0", - "reference": "360e42db6d1a6625ea55241a882a4244b84e72a0", - "shasum": "" - }, - "require": { - "illuminate/database": "^10.0 || ^11.0", - "laravel/serializable-closure": "^1.0 || ^2.0", - "workerman/webman-framework": "^2.1 || dev-master" - }, - "time": "2025-02-06T09:00:41+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "support\\": "src/support", - "Webman\\Database\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Webman database", - "support": { - "issues": "https://github.com/webman-php/database/issues", - "source": "https://github.com/webman-php/database/tree/v2.1.1" - }, - "install-path": "../webman/database" - }, - { - "name": "workerman/coroutine", - "version": "v1.1.3", - "version_normalized": "1.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/workerman-php/coroutine.git", - "reference": "df8fc428967d512a74a8a7d80355c1d40228c9fa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/workerman-php/coroutine/zipball/df8fc428967d512a74a8a7d80355c1d40228c9fa", - "reference": "df8fc428967d512a74a8a7d80355c1d40228c9fa", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^11.0", - "psr/log": "*" - }, - "time": "2025-02-17T03:34:21+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Workerman\\": "src", - "Workerman\\Coroutine\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Workerman coroutine", - "support": { - "issues": "https://github.com/workerman-php/coroutine/issues", - "source": "https://github.com/workerman-php/coroutine/tree/v1.1.3" - }, - "install-path": "../workerman/coroutine" - }, - { - "name": "workerman/webman-framework", - "version": "v2.1.2", - "version_normalized": "2.1.2.0", - "source": { - "type": "git", - "url": "https://github.com/walkor/webman-framework.git", - "reference": "f803bd867f07bb0929faef060b59a19a44186bfc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/walkor/webman-framework/zipball/f803bd867f07bb0929faef060b59a19a44186bfc", - "reference": "f803bd867f07bb0929faef060b59a19a44186bfc", - "shasum": "" - }, - "require": { - "ext-json": "*", - "nikic/fast-route": "^1.3", - "php": ">=8.1", - "psr/container": ">=1.0", - "psr/log": "^3.0", - "workerman/workerman": "^5.1 || dev-master" - }, - "suggest": { - "ext-event": "For better performance. " - }, - "time": "2025-03-10T11:52:22+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "./src/support/helpers.php" - ], - "psr-4": { - "Webman\\": "./src", - "Support\\": "./src/support", - "support\\": "./src/support", - "Support\\View\\": "./src/support/view", - "Support\\Bootstrap\\": "./src/support/bootstrap", - "Support\\Exception\\": "./src/support/exception" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "walkor", - "email": "walkor@workerman.net", - "homepage": "https://www.workerman.net", - "role": "Developer" - } - ], - "description": "High performance HTTP Service Framework.", - "homepage": "https://www.workerman.net", - "keywords": [ - "High Performance", - "http service" - ], - "support": { - "email": "walkor@workerman.net", - "forum": "https://wenda.workerman.net/", - "issues": "https://github.com/walkor/webman/issues", - "source": "https://github.com/walkor/webman-framework", - "wiki": "https://doc.workerman.net/" - }, - "install-path": "../workerman/webman-framework" - }, - { - "name": "workerman/workerman", - "version": "v5.1.0", - "version_normalized": "5.1.0.0", - "source": { - "type": "git", - "url": "https://github.com/walkor/workerman.git", - "reference": "5ce17bc71dfdad0e9eba8cd658342da793d2f581" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/walkor/workerman/zipball/5ce17bc71dfdad0e9eba8cd658342da793d2f581", - "reference": "5ce17bc71dfdad0e9eba8cd658342da793d2f581", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": ">=8.1", - "workerman/coroutine": "^1.1 || dev-main" - }, - "conflict": { - "ext-swow": " array( - 'name' => '__root__', - 'pretty_version' => '1.0.0+no-version-set', - 'version' => '1.0.0.0', - 'reference' => null, - 'type' => 'library', - 'install_path' => __DIR__ . '/../../', - 'aliases' => array(), - 'dev' => true, - ), - 'versions' => array( - '__root__' => array( - 'pretty_version' => '1.0.0+no-version-set', - 'version' => '1.0.0.0', - 'reference' => null, - 'type' => 'library', - 'install_path' => __DIR__ . '/../../', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'brick/math' => array( - 'pretty_version' => '0.12.3', - 'version' => '0.12.3.0', - 'reference' => '866551da34e9a618e64a819ee1e01c20d8a588ba', - 'type' => 'library', - 'install_path' => __DIR__ . '/../brick/math', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'carbonphp/carbon-doctrine-types' => array( - 'pretty_version' => '3.2.0', - 'version' => '3.2.0.0', - 'reference' => '18ba5ddfec8976260ead6e866180bd5d2f71aa1d', - 'type' => 'library', - 'install_path' => __DIR__ . '/../carbonphp/carbon-doctrine-types', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'doctrine/inflector' => array( - 'pretty_version' => '2.0.10', - 'version' => '2.0.10.0', - 'reference' => '5817d0659c5b50c9b950feb9af7b9668e2c436bc', - 'type' => 'library', - 'install_path' => __DIR__ . '/../doctrine/inflector', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'illuminate/collections' => array( - 'pretty_version' => 'v11.44.1', - 'version' => '11.44.1.0', - 'reference' => '48f5357348093bc8b94c691aa3ffc861d2ecc2a0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../illuminate/collections', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'illuminate/conditionable' => array( - 'pretty_version' => 'v11.44.1', - 'version' => '11.44.1.0', - 'reference' => '911df1bda950a3b799cf80671764e34eede131c6', - 'type' => 'library', - 'install_path' => __DIR__ . '/../illuminate/conditionable', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'illuminate/container' => array( - 'pretty_version' => 'v11.44.1', - 'version' => '11.44.1.0', - 'reference' => '4dcc3fcbab92e734fc0c08d9cfd97f5a1aef18ca', - 'type' => 'library', - 'install_path' => __DIR__ . '/../illuminate/container', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'illuminate/contracts' => array( - 'pretty_version' => 'v11.44.1', - 'version' => '11.44.1.0', - 'reference' => 'b350a3cd8450846325cb49e1cbc1293598b18898', - 'type' => 'library', - 'install_path' => __DIR__ . '/../illuminate/contracts', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'illuminate/database' => array( - 'pretty_version' => 'v11.44.1', - 'version' => '11.44.1.0', - 'reference' => '131dcdfcc6c838115d5e58c77d4fe816f735dff8', - 'type' => 'library', - 'install_path' => __DIR__ . '/../illuminate/database', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'illuminate/macroable' => array( - 'pretty_version' => 'v11.44.1', - 'version' => '11.44.1.0', - 'reference' => 'e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed', - 'type' => 'library', - 'install_path' => __DIR__ . '/../illuminate/macroable', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'illuminate/support' => array( - 'pretty_version' => 'v11.44.1', - 'version' => '11.44.1.0', - 'reference' => 'd86d42ad0c75a020e0e4a7c734e9424ca86811cc', - 'type' => 'library', - 'install_path' => __DIR__ . '/../illuminate/support', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'laravel/serializable-closure' => array( - 'pretty_version' => 'v2.0.3', - 'version' => '2.0.3.0', - 'reference' => 'f379c13663245f7aa4512a7869f62eb14095f23f', - 'type' => 'library', - 'install_path' => __DIR__ . '/../laravel/serializable-closure', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'nesbot/carbon' => array( - 'pretty_version' => '3.8.6', - 'version' => '3.8.6.0', - 'reference' => 'ff2f20cf83bd4d503720632ce8a426dc747bf7fd', - 'type' => 'library', - 'install_path' => __DIR__ . '/../nesbot/carbon', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'nikic/fast-route' => array( - 'pretty_version' => 'v1.3.0', - 'version' => '1.3.0.0', - 'reference' => '181d480e08d9476e61381e04a71b34dc0432e812', - 'type' => 'library', - 'install_path' => __DIR__ . '/../nikic/fast-route', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'psr/clock' => array( - 'pretty_version' => '1.0.0', - 'version' => '1.0.0.0', - 'reference' => 'e41a24703d4560fd0acb709162f73b8adfc3aa0d', - 'type' => 'library', - 'install_path' => __DIR__ . '/../psr/clock', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'psr/clock-implementation' => array( - 'dev_requirement' => false, - 'provided' => array( - 0 => '1.0', - ), - ), - 'psr/container' => array( - 'pretty_version' => '2.0.2', - 'version' => '2.0.2.0', - 'reference' => 'c71ecc56dfe541dbd90c5360474fbc405f8d5963', - 'type' => 'library', - 'install_path' => __DIR__ . '/../psr/container', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'psr/container-implementation' => array( - 'dev_requirement' => false, - 'provided' => array( - 0 => '1.1|2.0', - ), - ), - 'psr/log' => array( - 'pretty_version' => '3.0.2', - 'version' => '3.0.2.0', - 'reference' => 'f16e1d5863e37f8d8c2a01719f5b34baa2b714d3', - 'type' => 'library', - 'install_path' => __DIR__ . '/../psr/log', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'psr/simple-cache' => array( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'reference' => '764e0b3939f5ca87cb904f570ef9be2d78a07865', - 'type' => 'library', - 'install_path' => __DIR__ . '/../psr/simple-cache', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'spatie/once' => array( - 'dev_requirement' => false, - 'replaced' => array( - 0 => '*', - ), - ), - 'symfony/clock' => array( - 'pretty_version' => 'v7.2.0', - 'version' => '7.2.0.0', - 'reference' => 'b81435fbd6648ea425d1ee96a2d8e68f4ceacd24', - 'type' => 'library', - 'install_path' => __DIR__ . '/../symfony/clock', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'symfony/deprecation-contracts' => array( - 'pretty_version' => 'v3.5.1', - 'version' => '3.5.1.0', - 'reference' => '74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6', - 'type' => 'library', - 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'symfony/polyfill-mbstring' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', - 'reference' => '85181ba99b2345b0ef10ce42ecac37612d9fd341', - 'type' => 'library', - 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'symfony/polyfill-php83' => array( - 'pretty_version' => 'v1.31.0', - 'version' => '1.31.0.0', - 'reference' => '2fb86d65e2d424369ad2905e83b236a8805ba491', - 'type' => 'library', - 'install_path' => __DIR__ . '/../symfony/polyfill-php83', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'symfony/translation' => array( - 'pretty_version' => 'v7.2.4', - 'version' => '7.2.4.0', - 'reference' => '283856e6981286cc0d800b53bd5703e8e363f05a', - 'type' => 'library', - 'install_path' => __DIR__ . '/../symfony/translation', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'symfony/translation-contracts' => array( - 'pretty_version' => 'v3.5.1', - 'version' => '3.5.1.0', - 'reference' => '4667ff3bd513750603a09c8dedbea942487fb07c', - 'type' => 'library', - 'install_path' => __DIR__ . '/../symfony/translation-contracts', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'symfony/translation-implementation' => array( - 'dev_requirement' => false, - 'provided' => array( - 0 => '2.3|3.0', - ), - ), - 'voku/portable-ascii' => array( - 'pretty_version' => '2.0.3', - 'version' => '2.0.3.0', - 'reference' => 'b1d923f88091c6bf09699efcd7c8a1b1bfd7351d', - 'type' => 'library', - 'install_path' => __DIR__ . '/../voku/portable-ascii', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'webman/database' => array( - 'pretty_version' => 'v2.1.1', - 'version' => '2.1.1.0', - 'reference' => '360e42db6d1a6625ea55241a882a4244b84e72a0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../webman/database', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'workerman/coroutine' => array( - 'pretty_version' => 'v1.1.3', - 'version' => '1.1.3.0', - 'reference' => 'df8fc428967d512a74a8a7d80355c1d40228c9fa', - 'type' => 'library', - 'install_path' => __DIR__ . '/../workerman/coroutine', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'workerman/webman-framework' => array( - 'pretty_version' => 'v2.1.2', - 'version' => '2.1.2.0', - 'reference' => 'f803bd867f07bb0929faef060b59a19a44186bfc', - 'type' => 'library', - 'install_path' => __DIR__ . '/../workerman/webman-framework', - 'aliases' => array(), - 'dev_requirement' => false, - ), - 'workerman/workerman' => array( - 'pretty_version' => 'v5.1.0', - 'version' => '5.1.0.0', - 'reference' => '5ce17bc71dfdad0e9eba8cd658342da793d2f581', - 'type' => 'library', - 'install_path' => __DIR__ . '/../workerman/workerman', - 'aliases' => array(), - 'dev_requirement' => false, - ), - ), -); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php deleted file mode 100644 index d32d90c..0000000 --- a/vendor/composer/platform_check.php +++ /dev/null @@ -1,26 +0,0 @@ -= 80200)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 8.2.0". You are running ' . PHP_VERSION . '.'; -} - -if ($issues) { - if (!headers_sent()) { - header('HTTP/1.1 500 Internal Server Error'); - } - if (!ini_get('display_errors')) { - if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { - fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); - } elseif (!headers_sent()) { - echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; - } - } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR - ); -} diff --git a/vendor/doctrine/inflector/LICENSE b/vendor/doctrine/inflector/LICENSE deleted file mode 100644 index 8c38cc1..0000000 --- a/vendor/doctrine/inflector/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2006-2015 Doctrine Project - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/doctrine/inflector/README.md b/vendor/doctrine/inflector/README.md deleted file mode 100644 index 6e3a97f..0000000 --- a/vendor/doctrine/inflector/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Doctrine Inflector - -Doctrine Inflector is a small library that can perform string manipulations -with regard to uppercase/lowercase and singular/plural forms of words. - -[![Build Status](https://github.com/doctrine/inflector/workflows/Continuous%20Integration/badge.svg)](https://github.com/doctrine/inflector/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A4.0.x) -[![Code Coverage](https://codecov.io/gh/doctrine/inflector/branch/2.0.x/graph/badge.svg)](https://codecov.io/gh/doctrine/inflector/branch/2.0.x) diff --git a/vendor/doctrine/inflector/composer.json b/vendor/doctrine/inflector/composer.json deleted file mode 100644 index 91d7707..0000000 --- a/vendor/doctrine/inflector/composer.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "doctrine/inflector", - "type": "library", - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "keywords": ["php", "strings", "words", "manipulation", "inflector", "inflection", "uppercase", "lowercase", "singular", "plural"], - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "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"} - ], - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^11.0", - "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 || ^5.4" - }, - "autoload": { - "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" - } - }, - "autoload-dev": { - "psr-4": { - "Doctrine\\Tests\\Inflector\\": "tests/Doctrine/Tests/Inflector" - } - }, - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - } - } -} diff --git a/vendor/doctrine/inflector/docs/en/index.rst b/vendor/doctrine/inflector/docs/en/index.rst deleted file mode 100644 index 29866f4..0000000 --- a/vendor/doctrine/inflector/docs/en/index.rst +++ /dev/null @@ -1,226 +0,0 @@ -Introduction -============ - -The Doctrine Inflector has methods for inflecting text. The features include pluralization, -singularization, converting between camelCase and under_score and capitalizing -words. - -Installation -============ - -You can install the Inflector with composer: - -.. code-block:: console - - $ composer require doctrine/inflector - -Usage -===== - -Using the inflector is easy, you can create a new ``Doctrine\Inflector\Inflector`` instance by using -the ``Doctrine\Inflector\InflectorFactory`` class: - -.. code-block:: php - - use Doctrine\Inflector\InflectorFactory; - - $inflector = InflectorFactory::create()->build(); - -By default it will create an English inflector. If you want to use another language, just pass the language -you want to create an inflector for to the ``createForLanguage()`` method: - -.. code-block:: php - - use Doctrine\Inflector\InflectorFactory; - use Doctrine\Inflector\Language; - - $inflector = InflectorFactory::createForLanguage(Language::SPANISH)->build(); - -The supported languages are as follows: - -- ``Language::ENGLISH`` -- ``Language::FRENCH`` -- ``Language::NORWEGIAN_BOKMAL`` -- ``Language::PORTUGUESE`` -- ``Language::SPANISH`` -- ``Language::TURKISH`` - -If you want to manually construct the inflector instead of using a factory, you can do so like this: - -.. code-block:: php - - use Doctrine\Inflector\CachedWordInflector; - use Doctrine\Inflector\RulesetInflector; - use Doctrine\Inflector\Rules\English; - - $inflector = new Inflector( - new CachedWordInflector(new RulesetInflector( - English\Rules::getSingularRuleset() - )), - new CachedWordInflector(new RulesetInflector( - English\Rules::getPluralRuleset() - )) - ); - -Adding Languages ----------------- - -If you are interested in adding support for your language, take a look at the other languages defined in the -``Doctrine\Inflector\Rules`` namespace and the tests located in ``Doctrine\Tests\Inflector\Rules``. You can copy -one of the languages and update the rules for your language. - -Once you have done this, send a pull request to the ``doctrine/inflector`` repository with the additions. - -Custom Setup -============ - -If you want to setup custom singular and plural rules, you can configure these in the factory: - -.. code-block:: php - - use Doctrine\Inflector\InflectorFactory; - use Doctrine\Inflector\Rules\Pattern; - use Doctrine\Inflector\Rules\Patterns; - use Doctrine\Inflector\Rules\Ruleset; - use Doctrine\Inflector\Rules\Substitution; - use Doctrine\Inflector\Rules\Substitutions; - use Doctrine\Inflector\Rules\Transformation; - use Doctrine\Inflector\Rules\Transformations; - use Doctrine\Inflector\Rules\Word; - - $inflector = InflectorFactory::create() - ->withSingularRules( - new Ruleset( - new Transformations( - new Transformation(new Pattern('/^(bil)er$/i'), '\1'), - new Transformation(new Pattern('/^(inflec|contribu)tors$/i'), '\1ta') - ), - new Patterns(new Pattern('singulars')), - new Substitutions(new Substitution(new Word('spins'), new Word('spinor'))) - ) - ) - ->withPluralRules( - new Ruleset( - new Transformations( - new Transformation(new Pattern('^(bil)er$'), '\1'), - new Transformation(new Pattern('^(inflec|contribu)tors$'), '\1ta') - ), - new Patterns(new Pattern('noflect'), new Pattern('abtuse')), - new Substitutions( - new Substitution(new Word('amaze'), new Word('amazable')), - new Substitution(new Word('phone'), new Word('phonezes')) - ) - ) - ) - ->build(); - -No operation inflector ----------------------- - -The ``Doctrine\Inflector\NoopWordInflector`` may be used to configure an inflector that doesn't perform any operation for -pluralization and/or singularization. If will simply return the input as output. - -This is an implementation of the `Null Object design pattern `_. - -.. code-block:: php - - use Doctrine\Inflector\Inflector; - use Doctrine\Inflector\NoopWordInflector; - - $inflector = new Inflector(new NoopWordInflector(), new NoopWordInflector()); - -Tableize -======== - -Converts ``ModelName`` to ``model_name``: - -.. code-block:: php - - echo $inflector->tableize('ModelName'); // model_name - -Classify -======== - -Converts ``model_name`` to ``ModelName``: - -.. code-block:: php - - echo $inflector->classify('model_name'); // ModelName - -Camelize -======== - -This method uses `Classify`_ and then converts the first character to lowercase: - -.. code-block:: php - - echo $inflector->camelize('model_name'); // modelName - -Capitalize -========== - -Takes a string and capitalizes all of the words, like PHP's built-in -``ucwords`` function. This extends that behavior, however, by allowing the -word delimiters to be configured, rather than only separating on -whitespace. - -Here is an example: - -.. code-block:: php - - $string = 'top-o-the-morning to all_of_you!'; - - echo $inflector->capitalize($string); // Top-O-The-Morning To All_of_you! - - echo $inflector->capitalize($string, '-_ '); // Top-O-The-Morning To All_Of_You! - -Pluralize -========= - -Returns a word in plural form. - -.. code-block:: php - - echo $inflector->pluralize('browser'); // browsers - -Singularize -=========== - -Returns a word in singular form. - -.. code-block:: php - - echo $inflector->singularize('browsers'); // browser - -Urlize -====== - -Generate a URL friendly string from a string of text: - -.. code-block:: php - - echo $inflector->urlize('My first blog post'); // my-first-blog-post - -Unaccent -======== - -You can unaccent a string of text using the ``unaccent()`` method: - -.. code-block:: php - - echo $inflector->unaccent('año'); // ano - -Legacy API -========== - -The API present in Inflector 1.x is still available, but will be deprecated in a future release and dropped for 3.0. -Support for languages other than English is available in the 2.0 API only. - -Acknowledgements -================ - -The language rules in this library have been adapted from several different sources, including but not limited to: - -- `Ruby On Rails Inflector `_ -- `ICanBoogie Inflector `_ -- `CakePHP Inflector `_ diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php deleted file mode 100644 index 2d52908..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php +++ /dev/null @@ -1,24 +0,0 @@ -wordInflector = $wordInflector; - } - - public function inflect(string $word): string - { - return $this->cache[$word] ?? $this->cache[$word] = $this->wordInflector->inflect($word); - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php deleted file mode 100644 index 166061d..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php +++ /dev/null @@ -1,66 +0,0 @@ -singularRulesets[] = $this->getSingularRuleset(); - $this->pluralRulesets[] = $this->getPluralRuleset(); - } - - final public function build(): Inflector - { - return new Inflector( - new CachedWordInflector(new RulesetInflector( - ...$this->singularRulesets - )), - new CachedWordInflector(new RulesetInflector( - ...$this->pluralRulesets - )) - ); - } - - final public function withSingularRules(?Ruleset $singularRules, bool $reset = false): LanguageInflectorFactory - { - if ($reset) { - $this->singularRulesets = []; - } - - if ($singularRules instanceof Ruleset) { - array_unshift($this->singularRulesets, $singularRules); - } - - return $this; - } - - final public function withPluralRules(?Ruleset $pluralRules, bool $reset = false): LanguageInflectorFactory - { - if ($reset) { - $this->pluralRulesets = []; - } - - if ($pluralRules instanceof Ruleset) { - array_unshift($this->pluralRulesets, $pluralRules); - } - - return $this; - } - - abstract protected function getSingularRuleset(): Ruleset; - - abstract protected function getPluralRuleset(): Ruleset; -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php deleted file mode 100644 index 610a4cf..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php +++ /dev/null @@ -1,507 +0,0 @@ - 'A', - 'Á' => 'A', - 'Â' => 'A', - 'Ã' => 'A', - 'Ä' => 'Ae', - 'Æ' => 'Ae', - 'Å' => 'Aa', - 'æ' => 'a', - 'Ç' => 'C', - 'È' => 'E', - 'É' => 'E', - 'Ê' => 'E', - 'Ë' => 'E', - 'Ì' => 'I', - 'Í' => 'I', - 'Î' => 'I', - 'Ï' => 'I', - 'Ñ' => 'N', - 'Ò' => 'O', - 'Ó' => 'O', - 'Ô' => 'O', - 'Õ' => 'O', - 'Ö' => 'Oe', - 'Ù' => 'U', - 'Ú' => 'U', - 'Û' => 'U', - 'Ü' => 'Ue', - 'Ý' => 'Y', - 'ß' => 'ss', - 'à' => 'a', - 'á' => 'a', - 'â' => 'a', - 'ã' => 'a', - 'ä' => 'ae', - 'å' => 'aa', - 'ç' => 'c', - 'è' => 'e', - 'é' => 'e', - 'ê' => 'e', - 'ë' => 'e', - 'ì' => 'i', - 'í' => 'i', - 'î' => 'i', - 'ï' => 'i', - 'ñ' => 'n', - 'ò' => 'o', - 'ó' => 'o', - 'ô' => 'o', - 'õ' => 'o', - 'ö' => 'oe', - 'ù' => 'u', - 'ú' => 'u', - 'û' => 'u', - 'ü' => 'ue', - 'ý' => 'y', - 'ÿ' => 'y', - 'Ā' => 'A', - 'ā' => 'a', - 'Ă' => 'A', - 'ă' => 'a', - 'Ą' => 'A', - 'ą' => 'a', - 'Ć' => 'C', - 'ć' => 'c', - 'Ĉ' => 'C', - 'ĉ' => 'c', - 'Ċ' => 'C', - 'ċ' => 'c', - 'Č' => 'C', - 'č' => 'c', - 'Ď' => 'D', - 'ď' => 'd', - 'Đ' => 'D', - 'đ' => 'd', - 'Ē' => 'E', - 'ē' => 'e', - 'Ĕ' => 'E', - 'ĕ' => 'e', - 'Ė' => 'E', - 'ė' => 'e', - 'Ę' => 'E', - 'ę' => 'e', - 'Ě' => 'E', - 'ě' => 'e', - 'Ĝ' => 'G', - 'ĝ' => 'g', - 'Ğ' => 'G', - 'ğ' => 'g', - 'Ġ' => 'G', - 'ġ' => 'g', - 'Ģ' => 'G', - 'ģ' => 'g', - 'Ĥ' => 'H', - 'ĥ' => 'h', - 'Ħ' => 'H', - 'ħ' => 'h', - 'Ĩ' => 'I', - 'ĩ' => 'i', - 'Ī' => 'I', - 'ī' => 'i', - 'Ĭ' => 'I', - 'ĭ' => 'i', - 'Į' => 'I', - 'į' => 'i', - 'İ' => 'I', - 'ı' => 'i', - 'IJ' => 'IJ', - 'ij' => 'ij', - 'Ĵ' => 'J', - 'ĵ' => 'j', - 'Ķ' => 'K', - 'ķ' => 'k', - 'ĸ' => 'k', - 'Ĺ' => 'L', - 'ĺ' => 'l', - 'Ļ' => 'L', - 'ļ' => 'l', - 'Ľ' => 'L', - 'ľ' => 'l', - 'Ŀ' => 'L', - 'ŀ' => 'l', - 'Ł' => 'L', - 'ł' => 'l', - 'Ń' => 'N', - 'ń' => 'n', - 'Ņ' => 'N', - 'ņ' => 'n', - 'Ň' => 'N', - 'ň' => 'n', - 'ʼn' => 'N', - 'Ŋ' => 'n', - 'ŋ' => 'N', - 'Ō' => 'O', - 'ō' => 'o', - 'Ŏ' => 'O', - 'ŏ' => 'o', - 'Ő' => 'O', - 'ő' => 'o', - 'Œ' => 'OE', - 'œ' => 'oe', - 'Ø' => 'O', - 'ø' => 'o', - 'Ŕ' => 'R', - 'ŕ' => 'r', - 'Ŗ' => 'R', - 'ŗ' => 'r', - 'Ř' => 'R', - 'ř' => 'r', - 'Ś' => 'S', - 'ś' => 's', - 'Ŝ' => 'S', - 'ŝ' => 's', - 'Ş' => 'S', - 'ş' => 's', - 'Š' => 'S', - 'š' => 's', - 'Ţ' => 'T', - 'ţ' => 't', - 'Ť' => 'T', - 'ť' => 't', - 'Ŧ' => 'T', - 'ŧ' => 't', - 'Ũ' => 'U', - 'ũ' => 'u', - 'Ū' => 'U', - 'ū' => 'u', - 'Ŭ' => 'U', - 'ŭ' => 'u', - 'Ů' => 'U', - 'ů' => 'u', - 'Ű' => 'U', - 'ű' => 'u', - 'Ų' => 'U', - 'ų' => 'u', - 'Ŵ' => 'W', - 'ŵ' => 'w', - 'Ŷ' => 'Y', - 'ŷ' => 'y', - 'Ÿ' => 'Y', - 'Ź' => 'Z', - 'ź' => 'z', - 'Ż' => 'Z', - 'ż' => 'z', - 'Ž' => 'Z', - 'ž' => 'z', - 'ſ' => 's', - '€' => 'E', - '£' => '', - ]; - - /** @var WordInflector */ - private $singularizer; - - /** @var WordInflector */ - private $pluralizer; - - public function __construct(WordInflector $singularizer, WordInflector $pluralizer) - { - $this->singularizer = $singularizer; - $this->pluralizer = $pluralizer; - } - - /** - * Converts a word into the format for a Doctrine table name. Converts 'ModelName' to 'model_name'. - */ - public function tableize(string $word): string - { - $tableized = preg_replace('~(?<=\\w)([A-Z])~u', '_$1', $word); - - if ($tableized === null) { - throw new RuntimeException(sprintf( - 'preg_replace returned null for value "%s"', - $word - )); - } - - return mb_strtolower($tableized); - } - - /** - * Converts a word into the format for a Doctrine class name. Converts 'table_name' to 'TableName'. - */ - public function classify(string $word): string - { - return str_replace([' ', '_', '-'], '', ucwords($word, ' _-')); - } - - /** - * Camelizes a word. This uses the classify() method and turns the first character to lowercase. - */ - public function camelize(string $word): string - { - return lcfirst($this->classify($word)); - } - - /** - * Uppercases words with configurable delimiters between words. - * - * Takes a string and capitalizes all of the words, like PHP's built-in - * ucwords function. This extends that behavior, however, by allowing the - * word delimiters to be configured, rather than only separating on - * whitespace. - * - * Here is an example: - * - * capitalize($string); - * // Top-O-The-Morning To All_of_you! - * - * echo $inflector->capitalize($string, '-_ '); - * // Top-O-The-Morning To All_Of_You! - * ?> - * - * - * @param string $string The string to operate on. - * @param string $delimiters A list of word separators. - * - * @return string The string with all delimiter-separated words capitalized. - */ - public function capitalize(string $string, string $delimiters = " \n\t\r\0\x0B-"): string - { - return ucwords($string, $delimiters); - } - - /** - * Checks if the given string seems like it has utf8 characters in it. - * - * @param string $string The string to check for utf8 characters in. - */ - public function seemsUtf8(string $string): bool - { - for ($i = 0; $i < strlen($string); $i++) { - if (ord($string[$i]) < 0x80) { - continue; // 0bbbbbbb - } - - if ((ord($string[$i]) & 0xE0) === 0xC0) { - $n = 1; // 110bbbbb - } elseif ((ord($string[$i]) & 0xF0) === 0xE0) { - $n = 2; // 1110bbbb - } elseif ((ord($string[$i]) & 0xF8) === 0xF0) { - $n = 3; // 11110bbb - } elseif ((ord($string[$i]) & 0xFC) === 0xF8) { - $n = 4; // 111110bb - } elseif ((ord($string[$i]) & 0xFE) === 0xFC) { - $n = 5; // 1111110b - } else { - return false; // Does not match any model - } - - for ($j = 0; $j < $n; $j++) { // n bytes matching 10bbbbbb follow ? - if (++$i === strlen($string) || ((ord($string[$i]) & 0xC0) !== 0x80)) { - return false; - } - } - } - - return true; - } - - /** - * Remove any illegal characters, accents, etc. - * - * @param string $string String to unaccent - * - * @return string Unaccented string - */ - public function unaccent(string $string): string - { - if (preg_match('/[\x80-\xff]/', $string) === false) { - return $string; - } - - if ($this->seemsUtf8($string)) { - $string = strtr($string, self::ACCENTED_CHARACTERS); - } else { - $characters = []; - - // Assume ISO-8859-1 if not UTF-8 - $characters['in'] = - chr(128) - . chr(131) - . chr(138) - . chr(142) - . chr(154) - . chr(158) - . chr(159) - . chr(162) - . chr(165) - . chr(181) - . chr(192) - . chr(193) - . chr(194) - . chr(195) - . chr(196) - . chr(197) - . chr(199) - . chr(200) - . chr(201) - . chr(202) - . chr(203) - . chr(204) - . chr(205) - . chr(206) - . chr(207) - . chr(209) - . chr(210) - . chr(211) - . chr(212) - . chr(213) - . chr(214) - . chr(216) - . chr(217) - . chr(218) - . chr(219) - . chr(220) - . chr(221) - . chr(224) - . chr(225) - . chr(226) - . chr(227) - . chr(228) - . chr(229) - . chr(231) - . chr(232) - . chr(233) - . chr(234) - . chr(235) - . chr(236) - . chr(237) - . chr(238) - . chr(239) - . chr(241) - . chr(242) - . chr(243) - . chr(244) - . chr(245) - . chr(246) - . chr(248) - . chr(249) - . chr(250) - . chr(251) - . chr(252) - . chr(253) - . chr(255); - - $characters['out'] = 'EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'; - - $string = strtr($string, $characters['in'], $characters['out']); - - $doubleChars = []; - - $doubleChars['in'] = [ - chr(140), - chr(156), - chr(198), - chr(208), - chr(222), - chr(223), - chr(230), - chr(240), - chr(254), - ]; - - $doubleChars['out'] = ['OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th']; - - $string = str_replace($doubleChars['in'], $doubleChars['out'], $string); - } - - return $string; - } - - /** - * Convert any passed string to a url friendly string. - * Converts 'My first blog post' to 'my-first-blog-post' - * - * @param string $string String to urlize. - * - * @return string Urlized string. - */ - public function urlize(string $string): string - { - // Remove all non url friendly characters with the unaccent function - $unaccented = $this->unaccent($string); - - if (function_exists('mb_strtolower')) { - $lowered = mb_strtolower($unaccented); - } else { - $lowered = strtolower($unaccented); - } - - $replacements = [ - '/\W/' => ' ', - '/([A-Z]+)([A-Z][a-z])/' => '\1_\2', - '/([a-z\d])([A-Z])/' => '\1_\2', - '/[^A-Z^a-z^0-9^\/]+/' => '-', - ]; - - $urlized = $lowered; - - foreach ($replacements as $pattern => $replacement) { - $replaced = preg_replace($pattern, $replacement, $urlized); - - if ($replaced === null) { - throw new RuntimeException(sprintf( - 'preg_replace returned null for value "%s"', - $urlized - )); - } - - $urlized = $replaced; - } - - return trim($urlized, '-'); - } - - /** - * Returns a word in singular form. - * - * @param string $word The word in plural form. - * - * @return string The word in singular form. - */ - public function singularize(string $word): string - { - return $this->singularizer->inflect($word); - } - - /** - * Returns a word in plural form. - * - * @param string $word The word in singular form. - * - * @return string The word in plural form. - */ - public function pluralize(string $word): string - { - return $this->pluralizer->inflect($word); - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php deleted file mode 100644 index a0740a7..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php +++ /dev/null @@ -1,52 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php deleted file mode 100644 index 02257de..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php +++ /dev/null @@ -1,189 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php deleted file mode 100644 index 9747f91..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php +++ /dev/null @@ -1,28 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php deleted file mode 100644 index 5d8d3b3..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php +++ /dev/null @@ -1,30 +0,0 @@ -pattern = $pattern; - - if (isset($this->pattern[0]) && $this->pattern[0] === '/') { - $this->regex = $this->pattern; - } else { - $this->regex = '/' . $this->pattern . '/i'; - } - } - - public function getPattern(): string - { - return $this->pattern; - } - - public function getRegex(): string - { - return $this->regex; - } - - public function matches(string $word): bool - { - return preg_match($this->getRegex(), $word) === 1; - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php deleted file mode 100644 index e8d45cb..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php +++ /dev/null @@ -1,34 +0,0 @@ -patterns = $patterns; - - $patterns = array_map(static function (Pattern $pattern): string { - return $pattern->getPattern(); - }, $this->patterns); - - $this->regex = '/^(?:' . implode('|', $patterns) . ')$/i'; - } - - public function matches(string $word): bool - { - return preg_match($this->regex, $word, $regs) === 1; - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php deleted file mode 100644 index 0d41fe7..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php +++ /dev/null @@ -1,98 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php deleted file mode 100644 index b8e988f..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php +++ /dev/null @@ -1,32 +0,0 @@ -regular = $regular; - $this->uninflected = $uninflected; - $this->irregular = $irregular; - } - - public function getRegular(): Transformations - { - return $this->regular; - } - - public function getUninflected(): Patterns - { - return $this->uninflected; - } - - public function getIrregular(): Substitutions - { - return $this->irregular; - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php deleted file mode 100644 index 9129460..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php +++ /dev/null @@ -1,47 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php deleted file mode 100644 index c26ebe9..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php +++ /dev/null @@ -1,30 +0,0 @@ -from = $from; - $this->to = $to; - } - - public function getFrom(): Word - { - return $this->from; - } - - public function getTo(): Word - { - return $this->to; - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php deleted file mode 100644 index 17ee296..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php +++ /dev/null @@ -1,57 +0,0 @@ -substitutions[$substitution->getFrom()->getWord()] = $substitution; - } - } - - public function getFlippedSubstitutions(): Substitutions - { - $substitutions = []; - - foreach ($this->substitutions as $substitution) { - $substitutions[] = new Substitution( - $substitution->getTo(), - $substitution->getFrom() - ); - } - - return new Substitutions(...$substitutions); - } - - public function inflect(string $word): string - { - $lowerWord = strtolower($word); - - if (isset($this->substitutions[$lowerWord])) { - $firstLetterUppercase = $lowerWord[0] !== $word[0]; - - $toWord = $this->substitutions[$lowerWord]->getTo()->getWord(); - - if ($firstLetterUppercase) { - return strtoupper($toWord[0]) . substr($toWord, 1); - } - - return $toWord; - } - - return $word; - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php deleted file mode 100644 index 30dcd59..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php +++ /dev/null @@ -1,39 +0,0 @@ -pattern = $pattern; - $this->replacement = $replacement; - } - - public function getPattern(): Pattern - { - return $this->pattern; - } - - public function getReplacement(): string - { - return $this->replacement; - } - - public function inflect(string $word): string - { - return (string) preg_replace($this->pattern->getRegex(), $this->replacement, $word); - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php deleted file mode 100644 index b6a48fa..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php +++ /dev/null @@ -1,29 +0,0 @@ -transformations = $transformations; - } - - public function inflect(string $word): string - { - foreach ($this->transformations as $transformation) { - if ($transformation->getPattern()->matches($word)) { - return $transformation->inflect($word); - } - } - - return $word; - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php deleted file mode 100644 index a2bda0d..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php +++ /dev/null @@ -1,34 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php deleted file mode 100644 index ec1c37d..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php +++ /dev/null @@ -1,30 +0,0 @@ -word = $word; - } - - public function getWord(): string - { - return $this->word; - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php deleted file mode 100644 index 12b2ed5..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php +++ /dev/null @@ -1,56 +0,0 @@ -rulesets = array_merge([$ruleset], $rulesets); - } - - public function inflect(string $word): string - { - if ($word === '') { - return ''; - } - - foreach ($this->rulesets as $ruleset) { - if ($ruleset->getUninflected()->matches($word)) { - return $word; - } - - $inflected = $ruleset->getIrregular()->inflect($word); - - if ($inflected !== $word) { - return $inflected; - } - - $inflected = $ruleset->getRegular()->inflect($word); - - if ($inflected !== $word) { - return $inflected; - } - } - - return $word; - } -} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php deleted file mode 100644 index b88b1d6..0000000 --- a/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php +++ /dev/null @@ -1,10 +0,0 @@ -all(); - } elseif (! is_array($values)) { - continue; - } - - $results[] = $values; - } - - return array_merge([], ...$results); - } - - /** - * Cross join the given arrays, returning all possible permutations. - * - * @param iterable ...$arrays - * @return array - */ - public static function crossJoin(...$arrays) - { - $results = [[]]; - - foreach ($arrays as $index => $array) { - $append = []; - - foreach ($results as $product) { - foreach ($array as $item) { - $product[$index] = $item; - - $append[] = $product; - } - } - - $results = $append; - } - - return $results; - } - - /** - * Divide an array into two arrays. One with keys and the other with values. - * - * @param array $array - * @return array - */ - public static function divide($array) - { - return [array_keys($array), array_values($array)]; - } - - /** - * Flatten a multi-dimensional associative array with dots. - * - * @param iterable $array - * @param string $prepend - * @return array - */ - public static function dot($array, $prepend = '') - { - $results = []; - - foreach ($array as $key => $value) { - if (is_array($value) && ! empty($value)) { - $results = array_merge($results, static::dot($value, $prepend.$key.'.')); - } else { - $results[$prepend.$key] = $value; - } - } - - return $results; - } - - /** - * Convert a flatten "dot" notation array into an expanded array. - * - * @param iterable $array - * @return array - */ - public static function undot($array) - { - $results = []; - - foreach ($array as $key => $value) { - static::set($results, $key, $value); - } - - return $results; - } - - /** - * Get all of the given array except for a specified array of keys. - * - * @param array $array - * @param array|string|int|float $keys - * @return array - */ - public static function except($array, $keys) - { - static::forget($array, $keys); - - return $array; - } - - /** - * Determine if the given key exists in the provided array. - * - * @param \ArrayAccess|array $array - * @param string|int|float $key - * @return bool - */ - public static function exists($array, $key) - { - if ($array instanceof Enumerable) { - return $array->has($key); - } - - if ($array instanceof ArrayAccess) { - return $array->offsetExists($key); - } - - if (is_float($key)) { - $key = (string) $key; - } - - return array_key_exists($key, $array); - } - - /** - * Return the first element in an array passing a given truth test. - * - * @template TKey - * @template TValue - * @template TFirstDefault - * - * @param iterable $array - * @param (callable(TValue, TKey): bool)|null $callback - * @param TFirstDefault|(\Closure(): TFirstDefault) $default - * @return TValue|TFirstDefault - */ - public static function first($array, ?callable $callback = null, $default = null) - { - if (is_null($callback)) { - if (empty($array)) { - return value($default); - } - - foreach ($array as $item) { - return $item; - } - - return value($default); - } - - foreach ($array as $key => $value) { - if ($callback($value, $key)) { - return $value; - } - } - - return value($default); - } - - /** - * Return the last element in an array passing a given truth test. - * - * @template TKey - * @template TValue - * @template TLastDefault - * - * @param iterable $array - * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault|(\Closure(): TLastDefault) $default - * @return TValue|TLastDefault - */ - public static function last($array, ?callable $callback = null, $default = null) - { - if (is_null($callback)) { - return empty($array) ? value($default) : end($array); - } - - return static::first(array_reverse($array, true), $callback, $default); - } - - /** - * Take the first or last {$limit} items from an array. - * - * @param array $array - * @param int $limit - * @return array - */ - public static function take($array, $limit) - { - if ($limit < 0) { - return array_slice($array, $limit, abs($limit)); - } - - return array_slice($array, 0, $limit); - } - - /** - * Flatten a multi-dimensional array into a single level. - * - * @param iterable $array - * @param int $depth - * @return array - */ - public static function flatten($array, $depth = INF) - { - $result = []; - - foreach ($array as $item) { - $item = $item instanceof Collection ? $item->all() : $item; - - if (! is_array($item)) { - $result[] = $item; - } else { - $values = $depth === 1 - ? array_values($item) - : static::flatten($item, $depth - 1); - - foreach ($values as $value) { - $result[] = $value; - } - } - } - - return $result; - } - - /** - * Remove one or many array items from a given array using "dot" notation. - * - * @param array $array - * @param array|string|int|float $keys - * @return void - */ - public static function forget(&$array, $keys) - { - $original = &$array; - - $keys = (array) $keys; - - if (count($keys) === 0) { - return; - } - - foreach ($keys as $key) { - // if the exact key exists in the top-level, remove it - if (static::exists($array, $key)) { - unset($array[$key]); - - continue; - } - - $parts = explode('.', $key); - - // clean up before each pass - $array = &$original; - - while (count($parts) > 1) { - $part = array_shift($parts); - - if (isset($array[$part]) && static::accessible($array[$part])) { - $array = &$array[$part]; - } else { - continue 2; - } - } - - unset($array[array_shift($parts)]); - } - } - - /** - * Get an item from an array using "dot" notation. - * - * @param \ArrayAccess|array $array - * @param string|int|null $key - * @param mixed $default - * @return mixed - */ - public static function get($array, $key, $default = null) - { - if (! static::accessible($array)) { - return value($default); - } - - if (is_null($key)) { - return $array; - } - - if (static::exists($array, $key)) { - return $array[$key]; - } - - if (! str_contains($key, '.')) { - return $array[$key] ?? value($default); - } - - foreach (explode('.', $key) as $segment) { - if (static::accessible($array) && static::exists($array, $segment)) { - $array = $array[$segment]; - } else { - return value($default); - } - } - - return $array; - } - - /** - * Check if an item or items exist in an array using "dot" notation. - * - * @param \ArrayAccess|array $array - * @param string|array $keys - * @return bool - */ - public static function has($array, $keys) - { - $keys = (array) $keys; - - if (! $array || $keys === []) { - return false; - } - - foreach ($keys as $key) { - $subKeyArray = $array; - - if (static::exists($array, $key)) { - continue; - } - - foreach (explode('.', $key) as $segment) { - if (static::accessible($subKeyArray) && static::exists($subKeyArray, $segment)) { - $subKeyArray = $subKeyArray[$segment]; - } else { - return false; - } - } - } - - return true; - } - - /** - * Determine if any of the keys exist in an array using "dot" notation. - * - * @param \ArrayAccess|array $array - * @param string|array $keys - * @return bool - */ - public static function hasAny($array, $keys) - { - if (is_null($keys)) { - return false; - } - - $keys = (array) $keys; - - if (! $array) { - return false; - } - - if ($keys === []) { - return false; - } - - foreach ($keys as $key) { - if (static::has($array, $key)) { - return true; - } - } - - return false; - } - - /** - * Determines if an array is associative. - * - * An array is "associative" if it doesn't have sequential numerical keys beginning with zero. - * - * @param array $array - * @return bool - */ - public static function isAssoc(array $array) - { - return ! array_is_list($array); - } - - /** - * Determines if an array is a list. - * - * An array is a "list" if all array keys are sequential integers starting from 0 with no gaps in between. - * - * @param array $array - * @return bool - */ - public static function isList($array) - { - return array_is_list($array); - } - - /** - * Join all items using a string. The final items can use a separate glue string. - * - * @param array $array - * @param string $glue - * @param string $finalGlue - * @return string - */ - public static function join($array, $glue, $finalGlue = '') - { - if ($finalGlue === '') { - return implode($glue, $array); - } - - if (count($array) === 0) { - return ''; - } - - if (count($array) === 1) { - return end($array); - } - - $finalItem = array_pop($array); - - return implode($glue, $array).$finalGlue.$finalItem; - } - - /** - * Key an associative array by a field or using a callback. - * - * @param array $array - * @param callable|array|string $keyBy - * @return array - */ - public static function keyBy($array, $keyBy) - { - return (new Collection($array))->keyBy($keyBy)->all(); - } - - /** - * Prepend the key names of an associative array. - * - * @param array $array - * @param string $prependWith - * @return array - */ - public static function prependKeysWith($array, $prependWith) - { - return static::mapWithKeys($array, fn ($item, $key) => [$prependWith.$key => $item]); - } - - /** - * Get a subset of the items from the given array. - * - * @param array $array - * @param array|string $keys - * @return array - */ - public static function only($array, $keys) - { - return array_intersect_key($array, array_flip((array) $keys)); - } - - /** - * Select an array of values from an array. - * - * @param array $array - * @param array|string $keys - * @return array - */ - public static function select($array, $keys) - { - $keys = static::wrap($keys); - - return static::map($array, function ($item) use ($keys) { - $result = []; - - foreach ($keys as $key) { - if (Arr::accessible($item) && Arr::exists($item, $key)) { - $result[$key] = $item[$key]; - } elseif (is_object($item) && isset($item->{$key})) { - $result[$key] = $item->{$key}; - } - } - - return $result; - }); - } - - /** - * Pluck an array of values from an array. - * - * @param iterable $array - * @param string|array|int|null $value - * @param string|array|null $key - * @return array - */ - public static function pluck($array, $value, $key = null) - { - $results = []; - - [$value, $key] = static::explodePluckParameters($value, $key); - - foreach ($array as $item) { - $itemValue = data_get($item, $value); - - // If the key is "null", we will just append the value to the array and keep - // looping. Otherwise we will key the array using the value of the key we - // received from the developer. Then we'll return the final array form. - if (is_null($key)) { - $results[] = $itemValue; - } else { - $itemKey = data_get($item, $key); - - if (is_object($itemKey) && method_exists($itemKey, '__toString')) { - $itemKey = (string) $itemKey; - } - - $results[$itemKey] = $itemValue; - } - } - - return $results; - } - - /** - * Explode the "value" and "key" arguments passed to "pluck". - * - * @param string|array $value - * @param string|array|null $key - * @return array - */ - protected static function explodePluckParameters($value, $key) - { - $value = is_string($value) ? explode('.', $value) : $value; - - $key = is_null($key) || is_array($key) ? $key : explode('.', $key); - - return [$value, $key]; - } - - /** - * Run a map over each of the items in the array. - * - * @param array $array - * @param callable $callback - * @return array - */ - public static function map(array $array, callable $callback) - { - $keys = array_keys($array); - - try { - $items = array_map($callback, $array, $keys); - } catch (ArgumentCountError) { - $items = array_map($callback, $array); - } - - return array_combine($keys, $items); - } - - /** - * Run an associative map over each of the items. - * - * The callback should return an associative array with a single key/value pair. - * - * @template TKey - * @template TValue - * @template TMapWithKeysKey of array-key - * @template TMapWithKeysValue - * - * @param array $array - * @param callable(TValue, TKey): array $callback - * @return array - */ - public static function mapWithKeys(array $array, callable $callback) - { - $result = []; - - foreach ($array as $key => $value) { - $assoc = $callback($value, $key); - - foreach ($assoc as $mapKey => $mapValue) { - $result[$mapKey] = $mapValue; - } - } - - return $result; - } - - /** - * Run a map over each nested chunk of items. - * - * @template TKey - * @template TValue - * - * @param array $array - * @param callable(mixed...): TValue $callback - * @return array - */ - public static function mapSpread(array $array, callable $callback) - { - return static::map($array, function ($chunk, $key) use ($callback) { - $chunk[] = $key; - - return $callback(...$chunk); - }); - } - - /** - * Push an item onto the beginning of an array. - * - * @param array $array - * @param mixed $value - * @param mixed $key - * @return array - */ - public static function prepend($array, $value, $key = null) - { - if (func_num_args() == 2) { - array_unshift($array, $value); - } else { - $array = [$key => $value] + $array; - } - - return $array; - } - - /** - * Get a value from the array, and remove it. - * - * @param array $array - * @param string|int $key - * @param mixed $default - * @return mixed - */ - public static function pull(&$array, $key, $default = null) - { - $value = static::get($array, $key, $default); - - static::forget($array, $key); - - return $value; - } - - /** - * Convert the array into a query string. - * - * @param array $array - * @return string - */ - public static function query($array) - { - return http_build_query($array, '', '&', PHP_QUERY_RFC3986); - } - - /** - * Get one or a specified number of random values from an array. - * - * @param array $array - * @param int|null $number - * @param bool $preserveKeys - * @return mixed - * - * @throws \InvalidArgumentException - */ - public static function random($array, $number = null, $preserveKeys = false) - { - $requested = is_null($number) ? 1 : $number; - - $count = count($array); - - if ($requested > $count) { - throw new InvalidArgumentException( - "You requested {$requested} items, but there are only {$count} items available." - ); - } - - if (empty($array) || (! is_null($number) && $number <= 0)) { - return is_null($number) ? null : []; - } - - $keys = (new Randomizer)->pickArrayKeys($array, $requested); - - if (is_null($number)) { - return $array[$keys[0]]; - } - - $results = []; - - if ($preserveKeys) { - foreach ($keys as $key) { - $results[$key] = $array[$key]; - } - } else { - foreach ($keys as $key) { - $results[] = $array[$key]; - } - } - - return $results; - } - - /** - * Set an array item to a given value using "dot" notation. - * - * If no key is given to the method, the entire array will be replaced. - * - * @param array $array - * @param string|int|null $key - * @param mixed $value - * @return array - */ - public static function set(&$array, $key, $value) - { - if (is_null($key)) { - return $array = $value; - } - - $keys = explode('.', $key); - - foreach ($keys as $i => $key) { - if (count($keys) === 1) { - break; - } - - unset($keys[$i]); - - // If the key doesn't exist at this depth, we will just create an empty array - // to hold the next value, allowing us to create the arrays to hold final - // values at the correct depth. Then we'll keep digging into the array. - if (! isset($array[$key]) || ! is_array($array[$key])) { - $array[$key] = []; - } - - $array = &$array[$key]; - } - - $array[array_shift($keys)] = $value; - - return $array; - } - - /** - * Shuffle the given array and return the result. - * - * @param array $array - * @return array - */ - public static function shuffle($array) - { - return (new Randomizer)->shuffleArray($array); - } - - /** - * Sort the array using the given callback or "dot" notation. - * - * @param array $array - * @param callable|array|string|null $callback - * @return array - */ - public static function sort($array, $callback = null) - { - return (new Collection($array))->sortBy($callback)->all(); - } - - /** - * Sort the array in descending order using the given callback or "dot" notation. - * - * @param array $array - * @param callable|array|string|null $callback - * @return array - */ - public static function sortDesc($array, $callback = null) - { - return (new Collection($array))->sortByDesc($callback)->all(); - } - - /** - * Recursively sort an array by keys and values. - * - * @param array $array - * @param int $options - * @param bool $descending - * @return array - */ - public static function sortRecursive($array, $options = SORT_REGULAR, $descending = false) - { - foreach ($array as &$value) { - if (is_array($value)) { - $value = static::sortRecursive($value, $options, $descending); - } - } - - if (! array_is_list($array)) { - $descending - ? krsort($array, $options) - : ksort($array, $options); - } else { - $descending - ? rsort($array, $options) - : sort($array, $options); - } - - return $array; - } - - /** - * Recursively sort an array by keys and values in descending order. - * - * @param array $array - * @param int $options - * @return array - */ - public static function sortRecursiveDesc($array, $options = SORT_REGULAR) - { - return static::sortRecursive($array, $options, true); - } - - /** - * Conditionally compile classes from an array into a CSS class list. - * - * @param array $array - * @return string - */ - public static function toCssClasses($array) - { - $classList = static::wrap($array); - - $classes = []; - - foreach ($classList as $class => $constraint) { - if (is_numeric($class)) { - $classes[] = $constraint; - } elseif ($constraint) { - $classes[] = $class; - } - } - - return implode(' ', $classes); - } - - /** - * Conditionally compile styles from an array into a style list. - * - * @param array $array - * @return string - */ - public static function toCssStyles($array) - { - $styleList = static::wrap($array); - - $styles = []; - - foreach ($styleList as $class => $constraint) { - if (is_numeric($class)) { - $styles[] = Str::finish($constraint, ';'); - } elseif ($constraint) { - $styles[] = Str::finish($class, ';'); - } - } - - return implode(' ', $styles); - } - - /** - * Filter the array using the given callback. - * - * @param array $array - * @param callable $callback - * @return array - */ - public static function where($array, callable $callback) - { - return array_filter($array, $callback, ARRAY_FILTER_USE_BOTH); - } - - /** - * Filter the array using the negation of the given callback. - * - * @param array $array - * @param callable $callback - * @return array - */ - public static function reject($array, callable $callback) - { - return static::where($array, fn ($value, $key) => ! $callback($value, $key)); - } - - /** - * Filter items where the value is not null. - * - * @param array $array - * @return array - */ - public static function whereNotNull($array) - { - return static::where($array, fn ($value) => ! is_null($value)); - } - - /** - * If the given value is not an array and not null, wrap it in one. - * - * @param mixed $value - * @return array - */ - public static function wrap($value) - { - if (is_null($value)) { - return []; - } - - return is_array($value) ? $value : [$value]; - } -} diff --git a/vendor/illuminate/collections/Collection.php b/vendor/illuminate/collections/Collection.php deleted file mode 100644 index 01e1114..0000000 --- a/vendor/illuminate/collections/Collection.php +++ /dev/null @@ -1,1923 +0,0 @@ - - * @implements \Illuminate\Support\Enumerable - */ -class Collection implements ArrayAccess, CanBeEscapedWhenCastToString, Enumerable -{ - /** - * @use \Illuminate\Support\Traits\EnumeratesValues - */ - use EnumeratesValues, Macroable; - - /** - * The items contained in the collection. - * - * @var array - */ - protected $items = []; - - /** - * Create a new collection. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable|null $items - * @return void - */ - public function __construct($items = []) - { - $this->items = $this->getArrayableItems($items); - } - - /** - * Create a collection with the given range. - * - * @param int $from - * @param int $to - * @return static - */ - public static function range($from, $to) - { - return new static(range($from, $to)); - } - - /** - * Get all of the items in the collection. - * - * @return array - */ - public function all() - { - return $this->items; - } - - /** - * Get a lazy collection for the items in this collection. - * - * @return \Illuminate\Support\LazyCollection - */ - public function lazy() - { - return new LazyCollection($this->items); - } - - /** - * Get the median of a given key. - * - * @param string|array|null $key - * @return float|int|null - */ - public function median($key = null) - { - $values = (isset($key) ? $this->pluck($key) : $this) - ->filter(fn ($item) => ! is_null($item)) - ->sort()->values(); - - $count = $values->count(); - - if ($count === 0) { - return; - } - - $middle = (int) ($count / 2); - - if ($count % 2) { - return $values->get($middle); - } - - return (new static([ - $values->get($middle - 1), $values->get($middle), - ]))->average(); - } - - /** - * Get the mode of a given key. - * - * @param string|array|null $key - * @return array|null - */ - public function mode($key = null) - { - if ($this->count() === 0) { - return; - } - - $collection = isset($key) ? $this->pluck($key) : $this; - - $counts = new static; - - $collection->each(fn ($value) => $counts[$value] = isset($counts[$value]) ? $counts[$value] + 1 : 1); - - $sorted = $counts->sort(); - - $highestValue = $sorted->last(); - - return $sorted->filter(fn ($value) => $value == $highestValue) - ->sort()->keys()->all(); - } - - /** - * Collapse the collection of items into a single array. - * - * @return static - */ - public function collapse() - { - return new static(Arr::collapse($this->items)); - } - - /** - * Collapse the collection of items into a single array while preserving its keys. - * - * @return static - */ - public function collapseWithKeys() - { - if (! $this->items) { - return new static; - } - - $results = []; - - foreach ($this->items as $key => $values) { - if ($values instanceof Collection) { - $values = $values->all(); - } elseif (! is_array($values)) { - continue; - } - - $results[$key] = $values; - } - - return new static(array_replace(...$results)); - } - - /** - * Determine if an item exists in the collection. - * - * @param (callable(TValue, TKey): bool)|TValue|string $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function contains($key, $operator = null, $value = null) - { - if (func_num_args() === 1) { - if ($this->useAsCallable($key)) { - $placeholder = new stdClass; - - return $this->first($key, $placeholder) !== $placeholder; - } - - return in_array($key, $this->items); - } - - return $this->contains($this->operatorForWhere(...func_get_args())); - } - - /** - * Determine if an item exists, using strict comparison. - * - * @param (callable(TValue): bool)|TValue|array-key $key - * @param TValue|null $value - * @return bool - */ - public function containsStrict($key, $value = null) - { - if (func_num_args() === 2) { - return $this->contains(fn ($item) => data_get($item, $key) === $value); - } - - if ($this->useAsCallable($key)) { - return ! is_null($this->first($key)); - } - - return in_array($key, $this->items, true); - } - - /** - * Determine if an item is not contained in the collection. - * - * @param mixed $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function doesntContain($key, $operator = null, $value = null) - { - return ! $this->contains(...func_get_args()); - } - - /** - * Cross join with the given lists, returning all possible permutations. - * - * @template TCrossJoinKey - * @template TCrossJoinValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable ...$lists - * @return static> - */ - public function crossJoin(...$lists) - { - return new static(Arr::crossJoin( - $this->items, ...array_map([$this, 'getArrayableItems'], $lists) - )); - } - - /** - * Get the items in the collection that are not present in the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function diff($items) - { - return new static(array_diff($this->items, $this->getArrayableItems($items))); - } - - /** - * Get the items in the collection that are not present in the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TValue, TValue): int $callback - * @return static - */ - public function diffUsing($items, callable $callback) - { - return new static(array_udiff($this->items, $this->getArrayableItems($items), $callback)); - } - - /** - * Get the items in the collection whose keys and values are not present in the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function diffAssoc($items) - { - return new static(array_diff_assoc($this->items, $this->getArrayableItems($items))); - } - - /** - * Get the items in the collection whose keys and values are not present in the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TKey, TKey): int $callback - * @return static - */ - public function diffAssocUsing($items, callable $callback) - { - return new static(array_diff_uassoc($this->items, $this->getArrayableItems($items), $callback)); - } - - /** - * Get the items in the collection whose keys are not present in the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function diffKeys($items) - { - return new static(array_diff_key($this->items, $this->getArrayableItems($items))); - } - - /** - * Get the items in the collection whose keys are not present in the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TKey, TKey): int $callback - * @return static - */ - public function diffKeysUsing($items, callable $callback) - { - return new static(array_diff_ukey($this->items, $this->getArrayableItems($items), $callback)); - } - - /** - * Retrieve duplicate items from the collection. - * - * @template TMapValue - * - * @param (callable(TValue): TMapValue)|string|null $callback - * @param bool $strict - * @return static - */ - public function duplicates($callback = null, $strict = false) - { - $items = $this->map($this->valueRetriever($callback)); - - $uniqueItems = $items->unique(null, $strict); - - $compare = $this->duplicateComparator($strict); - - $duplicates = new static; - - foreach ($items as $key => $value) { - if ($uniqueItems->isNotEmpty() && $compare($value, $uniqueItems->first())) { - $uniqueItems->shift(); - } else { - $duplicates[$key] = $value; - } - } - - return $duplicates; - } - - /** - * Retrieve duplicate items from the collection using strict comparison. - * - * @template TMapValue - * - * @param (callable(TValue): TMapValue)|string|null $callback - * @return static - */ - public function duplicatesStrict($callback = null) - { - return $this->duplicates($callback, true); - } - - /** - * Get the comparison function to detect duplicates. - * - * @param bool $strict - * @return callable(TValue, TValue): bool - */ - protected function duplicateComparator($strict) - { - if ($strict) { - return fn ($a, $b) => $a === $b; - } - - return fn ($a, $b) => $a == $b; - } - - /** - * Get all items except for those with the specified keys. - * - * @param \Illuminate\Support\Enumerable|array|string $keys - * @return static - */ - public function except($keys) - { - if (is_null($keys)) { - return new static($this->items); - } - - if ($keys instanceof Enumerable) { - $keys = $keys->all(); - } elseif (! is_array($keys)) { - $keys = func_get_args(); - } - - return new static(Arr::except($this->items, $keys)); - } - - /** - * Run a filter over each of the items. - * - * @param (callable(TValue, TKey): bool)|null $callback - * @return static - */ - public function filter(?callable $callback = null) - { - if ($callback) { - return new static(Arr::where($this->items, $callback)); - } - - return new static(array_filter($this->items)); - } - - /** - * Get the first item from the collection passing the given truth test. - * - * @template TFirstDefault - * - * @param (callable(TValue, TKey): bool)|null $callback - * @param TFirstDefault|(\Closure(): TFirstDefault) $default - * @return TValue|TFirstDefault - */ - public function first(?callable $callback = null, $default = null) - { - return Arr::first($this->items, $callback, $default); - } - - /** - * Get a flattened array of the items in the collection. - * - * @param int $depth - * @return static - */ - public function flatten($depth = INF) - { - return new static(Arr::flatten($this->items, $depth)); - } - - /** - * Flip the items in the collection. - * - * @return static - */ - public function flip() - { - return new static(array_flip($this->items)); - } - - /** - * Remove an item from the collection by key. - * - * \Illuminate\Contracts\Support\Arrayable|iterable|TKey $keys - * - * @return $this - */ - public function forget($keys) - { - foreach ($this->getArrayableItems($keys) as $key) { - $this->offsetUnset($key); - } - - return $this; - } - - /** - * Get an item from the collection by key. - * - * @template TGetDefault - * - * @param TKey $key - * @param TGetDefault|(\Closure(): TGetDefault) $default - * @return TValue|TGetDefault - */ - public function get($key, $default = null) - { - if (array_key_exists($key, $this->items)) { - return $this->items[$key]; - } - - return value($default); - } - - /** - * Get an item from the collection by key or add it to collection if it does not exist. - * - * @template TGetOrPutValue - * - * @param mixed $key - * @param TGetOrPutValue|(\Closure(): TGetOrPutValue) $value - * @return TValue|TGetOrPutValue - */ - public function getOrPut($key, $value) - { - if (array_key_exists($key, $this->items)) { - return $this->items[$key]; - } - - $this->offsetSet($key, $value = value($value)); - - return $value; - } - - /** - * Group an associative array by a field or using a callback. - * - * @template TGroupKey of array-key - * - * @param (callable(TValue, TKey): TGroupKey)|array|string $groupBy - * @param bool $preserveKeys - * @return static<($groupBy is string ? array-key : ($groupBy is array ? array-key : TGroupKey)), static<($preserveKeys is true ? TKey : int), ($groupBy is array ? mixed : TValue)>> - */ - public function groupBy($groupBy, $preserveKeys = false) - { - if (! $this->useAsCallable($groupBy) && is_array($groupBy)) { - $nextGroups = $groupBy; - - $groupBy = array_shift($nextGroups); - } - - $groupBy = $this->valueRetriever($groupBy); - - $results = []; - - foreach ($this->items as $key => $value) { - $groupKeys = $groupBy($value, $key); - - if (! is_array($groupKeys)) { - $groupKeys = [$groupKeys]; - } - - foreach ($groupKeys as $groupKey) { - $groupKey = match (true) { - is_bool($groupKey) => (int) $groupKey, - $groupKey instanceof \BackedEnum => $groupKey->value, - $groupKey instanceof \Stringable => (string) $groupKey, - default => $groupKey, - }; - - if (! array_key_exists($groupKey, $results)) { - $results[$groupKey] = new static; - } - - $results[$groupKey]->offsetSet($preserveKeys ? $key : null, $value); - } - } - - $result = new static($results); - - if (! empty($nextGroups)) { - return $result->map->groupBy($nextGroups, $preserveKeys); - } - - return $result; - } - - /** - * Key an associative array by a field or using a callback. - * - * @template TNewKey of array-key - * - * @param (callable(TValue, TKey): TNewKey)|array|string $keyBy - * @return static<($keyBy is string ? array-key : ($keyBy is array ? array-key : TNewKey)), TValue> - */ - public function keyBy($keyBy) - { - $keyBy = $this->valueRetriever($keyBy); - - $results = []; - - foreach ($this->items as $key => $item) { - $resolvedKey = $keyBy($item, $key); - - if (is_object($resolvedKey)) { - $resolvedKey = (string) $resolvedKey; - } - - $results[$resolvedKey] = $item; - } - - return new static($results); - } - - /** - * Determine if an item exists in the collection by key. - * - * @param TKey|array $key - * @return bool - */ - public function has($key) - { - $keys = is_array($key) ? $key : func_get_args(); - - foreach ($keys as $value) { - if (! array_key_exists($value, $this->items)) { - return false; - } - } - - return true; - } - - /** - * Determine if any of the keys exist in the collection. - * - * @param TKey|array $key - * @return bool - */ - public function hasAny($key) - { - if ($this->isEmpty()) { - return false; - } - - $keys = is_array($key) ? $key : func_get_args(); - - foreach ($keys as $value) { - if (array_key_exists($value, $this->items)) { - return true; - } - } - - return false; - } - - /** - * Concatenate values of a given key as a string. - * - * @param (callable(TValue, TKey): mixed)|string|null $value - * @param string|null $glue - * @return string - */ - public function implode($value, $glue = null) - { - if ($this->useAsCallable($value)) { - return implode($glue ?? '', $this->map($value)->all()); - } - - $first = $this->first(); - - if (is_array($first) || (is_object($first) && ! $first instanceof Stringable)) { - return implode($glue ?? '', $this->pluck($value)->all()); - } - - return implode($value ?? '', $this->items); - } - - /** - * Intersect the collection with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function intersect($items) - { - return new static(array_intersect($this->items, $this->getArrayableItems($items))); - } - - /** - * Intersect the collection with the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TValue, TValue): int $callback - * @return static - */ - public function intersectUsing($items, callable $callback) - { - return new static(array_uintersect($this->items, $this->getArrayableItems($items), $callback)); - } - - /** - * Intersect the collection with the given items with additional index check. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function intersectAssoc($items) - { - return new static(array_intersect_assoc($this->items, $this->getArrayableItems($items))); - } - - /** - * Intersect the collection with the given items with additional index check, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TValue, TValue): int $callback - * @return static - */ - public function intersectAssocUsing($items, callable $callback) - { - return new static(array_intersect_uassoc($this->items, $this->getArrayableItems($items), $callback)); - } - - /** - * Intersect the collection with the given items by key. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function intersectByKeys($items) - { - return new static(array_intersect_key( - $this->items, $this->getArrayableItems($items) - )); - } - - /** - * Determine if the collection is empty or not. - * - * @phpstan-assert-if-true null $this->first() - * @phpstan-assert-if-true null $this->last() - * - * @phpstan-assert-if-false TValue $this->first() - * @phpstan-assert-if-false TValue $this->last() - * - * @return bool - */ - public function isEmpty() - { - return empty($this->items); - } - - /** - * Determine if the collection contains a single item. - * - * @return bool - */ - public function containsOneItem() - { - return $this->count() === 1; - } - - /** - * Join all items from the collection using a string. The final items can use a separate glue string. - * - * @param string $glue - * @param string $finalGlue - * @return string - */ - public function join($glue, $finalGlue = '') - { - if ($finalGlue === '') { - return $this->implode($glue); - } - - $count = $this->count(); - - if ($count === 0) { - return ''; - } - - if ($count === 1) { - return $this->last(); - } - - $collection = new static($this->items); - - $finalItem = $collection->pop(); - - return $collection->implode($glue).$finalGlue.$finalItem; - } - - /** - * Get the keys of the collection items. - * - * @return static - */ - public function keys() - { - return new static(array_keys($this->items)); - } - - /** - * Get the last item from the collection. - * - * @template TLastDefault - * - * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault|(\Closure(): TLastDefault) $default - * @return TValue|TLastDefault - */ - public function last(?callable $callback = null, $default = null) - { - return Arr::last($this->items, $callback, $default); - } - - /** - * Get the values of a given key. - * - * @param string|int|array|null $value - * @param string|null $key - * @return static - */ - public function pluck($value, $key = null) - { - return new static(Arr::pluck($this->items, $value, $key)); - } - - /** - * Run a map over each of the items. - * - * @template TMapValue - * - * @param callable(TValue, TKey): TMapValue $callback - * @return static - */ - public function map(callable $callback) - { - return new static(Arr::map($this->items, $callback)); - } - - /** - * Run a dictionary map over the items. - * - * The callback should return an associative array with a single key/value pair. - * - * @template TMapToDictionaryKey of array-key - * @template TMapToDictionaryValue - * - * @param callable(TValue, TKey): array $callback - * @return static> - */ - public function mapToDictionary(callable $callback) - { - $dictionary = []; - - foreach ($this->items as $key => $item) { - $pair = $callback($item, $key); - - $key = key($pair); - - $value = reset($pair); - - if (! isset($dictionary[$key])) { - $dictionary[$key] = []; - } - - $dictionary[$key][] = $value; - } - - return new static($dictionary); - } - - /** - * Run an associative map over each of the items. - * - * The callback should return an associative array with a single key/value pair. - * - * @template TMapWithKeysKey of array-key - * @template TMapWithKeysValue - * - * @param callable(TValue, TKey): array $callback - * @return static - */ - public function mapWithKeys(callable $callback) - { - return new static(Arr::mapWithKeys($this->items, $callback)); - } - - /** - * Merge the collection with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function merge($items) - { - return new static(array_merge($this->items, $this->getArrayableItems($items))); - } - - /** - * Recursively merge the collection with the given items. - * - * @template TMergeRecursiveValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function mergeRecursive($items) - { - return new static(array_merge_recursive($this->items, $this->getArrayableItems($items))); - } - - /** - * Multiply the items in the collection by the multiplier. - * - * @param int $multiplier - * @return static - */ - public function multiply(int $multiplier) - { - $new = new static; - - for ($i = 0; $i < $multiplier; $i++) { - $new->push(...$this->items); - } - - return $new; - } - - /** - * Create a collection by using this collection for keys and another for its values. - * - * @template TCombineValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @return static - */ - public function combine($values) - { - return new static(array_combine($this->all(), $this->getArrayableItems($values))); - } - - /** - * Union the collection with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function union($items) - { - return new static($this->items + $this->getArrayableItems($items)); - } - - /** - * Create a new collection consisting of every n-th element. - * - * @param int $step - * @param int $offset - * @return static - */ - public function nth($step, $offset = 0) - { - $new = []; - - $position = 0; - - foreach ($this->slice($offset)->items as $item) { - if ($position % $step === 0) { - $new[] = $item; - } - - $position++; - } - - return new static($new); - } - - /** - * Get the items with the specified keys. - * - * @param \Illuminate\Support\Enumerable|array|string|null $keys - * @return static - */ - public function only($keys) - { - if (is_null($keys)) { - return new static($this->items); - } - - if ($keys instanceof Enumerable) { - $keys = $keys->all(); - } - - $keys = is_array($keys) ? $keys : func_get_args(); - - return new static(Arr::only($this->items, $keys)); - } - - /** - * Select specific values from the items within the collection. - * - * @param \Illuminate\Support\Enumerable|array|string|null $keys - * @return static - */ - public function select($keys) - { - if (is_null($keys)) { - return new static($this->items); - } - - if ($keys instanceof Enumerable) { - $keys = $keys->all(); - } - - $keys = is_array($keys) ? $keys : func_get_args(); - - return new static(Arr::select($this->items, $keys)); - } - - /** - * Get and remove the last N items from the collection. - * - * @param int $count - * @return static|TValue|null - */ - public function pop($count = 1) - { - if ($count < 1) { - return new static; - } - - if ($count === 1) { - return array_pop($this->items); - } - - if ($this->isEmpty()) { - return new static; - } - - $results = []; - - $collectionCount = $this->count(); - - foreach (range(1, min($count, $collectionCount)) as $item) { - $results[] = array_pop($this->items); - } - - return new static($results); - } - - /** - * Push an item onto the beginning of the collection. - * - * @param TValue $value - * @param TKey $key - * @return $this - */ - public function prepend($value, $key = null) - { - $this->items = Arr::prepend($this->items, ...func_get_args()); - - return $this; - } - - /** - * Push one or more items onto the end of the collection. - * - * @param TValue ...$values - * @return $this - */ - public function push(...$values) - { - foreach ($values as $value) { - $this->items[] = $value; - } - - return $this; - } - - /** - * Prepend one or more items to the beginning of the collection. - * - * @param TValue ...$values - * @return $this - */ - public function unshift(...$values) - { - array_unshift($this->items, ...$values); - - return $this; - } - - /** - * Push all of the given items onto the collection. - * - * @template TConcatKey of array-key - * @template TConcatValue - * - * @param iterable $source - * @return static - */ - public function concat($source) - { - $result = new static($this); - - foreach ($source as $item) { - $result->push($item); - } - - return $result; - } - - /** - * Get and remove an item from the collection. - * - * @template TPullDefault - * - * @param TKey $key - * @param TPullDefault|(\Closure(): TPullDefault) $default - * @return TValue|TPullDefault - */ - public function pull($key, $default = null) - { - return Arr::pull($this->items, $key, $default); - } - - /** - * Put an item in the collection by key. - * - * @param TKey $key - * @param TValue $value - * @return $this - */ - public function put($key, $value) - { - $this->offsetSet($key, $value); - - return $this; - } - - /** - * Get one or a specified number of items randomly from the collection. - * - * @param (callable(self): int)|int|null $number - * @param bool $preserveKeys - * @return static|TValue - * - * @throws \InvalidArgumentException - */ - public function random($number = null, $preserveKeys = false) - { - if (is_null($number)) { - return Arr::random($this->items); - } - - if (is_callable($number)) { - return new static(Arr::random($this->items, $number($this), $preserveKeys)); - } - - return new static(Arr::random($this->items, $number, $preserveKeys)); - } - - /** - * Replace the collection items with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function replace($items) - { - return new static(array_replace($this->items, $this->getArrayableItems($items))); - } - - /** - * Recursively replace the collection items with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function replaceRecursive($items) - { - return new static(array_replace_recursive($this->items, $this->getArrayableItems($items))); - } - - /** - * Reverse items order. - * - * @return static - */ - public function reverse() - { - return new static(array_reverse($this->items, true)); - } - - /** - * Search the collection for a given value and return the corresponding key if successful. - * - * @param TValue|(callable(TValue,TKey): bool) $value - * @param bool $strict - * @return TKey|false - */ - public function search($value, $strict = false) - { - if (! $this->useAsCallable($value)) { - return array_search($value, $this->items, $strict); - } - - foreach ($this->items as $key => $item) { - if ($value($item, $key)) { - return $key; - } - } - - return false; - } - - /** - * Get the item before the given item. - * - * @param TValue|(callable(TValue,TKey): bool) $value - * @param bool $strict - * @return TValue|null - */ - public function before($value, $strict = false) - { - $key = $this->search($value, $strict); - - if ($key === false) { - return null; - } - - $position = ($keys = $this->keys())->search($key); - - if ($position === 0) { - return null; - } - - return $this->get($keys->get($position - 1)); - } - - /** - * Get the item after the given item. - * - * @param TValue|(callable(TValue,TKey): bool) $value - * @param bool $strict - * @return TValue|null - */ - public function after($value, $strict = false) - { - $key = $this->search($value, $strict); - - if ($key === false) { - return null; - } - - $position = ($keys = $this->keys())->search($key); - - if ($position === $keys->count() - 1) { - return null; - } - - return $this->get($keys->get($position + 1)); - } - - /** - * Get and remove the first N items from the collection. - * - * @param int $count - * @return static|TValue|null - * - * @throws \InvalidArgumentException - */ - public function shift($count = 1) - { - if ($count < 0) { - throw new InvalidArgumentException('Number of shifted items may not be less than zero.'); - } - - if ($this->isEmpty()) { - return null; - } - - if ($count === 0) { - return new static; - } - - if ($count === 1) { - return array_shift($this->items); - } - - $results = []; - - $collectionCount = $this->count(); - - foreach (range(1, min($count, $collectionCount)) as $item) { - $results[] = array_shift($this->items); - } - - return new static($results); - } - - /** - * Shuffle the items in the collection. - * - * @return static - */ - public function shuffle() - { - return new static(Arr::shuffle($this->items)); - } - - /** - * Create chunks representing a "sliding window" view of the items in the collection. - * - * @param int $size - * @param int $step - * @return static - */ - public function sliding($size = 2, $step = 1) - { - $chunks = floor(($this->count() - $size) / $step) + 1; - - return static::times($chunks, fn ($number) => $this->slice(($number - 1) * $step, $size)); - } - - /** - * Skip the first {$count} items. - * - * @param int $count - * @return static - */ - public function skip($count) - { - return $this->slice($count); - } - - /** - * Skip items in the collection until the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function skipUntil($value) - { - return new static($this->lazy()->skipUntil($value)->all()); - } - - /** - * Skip items in the collection while the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function skipWhile($value) - { - return new static($this->lazy()->skipWhile($value)->all()); - } - - /** - * Slice the underlying collection array. - * - * @param int $offset - * @param int|null $length - * @return static - */ - public function slice($offset, $length = null) - { - return new static(array_slice($this->items, $offset, $length, true)); - } - - /** - * Split a collection into a certain number of groups. - * - * @param int $numberOfGroups - * @return static - */ - public function split($numberOfGroups) - { - if ($this->isEmpty()) { - return new static; - } - - $groups = new static; - - $groupSize = floor($this->count() / $numberOfGroups); - - $remain = $this->count() % $numberOfGroups; - - $start = 0; - - for ($i = 0; $i < $numberOfGroups; $i++) { - $size = $groupSize; - - if ($i < $remain) { - $size++; - } - - if ($size) { - $groups->push(new static(array_slice($this->items, $start, $size))); - - $start += $size; - } - } - - return $groups; - } - - /** - * Split a collection into a certain number of groups, and fill the first groups completely. - * - * @param int $numberOfGroups - * @return static - */ - public function splitIn($numberOfGroups) - { - return $this->chunk((int) ceil($this->count() / $numberOfGroups)); - } - - /** - * Get the first item in the collection, but only if exactly one item exists. Otherwise, throw an exception. - * - * @param (callable(TValue, TKey): bool)|string $key - * @param mixed $operator - * @param mixed $value - * @return TValue - * - * @throws \Illuminate\Support\ItemNotFoundException - * @throws \Illuminate\Support\MultipleItemsFoundException - */ - public function sole($key = null, $operator = null, $value = null) - { - $filter = func_num_args() > 1 - ? $this->operatorForWhere(...func_get_args()) - : $key; - - $items = $this->unless($filter == null)->filter($filter); - - $count = $items->count(); - - if ($count === 0) { - throw new ItemNotFoundException; - } - - if ($count > 1) { - throw new MultipleItemsFoundException($count); - } - - return $items->first(); - } - - /** - * Get the first item in the collection but throw an exception if no matching items exist. - * - * @param (callable(TValue, TKey): bool)|string $key - * @param mixed $operator - * @param mixed $value - * @return TValue - * - * @throws \Illuminate\Support\ItemNotFoundException - */ - public function firstOrFail($key = null, $operator = null, $value = null) - { - $filter = func_num_args() > 1 - ? $this->operatorForWhere(...func_get_args()) - : $key; - - $placeholder = new stdClass(); - - $item = $this->first($filter, $placeholder); - - if ($item === $placeholder) { - throw new ItemNotFoundException; - } - - return $item; - } - - /** - * Chunk the collection into chunks of the given size. - * - * @param int $size - * @return static - */ - public function chunk($size) - { - if ($size <= 0) { - return new static; - } - - $chunks = []; - - foreach (array_chunk($this->items, $size, true) as $chunk) { - $chunks[] = new static($chunk); - } - - return new static($chunks); - } - - /** - * Chunk the collection into chunks with a callback. - * - * @param callable(TValue, TKey, static): bool $callback - * @return static> - */ - public function chunkWhile(callable $callback) - { - return new static( - $this->lazy()->chunkWhile($callback)->mapInto(static::class) - ); - } - - /** - * Sort through each item with a callback. - * - * @param (callable(TValue, TValue): int)|null|int $callback - * @return static - */ - public function sort($callback = null) - { - $items = $this->items; - - $callback && is_callable($callback) - ? uasort($items, $callback) - : asort($items, $callback ?? SORT_REGULAR); - - return new static($items); - } - - /** - * Sort items in descending order. - * - * @param int $options - * @return static - */ - public function sortDesc($options = SORT_REGULAR) - { - $items = $this->items; - - arsort($items, $options); - - return new static($items); - } - - /** - * Sort the collection using the given callback. - * - * @param array|(callable(TValue, TKey): mixed)|string $callback - * @param int $options - * @param bool $descending - * @return static - */ - public function sortBy($callback, $options = SORT_REGULAR, $descending = false) - { - if (is_array($callback) && ! is_callable($callback)) { - return $this->sortByMany($callback, $options); - } - - $results = []; - - $callback = $this->valueRetriever($callback); - - // First we will loop through the items and get the comparator from a callback - // function which we were given. Then, we will sort the returned values and - // grab all the corresponding values for the sorted keys from this array. - foreach ($this->items as $key => $value) { - $results[$key] = $callback($value, $key); - } - - $descending ? arsort($results, $options) - : asort($results, $options); - - // Once we have sorted all of the keys in the array, we will loop through them - // and grab the corresponding model so we can set the underlying items list - // to the sorted version. Then we'll just return the collection instance. - foreach (array_keys($results) as $key) { - $results[$key] = $this->items[$key]; - } - - return new static($results); - } - - /** - * Sort the collection using multiple comparisons. - * - * @param array $comparisons - * @param int $options - * @return static - */ - protected function sortByMany(array $comparisons = [], int $options = SORT_REGULAR) - { - $items = $this->items; - - uasort($items, function ($a, $b) use ($comparisons, $options) { - foreach ($comparisons as $comparison) { - $comparison = Arr::wrap($comparison); - - $prop = $comparison[0]; - - $ascending = Arr::get($comparison, 1, true) === true || - Arr::get($comparison, 1, true) === 'asc'; - - if (! is_string($prop) && is_callable($prop)) { - $result = $prop($a, $b); - } else { - $values = [data_get($a, $prop), data_get($b, $prop)]; - - if (! $ascending) { - $values = array_reverse($values); - } - - if (($options & SORT_FLAG_CASE) === SORT_FLAG_CASE) { - if (($options & SORT_NATURAL) === SORT_NATURAL) { - $result = strnatcasecmp($values[0], $values[1]); - } else { - $result = strcasecmp($values[0], $values[1]); - } - } else { - $result = match ($options) { - SORT_NUMERIC => intval($values[0]) <=> intval($values[1]), - SORT_STRING => strcmp($values[0], $values[1]), - SORT_NATURAL => strnatcmp((string) $values[0], (string) $values[1]), - SORT_LOCALE_STRING => strcoll($values[0], $values[1]), - default => $values[0] <=> $values[1], - }; - } - } - - if ($result === 0) { - continue; - } - - return $result; - } - }); - - return new static($items); - } - - /** - * Sort the collection in descending order using the given callback. - * - * @param array|(callable(TValue, TKey): mixed)|string $callback - * @param int $options - * @return static - */ - public function sortByDesc($callback, $options = SORT_REGULAR) - { - if (is_array($callback) && ! is_callable($callback)) { - foreach ($callback as $index => $key) { - $comparison = Arr::wrap($key); - - $comparison[1] = 'desc'; - - $callback[$index] = $comparison; - } - } - - return $this->sortBy($callback, $options, true); - } - - /** - * Sort the collection keys. - * - * @param int $options - * @param bool $descending - * @return static - */ - public function sortKeys($options = SORT_REGULAR, $descending = false) - { - $items = $this->items; - - $descending ? krsort($items, $options) : ksort($items, $options); - - return new static($items); - } - - /** - * Sort the collection keys in descending order. - * - * @param int $options - * @return static - */ - public function sortKeysDesc($options = SORT_REGULAR) - { - return $this->sortKeys($options, true); - } - - /** - * Sort the collection keys using a callback. - * - * @param callable(TKey, TKey): int $callback - * @return static - */ - public function sortKeysUsing(callable $callback) - { - $items = $this->items; - - uksort($items, $callback); - - return new static($items); - } - - /** - * Splice a portion of the underlying collection array. - * - * @param int $offset - * @param int|null $length - * @param array $replacement - * @return static - */ - public function splice($offset, $length = null, $replacement = []) - { - if (func_num_args() === 1) { - return new static(array_splice($this->items, $offset)); - } - - return new static(array_splice($this->items, $offset, $length, $this->getArrayableItems($replacement))); - } - - /** - * Take the first or last {$limit} items. - * - * @param int $limit - * @return static - */ - public function take($limit) - { - if ($limit < 0) { - return $this->slice($limit, abs($limit)); - } - - return $this->slice(0, $limit); - } - - /** - * Take items in the collection until the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function takeUntil($value) - { - return new static($this->lazy()->takeUntil($value)->all()); - } - - /** - * Take items in the collection while the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function takeWhile($value) - { - return new static($this->lazy()->takeWhile($value)->all()); - } - - /** - * Transform each item in the collection using a callback. - * - * @param callable(TValue, TKey): TValue $callback - * @return $this - */ - public function transform(callable $callback) - { - $this->items = $this->map($callback)->all(); - - return $this; - } - - /** - * Flatten a multi-dimensional associative array with dots. - * - * @return static - */ - public function dot() - { - return new static(Arr::dot($this->all())); - } - - /** - * Convert a flatten "dot" notation array into an expanded array. - * - * @return static - */ - public function undot() - { - return new static(Arr::undot($this->all())); - } - - /** - * Return only unique items from the collection array. - * - * @param (callable(TValue, TKey): mixed)|string|null $key - * @param bool $strict - * @return static - */ - public function unique($key = null, $strict = false) - { - if (is_null($key) && $strict === false) { - return new static(array_unique($this->items, SORT_REGULAR)); - } - - $callback = $this->valueRetriever($key); - - $exists = []; - - return $this->reject(function ($item, $key) use ($callback, $strict, &$exists) { - if (in_array($id = $callback($item, $key), $exists, $strict)) { - return true; - } - - $exists[] = $id; - }); - } - - /** - * Reset the keys on the underlying array. - * - * @return static - */ - public function values() - { - return new static(array_values($this->items)); - } - - /** - * Zip the collection together with one or more arrays. - * - * e.g. new Collection([1, 2, 3])->zip([4, 5, 6]); - * => [[1, 4], [2, 5], [3, 6]] - * - * @template TZipValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable ...$items - * @return static> - */ - public function zip($items) - { - $arrayableItems = array_map(fn ($items) => $this->getArrayableItems($items), func_get_args()); - - $params = array_merge([fn () => new static(func_get_args()), $this->items], $arrayableItems); - - return new static(array_map(...$params)); - } - - /** - * Pad collection to the specified length with a value. - * - * @template TPadValue - * - * @param int $size - * @param TPadValue $value - * @return static - */ - public function pad($size, $value) - { - return new static(array_pad($this->items, $size, $value)); - } - - /** - * Get an iterator for the items. - * - * @return \ArrayIterator - */ - public function getIterator(): Traversable - { - return new ArrayIterator($this->items); - } - - /** - * Count the number of items in the collection. - * - * @return int - */ - public function count(): int - { - return count($this->items); - } - - /** - * Count the number of items in the collection by a field or using a callback. - * - * @param (callable(TValue, TKey): array-key)|string|null $countBy - * @return static - */ - public function countBy($countBy = null) - { - return new static($this->lazy()->countBy($countBy)->all()); - } - - /** - * Add an item to the collection. - * - * @param TValue $item - * @return $this - */ - public function add($item) - { - $this->items[] = $item; - - return $this; - } - - /** - * Get a base Support collection instance from this collection. - * - * @return \Illuminate\Support\Collection - */ - public function toBase() - { - return new self($this); - } - - /** - * Determine if an item exists at an offset. - * - * @param TKey $key - * @return bool - */ - public function offsetExists($key): bool - { - return isset($this->items[$key]); - } - - /** - * Get an item at a given offset. - * - * @param TKey $key - * @return TValue - */ - public function offsetGet($key): mixed - { - return $this->items[$key]; - } - - /** - * Set the item at a given offset. - * - * @param TKey|null $key - * @param TValue $value - * @return void - */ - public function offsetSet($key, $value): void - { - if (is_null($key)) { - $this->items[] = $value; - } else { - $this->items[$key] = $value; - } - } - - /** - * Unset the item at a given offset. - * - * @param TKey $key - * @return void - */ - public function offsetUnset($key): void - { - unset($this->items[$key]); - } -} diff --git a/vendor/illuminate/collections/Enumerable.php b/vendor/illuminate/collections/Enumerable.php deleted file mode 100644 index 2d1214a..0000000 --- a/vendor/illuminate/collections/Enumerable.php +++ /dev/null @@ -1,1311 +0,0 @@ - - * @extends \IteratorAggregate - */ -interface Enumerable extends Arrayable, Countable, IteratorAggregate, Jsonable, JsonSerializable -{ - /** - * Create a new collection instance if the value isn't one already. - * - * @template TMakeKey of array-key - * @template TMakeValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable|null $items - * @return static - */ - public static function make($items = []); - - /** - * Create a new instance by invoking the callback a given amount of times. - * - * @param int $number - * @param callable|null $callback - * @return static - */ - public static function times($number, ?callable $callback = null); - - /** - * Create a collection with the given range. - * - * @param int $from - * @param int $to - * @return static - */ - public static function range($from, $to); - - /** - * Wrap the given value in a collection if applicable. - * - * @template TWrapValue - * - * @param iterable|TWrapValue $value - * @return static - */ - public static function wrap($value); - - /** - * Get the underlying items from the given collection if applicable. - * - * @template TUnwrapKey of array-key - * @template TUnwrapValue - * - * @param array|static $value - * @return array - */ - public static function unwrap($value); - - /** - * Create a new instance with no items. - * - * @return static - */ - public static function empty(); - - /** - * Get all items in the enumerable. - * - * @return array - */ - public function all(); - - /** - * Alias for the "avg" method. - * - * @param (callable(TValue): float|int)|string|null $callback - * @return float|int|null - */ - public function average($callback = null); - - /** - * Get the median of a given key. - * - * @param string|array|null $key - * @return float|int|null - */ - public function median($key = null); - - /** - * Get the mode of a given key. - * - * @param string|array|null $key - * @return array|null - */ - public function mode($key = null); - - /** - * Collapse the items into a single enumerable. - * - * @return static - */ - public function collapse(); - - /** - * Alias for the "contains" method. - * - * @param (callable(TValue, TKey): bool)|TValue|string $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function some($key, $operator = null, $value = null); - - /** - * Determine if an item exists, using strict comparison. - * - * @param (callable(TValue): bool)|TValue|array-key $key - * @param TValue|null $value - * @return bool - */ - public function containsStrict($key, $value = null); - - /** - * Get the average value of a given key. - * - * @param (callable(TValue): float|int)|string|null $callback - * @return float|int|null - */ - public function avg($callback = null); - - /** - * Determine if an item exists in the enumerable. - * - * @param (callable(TValue, TKey): bool)|TValue|string $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function contains($key, $operator = null, $value = null); - - /** - * Determine if an item is not contained in the collection. - * - * @param mixed $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function doesntContain($key, $operator = null, $value = null); - - /** - * Cross join with the given lists, returning all possible permutations. - * - * @template TCrossJoinKey - * @template TCrossJoinValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable ...$lists - * @return static> - */ - public function crossJoin(...$lists); - - /** - * Dump the collection and end the script. - * - * @param mixed ...$args - * @return never - */ - public function dd(...$args); - - /** - * Dump the collection. - * - * @param mixed ...$args - * @return $this - */ - public function dump(...$args); - - /** - * Get the items that are not present in the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function diff($items); - - /** - * Get the items that are not present in the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TValue, TValue): int $callback - * @return static - */ - public function diffUsing($items, callable $callback); - - /** - * Get the items whose keys and values are not present in the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function diffAssoc($items); - - /** - * Get the items whose keys and values are not present in the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TKey, TKey): int $callback - * @return static - */ - public function diffAssocUsing($items, callable $callback); - - /** - * Get the items whose keys are not present in the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function diffKeys($items); - - /** - * Get the items whose keys are not present in the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TKey, TKey): int $callback - * @return static - */ - public function diffKeysUsing($items, callable $callback); - - /** - * Retrieve duplicate items. - * - * @param (callable(TValue): bool)|string|null $callback - * @param bool $strict - * @return static - */ - public function duplicates($callback = null, $strict = false); - - /** - * Retrieve duplicate items using strict comparison. - * - * @param (callable(TValue): bool)|string|null $callback - * @return static - */ - public function duplicatesStrict($callback = null); - - /** - * Execute a callback over each item. - * - * @param callable(TValue, TKey): mixed $callback - * @return $this - */ - public function each(callable $callback); - - /** - * Execute a callback over each nested chunk of items. - * - * @param callable $callback - * @return static - */ - public function eachSpread(callable $callback); - - /** - * Determine if all items pass the given truth test. - * - * @param (callable(TValue, TKey): bool)|TValue|string $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function every($key, $operator = null, $value = null); - - /** - * Get all items except for those with the specified keys. - * - * @param \Illuminate\Support\Enumerable|array $keys - * @return static - */ - public function except($keys); - - /** - * Run a filter over each of the items. - * - * @param (callable(TValue): bool)|null $callback - * @return static - */ - public function filter(?callable $callback = null); - - /** - * Apply the callback if the given "value" is (or resolves to) truthy. - * - * @template TWhenReturnType as null - * - * @param bool $value - * @param (callable($this): TWhenReturnType)|null $callback - * @param (callable($this): TWhenReturnType)|null $default - * @return $this|TWhenReturnType - */ - public function when($value, ?callable $callback = null, ?callable $default = null); - - /** - * Apply the callback if the collection is empty. - * - * @template TWhenEmptyReturnType - * - * @param (callable($this): TWhenEmptyReturnType) $callback - * @param (callable($this): TWhenEmptyReturnType)|null $default - * @return $this|TWhenEmptyReturnType - */ - public function whenEmpty(callable $callback, ?callable $default = null); - - /** - * Apply the callback if the collection is not empty. - * - * @template TWhenNotEmptyReturnType - * - * @param callable($this): TWhenNotEmptyReturnType $callback - * @param (callable($this): TWhenNotEmptyReturnType)|null $default - * @return $this|TWhenNotEmptyReturnType - */ - public function whenNotEmpty(callable $callback, ?callable $default = null); - - /** - * Apply the callback if the given "value" is (or resolves to) falsy. - * - * @template TUnlessReturnType - * - * @param bool $value - * @param (callable($this): TUnlessReturnType) $callback - * @param (callable($this): TUnlessReturnType)|null $default - * @return $this|TUnlessReturnType - */ - public function unless($value, callable $callback, ?callable $default = null); - - /** - * Apply the callback unless the collection is empty. - * - * @template TUnlessEmptyReturnType - * - * @param callable($this): TUnlessEmptyReturnType $callback - * @param (callable($this): TUnlessEmptyReturnType)|null $default - * @return $this|TUnlessEmptyReturnType - */ - public function unlessEmpty(callable $callback, ?callable $default = null); - - /** - * Apply the callback unless the collection is not empty. - * - * @template TUnlessNotEmptyReturnType - * - * @param callable($this): TUnlessNotEmptyReturnType $callback - * @param (callable($this): TUnlessNotEmptyReturnType)|null $default - * @return $this|TUnlessNotEmptyReturnType - */ - public function unlessNotEmpty(callable $callback, ?callable $default = null); - - /** - * Filter items by the given key value pair. - * - * @param string $key - * @param mixed $operator - * @param mixed $value - * @return static - */ - public function where($key, $operator = null, $value = null); - - /** - * Filter items where the value for the given key is null. - * - * @param string|null $key - * @return static - */ - public function whereNull($key = null); - - /** - * Filter items where the value for the given key is not null. - * - * @param string|null $key - * @return static - */ - public function whereNotNull($key = null); - - /** - * Filter items by the given key value pair using strict comparison. - * - * @param string $key - * @param mixed $value - * @return static - */ - public function whereStrict($key, $value); - - /** - * Filter items by the given key value pair. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @param bool $strict - * @return static - */ - public function whereIn($key, $values, $strict = false); - - /** - * Filter items by the given key value pair using strict comparison. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @return static - */ - public function whereInStrict($key, $values); - - /** - * Filter items such that the value of the given key is between the given values. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @return static - */ - public function whereBetween($key, $values); - - /** - * Filter items such that the value of the given key is not between the given values. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @return static - */ - public function whereNotBetween($key, $values); - - /** - * Filter items by the given key value pair. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @param bool $strict - * @return static - */ - public function whereNotIn($key, $values, $strict = false); - - /** - * Filter items by the given key value pair using strict comparison. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @return static - */ - public function whereNotInStrict($key, $values); - - /** - * Filter the items, removing any items that don't match the given type(s). - * - * @template TWhereInstanceOf - * - * @param class-string|array> $type - * @return static - */ - public function whereInstanceOf($type); - - /** - * Get the first item from the enumerable passing the given truth test. - * - * @template TFirstDefault - * - * @param (callable(TValue,TKey): bool)|null $callback - * @param TFirstDefault|(\Closure(): TFirstDefault) $default - * @return TValue|TFirstDefault - */ - public function first(?callable $callback = null, $default = null); - - /** - * Get the first item by the given key value pair. - * - * @param string $key - * @param mixed $operator - * @param mixed $value - * @return TValue|null - */ - public function firstWhere($key, $operator = null, $value = null); - - /** - * Get a flattened array of the items in the collection. - * - * @param int $depth - * @return static - */ - public function flatten($depth = INF); - - /** - * Flip the values with their keys. - * - * @return static - */ - public function flip(); - - /** - * Get an item from the collection by key. - * - * @template TGetDefault - * - * @param TKey $key - * @param TGetDefault|(\Closure(): TGetDefault) $default - * @return TValue|TGetDefault - */ - public function get($key, $default = null); - - /** - * Group an associative array by a field or using a callback. - * - * @template TGroupKey of array-key - * - * @param (callable(TValue, TKey): TGroupKey)|array|string $groupBy - * @param bool $preserveKeys - * @return static<($groupBy is string ? array-key : ($groupBy is array ? array-key : TGroupKey)), static<($preserveKeys is true ? TKey : int), ($groupBy is array ? mixed : TValue)>> - */ - public function groupBy($groupBy, $preserveKeys = false); - - /** - * Key an associative array by a field or using a callback. - * - * @template TNewKey of array-key - * - * @param (callable(TValue, TKey): TNewKey)|array|string $keyBy - * @return static<($keyBy is string ? array-key : ($keyBy is array ? array-key : TNewKey)), TValue> - */ - public function keyBy($keyBy); - - /** - * Determine if an item exists in the collection by key. - * - * @param TKey|array $key - * @return bool - */ - public function has($key); - - /** - * Determine if any of the keys exist in the collection. - * - * @param mixed $key - * @return bool - */ - public function hasAny($key); - - /** - * Concatenate values of a given key as a string. - * - * @param (callable(TValue, TKey): mixed)|string $value - * @param string|null $glue - * @return string - */ - public function implode($value, $glue = null); - - /** - * Intersect the collection with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function intersect($items); - - /** - * Intersect the collection with the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TValue, TValue): int $callback - * @return static - */ - public function intersectUsing($items, callable $callback); - - /** - * Intersect the collection with the given items with additional index check. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function intersectAssoc($items); - - /** - * Intersect the collection with the given items with additional index check, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TValue, TValue): int $callback - * @return static - */ - public function intersectAssocUsing($items, callable $callback); - - /** - * Intersect the collection with the given items by key. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function intersectByKeys($items); - - /** - * Determine if the collection is empty or not. - * - * @return bool - */ - public function isEmpty(); - - /** - * Determine if the collection is not empty. - * - * @return bool - */ - public function isNotEmpty(); - - /** - * Determine if the collection contains a single item. - * - * @return bool - */ - public function containsOneItem(); - - /** - * Join all items from the collection using a string. The final items can use a separate glue string. - * - * @param string $glue - * @param string $finalGlue - * @return string - */ - public function join($glue, $finalGlue = ''); - - /** - * Get the keys of the collection items. - * - * @return static - */ - public function keys(); - - /** - * Get the last item from the collection. - * - * @template TLastDefault - * - * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault|(\Closure(): TLastDefault) $default - * @return TValue|TLastDefault - */ - public function last(?callable $callback = null, $default = null); - - /** - * Run a map over each of the items. - * - * @template TMapValue - * - * @param callable(TValue, TKey): TMapValue $callback - * @return static - */ - public function map(callable $callback); - - /** - * Run a map over each nested chunk of items. - * - * @param callable $callback - * @return static - */ - public function mapSpread(callable $callback); - - /** - * Run a dictionary map over the items. - * - * The callback should return an associative array with a single key/value pair. - * - * @template TMapToDictionaryKey of array-key - * @template TMapToDictionaryValue - * - * @param callable(TValue, TKey): array $callback - * @return static> - */ - public function mapToDictionary(callable $callback); - - /** - * Run a grouping map over the items. - * - * The callback should return an associative array with a single key/value pair. - * - * @template TMapToGroupsKey of array-key - * @template TMapToGroupsValue - * - * @param callable(TValue, TKey): array $callback - * @return static> - */ - public function mapToGroups(callable $callback); - - /** - * Run an associative map over each of the items. - * - * The callback should return an associative array with a single key/value pair. - * - * @template TMapWithKeysKey of array-key - * @template TMapWithKeysValue - * - * @param callable(TValue, TKey): array $callback - * @return static - */ - public function mapWithKeys(callable $callback); - - /** - * Map a collection and flatten the result by a single level. - * - * @template TFlatMapKey of array-key - * @template TFlatMapValue - * - * @param callable(TValue, TKey): (\Illuminate\Support\Collection|array) $callback - * @return static - */ - public function flatMap(callable $callback); - - /** - * Map the values into a new class. - * - * @template TMapIntoValue - * - * @param class-string $class - * @return static - */ - public function mapInto($class); - - /** - * Merge the collection with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function merge($items); - - /** - * Recursively merge the collection with the given items. - * - * @template TMergeRecursiveValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function mergeRecursive($items); - - /** - * Create a collection by using this collection for keys and another for its values. - * - * @template TCombineValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @return static - */ - public function combine($values); - - /** - * Union the collection with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function union($items); - - /** - * Get the min value of a given key. - * - * @param (callable(TValue):mixed)|string|null $callback - * @return mixed - */ - public function min($callback = null); - - /** - * Get the max value of a given key. - * - * @param (callable(TValue):mixed)|string|null $callback - * @return mixed - */ - public function max($callback = null); - - /** - * Create a new collection consisting of every n-th element. - * - * @param int $step - * @param int $offset - * @return static - */ - public function nth($step, $offset = 0); - - /** - * Get the items with the specified keys. - * - * @param \Illuminate\Support\Enumerable|array|string $keys - * @return static - */ - public function only($keys); - - /** - * "Paginate" the collection by slicing it into a smaller collection. - * - * @param int $page - * @param int $perPage - * @return static - */ - public function forPage($page, $perPage); - - /** - * Partition the collection into two arrays using the given callback or key. - * - * @param (callable(TValue, TKey): bool)|TValue|string $key - * @param mixed $operator - * @param mixed $value - * @return static, static> - */ - public function partition($key, $operator = null, $value = null); - - /** - * Push all of the given items onto the collection. - * - * @template TConcatKey of array-key - * @template TConcatValue - * - * @param iterable $source - * @return static - */ - public function concat($source); - - /** - * Get one or a specified number of items randomly from the collection. - * - * @param int|null $number - * @return static|TValue - * - * @throws \InvalidArgumentException - */ - public function random($number = null); - - /** - * Reduce the collection to a single value. - * - * @template TReduceInitial - * @template TReduceReturnType - * - * @param callable(TReduceInitial|TReduceReturnType, TValue, TKey): TReduceReturnType $callback - * @param TReduceInitial $initial - * @return TReduceInitial|TReduceReturnType - */ - public function reduce(callable $callback, $initial = null); - - /** - * Reduce the collection to multiple aggregate values. - * - * @param callable $callback - * @param mixed ...$initial - * @return array - * - * @throws \UnexpectedValueException - */ - public function reduceSpread(callable $callback, ...$initial); - - /** - * Replace the collection items with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function replace($items); - - /** - * Recursively replace the collection items with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function replaceRecursive($items); - - /** - * Reverse items order. - * - * @return static - */ - public function reverse(); - - /** - * Search the collection for a given value and return the corresponding key if successful. - * - * @param TValue|callable(TValue,TKey): bool $value - * @param bool $strict - * @return TKey|bool - */ - public function search($value, $strict = false); - - /** - * Get the item before the given item. - * - * @param TValue|(callable(TValue,TKey): bool) $value - * @param bool $strict - * @return TValue|null - */ - public function before($value, $strict = false); - - /** - * Get the item after the given item. - * - * @param TValue|(callable(TValue,TKey): bool) $value - * @param bool $strict - * @return TValue|null - */ - public function after($value, $strict = false); - - /** - * Shuffle the items in the collection. - * - * @return static - */ - public function shuffle(); - - /** - * Create chunks representing a "sliding window" view of the items in the collection. - * - * @param int $size - * @param int $step - * @return static - */ - public function sliding($size = 2, $step = 1); - - /** - * Skip the first {$count} items. - * - * @param int $count - * @return static - */ - public function skip($count); - - /** - * Skip items in the collection until the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function skipUntil($value); - - /** - * Skip items in the collection while the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function skipWhile($value); - - /** - * Get a slice of items from the enumerable. - * - * @param int $offset - * @param int|null $length - * @return static - */ - public function slice($offset, $length = null); - - /** - * Split a collection into a certain number of groups. - * - * @param int $numberOfGroups - * @return static - */ - public function split($numberOfGroups); - - /** - * Get the first item in the collection, but only if exactly one item exists. Otherwise, throw an exception. - * - * @param (callable(TValue, TKey): bool)|string $key - * @param mixed $operator - * @param mixed $value - * @return TValue - * - * @throws \Illuminate\Support\ItemNotFoundException - * @throws \Illuminate\Support\MultipleItemsFoundException - */ - public function sole($key = null, $operator = null, $value = null); - - /** - * Get the first item in the collection but throw an exception if no matching items exist. - * - * @param (callable(TValue, TKey): bool)|string $key - * @param mixed $operator - * @param mixed $value - * @return TValue - * - * @throws \Illuminate\Support\ItemNotFoundException - */ - public function firstOrFail($key = null, $operator = null, $value = null); - - /** - * Chunk the collection into chunks of the given size. - * - * @param int $size - * @return static - */ - public function chunk($size); - - /** - * Chunk the collection into chunks with a callback. - * - * @param callable(TValue, TKey, static): bool $callback - * @return static> - */ - public function chunkWhile(callable $callback); - - /** - * Split a collection into a certain number of groups, and fill the first groups completely. - * - * @param int $numberOfGroups - * @return static - */ - public function splitIn($numberOfGroups); - - /** - * Sort through each item with a callback. - * - * @param (callable(TValue, TValue): int)|null|int $callback - * @return static - */ - public function sort($callback = null); - - /** - * Sort items in descending order. - * - * @param int $options - * @return static - */ - public function sortDesc($options = SORT_REGULAR); - - /** - * Sort the collection using the given callback. - * - * @param array|(callable(TValue, TKey): mixed)|string $callback - * @param int $options - * @param bool $descending - * @return static - */ - public function sortBy($callback, $options = SORT_REGULAR, $descending = false); - - /** - * Sort the collection in descending order using the given callback. - * - * @param array|(callable(TValue, TKey): mixed)|string $callback - * @param int $options - * @return static - */ - public function sortByDesc($callback, $options = SORT_REGULAR); - - /** - * Sort the collection keys. - * - * @param int $options - * @param bool $descending - * @return static - */ - public function sortKeys($options = SORT_REGULAR, $descending = false); - - /** - * Sort the collection keys in descending order. - * - * @param int $options - * @return static - */ - public function sortKeysDesc($options = SORT_REGULAR); - - /** - * Sort the collection keys using a callback. - * - * @param callable(TKey, TKey): int $callback - * @return static - */ - public function sortKeysUsing(callable $callback); - - /** - * Get the sum of the given values. - * - * @param (callable(TValue): mixed)|string|null $callback - * @return mixed - */ - public function sum($callback = null); - - /** - * Take the first or last {$limit} items. - * - * @param int $limit - * @return static - */ - public function take($limit); - - /** - * Take items in the collection until the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function takeUntil($value); - - /** - * Take items in the collection while the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function takeWhile($value); - - /** - * Pass the collection to the given callback and then return it. - * - * @param callable(TValue): mixed $callback - * @return $this - */ - public function tap(callable $callback); - - /** - * Pass the enumerable to the given callback and return the result. - * - * @template TPipeReturnType - * - * @param callable($this): TPipeReturnType $callback - * @return TPipeReturnType - */ - public function pipe(callable $callback); - - /** - * Pass the collection into a new class. - * - * @template TPipeIntoValue - * - * @param class-string $class - * @return TPipeIntoValue - */ - public function pipeInto($class); - - /** - * Pass the collection through a series of callable pipes and return the result. - * - * @param array $pipes - * @return mixed - */ - public function pipeThrough($pipes); - - /** - * Get the values of a given key. - * - * @param string|array $value - * @param string|null $key - * @return static - */ - public function pluck($value, $key = null); - - /** - * Create a collection of all elements that do not pass a given truth test. - * - * @param (callable(TValue, TKey): bool)|bool|TValue $callback - * @return static - */ - public function reject($callback = true); - - /** - * Convert a flatten "dot" notation array into an expanded array. - * - * @return static - */ - public function undot(); - - /** - * Return only unique items from the collection array. - * - * @param (callable(TValue, TKey): mixed)|string|null $key - * @param bool $strict - * @return static - */ - public function unique($key = null, $strict = false); - - /** - * Return only unique items from the collection array using strict comparison. - * - * @param (callable(TValue, TKey): mixed)|string|null $key - * @return static - */ - public function uniqueStrict($key = null); - - /** - * Reset the keys on the underlying array. - * - * @return static - */ - public function values(); - - /** - * Pad collection to the specified length with a value. - * - * @template TPadValue - * - * @param int $size - * @param TPadValue $value - * @return static - */ - public function pad($size, $value); - - /** - * Get the values iterator. - * - * @return \Traversable - */ - public function getIterator(): Traversable; - - /** - * Count the number of items in the collection. - * - * @return int - */ - public function count(): int; - - /** - * Count the number of items in the collection by a field or using a callback. - * - * @param (callable(TValue, TKey): array-key)|string|null $countBy - * @return static - */ - public function countBy($countBy = null); - - /** - * Zip the collection together with one or more arrays. - * - * e.g. new Collection([1, 2, 3])->zip([4, 5, 6]); - * => [[1, 4], [2, 5], [3, 6]] - * - * @template TZipValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable ...$items - * @return static> - */ - public function zip($items); - - /** - * Collect the values into a collection. - * - * @return \Illuminate\Support\Collection - */ - public function collect(); - - /** - * Get the collection of items as a plain array. - * - * @return array - */ - public function toArray(); - - /** - * Convert the object into something JSON serializable. - * - * @return mixed - */ - public function jsonSerialize(): mixed; - - /** - * Get the collection of items as JSON. - * - * @param int $options - * @return string - */ - public function toJson($options = 0); - - /** - * Get a CachingIterator instance. - * - * @param int $flags - * @return \CachingIterator - */ - public function getCachingIterator($flags = CachingIterator::CALL_TOSTRING); - - /** - * Convert the collection to its string representation. - * - * @return string - */ - public function __toString(); - - /** - * Indicate that the model's string representation should be escaped when __toString is invoked. - * - * @param bool $escape - * @return $this - */ - public function escapeWhenCastingToString($escape = true); - - /** - * Add a method to the list of proxied methods. - * - * @param string $method - * @return void - */ - public static function proxy($method); - - /** - * Dynamically access collection proxies. - * - * @param string $key - * @return mixed - * - * @throws \Exception - */ - public function __get($key); -} diff --git a/vendor/illuminate/collections/HigherOrderCollectionProxy.php b/vendor/illuminate/collections/HigherOrderCollectionProxy.php deleted file mode 100644 index c5a723d..0000000 --- a/vendor/illuminate/collections/HigherOrderCollectionProxy.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @mixin TValue - */ -class HigherOrderCollectionProxy -{ - /** - * The collection being operated on. - * - * @var \Illuminate\Support\Enumerable - */ - protected $collection; - - /** - * The method being proxied. - * - * @var string - */ - protected $method; - - /** - * Create a new proxy instance. - * - * @param \Illuminate\Support\Enumerable $collection - * @param string $method - * @return void - */ - public function __construct(Enumerable $collection, $method) - { - $this->method = $method; - $this->collection = $collection; - } - - /** - * Proxy accessing an attribute onto the collection items. - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - return $this->collection->{$this->method}(function ($value) use ($key) { - return is_array($value) ? $value[$key] : $value->{$key}; - }); - } - - /** - * Proxy a method call onto the collection items. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->collection->{$this->method}(function ($value) use ($method, $parameters) { - return $value->{$method}(...$parameters); - }); - } -} diff --git a/vendor/illuminate/collections/ItemNotFoundException.php b/vendor/illuminate/collections/ItemNotFoundException.php deleted file mode 100644 index 05a51d9..0000000 --- a/vendor/illuminate/collections/ItemNotFoundException.php +++ /dev/null @@ -1,9 +0,0 @@ - - */ -class LazyCollection implements CanBeEscapedWhenCastToString, Enumerable -{ - /** - * @use \Illuminate\Support\Traits\EnumeratesValues - */ - use EnumeratesValues, Macroable; - - /** - * The source from which to generate items. - * - * @var (Closure(): \Generator)|static|array - */ - public $source; - - /** - * Create a new lazy collection instance. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable|(Closure(): \Generator)|self|array|null $source - * @return void - */ - public function __construct($source = null) - { - if ($source instanceof Closure || $source instanceof self) { - $this->source = $source; - } elseif (is_null($source)) { - $this->source = static::empty(); - } elseif ($source instanceof Generator) { - throw new InvalidArgumentException( - 'Generators should not be passed directly to LazyCollection. Instead, pass a generator function.' - ); - } else { - $this->source = $this->getArrayableItems($source); - } - } - - /** - * Create a new collection instance if the value isn't one already. - * - * @template TMakeKey of array-key - * @template TMakeValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable|(Closure(): \Generator)|self|array|null $items - * @return static - */ - public static function make($items = []) - { - return new static($items); - } - - /** - * Create a collection with the given range. - * - * @param int $from - * @param int $to - * @return static - */ - public static function range($from, $to) - { - return new static(function () use ($from, $to) { - if ($from <= $to) { - for (; $from <= $to; $from++) { - yield $from; - } - } else { - for (; $from >= $to; $from--) { - yield $from; - } - } - }); - } - - /** - * Get all items in the enumerable. - * - * @return array - */ - public function all() - { - if (is_array($this->source)) { - return $this->source; - } - - return iterator_to_array($this->getIterator()); - } - - /** - * Eager load all items into a new lazy collection backed by an array. - * - * @return static - */ - public function eager() - { - return new static($this->all()); - } - - /** - * Cache values as they're enumerated. - * - * @return static - */ - public function remember() - { - $iterator = $this->getIterator(); - - $iteratorIndex = 0; - - $cache = []; - - return new static(function () use ($iterator, &$iteratorIndex, &$cache) { - for ($index = 0; true; $index++) { - if (array_key_exists($index, $cache)) { - yield $cache[$index][0] => $cache[$index][1]; - - continue; - } - - if ($iteratorIndex < $index) { - $iterator->next(); - - $iteratorIndex++; - } - - if (! $iterator->valid()) { - break; - } - - $cache[$index] = [$iterator->key(), $iterator->current()]; - - yield $cache[$index][0] => $cache[$index][1]; - } - }); - } - - /** - * Get the median of a given key. - * - * @param string|array|null $key - * @return float|int|null - */ - public function median($key = null) - { - return $this->collect()->median($key); - } - - /** - * Get the mode of a given key. - * - * @param string|array|null $key - * @return array|null - */ - public function mode($key = null) - { - return $this->collect()->mode($key); - } - - /** - * Collapse the collection of items into a single array. - * - * @return static - */ - public function collapse() - { - return new static(function () { - foreach ($this as $values) { - if (is_array($values) || $values instanceof Enumerable) { - foreach ($values as $value) { - yield $value; - } - } - } - }); - } - - /** - * Collapse the collection of items into a single array while preserving its keys. - * - * @return static - */ - public function collapseWithKeys() - { - return new static(function () { - foreach ($this as $values) { - if (is_array($values) || $values instanceof Enumerable) { - foreach ($values as $key => $value) { - yield $key => $value; - } - } - } - }); - } - - /** - * Determine if an item exists in the enumerable. - * - * @param (callable(TValue, TKey): bool)|TValue|string $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function contains($key, $operator = null, $value = null) - { - if (func_num_args() === 1 && $this->useAsCallable($key)) { - $placeholder = new stdClass; - - /** @var callable $key */ - return $this->first($key, $placeholder) !== $placeholder; - } - - if (func_num_args() === 1) { - $needle = $key; - - foreach ($this as $value) { - if ($value == $needle) { - return true; - } - } - - return false; - } - - return $this->contains($this->operatorForWhere(...func_get_args())); - } - - /** - * Determine if an item exists, using strict comparison. - * - * @param (callable(TValue): bool)|TValue|array-key $key - * @param TValue|null $value - * @return bool - */ - public function containsStrict($key, $value = null) - { - if (func_num_args() === 2) { - return $this->contains(fn ($item) => data_get($item, $key) === $value); - } - - if ($this->useAsCallable($key)) { - return ! is_null($this->first($key)); - } - - foreach ($this as $item) { - if ($item === $key) { - return true; - } - } - - return false; - } - - /** - * Determine if an item is not contained in the enumerable. - * - * @param mixed $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function doesntContain($key, $operator = null, $value = null) - { - return ! $this->contains(...func_get_args()); - } - - /** - * Cross join the given iterables, returning all possible permutations. - * - * @template TCrossJoinKey - * @template TCrossJoinValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable ...$arrays - * @return static> - */ - public function crossJoin(...$arrays) - { - return $this->passthru('crossJoin', func_get_args()); - } - - /** - * Count the number of items in the collection by a field or using a callback. - * - * @param (callable(TValue, TKey): array-key)|string|null $countBy - * @return static - */ - public function countBy($countBy = null) - { - $countBy = is_null($countBy) - ? $this->identity() - : $this->valueRetriever($countBy); - - return new static(function () use ($countBy) { - $counts = []; - - foreach ($this as $key => $value) { - $group = $countBy($value, $key); - - if (empty($counts[$group])) { - $counts[$group] = 0; - } - - $counts[$group]++; - } - - yield from $counts; - }); - } - - /** - * Get the items that are not present in the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function diff($items) - { - return $this->passthru('diff', func_get_args()); - } - - /** - * Get the items that are not present in the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TValue, TValue): int $callback - * @return static - */ - public function diffUsing($items, callable $callback) - { - return $this->passthru('diffUsing', func_get_args()); - } - - /** - * Get the items whose keys and values are not present in the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function diffAssoc($items) - { - return $this->passthru('diffAssoc', func_get_args()); - } - - /** - * Get the items whose keys and values are not present in the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TKey, TKey): int $callback - * @return static - */ - public function diffAssocUsing($items, callable $callback) - { - return $this->passthru('diffAssocUsing', func_get_args()); - } - - /** - * Get the items whose keys are not present in the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function diffKeys($items) - { - return $this->passthru('diffKeys', func_get_args()); - } - - /** - * Get the items whose keys are not present in the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TKey, TKey): int $callback - * @return static - */ - public function diffKeysUsing($items, callable $callback) - { - return $this->passthru('diffKeysUsing', func_get_args()); - } - - /** - * Retrieve duplicate items. - * - * @template TMapValue - * - * @param (callable(TValue): TMapValue)|string|null $callback - * @param bool $strict - * @return static - */ - public function duplicates($callback = null, $strict = false) - { - return $this->passthru('duplicates', func_get_args()); - } - - /** - * Retrieve duplicate items using strict comparison. - * - * @template TMapValue - * - * @param (callable(TValue): TMapValue)|string|null $callback - * @return static - */ - public function duplicatesStrict($callback = null) - { - return $this->passthru('duplicatesStrict', func_get_args()); - } - - /** - * Get all items except for those with the specified keys. - * - * @param \Illuminate\Support\Enumerable|array $keys - * @return static - */ - public function except($keys) - { - return $this->passthru('except', func_get_args()); - } - - /** - * Run a filter over each of the items. - * - * @param (callable(TValue, TKey): bool)|null $callback - * @return static - */ - public function filter(?callable $callback = null) - { - if (is_null($callback)) { - $callback = fn ($value) => (bool) $value; - } - - return new static(function () use ($callback) { - foreach ($this as $key => $value) { - if ($callback($value, $key)) { - yield $key => $value; - } - } - }); - } - - /** - * Get the first item from the enumerable passing the given truth test. - * - * @template TFirstDefault - * - * @param (callable(TValue): bool)|null $callback - * @param TFirstDefault|(\Closure(): TFirstDefault) $default - * @return TValue|TFirstDefault - */ - public function first(?callable $callback = null, $default = null) - { - $iterator = $this->getIterator(); - - if (is_null($callback)) { - if (! $iterator->valid()) { - return value($default); - } - - return $iterator->current(); - } - - foreach ($iterator as $key => $value) { - if ($callback($value, $key)) { - return $value; - } - } - - return value($default); - } - - /** - * Get a flattened list of the items in the collection. - * - * @param int $depth - * @return static - */ - public function flatten($depth = INF) - { - $instance = new static(function () use ($depth) { - foreach ($this as $item) { - if (! is_array($item) && ! $item instanceof Enumerable) { - yield $item; - } elseif ($depth === 1) { - yield from $item; - } else { - yield from (new static($item))->flatten($depth - 1); - } - } - }); - - return $instance->values(); - } - - /** - * Flip the items in the collection. - * - * @return static - */ - public function flip() - { - return new static(function () { - foreach ($this as $key => $value) { - yield $value => $key; - } - }); - } - - /** - * Get an item by key. - * - * @template TGetDefault - * - * @param TKey|null $key - * @param TGetDefault|(\Closure(): TGetDefault) $default - * @return TValue|TGetDefault - */ - public function get($key, $default = null) - { - if (is_null($key)) { - return; - } - - foreach ($this as $outerKey => $outerValue) { - if ($outerKey == $key) { - return $outerValue; - } - } - - return value($default); - } - - /** - * Group an associative array by a field or using a callback. - * - * @template TGroupKey of array-key - * - * @param (callable(TValue, TKey): TGroupKey)|array|string $groupBy - * @param bool $preserveKeys - * @return static<($groupBy is string ? array-key : ($groupBy is array ? array-key : TGroupKey)), static<($preserveKeys is true ? TKey : int), ($groupBy is array ? mixed : TValue)>> - */ - public function groupBy($groupBy, $preserveKeys = false) - { - return $this->passthru('groupBy', func_get_args()); - } - - /** - * Key an associative array by a field or using a callback. - * - * @template TNewKey of array-key - * - * @param (callable(TValue, TKey): TNewKey)|array|string $keyBy - * @return static<($keyBy is string ? array-key : ($keyBy is array ? array-key : TNewKey)), TValue> - */ - public function keyBy($keyBy) - { - return new static(function () use ($keyBy) { - $keyBy = $this->valueRetriever($keyBy); - - foreach ($this as $key => $item) { - $resolvedKey = $keyBy($item, $key); - - if (is_object($resolvedKey)) { - $resolvedKey = (string) $resolvedKey; - } - - yield $resolvedKey => $item; - } - }); - } - - /** - * Determine if an item exists in the collection by key. - * - * @param mixed $key - * @return bool - */ - public function has($key) - { - $keys = array_flip(is_array($key) ? $key : func_get_args()); - $count = count($keys); - - foreach ($this as $key => $value) { - if (array_key_exists($key, $keys) && --$count == 0) { - return true; - } - } - - return false; - } - - /** - * Determine if any of the keys exist in the collection. - * - * @param mixed $key - * @return bool - */ - public function hasAny($key) - { - $keys = array_flip(is_array($key) ? $key : func_get_args()); - - foreach ($this as $key => $value) { - if (array_key_exists($key, $keys)) { - return true; - } - } - - return false; - } - - /** - * Concatenate values of a given key as a string. - * - * @param (callable(TValue, TKey): mixed)|string $value - * @param string|null $glue - * @return string - */ - public function implode($value, $glue = null) - { - return $this->collect()->implode(...func_get_args()); - } - - /** - * Intersect the collection with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function intersect($items) - { - return $this->passthru('intersect', func_get_args()); - } - - /** - * Intersect the collection with the given items, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TValue, TValue): int $callback - * @return static - */ - public function intersectUsing($items, callable $callback) - { - return $this->passthru('intersectUsing', func_get_args()); - } - - /** - * Intersect the collection with the given items with additional index check. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function intersectAssoc($items) - { - return $this->passthru('intersectAssoc', func_get_args()); - } - - /** - * Intersect the collection with the given items with additional index check, using the callback. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @param callable(TValue, TValue): int $callback - * @return static - */ - public function intersectAssocUsing($items, callable $callback) - { - return $this->passthru('intersectAssocUsing', func_get_args()); - } - - /** - * Intersect the collection with the given items by key. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function intersectByKeys($items) - { - return $this->passthru('intersectByKeys', func_get_args()); - } - - /** - * Determine if the items are empty or not. - * - * @return bool - */ - public function isEmpty() - { - return ! $this->getIterator()->valid(); - } - - /** - * Determine if the collection contains a single item. - * - * @return bool - */ - public function containsOneItem() - { - return $this->take(2)->count() === 1; - } - - /** - * Join all items from the collection using a string. The final items can use a separate glue string. - * - * @param string $glue - * @param string $finalGlue - * @return string - */ - public function join($glue, $finalGlue = '') - { - return $this->collect()->join(...func_get_args()); - } - - /** - * Get the keys of the collection items. - * - * @return static - */ - public function keys() - { - return new static(function () { - foreach ($this as $key => $value) { - yield $key; - } - }); - } - - /** - * Get the last item from the collection. - * - * @template TLastDefault - * - * @param (callable(TValue, TKey): bool)|null $callback - * @param TLastDefault|(\Closure(): TLastDefault) $default - * @return TValue|TLastDefault - */ - public function last(?callable $callback = null, $default = null) - { - $needle = $placeholder = new stdClass; - - foreach ($this as $key => $value) { - if (is_null($callback) || $callback($value, $key)) { - $needle = $value; - } - } - - return $needle === $placeholder ? value($default) : $needle; - } - - /** - * Get the values of a given key. - * - * @param string|array $value - * @param string|null $key - * @return static - */ - public function pluck($value, $key = null) - { - return new static(function () use ($value, $key) { - [$value, $key] = $this->explodePluckParameters($value, $key); - - foreach ($this as $item) { - $itemValue = data_get($item, $value); - - if (is_null($key)) { - yield $itemValue; - } else { - $itemKey = data_get($item, $key); - - if (is_object($itemKey) && method_exists($itemKey, '__toString')) { - $itemKey = (string) $itemKey; - } - - yield $itemKey => $itemValue; - } - } - }); - } - - /** - * Run a map over each of the items. - * - * @template TMapValue - * - * @param callable(TValue, TKey): TMapValue $callback - * @return static - */ - public function map(callable $callback) - { - return new static(function () use ($callback) { - foreach ($this as $key => $value) { - yield $key => $callback($value, $key); - } - }); - } - - /** - * Run a dictionary map over the items. - * - * The callback should return an associative array with a single key/value pair. - * - * @template TMapToDictionaryKey of array-key - * @template TMapToDictionaryValue - * - * @param callable(TValue, TKey): array $callback - * @return static> - */ - public function mapToDictionary(callable $callback) - { - return $this->passthru('mapToDictionary', func_get_args()); - } - - /** - * Run an associative map over each of the items. - * - * The callback should return an associative array with a single key/value pair. - * - * @template TMapWithKeysKey of array-key - * @template TMapWithKeysValue - * - * @param callable(TValue, TKey): array $callback - * @return static - */ - public function mapWithKeys(callable $callback) - { - return new static(function () use ($callback) { - foreach ($this as $key => $value) { - yield from $callback($value, $key); - } - }); - } - - /** - * Merge the collection with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function merge($items) - { - return $this->passthru('merge', func_get_args()); - } - - /** - * Recursively merge the collection with the given items. - * - * @template TMergeRecursiveValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function mergeRecursive($items) - { - return $this->passthru('mergeRecursive', func_get_args()); - } - - /** - * Multiply the items in the collection by the multiplier. - * - * @param int $multiplier - * @return static - */ - public function multiply(int $multiplier) - { - return $this->passthru('multiply', func_get_args()); - } - - /** - * Create a collection by using this collection for keys and another for its values. - * - * @template TCombineValue - * - * @param \IteratorAggregate|array|(callable(): \Generator) $values - * @return static - */ - public function combine($values) - { - return new static(function () use ($values) { - $values = $this->makeIterator($values); - - $errorMessage = 'Both parameters should have an equal number of elements'; - - foreach ($this as $key) { - if (! $values->valid()) { - trigger_error($errorMessage, E_USER_WARNING); - - break; - } - - yield $key => $values->current(); - - $values->next(); - } - - if ($values->valid()) { - trigger_error($errorMessage, E_USER_WARNING); - } - }); - } - - /** - * Union the collection with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function union($items) - { - return $this->passthru('union', func_get_args()); - } - - /** - * Create a new collection consisting of every n-th element. - * - * @param int $step - * @param int $offset - * @return static - */ - public function nth($step, $offset = 0) - { - return new static(function () use ($step, $offset) { - $position = 0; - - foreach ($this->slice($offset) as $item) { - if ($position % $step === 0) { - yield $item; - } - - $position++; - } - }); - } - - /** - * Get the items with the specified keys. - * - * @param \Illuminate\Support\Enumerable|array|string $keys - * @return static - */ - public function only($keys) - { - if ($keys instanceof Enumerable) { - $keys = $keys->all(); - } elseif (! is_null($keys)) { - $keys = is_array($keys) ? $keys : func_get_args(); - } - - return new static(function () use ($keys) { - if (is_null($keys)) { - yield from $this; - } else { - $keys = array_flip($keys); - - foreach ($this as $key => $value) { - if (array_key_exists($key, $keys)) { - yield $key => $value; - - unset($keys[$key]); - - if (empty($keys)) { - break; - } - } - } - } - }); - } - - /** - * Select specific values from the items within the collection. - * - * @param \Illuminate\Support\Enumerable|array|string $keys - * @return static - */ - public function select($keys) - { - if ($keys instanceof Enumerable) { - $keys = $keys->all(); - } elseif (! is_null($keys)) { - $keys = is_array($keys) ? $keys : func_get_args(); - } - - return new static(function () use ($keys) { - if (is_null($keys)) { - yield from $this; - } else { - foreach ($this as $item) { - $result = []; - - foreach ($keys as $key) { - if (Arr::accessible($item) && Arr::exists($item, $key)) { - $result[$key] = $item[$key]; - } elseif (is_object($item) && isset($item->{$key})) { - $result[$key] = $item->{$key}; - } - } - - yield $result; - } - } - }); - } - - /** - * Push all of the given items onto the collection. - * - * @template TConcatKey of array-key - * @template TConcatValue - * - * @param iterable $source - * @return static - */ - public function concat($source) - { - return (new static(function () use ($source) { - yield from $this; - yield from $source; - }))->values(); - } - - /** - * Get one or a specified number of items randomly from the collection. - * - * @param int|null $number - * @return static|TValue - * - * @throws \InvalidArgumentException - */ - public function random($number = null) - { - $result = $this->collect()->random(...func_get_args()); - - return is_null($number) ? $result : new static($result); - } - - /** - * Replace the collection items with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function replace($items) - { - return new static(function () use ($items) { - $items = $this->getArrayableItems($items); - - foreach ($this as $key => $value) { - if (array_key_exists($key, $items)) { - yield $key => $items[$key]; - - unset($items[$key]); - } else { - yield $key => $value; - } - } - - foreach ($items as $key => $value) { - yield $key => $value; - } - }); - } - - /** - * Recursively replace the collection items with the given items. - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable $items - * @return static - */ - public function replaceRecursive($items) - { - return $this->passthru('replaceRecursive', func_get_args()); - } - - /** - * Reverse items order. - * - * @return static - */ - public function reverse() - { - return $this->passthru('reverse', func_get_args()); - } - - /** - * Search the collection for a given value and return the corresponding key if successful. - * - * @param TValue|(callable(TValue,TKey): bool) $value - * @param bool $strict - * @return TKey|false - */ - public function search($value, $strict = false) - { - /** @var (callable(TValue,TKey): bool) $predicate */ - $predicate = $this->useAsCallable($value) - ? $value - : function ($item) use ($value, $strict) { - return $strict ? $item === $value : $item == $value; - }; - - foreach ($this as $key => $item) { - if ($predicate($item, $key)) { - return $key; - } - } - - return false; - } - - /** - * Get the item before the given item. - * - * @param TValue|(callable(TValue,TKey): bool) $value - * @param bool $strict - * @return TValue|null - */ - public function before($value, $strict = false) - { - $previous = null; - - /** @var (callable(TValue,TKey): bool) $predicate */ - $predicate = $this->useAsCallable($value) - ? $value - : function ($item) use ($value, $strict) { - return $strict ? $item === $value : $item == $value; - }; - - foreach ($this as $key => $item) { - if ($predicate($item, $key)) { - return $previous; - } - - $previous = $item; - } - - return null; - } - - /** - * Get the item after the given item. - * - * @param TValue|(callable(TValue,TKey): bool) $value - * @param bool $strict - * @return TValue|null - */ - public function after($value, $strict = false) - { - $found = false; - - /** @var (callable(TValue,TKey): bool) $predicate */ - $predicate = $this->useAsCallable($value) - ? $value - : function ($item) use ($value, $strict) { - return $strict ? $item === $value : $item == $value; - }; - - foreach ($this as $key => $item) { - if ($found) { - return $item; - } - - if ($predicate($item, $key)) { - $found = true; - } - } - - return null; - } - - /** - * Shuffle the items in the collection. - * - * @return static - */ - public function shuffle() - { - return $this->passthru('shuffle', []); - } - - /** - * Create chunks representing a "sliding window" view of the items in the collection. - * - * @param int $size - * @param int $step - * @return static - */ - public function sliding($size = 2, $step = 1) - { - return new static(function () use ($size, $step) { - $iterator = $this->getIterator(); - - $chunk = []; - - while ($iterator->valid()) { - $chunk[$iterator->key()] = $iterator->current(); - - if (count($chunk) == $size) { - yield (new static($chunk))->tap(function () use (&$chunk, $step) { - $chunk = array_slice($chunk, $step, null, true); - }); - - // If the $step between chunks is bigger than each chunk's $size - // we will skip the extra items (which should never be in any - // chunk) before we continue to the next chunk in the loop. - if ($step > $size) { - $skip = $step - $size; - - for ($i = 0; $i < $skip && $iterator->valid(); $i++) { - $iterator->next(); - } - } - } - - $iterator->next(); - } - }); - } - - /** - * Skip the first {$count} items. - * - * @param int $count - * @return static - */ - public function skip($count) - { - return new static(function () use ($count) { - $iterator = $this->getIterator(); - - while ($iterator->valid() && $count--) { - $iterator->next(); - } - - while ($iterator->valid()) { - yield $iterator->key() => $iterator->current(); - - $iterator->next(); - } - }); - } - - /** - * Skip items in the collection until the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function skipUntil($value) - { - $callback = $this->useAsCallable($value) ? $value : $this->equality($value); - - return $this->skipWhile($this->negate($callback)); - } - - /** - * Skip items in the collection while the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function skipWhile($value) - { - $callback = $this->useAsCallable($value) ? $value : $this->equality($value); - - return new static(function () use ($callback) { - $iterator = $this->getIterator(); - - while ($iterator->valid() && $callback($iterator->current(), $iterator->key())) { - $iterator->next(); - } - - while ($iterator->valid()) { - yield $iterator->key() => $iterator->current(); - - $iterator->next(); - } - }); - } - - /** - * Get a slice of items from the enumerable. - * - * @param int $offset - * @param int|null $length - * @return static - */ - public function slice($offset, $length = null) - { - if ($offset < 0 || $length < 0) { - return $this->passthru('slice', func_get_args()); - } - - $instance = $this->skip($offset); - - return is_null($length) ? $instance : $instance->take($length); - } - - /** - * Split a collection into a certain number of groups. - * - * @param int $numberOfGroups - * @return static - */ - public function split($numberOfGroups) - { - return $this->passthru('split', func_get_args()); - } - - /** - * Get the first item in the collection, but only if exactly one item exists. Otherwise, throw an exception. - * - * @param (callable(TValue, TKey): bool)|string $key - * @param mixed $operator - * @param mixed $value - * @return TValue - * - * @throws \Illuminate\Support\ItemNotFoundException - * @throws \Illuminate\Support\MultipleItemsFoundException - */ - public function sole($key = null, $operator = null, $value = null) - { - $filter = func_num_args() > 1 - ? $this->operatorForWhere(...func_get_args()) - : $key; - - return $this - ->unless($filter == null) - ->filter($filter) - ->take(2) - ->collect() - ->sole(); - } - - /** - * Get the first item in the collection but throw an exception if no matching items exist. - * - * @param (callable(TValue, TKey): bool)|string $key - * @param mixed $operator - * @param mixed $value - * @return TValue - * - * @throws \Illuminate\Support\ItemNotFoundException - */ - public function firstOrFail($key = null, $operator = null, $value = null) - { - $filter = func_num_args() > 1 - ? $this->operatorForWhere(...func_get_args()) - : $key; - - return $this - ->unless($filter == null) - ->filter($filter) - ->take(1) - ->collect() - ->firstOrFail(); - } - - /** - * Chunk the collection into chunks of the given size. - * - * @param int $size - * @return static - */ - public function chunk($size) - { - if ($size <= 0) { - return static::empty(); - } - - return new static(function () use ($size) { - $iterator = $this->getIterator(); - - while ($iterator->valid()) { - $chunk = []; - - while (true) { - $chunk[$iterator->key()] = $iterator->current(); - - if (count($chunk) < $size) { - $iterator->next(); - - if (! $iterator->valid()) { - break; - } - } else { - break; - } - } - - yield new static($chunk); - - $iterator->next(); - } - }); - } - - /** - * Split a collection into a certain number of groups, and fill the first groups completely. - * - * @param int $numberOfGroups - * @return static - */ - public function splitIn($numberOfGroups) - { - return $this->chunk((int) ceil($this->count() / $numberOfGroups)); - } - - /** - * Chunk the collection into chunks with a callback. - * - * @param callable(TValue, TKey, Collection): bool $callback - * @return static> - */ - public function chunkWhile(callable $callback) - { - return new static(function () use ($callback) { - $iterator = $this->getIterator(); - - $chunk = new Collection; - - if ($iterator->valid()) { - $chunk[$iterator->key()] = $iterator->current(); - - $iterator->next(); - } - - while ($iterator->valid()) { - if (! $callback($iterator->current(), $iterator->key(), $chunk)) { - yield new static($chunk); - - $chunk = new Collection; - } - - $chunk[$iterator->key()] = $iterator->current(); - - $iterator->next(); - } - - if ($chunk->isNotEmpty()) { - yield new static($chunk); - } - }); - } - - /** - * Sort through each item with a callback. - * - * @param (callable(TValue, TValue): int)|null|int $callback - * @return static - */ - public function sort($callback = null) - { - return $this->passthru('sort', func_get_args()); - } - - /** - * Sort items in descending order. - * - * @param int $options - * @return static - */ - public function sortDesc($options = SORT_REGULAR) - { - return $this->passthru('sortDesc', func_get_args()); - } - - /** - * Sort the collection using the given callback. - * - * @param array|(callable(TValue, TKey): mixed)|string $callback - * @param int $options - * @param bool $descending - * @return static - */ - public function sortBy($callback, $options = SORT_REGULAR, $descending = false) - { - return $this->passthru('sortBy', func_get_args()); - } - - /** - * Sort the collection in descending order using the given callback. - * - * @param array|(callable(TValue, TKey): mixed)|string $callback - * @param int $options - * @return static - */ - public function sortByDesc($callback, $options = SORT_REGULAR) - { - return $this->passthru('sortByDesc', func_get_args()); - } - - /** - * Sort the collection keys. - * - * @param int $options - * @param bool $descending - * @return static - */ - public function sortKeys($options = SORT_REGULAR, $descending = false) - { - return $this->passthru('sortKeys', func_get_args()); - } - - /** - * Sort the collection keys in descending order. - * - * @param int $options - * @return static - */ - public function sortKeysDesc($options = SORT_REGULAR) - { - return $this->passthru('sortKeysDesc', func_get_args()); - } - - /** - * Sort the collection keys using a callback. - * - * @param callable(TKey, TKey): int $callback - * @return static - */ - public function sortKeysUsing(callable $callback) - { - return $this->passthru('sortKeysUsing', func_get_args()); - } - - /** - * Take the first or last {$limit} items. - * - * @param int $limit - * @return static - */ - public function take($limit) - { - if ($limit < 0) { - return new static(function () use ($limit) { - $limit = abs($limit); - $ringBuffer = []; - $position = 0; - - foreach ($this as $key => $value) { - $ringBuffer[$position] = [$key, $value]; - $position = ($position + 1) % $limit; - } - - for ($i = 0, $end = min($limit, count($ringBuffer)); $i < $end; $i++) { - $pointer = ($position + $i) % $limit; - yield $ringBuffer[$pointer][0] => $ringBuffer[$pointer][1]; - } - }); - } - - return new static(function () use ($limit) { - $iterator = $this->getIterator(); - - while ($limit--) { - if (! $iterator->valid()) { - break; - } - - yield $iterator->key() => $iterator->current(); - - if ($limit) { - $iterator->next(); - } - } - }); - } - - /** - * Take items in the collection until the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function takeUntil($value) - { - /** @var callable(TValue, TKey): bool $callback */ - $callback = $this->useAsCallable($value) ? $value : $this->equality($value); - - return new static(function () use ($callback) { - foreach ($this as $key => $item) { - if ($callback($item, $key)) { - break; - } - - yield $key => $item; - } - }); - } - - /** - * Take items in the collection until a given point in time. - * - * @param \DateTimeInterface $timeout - * @return static - */ - public function takeUntilTimeout(DateTimeInterface $timeout) - { - $timeout = $timeout->getTimestamp(); - - return new static(function () use ($timeout) { - if ($this->now() >= $timeout) { - return; - } - - foreach ($this as $key => $value) { - yield $key => $value; - - if ($this->now() >= $timeout) { - break; - } - } - }); - } - - /** - * Take items in the collection while the given condition is met. - * - * @param TValue|callable(TValue,TKey): bool $value - * @return static - */ - public function takeWhile($value) - { - /** @var callable(TValue, TKey): bool $callback */ - $callback = $this->useAsCallable($value) ? $value : $this->equality($value); - - return $this->takeUntil(fn ($item, $key) => ! $callback($item, $key)); - } - - /** - * Pass each item in the collection to the given callback, lazily. - * - * @param callable(TValue, TKey): mixed $callback - * @return static - */ - public function tapEach(callable $callback) - { - return new static(function () use ($callback) { - foreach ($this as $key => $value) { - $callback($value, $key); - - yield $key => $value; - } - }); - } - - /** - * Throttle the values, releasing them at most once per the given seconds. - * - * @return static - */ - public function throttle(float $seconds) - { - return new static(function () use ($seconds) { - $microseconds = $seconds * 1_000_000; - - foreach ($this as $key => $value) { - $fetchedAt = $this->preciseNow(); - - yield $key => $value; - - $sleep = $microseconds - ($this->preciseNow() - $fetchedAt); - - $this->usleep((int) $sleep); - } - }); - } - - /** - * Flatten a multi-dimensional associative array with dots. - * - * @return static - */ - public function dot() - { - return $this->passthru('dot', []); - } - - /** - * Convert a flatten "dot" notation array into an expanded array. - * - * @return static - */ - public function undot() - { - return $this->passthru('undot', []); - } - - /** - * Return only unique items from the collection array. - * - * @param (callable(TValue, TKey): mixed)|string|null $key - * @param bool $strict - * @return static - */ - public function unique($key = null, $strict = false) - { - $callback = $this->valueRetriever($key); - - return new static(function () use ($callback, $strict) { - $exists = []; - - foreach ($this as $key => $item) { - if (! in_array($id = $callback($item, $key), $exists, $strict)) { - yield $key => $item; - - $exists[] = $id; - } - } - }); - } - - /** - * Reset the keys on the underlying array. - * - * @return static - */ - public function values() - { - return new static(function () { - foreach ($this as $item) { - yield $item; - } - }); - } - - /** - * Zip the collection together with one or more arrays. - * - * e.g. new LazyCollection([1, 2, 3])->zip([4, 5, 6]); - * => [[1, 4], [2, 5], [3, 6]] - * - * @template TZipValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable ...$items - * @return static> - */ - public function zip($items) - { - $iterables = func_get_args(); - - return new static(function () use ($iterables) { - $iterators = (new Collection($iterables))->map(function ($iterable) { - return $this->makeIterator($iterable); - })->prepend($this->getIterator()); - - while ($iterators->contains->valid()) { - yield new static($iterators->map->current()); - - $iterators->each->next(); - } - }); - } - - /** - * Pad collection to the specified length with a value. - * - * @template TPadValue - * - * @param int $size - * @param TPadValue $value - * @return static - */ - public function pad($size, $value) - { - if ($size < 0) { - return $this->passthru('pad', func_get_args()); - } - - return new static(function () use ($size, $value) { - $yielded = 0; - - foreach ($this as $index => $item) { - yield $index => $item; - - $yielded++; - } - - while ($yielded++ < $size) { - yield $value; - } - }); - } - - /** - * Get the values iterator. - * - * @return \Traversable - */ - public function getIterator(): Traversable - { - return $this->makeIterator($this->source); - } - - /** - * Count the number of items in the collection. - * - * @return int - */ - public function count(): int - { - if (is_array($this->source)) { - return count($this->source); - } - - return iterator_count($this->getIterator()); - } - - /** - * Make an iterator from the given source. - * - * @template TIteratorKey of array-key - * @template TIteratorValue - * - * @param \IteratorAggregate|array|(callable(): \Generator) $source - * @return \Traversable - */ - protected function makeIterator($source) - { - if ($source instanceof IteratorAggregate) { - return $source->getIterator(); - } - - if (is_array($source)) { - return new ArrayIterator($source); - } - - if (is_callable($source)) { - $maybeTraversable = $source(); - - return $maybeTraversable instanceof Traversable - ? $maybeTraversable - : new ArrayIterator(Arr::wrap($maybeTraversable)); - } - - return new ArrayIterator((array) $source); - } - - /** - * Explode the "value" and "key" arguments passed to "pluck". - * - * @param string|string[] $value - * @param string|string[]|null $key - * @return array{string[],string[]|null} - */ - protected function explodePluckParameters($value, $key) - { - $value = is_string($value) ? explode('.', $value) : $value; - - $key = is_null($key) || is_array($key) ? $key : explode('.', $key); - - return [$value, $key]; - } - - /** - * Pass this lazy collection through a method on the collection class. - * - * @param string $method - * @param array $params - * @return static - */ - protected function passthru($method, array $params) - { - return new static(function () use ($method, $params) { - yield from $this->collect()->$method(...$params); - }); - } - - /** - * Get the current time. - * - * @return int - */ - protected function now() - { - return class_exists(Carbon::class) - ? Carbon::now()->timestamp - : time(); - } - - /** - * Get the precise current time. - * - * @return float - */ - protected function preciseNow() - { - return class_exists(Carbon::class) - ? Carbon::now()->getPreciseTimestamp() - : microtime(true) * 1_000_000; - } - - /** - * Sleep for the given amount of microseconds. - * - * @return void - */ - protected function usleep(int $microseconds) - { - if ($microseconds <= 0) { - return; - } - - class_exists(Sleep::class) - ? Sleep::usleep($microseconds) - : usleep($microseconds); - } -} diff --git a/vendor/illuminate/collections/MultipleItemsFoundException.php b/vendor/illuminate/collections/MultipleItemsFoundException.php deleted file mode 100644 index d90d835..0000000 --- a/vendor/illuminate/collections/MultipleItemsFoundException.php +++ /dev/null @@ -1,40 +0,0 @@ -count = $count; - - parent::__construct("$count items were found.", $code, $previous); - } - - /** - * Get the number of items found. - * - * @return int - */ - public function getCount() - { - return $this->count; - } -} diff --git a/vendor/illuminate/collections/Traits/EnumeratesValues.php b/vendor/illuminate/collections/Traits/EnumeratesValues.php deleted file mode 100644 index 7d47b1f..0000000 --- a/vendor/illuminate/collections/Traits/EnumeratesValues.php +++ /dev/null @@ -1,1188 +0,0 @@ - $average - * @property-read HigherOrderCollectionProxy $avg - * @property-read HigherOrderCollectionProxy $contains - * @property-read HigherOrderCollectionProxy $doesntContain - * @property-read HigherOrderCollectionProxy $each - * @property-read HigherOrderCollectionProxy $every - * @property-read HigherOrderCollectionProxy $filter - * @property-read HigherOrderCollectionProxy $first - * @property-read HigherOrderCollectionProxy $flatMap - * @property-read HigherOrderCollectionProxy $groupBy - * @property-read HigherOrderCollectionProxy $keyBy - * @property-read HigherOrderCollectionProxy $last - * @property-read HigherOrderCollectionProxy $map - * @property-read HigherOrderCollectionProxy $max - * @property-read HigherOrderCollectionProxy $min - * @property-read HigherOrderCollectionProxy $partition - * @property-read HigherOrderCollectionProxy $percentage - * @property-read HigherOrderCollectionProxy $reject - * @property-read HigherOrderCollectionProxy $skipUntil - * @property-read HigherOrderCollectionProxy $skipWhile - * @property-read HigherOrderCollectionProxy $some - * @property-read HigherOrderCollectionProxy $sortBy - * @property-read HigherOrderCollectionProxy $sortByDesc - * @property-read HigherOrderCollectionProxy $sum - * @property-read HigherOrderCollectionProxy $takeUntil - * @property-read HigherOrderCollectionProxy $takeWhile - * @property-read HigherOrderCollectionProxy $unique - * @property-read HigherOrderCollectionProxy $unless - * @property-read HigherOrderCollectionProxy $until - * @property-read HigherOrderCollectionProxy $when - */ -trait EnumeratesValues -{ - use Conditionable; - - /** - * Indicates that the object's string representation should be escaped when __toString is invoked. - * - * @var bool - */ - protected $escapeWhenCastingToString = false; - - /** - * The methods that can be proxied. - * - * @var array - */ - protected static $proxies = [ - 'average', - 'avg', - 'contains', - 'doesntContain', - 'each', - 'every', - 'filter', - 'first', - 'flatMap', - 'groupBy', - 'keyBy', - 'last', - 'map', - 'max', - 'min', - 'partition', - 'percentage', - 'reject', - 'skipUntil', - 'skipWhile', - 'some', - 'sortBy', - 'sortByDesc', - 'sum', - 'takeUntil', - 'takeWhile', - 'unique', - 'unless', - 'until', - 'when', - ]; - - /** - * Create a new collection instance if the value isn't one already. - * - * @template TMakeKey of array-key - * @template TMakeValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable|null $items - * @return static - */ - public static function make($items = []) - { - return new static($items); - } - - /** - * Wrap the given value in a collection if applicable. - * - * @template TWrapValue - * - * @param iterable|TWrapValue $value - * @return static - */ - public static function wrap($value) - { - return $value instanceof Enumerable - ? new static($value) - : new static(Arr::wrap($value)); - } - - /** - * Get the underlying items from the given collection if applicable. - * - * @template TUnwrapKey of array-key - * @template TUnwrapValue - * - * @param array|static $value - * @return array - */ - public static function unwrap($value) - { - return $value instanceof Enumerable ? $value->all() : $value; - } - - /** - * Create a new instance with no items. - * - * @return static - */ - public static function empty() - { - return new static([]); - } - - /** - * Create a new collection by invoking the callback a given amount of times. - * - * @template TTimesValue - * - * @param int $number - * @param (callable(int): TTimesValue)|null $callback - * @return static - */ - public static function times($number, ?callable $callback = null) - { - if ($number < 1) { - return new static; - } - - return static::range(1, $number) - ->unless($callback == null) - ->map($callback); - } - - /** - * Get the average value of a given key. - * - * @param (callable(TValue): float|int)|string|null $callback - * @return float|int|null - */ - public function avg($callback = null) - { - $callback = $this->valueRetriever($callback); - - $reduced = $this->reduce(static function (&$reduce, $value) use ($callback) { - if (! is_null($resolved = $callback($value))) { - $reduce[0] += $resolved; - $reduce[1]++; - } - - return $reduce; - }, [0, 0]); - - return $reduced[1] ? $reduced[0] / $reduced[1] : null; - } - - /** - * Alias for the "avg" method. - * - * @param (callable(TValue): float|int)|string|null $callback - * @return float|int|null - */ - public function average($callback = null) - { - return $this->avg($callback); - } - - /** - * Alias for the "contains" method. - * - * @param (callable(TValue, TKey): bool)|TValue|string $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function some($key, $operator = null, $value = null) - { - return $this->contains(...func_get_args()); - } - - /** - * Dump the given arguments and terminate execution. - * - * @param mixed ...$args - * @return never - */ - public function dd(...$args) - { - dd($this->all(), ...$args); - } - - /** - * Dump the items. - * - * @param mixed ...$args - * @return $this - */ - public function dump(...$args) - { - dump($this->all(), ...$args); - - return $this; - } - - /** - * Execute a callback over each item. - * - * @param callable(TValue, TKey): mixed $callback - * @return $this - */ - public function each(callable $callback) - { - foreach ($this as $key => $item) { - if ($callback($item, $key) === false) { - break; - } - } - - return $this; - } - - /** - * Execute a callback over each nested chunk of items. - * - * @param callable(...mixed): mixed $callback - * @return static - */ - public function eachSpread(callable $callback) - { - return $this->each(function ($chunk, $key) use ($callback) { - $chunk[] = $key; - - return $callback(...$chunk); - }); - } - - /** - * Determine if all items pass the given truth test. - * - * @param (callable(TValue, TKey): bool)|TValue|string $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function every($key, $operator = null, $value = null) - { - if (func_num_args() === 1) { - $callback = $this->valueRetriever($key); - - foreach ($this as $k => $v) { - if (! $callback($v, $k)) { - return false; - } - } - - return true; - } - - return $this->every($this->operatorForWhere(...func_get_args())); - } - - /** - * Get the first item by the given key value pair. - * - * @param callable|string $key - * @param mixed $operator - * @param mixed $value - * @return TValue|null - */ - public function firstWhere($key, $operator = null, $value = null) - { - return $this->first($this->operatorForWhere(...func_get_args())); - } - - /** - * Get a single key's value from the first matching item in the collection. - * - * @template TValueDefault - * - * @param string $key - * @param TValueDefault|(\Closure(): TValueDefault) $default - * @return TValue|TValueDefault - */ - public function value($key, $default = null) - { - if ($value = $this->firstWhere($key)) { - return data_get($value, $key, $default); - } - - return value($default); - } - - /** - * Ensure that every item in the collection is of the expected type. - * - * @template TEnsureOfType - * - * @param class-string|array>|scalar|'array'|'null' $type - * @return static - * - * @throws \UnexpectedValueException - */ - public function ensure($type) - { - $allowedTypes = is_array($type) ? $type : [$type]; - - return $this->each(function ($item, $index) use ($allowedTypes) { - $itemType = get_debug_type($item); - - foreach ($allowedTypes as $allowedType) { - if ($itemType === $allowedType || $item instanceof $allowedType) { - return true; - } - } - - throw new UnexpectedValueException( - sprintf("Collection should only include [%s] items, but '%s' found at position %d.", implode(', ', $allowedTypes), $itemType, $index) - ); - }); - } - - /** - * Determine if the collection is not empty. - * - * @phpstan-assert-if-true TValue $this->first() - * @phpstan-assert-if-true TValue $this->last() - * - * @phpstan-assert-if-false null $this->first() - * @phpstan-assert-if-false null $this->last() - * - * @return bool - */ - public function isNotEmpty() - { - return ! $this->isEmpty(); - } - - /** - * Run a map over each nested chunk of items. - * - * @template TMapSpreadValue - * - * @param callable(mixed...): TMapSpreadValue $callback - * @return static - */ - public function mapSpread(callable $callback) - { - return $this->map(function ($chunk, $key) use ($callback) { - $chunk[] = $key; - - return $callback(...$chunk); - }); - } - - /** - * Run a grouping map over the items. - * - * The callback should return an associative array with a single key/value pair. - * - * @template TMapToGroupsKey of array-key - * @template TMapToGroupsValue - * - * @param callable(TValue, TKey): array $callback - * @return static> - */ - public function mapToGroups(callable $callback) - { - $groups = $this->mapToDictionary($callback); - - return $groups->map([$this, 'make']); - } - - /** - * Map a collection and flatten the result by a single level. - * - * @template TFlatMapKey of array-key - * @template TFlatMapValue - * - * @param callable(TValue, TKey): (\Illuminate\Support\Collection|array) $callback - * @return static - */ - public function flatMap(callable $callback) - { - return $this->map($callback)->collapse(); - } - - /** - * Map the values into a new class. - * - * @template TMapIntoValue - * - * @param class-string $class - * @return static - */ - public function mapInto($class) - { - if (is_subclass_of($class, BackedEnum::class)) { - return $this->map(fn ($value, $key) => $class::from($value)); - } - - return $this->map(fn ($value, $key) => new $class($value, $key)); - } - - /** - * Get the min value of a given key. - * - * @param (callable(TValue):mixed)|string|null $callback - * @return mixed - */ - public function min($callback = null) - { - $callback = $this->valueRetriever($callback); - - return $this->map(fn ($value) => $callback($value)) - ->filter(fn ($value) => ! is_null($value)) - ->reduce(fn ($result, $value) => is_null($result) || $value < $result ? $value : $result); - } - - /** - * Get the max value of a given key. - * - * @param (callable(TValue):mixed)|string|null $callback - * @return mixed - */ - public function max($callback = null) - { - $callback = $this->valueRetriever($callback); - - return $this->filter(fn ($value) => ! is_null($value))->reduce(function ($result, $item) use ($callback) { - $value = $callback($item); - - return is_null($result) || $value > $result ? $value : $result; - }); - } - - /** - * "Paginate" the collection by slicing it into a smaller collection. - * - * @param int $page - * @param int $perPage - * @return static - */ - public function forPage($page, $perPage) - { - $offset = max(0, ($page - 1) * $perPage); - - return $this->slice($offset, $perPage); - } - - /** - * Partition the collection into two arrays using the given callback or key. - * - * @param (callable(TValue, TKey): bool)|TValue|string $key - * @param TValue|string|null $operator - * @param TValue|null $value - * @return static, static> - */ - public function partition($key, $operator = null, $value = null) - { - $passed = []; - $failed = []; - - $callback = func_num_args() === 1 - ? $this->valueRetriever($key) - : $this->operatorForWhere(...func_get_args()); - - foreach ($this as $key => $item) { - if ($callback($item, $key)) { - $passed[$key] = $item; - } else { - $failed[$key] = $item; - } - } - - return new static([new static($passed), new static($failed)]); - } - - /** - * Calculate the percentage of items that pass a given truth test. - * - * @param (callable(TValue, TKey): bool) $callback - * @param int $precision - * @return float|null - */ - public function percentage(callable $callback, int $precision = 2) - { - if ($this->isEmpty()) { - return null; - } - - return round( - $this->filter($callback)->count() / $this->count() * 100, - $precision - ); - } - - /** - * Get the sum of the given values. - * - * @param (callable(TValue): mixed)|string|null $callback - * @return mixed - */ - public function sum($callback = null) - { - $callback = is_null($callback) - ? $this->identity() - : $this->valueRetriever($callback); - - return $this->reduce(fn ($result, $item) => $result + $callback($item), 0); - } - - /** - * Apply the callback if the collection is empty. - * - * @template TWhenEmptyReturnType - * - * @param (callable($this): TWhenEmptyReturnType) $callback - * @param (callable($this): TWhenEmptyReturnType)|null $default - * @return $this|TWhenEmptyReturnType - */ - public function whenEmpty(callable $callback, ?callable $default = null) - { - return $this->when($this->isEmpty(), $callback, $default); - } - - /** - * Apply the callback if the collection is not empty. - * - * @template TWhenNotEmptyReturnType - * - * @param callable($this): TWhenNotEmptyReturnType $callback - * @param (callable($this): TWhenNotEmptyReturnType)|null $default - * @return $this|TWhenNotEmptyReturnType - */ - public function whenNotEmpty(callable $callback, ?callable $default = null) - { - return $this->when($this->isNotEmpty(), $callback, $default); - } - - /** - * Apply the callback unless the collection is empty. - * - * @template TUnlessEmptyReturnType - * - * @param callable($this): TUnlessEmptyReturnType $callback - * @param (callable($this): TUnlessEmptyReturnType)|null $default - * @return $this|TUnlessEmptyReturnType - */ - public function unlessEmpty(callable $callback, ?callable $default = null) - { - return $this->whenNotEmpty($callback, $default); - } - - /** - * Apply the callback unless the collection is not empty. - * - * @template TUnlessNotEmptyReturnType - * - * @param callable($this): TUnlessNotEmptyReturnType $callback - * @param (callable($this): TUnlessNotEmptyReturnType)|null $default - * @return $this|TUnlessNotEmptyReturnType - */ - public function unlessNotEmpty(callable $callback, ?callable $default = null) - { - return $this->whenEmpty($callback, $default); - } - - /** - * Filter items by the given key value pair. - * - * @param callable|string $key - * @param mixed $operator - * @param mixed $value - * @return static - */ - public function where($key, $operator = null, $value = null) - { - return $this->filter($this->operatorForWhere(...func_get_args())); - } - - /** - * Filter items where the value for the given key is null. - * - * @param string|null $key - * @return static - */ - public function whereNull($key = null) - { - return $this->whereStrict($key, null); - } - - /** - * Filter items where the value for the given key is not null. - * - * @param string|null $key - * @return static - */ - public function whereNotNull($key = null) - { - return $this->where($key, '!==', null); - } - - /** - * Filter items by the given key value pair using strict comparison. - * - * @param string $key - * @param mixed $value - * @return static - */ - public function whereStrict($key, $value) - { - return $this->where($key, '===', $value); - } - - /** - * Filter items by the given key value pair. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @param bool $strict - * @return static - */ - public function whereIn($key, $values, $strict = false) - { - $values = $this->getArrayableItems($values); - - return $this->filter(fn ($item) => in_array(data_get($item, $key), $values, $strict)); - } - - /** - * Filter items by the given key value pair using strict comparison. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @return static - */ - public function whereInStrict($key, $values) - { - return $this->whereIn($key, $values, true); - } - - /** - * Filter items such that the value of the given key is between the given values. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @return static - */ - public function whereBetween($key, $values) - { - return $this->where($key, '>=', reset($values))->where($key, '<=', end($values)); - } - - /** - * Filter items such that the value of the given key is not between the given values. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @return static - */ - public function whereNotBetween($key, $values) - { - return $this->filter( - fn ($item) => data_get($item, $key) < reset($values) || data_get($item, $key) > end($values) - ); - } - - /** - * Filter items by the given key value pair. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @param bool $strict - * @return static - */ - public function whereNotIn($key, $values, $strict = false) - { - $values = $this->getArrayableItems($values); - - return $this->reject(fn ($item) => in_array(data_get($item, $key), $values, $strict)); - } - - /** - * Filter items by the given key value pair using strict comparison. - * - * @param string $key - * @param \Illuminate\Contracts\Support\Arrayable|iterable $values - * @return static - */ - public function whereNotInStrict($key, $values) - { - return $this->whereNotIn($key, $values, true); - } - - /** - * Filter the items, removing any items that don't match the given type(s). - * - * @template TWhereInstanceOf - * - * @param class-string|array> $type - * @return static - */ - public function whereInstanceOf($type) - { - return $this->filter(function ($value) use ($type) { - if (is_array($type)) { - foreach ($type as $classType) { - if ($value instanceof $classType) { - return true; - } - } - - return false; - } - - return $value instanceof $type; - }); - } - - /** - * Pass the collection to the given callback and return the result. - * - * @template TPipeReturnType - * - * @param callable($this): TPipeReturnType $callback - * @return TPipeReturnType - */ - public function pipe(callable $callback) - { - return $callback($this); - } - - /** - * Pass the collection into a new class. - * - * @template TPipeIntoValue - * - * @param class-string $class - * @return TPipeIntoValue - */ - public function pipeInto($class) - { - return new $class($this); - } - - /** - * Pass the collection through a series of callable pipes and return the result. - * - * @param array $callbacks - * @return mixed - */ - public function pipeThrough($callbacks) - { - return (new Collection($callbacks))->reduce( - fn ($carry, $callback) => $callback($carry), - $this, - ); - } - - /** - * Reduce the collection to a single value. - * - * @template TReduceInitial - * @template TReduceReturnType - * - * @param callable(TReduceInitial|TReduceReturnType, TValue, TKey): TReduceReturnType $callback - * @param TReduceInitial $initial - * @return TReduceReturnType - */ - public function reduce(callable $callback, $initial = null) - { - $result = $initial; - - foreach ($this as $key => $value) { - $result = $callback($result, $value, $key); - } - - return $result; - } - - /** - * Reduce the collection to multiple aggregate values. - * - * @param callable $callback - * @param mixed ...$initial - * @return array - * - * @throws \UnexpectedValueException - */ - public function reduceSpread(callable $callback, ...$initial) - { - $result = $initial; - - foreach ($this as $key => $value) { - $result = call_user_func_array($callback, array_merge($result, [$value, $key])); - - if (! is_array($result)) { - throw new UnexpectedValueException(sprintf( - "%s::reduceSpread expects reducer to return an array, but got a '%s' instead.", - class_basename(static::class), gettype($result) - )); - } - } - - return $result; - } - - /** - * Reduce an associative collection to a single value. - * - * @template TReduceWithKeysInitial - * @template TReduceWithKeysReturnType - * - * @param callable(TReduceWithKeysInitial|TReduceWithKeysReturnType, TValue, TKey): TReduceWithKeysReturnType $callback - * @param TReduceWithKeysInitial $initial - * @return TReduceWithKeysReturnType - */ - public function reduceWithKeys(callable $callback, $initial = null) - { - return $this->reduce($callback, $initial); - } - - /** - * Create a collection of all elements that do not pass a given truth test. - * - * @param (callable(TValue, TKey): bool)|bool|TValue $callback - * @return static - */ - public function reject($callback = true) - { - $useAsCallable = $this->useAsCallable($callback); - - return $this->filter(function ($value, $key) use ($callback, $useAsCallable) { - return $useAsCallable - ? ! $callback($value, $key) - : $value != $callback; - }); - } - - /** - * Pass the collection to the given callback and then return it. - * - * @param callable($this): mixed $callback - * @return $this - */ - public function tap(callable $callback) - { - $callback($this); - - return $this; - } - - /** - * Return only unique items from the collection array. - * - * @param (callable(TValue, TKey): mixed)|string|null $key - * @param bool $strict - * @return static - */ - public function unique($key = null, $strict = false) - { - $callback = $this->valueRetriever($key); - - $exists = []; - - return $this->reject(function ($item, $key) use ($callback, $strict, &$exists) { - if (in_array($id = $callback($item, $key), $exists, $strict)) { - return true; - } - - $exists[] = $id; - }); - } - - /** - * Return only unique items from the collection array using strict comparison. - * - * @param (callable(TValue, TKey): mixed)|string|null $key - * @return static - */ - public function uniqueStrict($key = null) - { - return $this->unique($key, true); - } - - /** - * Collect the values into a collection. - * - * @return \Illuminate\Support\Collection - */ - public function collect() - { - return new Collection($this->all()); - } - - /** - * Get the collection of items as a plain array. - * - * @return array - */ - public function toArray() - { - return $this->map(fn ($value) => $value instanceof Arrayable ? $value->toArray() : $value)->all(); - } - - /** - * Convert the object into something JSON serializable. - * - * @return array - */ - public function jsonSerialize(): array - { - return array_map(function ($value) { - if ($value instanceof JsonSerializable) { - return $value->jsonSerialize(); - } elseif ($value instanceof Jsonable) { - return json_decode($value->toJson(), true); - } elseif ($value instanceof Arrayable) { - return $value->toArray(); - } - - return $value; - }, $this->all()); - } - - /** - * Get the collection of items as JSON. - * - * @param int $options - * @return string - */ - public function toJson($options = 0) - { - return json_encode($this->jsonSerialize(), $options); - } - - /** - * Get a CachingIterator instance. - * - * @param int $flags - * @return \CachingIterator - */ - public function getCachingIterator($flags = CachingIterator::CALL_TOSTRING) - { - return new CachingIterator($this->getIterator(), $flags); - } - - /** - * Convert the collection to its string representation. - * - * @return string - */ - public function __toString() - { - return $this->escapeWhenCastingToString - ? e($this->toJson()) - : $this->toJson(); - } - - /** - * Indicate that the model's string representation should be escaped when __toString is invoked. - * - * @param bool $escape - * @return $this - */ - public function escapeWhenCastingToString($escape = true) - { - $this->escapeWhenCastingToString = $escape; - - return $this; - } - - /** - * Add a method to the list of proxied methods. - * - * @param string $method - * @return void - */ - public static function proxy($method) - { - static::$proxies[] = $method; - } - - /** - * Dynamically access collection proxies. - * - * @param string $key - * @return mixed - * - * @throws \Exception - */ - public function __get($key) - { - if (! in_array($key, static::$proxies)) { - throw new Exception("Property [{$key}] does not exist on this collection instance."); - } - - return new HigherOrderCollectionProxy($this, $key); - } - - /** - * Results array of items from Collection or Arrayable. - * - * @param mixed $items - * @return array - */ - protected function getArrayableItems($items) - { - if (is_array($items)) { - return $items; - } - - return match (true) { - $items instanceof WeakMap => throw new InvalidArgumentException('Collections can not be created using instances of WeakMap.'), - $items instanceof Enumerable => $items->all(), - $items instanceof Arrayable => $items->toArray(), - $items instanceof Traversable => iterator_to_array($items), - $items instanceof Jsonable => json_decode($items->toJson(), true), - $items instanceof JsonSerializable => (array) $items->jsonSerialize(), - $items instanceof UnitEnum => [$items], - default => (array) $items, - }; - } - - /** - * Get an operator checker callback. - * - * @param callable|string $key - * @param string|null $operator - * @param mixed $value - * @return \Closure - */ - protected function operatorForWhere($key, $operator = null, $value = null) - { - if ($this->useAsCallable($key)) { - return $key; - } - - if (func_num_args() === 1) { - $value = true; - - $operator = '='; - } - - if (func_num_args() === 2) { - $value = $operator; - - $operator = '='; - } - - return function ($item) use ($key, $operator, $value) { - $retrieved = enum_value(data_get($item, $key)); - $value = enum_value($value); - - $strings = array_filter([$retrieved, $value], function ($value) { - return match (true) { - is_string($value) => true, - $value instanceof \Stringable => true, - default => false, - }; - }); - - if (count($strings) < 2 && count(array_filter([$retrieved, $value], 'is_object')) == 1) { - return in_array($operator, ['!=', '<>', '!==']); - } - - switch ($operator) { - default: - case '=': - case '==': return $retrieved == $value; - case '!=': - case '<>': return $retrieved != $value; - case '<': return $retrieved < $value; - case '>': return $retrieved > $value; - case '<=': return $retrieved <= $value; - case '>=': return $retrieved >= $value; - case '===': return $retrieved === $value; - case '!==': return $retrieved !== $value; - case '<=>': return $retrieved <=> $value; - } - }; - } - - /** - * Determine if the given value is callable, but not a string. - * - * @param mixed $value - * @return bool - */ - protected function useAsCallable($value) - { - return ! is_string($value) && is_callable($value); - } - - /** - * Get a value retrieving callback. - * - * @param callable|string|null $value - * @return callable - */ - protected function valueRetriever($value) - { - if ($this->useAsCallable($value)) { - return $value; - } - - return fn ($item) => data_get($item, $value); - } - - /** - * Make a function to check an item's equality. - * - * @param mixed $value - * @return \Closure(mixed): bool - */ - protected function equality($value) - { - return fn ($item) => $item === $value; - } - - /** - * Make a function using another function, by negating its result. - * - * @param \Closure $callback - * @return \Closure - */ - protected function negate(Closure $callback) - { - return fn (...$params) => ! $callback(...$params); - } - - /** - * Make a function that returns what's passed to it. - * - * @return \Closure(TValue): TValue - */ - protected function identity() - { - return fn ($value) => $value; - } -} diff --git a/vendor/illuminate/collections/composer.json b/vendor/illuminate/collections/composer.json deleted file mode 100644 index b537407..0000000 --- a/vendor/illuminate/collections/composer.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "illuminate/collections", - "description": "The Illuminate Collections package.", - "license": "MIT", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "require": { - "php": "^8.2", - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0" - }, - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - }, - "files": [ - "functions.php", - "helpers.php" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "suggest": { - "symfony/var-dumper": "Required to use the dump method (^7.0)." - }, - "config": { - "sort-packages": true - }, - "minimum-stability": "dev" -} diff --git a/vendor/illuminate/collections/functions.php b/vendor/illuminate/collections/functions.php deleted file mode 100644 index 6ccd9b3..0000000 --- a/vendor/illuminate/collections/functions.php +++ /dev/null @@ -1,27 +0,0 @@ - $value->value, - $value instanceof \UnitEnum => $value->name, - - default => $value ?? value($default), - }; - } -} diff --git a/vendor/illuminate/collections/helpers.php b/vendor/illuminate/collections/helpers.php deleted file mode 100644 index 6d691f5..0000000 --- a/vendor/illuminate/collections/helpers.php +++ /dev/null @@ -1,257 +0,0 @@ -|iterable|null $value - * @return \Illuminate\Support\Collection - */ - function collect($value = []) - { - return new Collection($value); - } -} - -if (! function_exists('data_fill')) { - /** - * Fill in data where it's missing. - * - * @param mixed $target - * @param string|array $key - * @param mixed $value - * @return mixed - */ - function data_fill(&$target, $key, $value) - { - return data_set($target, $key, $value, false); - } -} - -if (! function_exists('data_get')) { - /** - * Get an item from an array or object using "dot" notation. - * - * @param mixed $target - * @param string|array|int|null $key - * @param mixed $default - * @return mixed - */ - function data_get($target, $key, $default = null) - { - if (is_null($key)) { - return $target; - } - - $key = is_array($key) ? $key : explode('.', $key); - - foreach ($key as $i => $segment) { - unset($key[$i]); - - if (is_null($segment)) { - return $target; - } - - if ($segment === '*') { - if ($target instanceof Collection) { - $target = $target->all(); - } elseif (! is_iterable($target)) { - return value($default); - } - - $result = []; - - foreach ($target as $item) { - $result[] = data_get($item, $key); - } - - return in_array('*', $key) ? Arr::collapse($result) : $result; - } - - $segment = match ($segment) { - '\*' => '*', - '\{first}' => '{first}', - '{first}' => array_key_first(is_array($target) ? $target : (new Collection($target))->all()), - '\{last}' => '{last}', - '{last}' => array_key_last(is_array($target) ? $target : (new Collection($target))->all()), - default => $segment, - }; - - if (Arr::accessible($target) && Arr::exists($target, $segment)) { - $target = $target[$segment]; - } elseif (is_object($target) && isset($target->{$segment})) { - $target = $target->{$segment}; - } else { - return value($default); - } - } - - return $target; - } -} - -if (! function_exists('data_set')) { - /** - * Set an item on an array or object using dot notation. - * - * @param mixed $target - * @param string|array $key - * @param mixed $value - * @param bool $overwrite - * @return mixed - */ - function data_set(&$target, $key, $value, $overwrite = true) - { - $segments = is_array($key) ? $key : explode('.', $key); - - if (($segment = array_shift($segments)) === '*') { - if (! Arr::accessible($target)) { - $target = []; - } - - if ($segments) { - foreach ($target as &$inner) { - data_set($inner, $segments, $value, $overwrite); - } - } elseif ($overwrite) { - foreach ($target as &$inner) { - $inner = $value; - } - } - } elseif (Arr::accessible($target)) { - if ($segments) { - if (! Arr::exists($target, $segment)) { - $target[$segment] = []; - } - - data_set($target[$segment], $segments, $value, $overwrite); - } elseif ($overwrite || ! Arr::exists($target, $segment)) { - $target[$segment] = $value; - } - } elseif (is_object($target)) { - if ($segments) { - if (! isset($target->{$segment})) { - $target->{$segment} = []; - } - - data_set($target->{$segment}, $segments, $value, $overwrite); - } elseif ($overwrite || ! isset($target->{$segment})) { - $target->{$segment} = $value; - } - } else { - $target = []; - - if ($segments) { - data_set($target[$segment], $segments, $value, $overwrite); - } elseif ($overwrite) { - $target[$segment] = $value; - } - } - - return $target; - } -} - -if (! function_exists('data_forget')) { - /** - * Remove / unset an item from an array or object using "dot" notation. - * - * @param mixed $target - * @param string|array|int|null $key - * @return mixed - */ - function data_forget(&$target, $key) - { - $segments = is_array($key) ? $key : explode('.', $key); - - if (($segment = array_shift($segments)) === '*' && Arr::accessible($target)) { - if ($segments) { - foreach ($target as &$inner) { - data_forget($inner, $segments); - } - } - } elseif (Arr::accessible($target)) { - if ($segments && Arr::exists($target, $segment)) { - data_forget($target[$segment], $segments); - } else { - Arr::forget($target, $segment); - } - } elseif (is_object($target)) { - if ($segments && isset($target->{$segment})) { - data_forget($target->{$segment}, $segments); - } elseif (isset($target->{$segment})) { - unset($target->{$segment}); - } - } - - return $target; - } -} - -if (! function_exists('head')) { - /** - * Get the first element of an array. Useful for method chaining. - * - * @param array $array - * @return mixed - */ - function head($array) - { - return reset($array); - } -} - -if (! function_exists('last')) { - /** - * Get the last element from an array. - * - * @param array $array - * @return mixed - */ - function last($array) - { - return end($array); - } -} - -if (! function_exists('value')) { - /** - * Return the default value of the given value. - * - * @template TValue - * @template TArgs - * - * @param TValue|\Closure(TArgs): TValue $value - * @param TArgs ...$args - * @return TValue - */ - function value($value, ...$args) - { - return $value instanceof Closure ? $value(...$args) : $value; - } -} - -if (! function_exists('when')) { - /** - * Return a value if the given condition is true. - * - * @param mixed $condition - * @param \Closure|mixed $value - * @param \Closure|mixed $default - * @return mixed - */ - function when($condition, $value, $default = null) - { - if ($condition) { - return value($value, $condition); - } - - return value($default, $condition); - } -} diff --git a/vendor/illuminate/conditionable/HigherOrderWhenProxy.php b/vendor/illuminate/conditionable/HigherOrderWhenProxy.php deleted file mode 100644 index 579114c..0000000 --- a/vendor/illuminate/conditionable/HigherOrderWhenProxy.php +++ /dev/null @@ -1,109 +0,0 @@ -target = $target; - } - - /** - * Set the condition on the proxy. - * - * @param bool $condition - * @return $this - */ - public function condition($condition) - { - [$this->condition, $this->hasCondition] = [$condition, true]; - - return $this; - } - - /** - * Indicate that the condition should be negated. - * - * @return $this - */ - public function negateConditionOnCapture() - { - $this->negateConditionOnCapture = true; - - return $this; - } - - /** - * Proxy accessing an attribute onto the target. - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - if (! $this->hasCondition) { - $condition = $this->target->{$key}; - - return $this->condition($this->negateConditionOnCapture ? ! $condition : $condition); - } - - return $this->condition - ? $this->target->{$key} - : $this->target; - } - - /** - * Proxy a method call on the target. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - if (! $this->hasCondition) { - $condition = $this->target->{$method}(...$parameters); - - return $this->condition($this->negateConditionOnCapture ? ! $condition : $condition); - } - - return $this->condition - ? $this->target->{$method}(...$parameters) - : $this->target; - } -} diff --git a/vendor/illuminate/conditionable/LICENSE.md b/vendor/illuminate/conditionable/LICENSE.md deleted file mode 100644 index 79810c8..0000000 --- a/vendor/illuminate/conditionable/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Taylor Otwell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/illuminate/conditionable/Traits/Conditionable.php b/vendor/illuminate/conditionable/Traits/Conditionable.php deleted file mode 100644 index 5e3194b..0000000 --- a/vendor/illuminate/conditionable/Traits/Conditionable.php +++ /dev/null @@ -1,73 +0,0 @@ -condition($value); - } - - if ($value) { - return $callback($this, $value) ?? $this; - } elseif ($default) { - return $default($this, $value) ?? $this; - } - - return $this; - } - - /** - * Apply the callback if the given "value" is (or resolves to) falsy. - * - * @template TUnlessParameter - * @template TUnlessReturnType - * - * @param (\Closure($this): TUnlessParameter)|TUnlessParameter|null $value - * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $callback - * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $default - * @return $this|TUnlessReturnType - */ - public function unless($value = null, ?callable $callback = null, ?callable $default = null) - { - $value = $value instanceof Closure ? $value($this) : $value; - - if (func_num_args() === 0) { - return (new HigherOrderWhenProxy($this))->negateConditionOnCapture(); - } - - if (func_num_args() === 1) { - return (new HigherOrderWhenProxy($this))->condition(! $value); - } - - if (! $value) { - return $callback($this, $value) ?? $this; - } elseif ($default) { - return $default($this, $value) ?? $this; - } - - return $this; - } -} diff --git a/vendor/illuminate/conditionable/composer.json b/vendor/illuminate/conditionable/composer.json deleted file mode 100644 index eb1d71e..0000000 --- a/vendor/illuminate/conditionable/composer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "illuminate/conditionable", - "description": "The Illuminate Conditionable package.", - "license": "MIT", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "require": { - "php": "^8.0.2" - }, - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "config": { - "sort-packages": true - }, - "minimum-stability": "dev" -} diff --git a/vendor/illuminate/container/Attributes/Auth.php b/vendor/illuminate/container/Attributes/Auth.php deleted file mode 100644 index 4cf0c1a..0000000 --- a/vendor/illuminate/container/Attributes/Auth.php +++ /dev/null @@ -1,30 +0,0 @@ -make('auth')->guard($attribute->guard); - } -} diff --git a/vendor/illuminate/container/Attributes/Authenticated.php b/vendor/illuminate/container/Attributes/Authenticated.php deleted file mode 100644 index ffbba45..0000000 --- a/vendor/illuminate/container/Attributes/Authenticated.php +++ /dev/null @@ -1,30 +0,0 @@ -make('auth')->userResolver(), $attribute->guard); - } -} diff --git a/vendor/illuminate/container/Attributes/Cache.php b/vendor/illuminate/container/Attributes/Cache.php deleted file mode 100644 index 2b7b1f7..0000000 --- a/vendor/illuminate/container/Attributes/Cache.php +++ /dev/null @@ -1,30 +0,0 @@ -make('cache')->store($attribute->store); - } -} diff --git a/vendor/illuminate/container/Attributes/Config.php b/vendor/illuminate/container/Attributes/Config.php deleted file mode 100644 index 0133708..0000000 --- a/vendor/illuminate/container/Attributes/Config.php +++ /dev/null @@ -1,30 +0,0 @@ -make('config')->get($attribute->key, $attribute->default); - } -} diff --git a/vendor/illuminate/container/Attributes/CurrentUser.php b/vendor/illuminate/container/Attributes/CurrentUser.php deleted file mode 100644 index 7c13b4e..0000000 --- a/vendor/illuminate/container/Attributes/CurrentUser.php +++ /dev/null @@ -1,11 +0,0 @@ -make('db')->connection($attribute->connection); - } -} diff --git a/vendor/illuminate/container/Attributes/Log.php b/vendor/illuminate/container/Attributes/Log.php deleted file mode 100644 index 07673e7..0000000 --- a/vendor/illuminate/container/Attributes/Log.php +++ /dev/null @@ -1,30 +0,0 @@ -make('log')->channel($attribute->channel); - } -} diff --git a/vendor/illuminate/container/Attributes/RouteParameter.php b/vendor/illuminate/container/Attributes/RouteParameter.php deleted file mode 100644 index 32afced..0000000 --- a/vendor/illuminate/container/Attributes/RouteParameter.php +++ /dev/null @@ -1,30 +0,0 @@ -make('request')->route($attribute->parameter); - } -} diff --git a/vendor/illuminate/container/Attributes/Storage.php b/vendor/illuminate/container/Attributes/Storage.php deleted file mode 100644 index b9a16d1..0000000 --- a/vendor/illuminate/container/Attributes/Storage.php +++ /dev/null @@ -1,30 +0,0 @@ -make('filesystem')->disk($attribute->disk); - } -} diff --git a/vendor/illuminate/container/Attributes/Tag.php b/vendor/illuminate/container/Attributes/Tag.php deleted file mode 100644 index 944fcd9..0000000 --- a/vendor/illuminate/container/Attributes/Tag.php +++ /dev/null @@ -1,30 +0,0 @@ -tagged($attribute->tag); - } -} diff --git a/vendor/illuminate/container/BoundMethod.php b/vendor/illuminate/container/BoundMethod.php deleted file mode 100644 index d719e91..0000000 --- a/vendor/illuminate/container/BoundMethod.php +++ /dev/null @@ -1,217 +0,0 @@ -make($segments[0]), $method], - $parameters - ); - } - - /** - * Call a method that has been bound to the container. - * - * @param \Illuminate\Container\Container $container - * @param callable $callback - * @param mixed $default - * @return mixed - */ - protected static function callBoundMethod($container, $callback, $default) - { - if (! is_array($callback)) { - return Util::unwrapIfClosure($default); - } - - // Here we need to turn the array callable into a Class@method string we can use to - // examine the container and see if there are any method bindings for this given - // method. If there are, we can call this method binding callback immediately. - $method = static::normalizeMethod($callback); - - if ($container->hasMethodBinding($method)) { - return $container->callMethodBinding($method, $callback[0]); - } - - return Util::unwrapIfClosure($default); - } - - /** - * Normalize the given callback into a Class@method string. - * - * @param callable $callback - * @return string - */ - protected static function normalizeMethod($callback) - { - $class = is_string($callback[0]) ? $callback[0] : get_class($callback[0]); - - return "{$class}@{$callback[1]}"; - } - - /** - * Get all dependencies for a given method. - * - * @param \Illuminate\Container\Container $container - * @param callable|string $callback - * @param array $parameters - * @return array - * - * @throws \ReflectionException - */ - protected static function getMethodDependencies($container, $callback, array $parameters = []) - { - $dependencies = []; - - foreach (static::getCallReflector($callback)->getParameters() as $parameter) { - static::addDependencyForCallParameter($container, $parameter, $parameters, $dependencies); - } - - return array_merge($dependencies, array_values($parameters)); - } - - /** - * Get the proper reflection instance for the given callback. - * - * @param callable|string $callback - * @return \ReflectionFunctionAbstract - * - * @throws \ReflectionException - */ - protected static function getCallReflector($callback) - { - if (is_string($callback) && str_contains($callback, '::')) { - $callback = explode('::', $callback); - } elseif (is_object($callback) && ! $callback instanceof Closure) { - $callback = [$callback, '__invoke']; - } - - return is_array($callback) - ? new ReflectionMethod($callback[0], $callback[1]) - : new ReflectionFunction($callback); - } - - /** - * Get the dependency for the given call parameter. - * - * @param \Illuminate\Container\Container $container - * @param \ReflectionParameter $parameter - * @param array $parameters - * @param array $dependencies - * @return void - * - * @throws \Illuminate\Contracts\Container\BindingResolutionException - */ - protected static function addDependencyForCallParameter( - $container, - $parameter, - array &$parameters, - &$dependencies - ) { - $pendingDependencies = []; - - if (array_key_exists($paramName = $parameter->getName(), $parameters)) { - $pendingDependencies[] = $parameters[$paramName]; - - unset($parameters[$paramName]); - } elseif ($attribute = Util::getContextualAttributeFromDependency($parameter)) { - $pendingDependencies[] = $container->resolveFromAttribute($attribute); - } elseif (! is_null($className = Util::getParameterClassName($parameter))) { - if (array_key_exists($className, $parameters)) { - $pendingDependencies[] = $parameters[$className]; - - unset($parameters[$className]); - } elseif ($parameter->isVariadic()) { - $variadicDependencies = $container->make($className); - - $pendingDependencies = array_merge($pendingDependencies, is_array($variadicDependencies) - ? $variadicDependencies - : [$variadicDependencies]); - } else { - $pendingDependencies[] = $container->make($className); - } - } elseif ($parameter->isDefaultValueAvailable()) { - $pendingDependencies[] = $parameter->getDefaultValue(); - } elseif (! $parameter->isOptional() && ! array_key_exists($paramName, $parameters)) { - $message = "Unable to resolve dependency [{$parameter}] in class {$parameter->getDeclaringClass()->getName()}"; - - throw new BindingResolutionException($message); - } - - foreach ($pendingDependencies as $dependency) { - $container->fireAfterResolvingAttributeCallbacks($parameter->getAttributes(), $dependency); - } - - $dependencies = array_merge($dependencies, $pendingDependencies); - } - - /** - * Determine if the given string is in Class@method syntax. - * - * @param mixed $callback - * @return bool - */ - protected static function isCallableWithAtSign($callback) - { - return is_string($callback) && str_contains($callback, '@'); - } -} diff --git a/vendor/illuminate/container/Container.php b/vendor/illuminate/container/Container.php deleted file mode 100644 index 27d835c..0000000 --- a/vendor/illuminate/container/Container.php +++ /dev/null @@ -1,1628 +0,0 @@ -getAlias($c); - } - - return new ContextualBindingBuilder($this, $aliases); - } - - /** - * Define a contextual binding based on an attribute. - * - * @param string $attribute - * @param \Closure $handler - * @return void - */ - public function whenHasAttribute(string $attribute, Closure $handler) - { - $this->contextualAttributes[$attribute] = $handler; - } - - /** - * Determine if the given abstract type has been bound. - * - * @param string $abstract - * @return bool - */ - public function bound($abstract) - { - return isset($this->bindings[$abstract]) || - isset($this->instances[$abstract]) || - $this->isAlias($abstract); - } - - /** - * {@inheritdoc} - * - * @return bool - */ - public function has(string $id): bool - { - return $this->bound($id); - } - - /** - * Determine if the given abstract type has been resolved. - * - * @param string $abstract - * @return bool - */ - public function resolved($abstract) - { - if ($this->isAlias($abstract)) { - $abstract = $this->getAlias($abstract); - } - - return isset($this->resolved[$abstract]) || - isset($this->instances[$abstract]); - } - - /** - * Determine if a given type is shared. - * - * @param string $abstract - * @return bool - */ - public function isShared($abstract) - { - return isset($this->instances[$abstract]) || - (isset($this->bindings[$abstract]['shared']) && - $this->bindings[$abstract]['shared'] === true); - } - - /** - * Determine if a given string is an alias. - * - * @param string $name - * @return bool - */ - public function isAlias($name) - { - return isset($this->aliases[$name]); - } - - /** - * Register a binding with the container. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @param bool $shared - * @return void - * - * @throws \TypeError - */ - public function bind($abstract, $concrete = null, $shared = false) - { - $this->dropStaleInstances($abstract); - - // If no concrete type was given, we will simply set the concrete type to the - // abstract type. After that, the concrete type to be registered as shared - // without being forced to state their classes in both of the parameters. - if (is_null($concrete)) { - $concrete = $abstract; - } - - // If the factory is not a Closure, it means it is just a class name which is - // bound into this container to the abstract type and we will just wrap it - // up inside its own Closure to give us more convenience when extending. - if (! $concrete instanceof Closure) { - if (! is_string($concrete)) { - throw new TypeError(self::class.'::bind(): Argument #2 ($concrete) must be of type Closure|string|null'); - } - - $concrete = $this->getClosure($abstract, $concrete); - } - - $this->bindings[$abstract] = ['concrete' => $concrete, 'shared' => $shared]; - - // If the abstract type was already resolved in this container we'll fire the - // rebound listener so that any objects which have already gotten resolved - // can have their copy of the object updated via the listener callbacks. - if ($this->resolved($abstract)) { - $this->rebound($abstract); - } - } - - /** - * Get the Closure to be used when building a type. - * - * @param string $abstract - * @param string $concrete - * @return \Closure - */ - protected function getClosure($abstract, $concrete) - { - return function ($container, $parameters = []) use ($abstract, $concrete) { - if ($abstract == $concrete) { - return $container->build($concrete); - } - - return $container->resolve( - $concrete, $parameters, $raiseEvents = false - ); - }; - } - - /** - * Determine if the container has a method binding. - * - * @param string $method - * @return bool - */ - public function hasMethodBinding($method) - { - return isset($this->methodBindings[$method]); - } - - /** - * Bind a callback to resolve with Container::call. - * - * @param array|string $method - * @param \Closure $callback - * @return void - */ - public function bindMethod($method, $callback) - { - $this->methodBindings[$this->parseBindMethod($method)] = $callback; - } - - /** - * Get the method to be bound in class@method format. - * - * @param array|string $method - * @return string - */ - protected function parseBindMethod($method) - { - if (is_array($method)) { - return $method[0].'@'.$method[1]; - } - - return $method; - } - - /** - * Get the method binding for the given method. - * - * @param string $method - * @param mixed $instance - * @return mixed - */ - public function callMethodBinding($method, $instance) - { - return call_user_func($this->methodBindings[$method], $instance, $this); - } - - /** - * Add a contextual binding to the container. - * - * @param string $concrete - * @param string $abstract - * @param \Closure|string $implementation - * @return void - */ - public function addContextualBinding($concrete, $abstract, $implementation) - { - $this->contextual[$concrete][$this->getAlias($abstract)] = $implementation; - } - - /** - * Register a binding if it hasn't already been registered. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @param bool $shared - * @return void - */ - public function bindIf($abstract, $concrete = null, $shared = false) - { - if (! $this->bound($abstract)) { - $this->bind($abstract, $concrete, $shared); - } - } - - /** - * Register a shared binding in the container. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - */ - public function singleton($abstract, $concrete = null) - { - $this->bind($abstract, $concrete, true); - } - - /** - * Register a shared binding if it hasn't already been registered. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - */ - public function singletonIf($abstract, $concrete = null) - { - if (! $this->bound($abstract)) { - $this->singleton($abstract, $concrete); - } - } - - /** - * Register a scoped binding in the container. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - */ - public function scoped($abstract, $concrete = null) - { - $this->scopedInstances[] = $abstract; - - $this->singleton($abstract, $concrete); - } - - /** - * Register a scoped binding if it hasn't already been registered. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - */ - public function scopedIf($abstract, $concrete = null) - { - if (! $this->bound($abstract)) { - $this->scoped($abstract, $concrete); - } - } - - /** - * "Extend" an abstract type in the container. - * - * @param string $abstract - * @param \Closure $closure - * @return void - * - * @throws \InvalidArgumentException - */ - public function extend($abstract, Closure $closure) - { - $abstract = $this->getAlias($abstract); - - if (isset($this->instances[$abstract])) { - $this->instances[$abstract] = $closure($this->instances[$abstract], $this); - - $this->rebound($abstract); - } else { - $this->extenders[$abstract][] = $closure; - - if ($this->resolved($abstract)) { - $this->rebound($abstract); - } - } - } - - /** - * Register an existing instance as shared in the container. - * - * @template TInstance of mixed - * - * @param string $abstract - * @param TInstance $instance - * @return TInstance - */ - public function instance($abstract, $instance) - { - $this->removeAbstractAlias($abstract); - - $isBound = $this->bound($abstract); - - unset($this->aliases[$abstract]); - - // We'll check to determine if this type has been bound before, and if it has - // we will fire the rebound callbacks registered with the container and it - // can be updated with consuming classes that have gotten resolved here. - $this->instances[$abstract] = $instance; - - if ($isBound) { - $this->rebound($abstract); - } - - return $instance; - } - - /** - * Remove an alias from the contextual binding alias cache. - * - * @param string $searched - * @return void - */ - protected function removeAbstractAlias($searched) - { - if (! isset($this->aliases[$searched])) { - return; - } - - foreach ($this->abstractAliases as $abstract => $aliases) { - foreach ($aliases as $index => $alias) { - if ($alias == $searched) { - unset($this->abstractAliases[$abstract][$index]); - } - } - } - } - - /** - * Assign a set of tags to a given binding. - * - * @param array|string $abstracts - * @param array|mixed ...$tags - * @return void - */ - public function tag($abstracts, $tags) - { - $tags = is_array($tags) ? $tags : array_slice(func_get_args(), 1); - - foreach ($tags as $tag) { - if (! isset($this->tags[$tag])) { - $this->tags[$tag] = []; - } - - foreach ((array) $abstracts as $abstract) { - $this->tags[$tag][] = $abstract; - } - } - } - - /** - * Resolve all of the bindings for a given tag. - * - * @param string $tag - * @return iterable - */ - public function tagged($tag) - { - if (! isset($this->tags[$tag])) { - return []; - } - - return new RewindableGenerator(function () use ($tag) { - foreach ($this->tags[$tag] as $abstract) { - yield $this->make($abstract); - } - }, count($this->tags[$tag])); - } - - /** - * Alias a type to a different name. - * - * @param string $abstract - * @param string $alias - * @return void - * - * @throws \LogicException - */ - public function alias($abstract, $alias) - { - if ($alias === $abstract) { - throw new LogicException("[{$abstract}] is aliased to itself."); - } - - $this->aliases[$alias] = $abstract; - - $this->abstractAliases[$abstract][] = $alias; - } - - /** - * Bind a new callback to an abstract's rebind event. - * - * @param string $abstract - * @param \Closure $callback - * @return mixed - */ - public function rebinding($abstract, Closure $callback) - { - $this->reboundCallbacks[$abstract = $this->getAlias($abstract)][] = $callback; - - if ($this->bound($abstract)) { - return $this->make($abstract); - } - } - - /** - * Refresh an instance on the given target and method. - * - * @param string $abstract - * @param mixed $target - * @param string $method - * @return mixed - */ - public function refresh($abstract, $target, $method) - { - return $this->rebinding($abstract, function ($app, $instance) use ($target, $method) { - $target->{$method}($instance); - }); - } - - /** - * Fire the "rebound" callbacks for the given abstract type. - * - * @param string $abstract - * @return void - */ - protected function rebound($abstract) - { - if (! $callbacks = $this->getReboundCallbacks($abstract)) { - return; - } - - $instance = $this->make($abstract); - - foreach ($callbacks as $callback) { - $callback($this, $instance); - } - } - - /** - * Get the rebound callbacks for a given type. - * - * @param string $abstract - * @return array - */ - protected function getReboundCallbacks($abstract) - { - return $this->reboundCallbacks[$abstract] ?? []; - } - - /** - * Wrap the given closure such that its dependencies will be injected when executed. - * - * @param \Closure $callback - * @param array $parameters - * @return \Closure - */ - public function wrap(Closure $callback, array $parameters = []) - { - return fn () => $this->call($callback, $parameters); - } - - /** - * Call the given Closure / class@method and inject its dependencies. - * - * @param callable|string $callback - * @param array $parameters - * @param string|null $defaultMethod - * @return mixed - * - * @throws \InvalidArgumentException - */ - public function call($callback, array $parameters = [], $defaultMethod = null) - { - $pushedToBuildStack = false; - - if (($className = $this->getClassForCallable($callback)) && ! in_array( - $className, - $this->buildStack, - true - )) { - $this->buildStack[] = $className; - - $pushedToBuildStack = true; - } - - $result = BoundMethod::call($this, $callback, $parameters, $defaultMethod); - - if ($pushedToBuildStack) { - array_pop($this->buildStack); - } - - return $result; - } - - /** - * Get the class name for the given callback, if one can be determined. - * - * @param callable|string $callback - * @return string|false - */ - protected function getClassForCallable($callback) - { - if (is_callable($callback) && - ! ($reflector = new ReflectionFunction($callback(...)))->isAnonymous()) { - return $reflector->getClosureScopeClass()->name ?? false; - } - - return false; - } - - /** - * Get a closure to resolve the given type from the container. - * - * @template TClass of object - * - * @param string|class-string $abstract - * @return ($abstract is class-string ? \Closure(): TClass : \Closure(): mixed) - */ - public function factory($abstract) - { - return fn () => $this->make($abstract); - } - - /** - * An alias function name for make(). - * - * @template TClass of object - * - * @param string|class-string|callable $abstract - * @param array $parameters - * @return ($abstract is class-string ? TClass : mixed) - * - * @throws \Illuminate\Contracts\Container\BindingResolutionException - */ - public function makeWith($abstract, array $parameters = []) - { - return $this->make($abstract, $parameters); - } - - /** - * Resolve the given type from the container. - * - * @template TClass of object - * - * @param string|class-string $abstract - * @param array $parameters - * @return ($abstract is class-string ? TClass : mixed) - * - * @throws \Illuminate\Contracts\Container\BindingResolutionException - */ - public function make($abstract, array $parameters = []) - { - return $this->resolve($abstract, $parameters); - } - - /** - * {@inheritdoc} - * - * @template TClass of object - * - * @param string|class-string $id - * @return ($id is class-string ? TClass : mixed) - */ - public function get(string $id) - { - try { - return $this->resolve($id); - } catch (Exception $e) { - if ($this->has($id) || $e instanceof CircularDependencyException) { - throw $e; - } - - throw new EntryNotFoundException($id, is_int($e->getCode()) ? $e->getCode() : 0, $e); - } - } - - /** - * Resolve the given type from the container. - * - * @template TClass of object - * - * @param string|class-string|callable $abstract - * @param array $parameters - * @param bool $raiseEvents - * @return ($abstract is class-string ? TClass : mixed) - * - * @throws \Illuminate\Contracts\Container\BindingResolutionException - * @throws \Illuminate\Contracts\Container\CircularDependencyException - */ - protected function resolve($abstract, $parameters = [], $raiseEvents = true) - { - $abstract = $this->getAlias($abstract); - - // First we'll fire any event handlers which handle the "before" resolving of - // specific types. This gives some hooks the chance to add various extends - // calls to change the resolution of objects that they're interested in. - if ($raiseEvents) { - $this->fireBeforeResolvingCallbacks($abstract, $parameters); - } - - $concrete = $this->getContextualConcrete($abstract); - - $needsContextualBuild = ! empty($parameters) || ! is_null($concrete); - - // If an instance of the type is currently being managed as a singleton we'll - // just return an existing instance instead of instantiating new instances - // so the developer can keep using the same objects instance every time. - if (isset($this->instances[$abstract]) && ! $needsContextualBuild) { - return $this->instances[$abstract]; - } - - $this->with[] = $parameters; - - if (is_null($concrete)) { - $concrete = $this->getConcrete($abstract); - } - - // We're ready to instantiate an instance of the concrete type registered for - // the binding. This will instantiate the types, as well as resolve any of - // its "nested" dependencies recursively until all have gotten resolved. - $object = $this->isBuildable($concrete, $abstract) - ? $this->build($concrete) - : $this->make($concrete); - - // If we defined any extenders for this type, we'll need to spin through them - // and apply them to the object being built. This allows for the extension - // of services, such as changing configuration or decorating the object. - foreach ($this->getExtenders($abstract) as $extender) { - $object = $extender($object, $this); - } - - // If the requested type is registered as a singleton we'll want to cache off - // the instances in "memory" so we can return it later without creating an - // entirely new instance of an object on each subsequent request for it. - if ($this->isShared($abstract) && ! $needsContextualBuild) { - $this->instances[$abstract] = $object; - } - - if ($raiseEvents) { - $this->fireResolvingCallbacks($abstract, $object); - } - - // Before returning, we will also set the resolved flag to "true" and pop off - // the parameter overrides for this build. After those two things are done - // we will be ready to return back the fully constructed class instance. - if (! $needsContextualBuild) { - $this->resolved[$abstract] = true; - } - - array_pop($this->with); - - return $object; - } - - /** - * Get the concrete type for a given abstract. - * - * @param string|callable $abstract - * @return mixed - */ - protected function getConcrete($abstract) - { - // If we don't have a registered resolver or concrete for the type, we'll just - // assume each type is a concrete name and will attempt to resolve it as is - // since the container should be able to resolve concretes automatically. - if (isset($this->bindings[$abstract])) { - return $this->bindings[$abstract]['concrete']; - } - - return $abstract; - } - - /** - * Get the contextual concrete binding for the given abstract. - * - * @param string|callable $abstract - * @return \Closure|string|array|null - */ - protected function getContextualConcrete($abstract) - { - if (! is_null($binding = $this->findInContextualBindings($abstract))) { - return $binding; - } - - // Next we need to see if a contextual binding might be bound under an alias of the - // given abstract type. So, we will need to check if any aliases exist with this - // type and then spin through them and check for contextual bindings on these. - if (empty($this->abstractAliases[$abstract])) { - return; - } - - foreach ($this->abstractAliases[$abstract] as $alias) { - if (! is_null($binding = $this->findInContextualBindings($alias))) { - return $binding; - } - } - } - - /** - * Find the concrete binding for the given abstract in the contextual binding array. - * - * @param string|callable $abstract - * @return \Closure|string|null - */ - protected function findInContextualBindings($abstract) - { - return $this->contextual[end($this->buildStack)][$abstract] ?? null; - } - - /** - * Determine if the given concrete is buildable. - * - * @param mixed $concrete - * @param string $abstract - * @return bool - */ - protected function isBuildable($concrete, $abstract) - { - return $concrete === $abstract || $concrete instanceof Closure; - } - - /** - * Instantiate a concrete instance of the given type. - * - * @template TClass of object - * - * @param \Closure(static, array): TClass|class-string $concrete - * @return TClass - * - * @throws \Illuminate\Contracts\Container\BindingResolutionException - * @throws \Illuminate\Contracts\Container\CircularDependencyException - */ - public function build($concrete) - { - // If the concrete type is actually a Closure, we will just execute it and - // hand back the results of the functions, which allows functions to be - // used as resolvers for more fine-tuned resolution of these objects. - if ($concrete instanceof Closure) { - $this->buildStack[] = spl_object_hash($concrete); - - try { - return $concrete($this, $this->getLastParameterOverride()); - } finally { - array_pop($this->buildStack); - } - } - - try { - $reflector = new ReflectionClass($concrete); - } catch (ReflectionException $e) { - throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e); - } - - // If the type is not instantiable, the developer is attempting to resolve - // an abstract type such as an Interface or Abstract Class and there is - // no binding registered for the abstractions so we need to bail out. - if (! $reflector->isInstantiable()) { - return $this->notInstantiable($concrete); - } - - $this->buildStack[] = $concrete; - - $constructor = $reflector->getConstructor(); - - // If there are no constructors, that means there are no dependencies then - // we can just resolve the instances of the objects right away, without - // resolving any other types or dependencies out of these containers. - if (is_null($constructor)) { - array_pop($this->buildStack); - - $this->fireAfterResolvingAttributeCallbacks( - $reflector->getAttributes(), $instance = new $concrete - ); - - return $instance; - } - - $dependencies = $constructor->getParameters(); - - // Once we have all the constructor's parameters we can create each of the - // dependency instances and then use the reflection instances to make a - // new instance of this class, injecting the created dependencies in. - try { - $instances = $this->resolveDependencies($dependencies); - } catch (BindingResolutionException $e) { - array_pop($this->buildStack); - - throw $e; - } - - array_pop($this->buildStack); - - $this->fireAfterResolvingAttributeCallbacks( - $reflector->getAttributes(), $instance = $reflector->newInstanceArgs($instances) - ); - - return $instance; - } - - /** - * Resolve all of the dependencies from the ReflectionParameters. - * - * @param \ReflectionParameter[] $dependencies - * @return array - * - * @throws \Illuminate\Contracts\Container\BindingResolutionException - */ - protected function resolveDependencies(array $dependencies) - { - $results = []; - - foreach ($dependencies as $dependency) { - // If the dependency has an override for this particular build we will use - // that instead as the value. Otherwise, we will continue with this run - // of resolutions and let reflection attempt to determine the result. - if ($this->hasParameterOverride($dependency)) { - $results[] = $this->getParameterOverride($dependency); - - continue; - } - - $result = null; - - if (! is_null($attribute = Util::getContextualAttributeFromDependency($dependency))) { - $result = $this->resolveFromAttribute($attribute); - } - - // If the class is null, it means the dependency is a string or some other - // primitive type which we can not resolve since it is not a class and - // we will just bomb out with an error since we have no-where to go. - $result ??= is_null(Util::getParameterClassName($dependency)) - ? $this->resolvePrimitive($dependency) - : $this->resolveClass($dependency); - - $this->fireAfterResolvingAttributeCallbacks($dependency->getAttributes(), $result); - - if ($dependency->isVariadic()) { - $results = array_merge($results, $result); - } else { - $results[] = $result; - } - } - - return $results; - } - - /** - * Determine if the given dependency has a parameter override. - * - * @param \ReflectionParameter $dependency - * @return bool - */ - protected function hasParameterOverride($dependency) - { - return array_key_exists( - $dependency->name, $this->getLastParameterOverride() - ); - } - - /** - * Get a parameter override for a dependency. - * - * @param \ReflectionParameter $dependency - * @return mixed - */ - protected function getParameterOverride($dependency) - { - return $this->getLastParameterOverride()[$dependency->name]; - } - - /** - * Get the last parameter override. - * - * @return array - */ - protected function getLastParameterOverride() - { - return count($this->with) ? end($this->with) : []; - } - - /** - * Resolve a non-class hinted primitive dependency. - * - * @param \ReflectionParameter $parameter - * @return mixed - * - * @throws \Illuminate\Contracts\Container\BindingResolutionException - */ - protected function resolvePrimitive(ReflectionParameter $parameter) - { - if (! is_null($concrete = $this->getContextualConcrete('$'.$parameter->getName()))) { - return Util::unwrapIfClosure($concrete, $this); - } - - if ($parameter->isDefaultValueAvailable()) { - return $parameter->getDefaultValue(); - } - - if ($parameter->isVariadic()) { - return []; - } - - if ($parameter->hasType() && $parameter->allowsNull()) { - return null; - } - - $this->unresolvablePrimitive($parameter); - } - - /** - * Resolve a class based dependency from the container. - * - * @param \ReflectionParameter $parameter - * @return mixed - * - * @throws \Illuminate\Contracts\Container\BindingResolutionException - */ - protected function resolveClass(ReflectionParameter $parameter) - { - try { - return $parameter->isVariadic() - ? $this->resolveVariadicClass($parameter) - : $this->make(Util::getParameterClassName($parameter)); - } - - // If we can not resolve the class instance, we will check to see if the value - // is optional, and if it is we will return the optional parameter value as - // the value of the dependency, similarly to how we do this with scalars. - catch (BindingResolutionException $e) { - if ($parameter->isDefaultValueAvailable()) { - array_pop($this->with); - - return $parameter->getDefaultValue(); - } - - if ($parameter->isVariadic()) { - array_pop($this->with); - - return []; - } - - throw $e; - } - } - - /** - * Resolve a class based variadic dependency from the container. - * - * @param \ReflectionParameter $parameter - * @return mixed - */ - protected function resolveVariadicClass(ReflectionParameter $parameter) - { - $className = Util::getParameterClassName($parameter); - - $abstract = $this->getAlias($className); - - if (! is_array($concrete = $this->getContextualConcrete($abstract))) { - return $this->make($className); - } - - return array_map(fn ($abstract) => $this->resolve($abstract), $concrete); - } - - /** - * Resolve a dependency based on an attribute. - * - * @param \ReflectionAttribute $attribute - * @return mixed - */ - public function resolveFromAttribute(ReflectionAttribute $attribute) - { - $handler = $this->contextualAttributes[$attribute->getName()] ?? null; - - $instance = $attribute->newInstance(); - - if (is_null($handler) && method_exists($instance, 'resolve')) { - $handler = $instance->resolve(...); - } - - if (is_null($handler)) { - throw new BindingResolutionException("Contextual binding attribute [{$attribute->getName()}] has no registered handler."); - } - - return $handler($instance, $this); - } - - /** - * Throw an exception that the concrete is not instantiable. - * - * @param string $concrete - * @return void - * - * @throws \Illuminate\Contracts\Container\BindingResolutionException - */ - protected function notInstantiable($concrete) - { - if (! empty($this->buildStack)) { - $previous = implode(', ', $this->buildStack); - - $message = "Target [$concrete] is not instantiable while building [$previous]."; - } else { - $message = "Target [$concrete] is not instantiable."; - } - - throw new BindingResolutionException($message); - } - - /** - * Throw an exception for an unresolvable primitive. - * - * @param \ReflectionParameter $parameter - * @return void - * - * @throws \Illuminate\Contracts\Container\BindingResolutionException - */ - protected function unresolvablePrimitive(ReflectionParameter $parameter) - { - $message = "Unresolvable dependency resolving [$parameter] in class {$parameter->getDeclaringClass()->getName()}"; - - throw new BindingResolutionException($message); - } - - /** - * Register a new before resolving callback for all types. - * - * @param \Closure|string $abstract - * @param \Closure|null $callback - * @return void - */ - public function beforeResolving($abstract, ?Closure $callback = null) - { - if (is_string($abstract)) { - $abstract = $this->getAlias($abstract); - } - - if ($abstract instanceof Closure && is_null($callback)) { - $this->globalBeforeResolvingCallbacks[] = $abstract; - } else { - $this->beforeResolvingCallbacks[$abstract][] = $callback; - } - } - - /** - * Register a new resolving callback. - * - * @param \Closure|string $abstract - * @param \Closure|null $callback - * @return void - */ - public function resolving($abstract, ?Closure $callback = null) - { - if (is_string($abstract)) { - $abstract = $this->getAlias($abstract); - } - - if (is_null($callback) && $abstract instanceof Closure) { - $this->globalResolvingCallbacks[] = $abstract; - } else { - $this->resolvingCallbacks[$abstract][] = $callback; - } - } - - /** - * Register a new after resolving callback for all types. - * - * @param \Closure|string $abstract - * @param \Closure|null $callback - * @return void - */ - public function afterResolving($abstract, ?Closure $callback = null) - { - if (is_string($abstract)) { - $abstract = $this->getAlias($abstract); - } - - if ($abstract instanceof Closure && is_null($callback)) { - $this->globalAfterResolvingCallbacks[] = $abstract; - } else { - $this->afterResolvingCallbacks[$abstract][] = $callback; - } - } - - /** - * Register a new after resolving attribute callback for all types. - * - * @param string $attribute - * @param \Closure $callback - * @return void - */ - public function afterResolvingAttribute(string $attribute, \Closure $callback) - { - $this->afterResolvingAttributeCallbacks[$attribute][] = $callback; - } - - /** - * Fire all of the before resolving callbacks. - * - * @param string $abstract - * @param array $parameters - * @return void - */ - protected function fireBeforeResolvingCallbacks($abstract, $parameters = []) - { - $this->fireBeforeCallbackArray($abstract, $parameters, $this->globalBeforeResolvingCallbacks); - - foreach ($this->beforeResolvingCallbacks as $type => $callbacks) { - if ($type === $abstract || is_subclass_of($abstract, $type)) { - $this->fireBeforeCallbackArray($abstract, $parameters, $callbacks); - } - } - } - - /** - * Fire an array of callbacks with an object. - * - * @param string $abstract - * @param array $parameters - * @param array $callbacks - * @return void - */ - protected function fireBeforeCallbackArray($abstract, $parameters, array $callbacks) - { - foreach ($callbacks as $callback) { - $callback($abstract, $parameters, $this); - } - } - - /** - * Fire all of the resolving callbacks. - * - * @param string $abstract - * @param mixed $object - * @return void - */ - protected function fireResolvingCallbacks($abstract, $object) - { - $this->fireCallbackArray($object, $this->globalResolvingCallbacks); - - $this->fireCallbackArray( - $object, $this->getCallbacksForType($abstract, $object, $this->resolvingCallbacks) - ); - - $this->fireAfterResolvingCallbacks($abstract, $object); - } - - /** - * Fire all of the after resolving callbacks. - * - * @param string $abstract - * @param mixed $object - * @return void - */ - protected function fireAfterResolvingCallbacks($abstract, $object) - { - $this->fireCallbackArray($object, $this->globalAfterResolvingCallbacks); - - $this->fireCallbackArray( - $object, $this->getCallbacksForType($abstract, $object, $this->afterResolvingCallbacks) - ); - } - - /** - * Fire all of the after resolving attribute callbacks. - * - * @param \ReflectionAttribute[] $attributes - * @param mixed $object - * @return void - */ - public function fireAfterResolvingAttributeCallbacks(array $attributes, $object) - { - foreach ($attributes as $attribute) { - if (is_a($attribute->getName(), ContextualAttribute::class, true)) { - $instance = $attribute->newInstance(); - - if (method_exists($instance, 'after')) { - $instance->after($instance, $object, $this); - } - } - - $callbacks = $this->getCallbacksForType( - $attribute->getName(), $object, $this->afterResolvingAttributeCallbacks - ); - - foreach ($callbacks as $callback) { - $callback($attribute->newInstance(), $object, $this); - } - } - } - - /** - * Get all callbacks for a given type. - * - * @param string $abstract - * @param object $object - * @param array $callbacksPerType - * @return array - */ - protected function getCallbacksForType($abstract, $object, array $callbacksPerType) - { - $results = []; - - foreach ($callbacksPerType as $type => $callbacks) { - if ($type === $abstract || $object instanceof $type) { - $results = array_merge($results, $callbacks); - } - } - - return $results; - } - - /** - * Fire an array of callbacks with an object. - * - * @param mixed $object - * @param array $callbacks - * @return void - */ - protected function fireCallbackArray($object, array $callbacks) - { - foreach ($callbacks as $callback) { - $callback($object, $this); - } - } - - /** - * Get the container's bindings. - * - * @return array - */ - public function getBindings() - { - return $this->bindings; - } - - /** - * Get the alias for an abstract if available. - * - * @param string $abstract - * @return string - */ - public function getAlias($abstract) - { - return isset($this->aliases[$abstract]) - ? $this->getAlias($this->aliases[$abstract]) - : $abstract; - } - - /** - * Get the extender callbacks for a given type. - * - * @param string $abstract - * @return array - */ - protected function getExtenders($abstract) - { - return $this->extenders[$this->getAlias($abstract)] ?? []; - } - - /** - * Remove all of the extender callbacks for a given type. - * - * @param string $abstract - * @return void - */ - public function forgetExtenders($abstract) - { - unset($this->extenders[$this->getAlias($abstract)]); - } - - /** - * Drop all of the stale instances and aliases. - * - * @param string $abstract - * @return void - */ - protected function dropStaleInstances($abstract) - { - unset($this->instances[$abstract], $this->aliases[$abstract]); - } - - /** - * Remove a resolved instance from the instance cache. - * - * @param string $abstract - * @return void - */ - public function forgetInstance($abstract) - { - unset($this->instances[$abstract]); - } - - /** - * Clear all of the instances from the container. - * - * @return void - */ - public function forgetInstances() - { - $this->instances = []; - } - - /** - * Clear all of the scoped instances from the container. - * - * @return void - */ - public function forgetScopedInstances() - { - foreach ($this->scopedInstances as $scoped) { - unset($this->instances[$scoped]); - } - } - - /** - * Flush the container of all bindings and resolved instances. - * - * @return void - */ - public function flush() - { - $this->aliases = []; - $this->resolved = []; - $this->bindings = []; - $this->instances = []; - $this->abstractAliases = []; - $this->scopedInstances = []; - } - - /** - * Get the globally available instance of the container. - * - * @return static - */ - public static function getInstance() - { - return static::$instance ??= new static; - } - - /** - * Set the shared instance of the container. - * - * @param \Illuminate\Contracts\Container\Container|null $container - * @return \Illuminate\Contracts\Container\Container|static - */ - public static function setInstance(?ContainerContract $container = null) - { - return static::$instance = $container; - } - - /** - * Determine if a given offset exists. - * - * @param string $key - * @return bool - */ - public function offsetExists($key): bool - { - return $this->bound($key); - } - - /** - * Get the value at a given offset. - * - * @param string $key - * @return mixed - */ - public function offsetGet($key): mixed - { - return $this->make($key); - } - - /** - * Set the value at a given offset. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function offsetSet($key, $value): void - { - $this->bind($key, $value instanceof Closure ? $value : fn () => $value); - } - - /** - * Unset the value at a given offset. - * - * @param string $key - * @return void - */ - public function offsetUnset($key): void - { - unset($this->bindings[$key], $this->instances[$key], $this->resolved[$key]); - } - - /** - * Dynamically access container services. - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - return $this[$key]; - } - - /** - * Dynamically set container services. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function __set($key, $value) - { - $this[$key] = $value; - } -} diff --git a/vendor/illuminate/container/ContextualBindingBuilder.php b/vendor/illuminate/container/ContextualBindingBuilder.php deleted file mode 100644 index 707b74c..0000000 --- a/vendor/illuminate/container/ContextualBindingBuilder.php +++ /dev/null @@ -1,96 +0,0 @@ -concrete = $concrete; - $this->container = $container; - } - - /** - * Define the abstract target that depends on the context. - * - * @param string $abstract - * @return $this - */ - public function needs($abstract) - { - $this->needs = $abstract; - - return $this; - } - - /** - * Define the implementation for the contextual binding. - * - * @param \Closure|string|array $implementation - * @return void - */ - public function give($implementation) - { - foreach (Util::arrayWrap($this->concrete) as $concrete) { - $this->container->addContextualBinding($concrete, $this->needs, $implementation); - } - } - - /** - * Define tagged services to be used as the implementation for the contextual binding. - * - * @param string $tag - * @return void - */ - public function giveTagged($tag) - { - $this->give(function ($container) use ($tag) { - $taggedServices = $container->tagged($tag); - - return is_array($taggedServices) ? $taggedServices : iterator_to_array($taggedServices); - }); - } - - /** - * Specify the configuration item to bind as a primitive. - * - * @param string $key - * @param mixed $default - * @return void - */ - public function giveConfig($key, $default = null) - { - $this->give(fn ($container) => $container->get('config')->get($key, $default)); - } -} diff --git a/vendor/illuminate/container/EntryNotFoundException.php b/vendor/illuminate/container/EntryNotFoundException.php deleted file mode 100644 index 4266921..0000000 --- a/vendor/illuminate/container/EntryNotFoundException.php +++ /dev/null @@ -1,11 +0,0 @@ -count = $count; - $this->generator = $generator; - } - - /** - * Get an iterator from the generator. - * - * @return \Traversable - */ - public function getIterator(): Traversable - { - return ($this->generator)(); - } - - /** - * Get the total number of tagged services. - * - * @return int - */ - public function count(): int - { - if (is_callable($count = $this->count)) { - $this->count = $count(); - } - - return $this->count; - } -} diff --git a/vendor/illuminate/container/Util.php b/vendor/illuminate/container/Util.php deleted file mode 100644 index ebd345e..0000000 --- a/vendor/illuminate/container/Util.php +++ /dev/null @@ -1,87 +0,0 @@ -getType(); - - if (! $type instanceof ReflectionNamedType || $type->isBuiltin()) { - return null; - } - - $name = $type->getName(); - - if (! is_null($class = $parameter->getDeclaringClass())) { - if ($name === 'self') { - return $class->getName(); - } - - if ($name === 'parent' && $parent = $class->getParentClass()) { - return $parent->getName(); - } - } - - return $name; - } - - /** - * Get a contextual attribute from a dependency. - * - * @param \ReflectionParameter $dependency - * @return \ReflectionAttribute|null - */ - public static function getContextualAttributeFromDependency($dependency) - { - return $dependency->getAttributes(ContextualAttribute::class, ReflectionAttribute::IS_INSTANCEOF)[0] ?? null; - } -} diff --git a/vendor/illuminate/container/composer.json b/vendor/illuminate/container/composer.json deleted file mode 100644 index ab9f51c..0000000 --- a/vendor/illuminate/container/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "illuminate/container", - "description": "The Illuminate Container package.", - "license": "MIT", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "require": { - "php": "^8.2", - "illuminate/contracts": "^11.0", - "psr/container": "^1.1.1|^2.0.1" - }, - "provide": { - "psr/container-implementation": "1.1|2.0" - }, - "autoload": { - "psr-4": { - "Illuminate\\Container\\": "" - } - }, - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "config": { - "sort-packages": true - }, - "minimum-stability": "dev" -} diff --git a/vendor/illuminate/contracts/Auth/Access/Authorizable.php b/vendor/illuminate/contracts/Auth/Access/Authorizable.php deleted file mode 100644 index cedeb6e..0000000 --- a/vendor/illuminate/contracts/Auth/Access/Authorizable.php +++ /dev/null @@ -1,15 +0,0 @@ - $id - * @return ($id is class-string ? TClass : mixed) - */ - public function get(string $id); - - /** - * Determine if the given abstract type has been bound. - * - * @param string $abstract - * @return bool - */ - public function bound($abstract); - - /** - * Alias a type to a different name. - * - * @param string $abstract - * @param string $alias - * @return void - * - * @throws \LogicException - */ - public function alias($abstract, $alias); - - /** - * Assign a set of tags to a given binding. - * - * @param array|string $abstracts - * @param array|mixed ...$tags - * @return void - */ - public function tag($abstracts, $tags); - - /** - * Resolve all of the bindings for a given tag. - * - * @param string $tag - * @return iterable - */ - public function tagged($tag); - - /** - * Register a binding with the container. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @param bool $shared - * @return void - */ - public function bind($abstract, $concrete = null, $shared = false); - - /** - * Bind a callback to resolve with Container::call. - * - * @param array|string $method - * @param \Closure $callback - * @return void - */ - public function bindMethod($method, $callback); - - /** - * Register a binding if it hasn't already been registered. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @param bool $shared - * @return void - */ - public function bindIf($abstract, $concrete = null, $shared = false); - - /** - * Register a shared binding in the container. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - */ - public function singleton($abstract, $concrete = null); - - /** - * Register a shared binding if it hasn't already been registered. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - */ - public function singletonIf($abstract, $concrete = null); - - /** - * Register a scoped binding in the container. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - */ - public function scoped($abstract, $concrete = null); - - /** - * Register a scoped binding if it hasn't already been registered. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - */ - public function scopedIf($abstract, $concrete = null); - - /** - * "Extend" an abstract type in the container. - * - * @param string $abstract - * @param \Closure $closure - * @return void - * - * @throws \InvalidArgumentException - */ - public function extend($abstract, Closure $closure); - - /** - * Register an existing instance as shared in the container. - * - * @template TInstance of mixed - * - * @param string $abstract - * @param TInstance $instance - * @return TInstance - */ - public function instance($abstract, $instance); - - /** - * Add a contextual binding to the container. - * - * @param string $concrete - * @param string $abstract - * @param \Closure|string $implementation - * @return void - */ - public function addContextualBinding($concrete, $abstract, $implementation); - - /** - * Define a contextual binding. - * - * @param string|array $concrete - * @return \Illuminate\Contracts\Container\ContextualBindingBuilder - */ - public function when($concrete); - - /** - * Get a closure to resolve the given type from the container. - * - * @template TClass of object - * - * @param string|class-string $abstract - * @return ($abstract is class-string ? \Closure(): TClass : \Closure(): mixed) - */ - public function factory($abstract); - - /** - * Flush the container of all bindings and resolved instances. - * - * @return void - */ - public function flush(); - - /** - * Resolve the given type from the container. - * - * @template TClass of object - * - * @param string|class-string $abstract - * @param array $parameters - * @return ($abstract is class-string ? TClass : mixed) - * - * @throws \Illuminate\Contracts\Container\BindingResolutionException - */ - public function make($abstract, array $parameters = []); - - /** - * Call the given Closure / class@method and inject its dependencies. - * - * @param callable|string $callback - * @param array $parameters - * @param string|null $defaultMethod - * @return mixed - */ - public function call($callback, array $parameters = [], $defaultMethod = null); - - /** - * Determine if the given abstract type has been resolved. - * - * @param string $abstract - * @return bool - */ - public function resolved($abstract); - - /** - * Register a new before resolving callback. - * - * @param \Closure|string $abstract - * @param \Closure|null $callback - * @return void - */ - public function beforeResolving($abstract, ?Closure $callback = null); - - /** - * Register a new resolving callback. - * - * @param \Closure|string $abstract - * @param \Closure|null $callback - * @return void - */ - public function resolving($abstract, ?Closure $callback = null); - - /** - * Register a new after resolving callback. - * - * @param \Closure|string $abstract - * @param \Closure|null $callback - * @return void - */ - public function afterResolving($abstract, ?Closure $callback = null); -} diff --git a/vendor/illuminate/contracts/Container/ContextualAttribute.php b/vendor/illuminate/contracts/Container/ContextualAttribute.php deleted file mode 100644 index 06f6f06..0000000 --- a/vendor/illuminate/contracts/Container/ContextualAttribute.php +++ /dev/null @@ -1,8 +0,0 @@ -|CastsAttributes|CastsInboundAttributes - */ - public static function castUsing(array $arguments); -} diff --git a/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php b/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php deleted file mode 100644 index 89cec66..0000000 --- a/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php +++ /dev/null @@ -1,34 +0,0 @@ - $attributes - * @return TGet|null - */ - public function get(Model $model, string $key, mixed $value, array $attributes); - - /** - * Transform the attribute to its underlying model values. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @param string $key - * @param TSet|null $value - * @param array $attributes - * @return mixed - */ - public function set(Model $model, string $key, mixed $value, array $attributes); -} diff --git a/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php b/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php deleted file mode 100644 index 312f7ae..0000000 --- a/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php +++ /dev/null @@ -1,19 +0,0 @@ - $attributes - * @return mixed - */ - public function set(Model $model, string $key, mixed $value, array $attributes); -} diff --git a/vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php b/vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php deleted file mode 100644 index 48ba73a..0000000 --- a/vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php +++ /dev/null @@ -1,28 +0,0 @@ - $attributes - * @return mixed - */ - public function serialize(Model $model, string $key, mixed $value, array $attributes); -} diff --git a/vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php b/vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php deleted file mode 100644 index c82125a..0000000 --- a/vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php +++ /dev/null @@ -1,30 +0,0 @@ - - */ - public $class; - - /** - * The unique identifier of the model. - * - * This may be either a single ID or an array of IDs. - * - * @var mixed - */ - public $id; - - /** - * The relationships loaded on the model. - * - * @var array - */ - public $relations; - - /** - * The connection name of the model. - * - * @var string|null - */ - public $connection; - - /** - * The class name of the model collection. - * - * @var class-string<\Illuminate\Database\Eloquent\Collection>|null - */ - public $collectionClass; - - /** - * Create a new model identifier. - * - * @param class-string<\Illuminate\Database\Eloquent\Model> $class - * @param mixed $id - * @param array $relations - * @param mixed $connection - * @return void - */ - public function __construct($class, $id, array $relations, $connection) - { - $this->id = $id; - $this->class = $class; - $this->relations = $relations; - $this->connection = $connection; - } - - /** - * Specify the collection class that should be used when serializing / restoring collections. - * - * @param class-string<\Illuminate\Database\Eloquent\Collection> $collectionClass - * @return $this - */ - public function useCollectionClass(?string $collectionClass) - { - $this->collectionClass = $collectionClass; - - return $this; - } -} diff --git a/vendor/illuminate/contracts/Database/Query/Builder.php b/vendor/illuminate/contracts/Database/Query/Builder.php deleted file mode 100644 index e116ebf..0000000 --- a/vendor/illuminate/contracts/Database/Query/Builder.php +++ /dev/null @@ -1,12 +0,0 @@ - - */ - public function items(); - - /** - * Get the "cursor" of the previous set of items. - * - * @return \Illuminate\Pagination\Cursor|null - */ - public function previousCursor(); - - /** - * Get the "cursor" of the next set of items. - * - * @return \Illuminate\Pagination\Cursor|null - */ - public function nextCursor(); - - /** - * Determine how many items are being shown per page. - * - * @return int - */ - public function perPage(); - - /** - * Get the current cursor being paginated. - * - * @return \Illuminate\Pagination\Cursor|null - */ - public function cursor(); - - /** - * Determine if there are enough items to split into multiple pages. - * - * @return bool - */ - public function hasPages(); - - /** - * Get the base path for paginator generated URLs. - * - * @return string|null - */ - public function path(); - - /** - * Determine if the list of items is empty or not. - * - * @return bool - */ - public function isEmpty(); - - /** - * Determine if the list of items is not empty. - * - * @return bool - */ - public function isNotEmpty(); - - /** - * Render the paginator using a given view. - * - * @param string|null $view - * @param array $data - * @return string - */ - public function render($view = null, $data = []); -} diff --git a/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php b/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php deleted file mode 100644 index bd08082..0000000 --- a/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php +++ /dev/null @@ -1,36 +0,0 @@ - - */ -interface LengthAwarePaginator extends Paginator -{ - /** - * Create a range of pagination URLs. - * - * @param int $start - * @param int $end - * @return array - */ - public function getUrlRange($start, $end); - - /** - * Determine the total number of items in the data store. - * - * @return int - */ - public function total(); - - /** - * Get the page number of the last available page. - * - * @return int - */ - public function lastPage(); -} diff --git a/vendor/illuminate/contracts/Pagination/Paginator.php b/vendor/illuminate/contracts/Pagination/Paginator.php deleted file mode 100644 index c59f58b..0000000 --- a/vendor/illuminate/contracts/Pagination/Paginator.php +++ /dev/null @@ -1,129 +0,0 @@ - - */ - public function items(); - - /** - * Get the "index" of the first item being paginated. - * - * @return int|null - */ - public function firstItem(); - - /** - * Get the "index" of the last item being paginated. - * - * @return int|null - */ - public function lastItem(); - - /** - * Determine how many items are being shown per page. - * - * @return int - */ - public function perPage(); - - /** - * Determine the current page being paginated. - * - * @return int - */ - public function currentPage(); - - /** - * Determine if there are enough items to split into multiple pages. - * - * @return bool - */ - public function hasPages(); - - /** - * Determine if there are more items in the data store. - * - * @return bool - */ - public function hasMorePages(); - - /** - * Get the base path for paginator generated URLs. - * - * @return string|null - */ - public function path(); - - /** - * Determine if the list of items is empty or not. - * - * @return bool - */ - public function isEmpty(); - - /** - * Determine if the list of items is not empty. - * - * @return bool - */ - public function isNotEmpty(); - - /** - * Render the paginator using a given view. - * - * @param string|null $view - * @param array $data - * @return string - */ - public function render($view = null, $data = []); -} diff --git a/vendor/illuminate/contracts/Pipeline/Hub.php b/vendor/illuminate/contracts/Pipeline/Hub.php deleted file mode 100644 index 1ae675f..0000000 --- a/vendor/illuminate/contracts/Pipeline/Hub.php +++ /dev/null @@ -1,15 +0,0 @@ - - */ - public function getQueueableIds(); - - /** - * Get the relationships of the entities being queued. - * - * @return array - */ - public function getQueueableRelations(); - - /** - * Get the connection of the entities being queued. - * - * @return string|null - */ - public function getQueueableConnection(); -} diff --git a/vendor/illuminate/contracts/Queue/QueueableEntity.php b/vendor/illuminate/contracts/Queue/QueueableEntity.php deleted file mode 100644 index 366f0c8..0000000 --- a/vendor/illuminate/contracts/Queue/QueueableEntity.php +++ /dev/null @@ -1,27 +0,0 @@ - - */ - public function toArray(); -} diff --git a/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php b/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php deleted file mode 100644 index e1be6fe..0000000 --- a/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php +++ /dev/null @@ -1,14 +0,0 @@ -setupContainer($container ?: new Container); - - // Once we have the container setup, we will setup the default configuration - // options in the container "config" binding. This will make the database - // manager work correctly out of the box without extreme configuration. - $this->setupDefaultConfiguration(); - - $this->setupManager(); - } - - /** - * Setup the default database configuration options. - * - * @return void - */ - protected function setupDefaultConfiguration() - { - $this->container['config']['database.fetch'] = PDO::FETCH_OBJ; - - $this->container['config']['database.default'] = 'default'; - } - - /** - * Build the database manager instance. - * - * @return void - */ - protected function setupManager() - { - $factory = new ConnectionFactory($this->container); - - $this->manager = new DatabaseManager($this->container, $factory); - } - - /** - * Get a connection instance from the global manager. - * - * @param string|null $connection - * @return \Illuminate\Database\Connection - */ - public static function connection($connection = null) - { - return static::$instance->getConnection($connection); - } - - /** - * Get a fluent query builder instance. - * - * @param \Closure|\Illuminate\Database\Query\Builder|string $table - * @param string|null $as - * @param string|null $connection - * @return \Illuminate\Database\Query\Builder - */ - public static function table($table, $as = null, $connection = null) - { - return static::$instance->connection($connection)->table($table, $as); - } - - /** - * Get a schema builder instance. - * - * @param string|null $connection - * @return \Illuminate\Database\Schema\Builder - */ - public static function schema($connection = null) - { - return static::$instance->connection($connection)->getSchemaBuilder(); - } - - /** - * Get a registered connection instance. - * - * @param string|null $name - * @return \Illuminate\Database\Connection - */ - public function getConnection($name = null) - { - return $this->manager->connection($name); - } - - /** - * Register a connection with the manager. - * - * @param array $config - * @param string $name - * @return void - */ - public function addConnection(array $config, $name = 'default') - { - $connections = $this->container['config']['database.connections']; - - $connections[$name] = $config; - - $this->container['config']['database.connections'] = $connections; - } - - /** - * Bootstrap Eloquent so it is ready for usage. - * - * @return void - */ - public function bootEloquent() - { - Eloquent::setConnectionResolver($this->manager); - - // If we have an event dispatcher instance, we will go ahead and register it - // with the Eloquent ORM, allowing for model callbacks while creating and - // updating "model" instances; however, it is not necessary to operate. - if ($dispatcher = $this->getEventDispatcher()) { - Eloquent::setEventDispatcher($dispatcher); - } - } - - /** - * Set the fetch mode for the database connections. - * - * @param int $fetchMode - * @return $this - */ - public function setFetchMode($fetchMode) - { - $this->container['config']['database.fetch'] = $fetchMode; - - return $this; - } - - /** - * Get the database manager instance. - * - * @return \Illuminate\Database\DatabaseManager - */ - public function getDatabaseManager() - { - return $this->manager; - } - - /** - * Get the current event dispatcher instance. - * - * @return \Illuminate\Contracts\Events\Dispatcher|null - */ - public function getEventDispatcher() - { - if ($this->container->bound('events')) { - return $this->container['events']; - } - } - - /** - * Set the event dispatcher instance to be used by connections. - * - * @param \Illuminate\Contracts\Events\Dispatcher $dispatcher - * @return void - */ - public function setEventDispatcher(Dispatcher $dispatcher) - { - $this->container->instance('events', $dispatcher); - } - - /** - * Dynamically pass methods to the default connection. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public static function __callStatic($method, $parameters) - { - return static::connection()->$method(...$parameters); - } -} diff --git a/vendor/illuminate/database/ClassMorphViolationException.php b/vendor/illuminate/database/ClassMorphViolationException.php deleted file mode 100644 index 6594d2d..0000000 --- a/vendor/illuminate/database/ClassMorphViolationException.php +++ /dev/null @@ -1,29 +0,0 @@ -model = $class; - } -} diff --git a/vendor/illuminate/database/Concerns/BuildsQueries.php b/vendor/illuminate/database/Concerns/BuildsQueries.php deleted file mode 100644 index 688d362..0000000 --- a/vendor/illuminate/database/Concerns/BuildsQueries.php +++ /dev/null @@ -1,578 +0,0 @@ -, int): mixed $callback - * @return bool - */ - public function chunk($count, callable $callback) - { - $this->enforceOrderBy(); - - $page = 1; - - do { - // We'll execute the query for the given page and get the results. If there are - // no results we can just break and return from here. When there are results - // we will call the callback with the current chunk of these results here. - $results = $this->forPage($page, $count)->get(); - - $countResults = $results->count(); - - if ($countResults == 0) { - break; - } - - // On each chunk result set, we will pass them to the callback and then let the - // developer take care of everything within the callback, which allows us to - // keep the memory low for spinning through large result sets for working. - if ($callback($results, $page) === false) { - return false; - } - - unset($results); - - $page++; - } while ($countResults == $count); - - return true; - } - - /** - * Run a map over each item while chunking. - * - * @template TReturn - * - * @param callable(TValue): TReturn $callback - * @param int $count - * @return \Illuminate\Support\Collection - */ - public function chunkMap(callable $callback, $count = 1000) - { - $collection = new Collection; - - $this->chunk($count, function ($items) use ($collection, $callback) { - $items->each(function ($item) use ($collection, $callback) { - $collection->push($callback($item)); - }); - }); - - return $collection; - } - - /** - * Execute a callback over each item while chunking. - * - * @param callable(TValue, int): mixed $callback - * @param int $count - * @return bool - * - * @throws \RuntimeException - */ - public function each(callable $callback, $count = 1000) - { - return $this->chunk($count, function ($results) use ($callback) { - foreach ($results as $key => $value) { - if ($callback($value, $key) === false) { - return false; - } - } - }); - } - - /** - * Chunk the results of a query by comparing IDs. - * - * @param int $count - * @param callable(\Illuminate\Support\Collection, int): mixed $callback - * @param string|null $column - * @param string|null $alias - * @return bool - */ - public function chunkById($count, callable $callback, $column = null, $alias = null) - { - return $this->orderedChunkById($count, $callback, $column, $alias); - } - - /** - * Chunk the results of a query by comparing IDs in descending order. - * - * @param int $count - * @param callable(\Illuminate\Support\Collection, int): mixed $callback - * @param string|null $column - * @param string|null $alias - * @return bool - */ - public function chunkByIdDesc($count, callable $callback, $column = null, $alias = null) - { - return $this->orderedChunkById($count, $callback, $column, $alias, descending: true); - } - - /** - * Chunk the results of a query by comparing IDs in a given order. - * - * @param int $count - * @param callable(\Illuminate\Support\Collection, int): mixed $callback - * @param string|null $column - * @param string|null $alias - * @param bool $descending - * @return bool - * - * @throws \RuntimeException - */ - public function orderedChunkById($count, callable $callback, $column = null, $alias = null, $descending = false) - { - $column ??= $this->defaultKeyName(); - - $alias ??= $column; - - $lastId = null; - - $page = 1; - - do { - $clone = clone $this; - - // We'll execute the query for the given page and get the results. If there are - // no results we can just break and return from here. When there are results - // we will call the callback with the current chunk of these results here. - if ($descending) { - $results = $clone->forPageBeforeId($count, $lastId, $column)->get(); - } else { - $results = $clone->forPageAfterId($count, $lastId, $column)->get(); - } - - $countResults = $results->count(); - - if ($countResults == 0) { - break; - } - - // On each chunk result set, we will pass them to the callback and then let the - // developer take care of everything within the callback, which allows us to - // keep the memory low for spinning through large result sets for working. - if ($callback($results, $page) === false) { - return false; - } - - $lastId = data_get($results->last(), $alias); - - if ($lastId === null) { - throw new RuntimeException("The chunkById operation was aborted because the [{$alias}] column is not present in the query result."); - } - - unset($results); - - $page++; - } while ($countResults == $count); - - return true; - } - - /** - * Execute a callback over each item while chunking by ID. - * - * @param callable(TValue, int): mixed $callback - * @param int $count - * @param string|null $column - * @param string|null $alias - * @return bool - */ - public function eachById(callable $callback, $count = 1000, $column = null, $alias = null) - { - return $this->chunkById($count, function ($results, $page) use ($callback, $count) { - foreach ($results as $key => $value) { - if ($callback($value, (($page - 1) * $count) + $key) === false) { - return false; - } - } - }, $column, $alias); - } - - /** - * Query lazily, by chunks of the given size. - * - * @param int $chunkSize - * @return \Illuminate\Support\LazyCollection - * - * @throws \InvalidArgumentException - */ - public function lazy($chunkSize = 1000) - { - if ($chunkSize < 1) { - throw new InvalidArgumentException('The chunk size should be at least 1'); - } - - $this->enforceOrderBy(); - - return new LazyCollection(function () use ($chunkSize) { - $page = 1; - - while (true) { - $results = $this->forPage($page++, $chunkSize)->get(); - - foreach ($results as $result) { - yield $result; - } - - if ($results->count() < $chunkSize) { - return; - } - } - }); - } - - /** - * Query lazily, by chunking the results of a query by comparing IDs. - * - * @param int $chunkSize - * @param string|null $column - * @param string|null $alias - * @return \Illuminate\Support\LazyCollection - * - * @throws \InvalidArgumentException - */ - public function lazyById($chunkSize = 1000, $column = null, $alias = null) - { - return $this->orderedLazyById($chunkSize, $column, $alias); - } - - /** - * Query lazily, by chunking the results of a query by comparing IDs in descending order. - * - * @param int $chunkSize - * @param string|null $column - * @param string|null $alias - * @return \Illuminate\Support\LazyCollection - * - * @throws \InvalidArgumentException - */ - public function lazyByIdDesc($chunkSize = 1000, $column = null, $alias = null) - { - return $this->orderedLazyById($chunkSize, $column, $alias, true); - } - - /** - * Query lazily, by chunking the results of a query by comparing IDs in a given order. - * - * @param int $chunkSize - * @param string|null $column - * @param string|null $alias - * @param bool $descending - * @return \Illuminate\Support\LazyCollection - * - * @throws \InvalidArgumentException - */ - protected function orderedLazyById($chunkSize = 1000, $column = null, $alias = null, $descending = false) - { - if ($chunkSize < 1) { - throw new InvalidArgumentException('The chunk size should be at least 1'); - } - - $column ??= $this->defaultKeyName(); - - $alias ??= $column; - - return new LazyCollection(function () use ($chunkSize, $column, $alias, $descending) { - $lastId = null; - - while (true) { - $clone = clone $this; - - if ($descending) { - $results = $clone->forPageBeforeId($chunkSize, $lastId, $column)->get(); - } else { - $results = $clone->forPageAfterId($chunkSize, $lastId, $column)->get(); - } - - foreach ($results as $result) { - yield $result; - } - - if ($results->count() < $chunkSize) { - return; - } - - $lastId = $results->last()->{$alias}; - - if ($lastId === null) { - throw new RuntimeException("The lazyById operation was aborted because the [{$alias}] column is not present in the query result."); - } - } - }); - } - - /** - * Execute the query and get the first result. - * - * @param array|string $columns - * @return TValue|null - */ - public function first($columns = ['*']) - { - return $this->take(1)->get($columns)->first(); - } - - /** - * Execute the query and get the first result or throw an exception. - * - * @param array|string $columns - * @param string|null $message - * @return TValue - * - * @throws \Illuminate\Database\RecordNotFoundException - */ - public function firstOrFail($columns = ['*'], $message = null) - { - if (! is_null($result = $this->first($columns))) { - return $result; - } - - throw new RecordNotFoundException($message ?: 'No record found for the given query.'); - } - - /** - * Execute the query and get the first result if it's the sole matching record. - * - * @param array|string $columns - * @return TValue - * - * @throws \Illuminate\Database\RecordsNotFoundException - * @throws \Illuminate\Database\MultipleRecordsFoundException - */ - public function sole($columns = ['*']) - { - $result = $this->take(2)->get($columns); - - $count = $result->count(); - - if ($count === 0) { - throw new RecordsNotFoundException; - } - - if ($count > 1) { - throw new MultipleRecordsFoundException($count); - } - - return $result->first(); - } - - /** - * Paginate the given query using a cursor paginator. - * - * @param int $perPage - * @param array|string $columns - * @param string $cursorName - * @param \Illuminate\Pagination\Cursor|string|null $cursor - * @return \Illuminate\Contracts\Pagination\CursorPaginator - */ - protected function paginateUsingCursor($perPage, $columns = ['*'], $cursorName = 'cursor', $cursor = null) - { - if (! $cursor instanceof Cursor) { - $cursor = is_string($cursor) - ? Cursor::fromEncoded($cursor) - : CursorPaginator::resolveCurrentCursor($cursorName, $cursor); - } - - $orders = $this->ensureOrderForCursorPagination(! is_null($cursor) && $cursor->pointsToPreviousItems()); - - if (! is_null($cursor)) { - // Reset the union bindings so we can add the cursor where in the correct position... - $this->setBindings([], 'union'); - - $addCursorConditions = function (self $builder, $previousColumn, $originalColumn, $i) use (&$addCursorConditions, $cursor, $orders) { - $unionBuilders = $builder->getUnionBuilders(); - - if (! is_null($previousColumn)) { - $originalColumn ??= $this->getOriginalColumnNameForCursorPagination($this, $previousColumn); - - $builder->where( - Str::contains($originalColumn, ['(', ')']) ? new Expression($originalColumn) : $originalColumn, - '=', - $cursor->parameter($previousColumn) - ); - - $unionBuilders->each(function ($unionBuilder) use ($previousColumn, $cursor) { - $unionBuilder->where( - $this->getOriginalColumnNameForCursorPagination($unionBuilder, $previousColumn), - '=', - $cursor->parameter($previousColumn) - ); - - $this->addBinding($unionBuilder->getRawBindings()['where'], 'union'); - }); - } - - $builder->where(function (self $secondBuilder) use ($addCursorConditions, $cursor, $orders, $i, $unionBuilders) { - ['column' => $column, 'direction' => $direction] = $orders[$i]; - - $originalColumn = $this->getOriginalColumnNameForCursorPagination($this, $column); - - $secondBuilder->where( - Str::contains($originalColumn, ['(', ')']) ? new Expression($originalColumn) : $originalColumn, - $direction === 'asc' ? '>' : '<', - $cursor->parameter($column) - ); - - if ($i < $orders->count() - 1) { - $secondBuilder->orWhere(function (self $thirdBuilder) use ($addCursorConditions, $column, $originalColumn, $i) { - $addCursorConditions($thirdBuilder, $column, $originalColumn, $i + 1); - }); - } - - $unionBuilders->each(function ($unionBuilder) use ($column, $direction, $cursor, $i, $orders, $addCursorConditions) { - $unionWheres = $unionBuilder->getRawBindings()['where']; - - $originalColumn = $this->getOriginalColumnNameForCursorPagination($unionBuilder, $column); - $unionBuilder->where(function ($unionBuilder) use ($column, $direction, $cursor, $i, $orders, $addCursorConditions, $originalColumn, $unionWheres) { - $unionBuilder->where( - $originalColumn, - $direction === 'asc' ? '>' : '<', - $cursor->parameter($column) - ); - - if ($i < $orders->count() - 1) { - $unionBuilder->orWhere(function (self $fourthBuilder) use ($addCursorConditions, $column, $originalColumn, $i) { - $addCursorConditions($fourthBuilder, $column, $originalColumn, $i + 1); - }); - } - - $this->addBinding($unionWheres, 'union'); - $this->addBinding($unionBuilder->getRawBindings()['where'], 'union'); - }); - }); - }); - }; - - $addCursorConditions($this, null, null, 0); - } - - $this->limit($perPage + 1); - - return $this->cursorPaginator($this->get($columns), $perPage, $cursor, [ - 'path' => Paginator::resolveCurrentPath(), - 'cursorName' => $cursorName, - 'parameters' => $orders->pluck('column')->toArray(), - ]); - } - - /** - * Get the original column name of the given column, without any aliasing. - * - * @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $builder - * @param string $parameter - * @return string - */ - protected function getOriginalColumnNameForCursorPagination($builder, string $parameter) - { - $columns = $builder instanceof Builder ? $builder->getQuery()->getColumns() : $builder->getColumns(); - - if (! is_null($columns)) { - foreach ($columns as $column) { - if (($position = strripos($column, ' as ')) !== false) { - $original = substr($column, 0, $position); - - $alias = substr($column, $position + 4); - - if ($parameter === $alias || $builder->getGrammar()->wrap($parameter) === $alias) { - return $original; - } - } - } - } - - return $parameter; - } - - /** - * Create a new length-aware paginator instance. - * - * @param \Illuminate\Support\Collection $items - * @param int $total - * @param int $perPage - * @param int $currentPage - * @param array $options - * @return \Illuminate\Pagination\LengthAwarePaginator - */ - protected function paginator($items, $total, $perPage, $currentPage, $options) - { - return Container::getInstance()->makeWith(LengthAwarePaginator::class, compact( - 'items', 'total', 'perPage', 'currentPage', 'options' - )); - } - - /** - * Create a new simple paginator instance. - * - * @param \Illuminate\Support\Collection $items - * @param int $perPage - * @param int $currentPage - * @param array $options - * @return \Illuminate\Pagination\Paginator - */ - protected function simplePaginator($items, $perPage, $currentPage, $options) - { - return Container::getInstance()->makeWith(Paginator::class, compact( - 'items', 'perPage', 'currentPage', 'options' - )); - } - - /** - * Create a new cursor paginator instance. - * - * @param \Illuminate\Support\Collection $items - * @param int $perPage - * @param \Illuminate\Pagination\Cursor $cursor - * @param array $options - * @return \Illuminate\Pagination\CursorPaginator - */ - protected function cursorPaginator($items, $perPage, $cursor, $options) - { - return Container::getInstance()->makeWith(CursorPaginator::class, compact( - 'items', 'perPage', 'cursor', 'options' - )); - } - - /** - * Pass the query to a given callback. - * - * @param callable($this): mixed $callback - * @return $this - */ - public function tap($callback) - { - $callback($this); - - return $this; - } -} diff --git a/vendor/illuminate/database/Concerns/BuildsWhereDateClauses.php b/vendor/illuminate/database/Concerns/BuildsWhereDateClauses.php deleted file mode 100644 index ea60489..0000000 --- a/vendor/illuminate/database/Concerns/BuildsWhereDateClauses.php +++ /dev/null @@ -1,250 +0,0 @@ -wherePastOrFuture($columns, '<', 'and'); - } - - /** - * Add a where clause to determine if a "date" column is in the past or now to the query. - * - * @param array|string $columns - * @return $this - */ - public function whereNowOrPast($columns) - { - return $this->wherePastOrFuture($columns, '<=', 'and'); - } - - /** - * Add an "or where" clause to determine if a "date" column is in the past to the query. - * - * @param array|string $columns - * @return $this - */ - public function orWherePast($columns) - { - return $this->wherePastOrFuture($columns, '<', 'or'); - } - - /** - * Add a where clause to determine if a "date" column is in the past or now to the query. - * - * @param array|string $columns - * @return $this - */ - public function orWhereNowOrPast($columns) - { - return $this->wherePastOrFuture($columns, '<=', 'or'); - } - - /** - * Add a where clause to determine if a "date" column is in the future to the query. - * - * @param array|string $columns - * @return $this - */ - public function whereFuture($columns) - { - return $this->wherePastOrFuture($columns, '>', 'and'); - } - - /** - * Add a where clause to determine if a "date" column is in the future or now to the query. - * - * @param array|string $columns - * @return $this - */ - public function whereNowOrFuture($columns) - { - return $this->wherePastOrFuture($columns, '>=', 'and'); - } - - /** - * Add an "or where" clause to determine if a "date" column is in the future to the query. - * - * @param array|string $columns - * @return $this - */ - public function orWhereFuture($columns) - { - return $this->wherePastOrFuture($columns, '>', 'or'); - } - - /** - * Add an "or where" clause to determine if a "date" column is in the future or now to the query. - * - * @param array|string $columns - * @return $this - */ - public function orWhereNowOrFuture($columns) - { - return $this->wherePastOrFuture($columns, '>=', 'or'); - } - - /** - * Add an "where" clause to determine if a "date" column is in the past or future. - * - * @param array|string $columns - * @return $this - */ - protected function wherePastOrFuture($columns, $operator, $boolean) - { - $type = 'Basic'; - $value = Carbon::now(); - - foreach (Arr::wrap($columns) as $column) { - $this->wheres[] = compact('type', 'column', 'boolean', 'operator', 'value'); - - $this->addBinding($value); - } - - return $this; - } - - /** - * Add a "where date" clause to determine if a "date" column is today to the query. - * - * @param array|string $columns - * @param string $boolean - * @return $this - */ - public function whereToday($columns, $boolean = 'and') - { - return $this->whereTodayBeforeOrAfter($columns, '=', $boolean); - } - - /** - * Add a "where date" clause to determine if a "date" column is before today. - * - * @param array|string $columns - * @return $this - */ - public function whereBeforeToday($columns) - { - return $this->whereTodayBeforeOrAfter($columns, '<', 'and'); - } - - /** - * Add a "where date" clause to determine if a "date" column is today or before to the query. - * - * @param array|string $columns - * @return $this - */ - public function whereTodayOrBefore($columns) - { - return $this->whereTodayBeforeOrAfter($columns, '<=', 'and'); - } - - /** - * Add a "where date" clause to determine if a "date" column is after today. - * - * @param array|string $columns - * @return $this - */ - public function whereAfterToday($columns) - { - return $this->whereTodayBeforeOrAfter($columns, '>', 'and'); - } - - /** - * Add a "where date" clause to determine if a "date" column is today or after to the query. - * - * @param array|string $columns - * @return $this - */ - public function whereTodayOrAfter($columns) - { - return $this->whereTodayBeforeOrAfter($columns, '>=', 'and'); - } - - /** - * Add an "or where date" clause to determine if a "date" column is today to the query. - * - * @param array|string $columns - * @return $this - */ - public function orWhereToday($columns) - { - return $this->whereToday($columns, 'or'); - } - - /** - * Add an "or where date" clause to determine if a "date" column is before today. - * - * @param array|string $columns - * @return $this - */ - public function orWhereBeforeToday($columns) - { - return $this->whereTodayBeforeOrAfter($columns, '<', 'or'); - } - - /** - * Add an "or where date" clause to determine if a "date" column is today or before to the query. - * - * @param array|string $columns - * @param string $boolean - * @return $this - */ - public function orWhereTodayOrBefore($columns) - { - return $this->whereTodayBeforeOrAfter($columns, '<=', 'or'); - } - - /** - * Add an "or where date" clause to determine if a "date" column is after today. - * - * @param array|string $columns - * @param string $boolean - * @return $this - */ - public function orWhereAfterToday($columns) - { - return $this->whereTodayBeforeOrAfter($columns, '>', 'or'); - } - - /** - * Add an "or where date" clause to determine if a "date" column is today or after to the query. - * - * @param array|string $columns - * @param string $boolean - * @return $this - */ - public function orWhereTodayOrAfter($columns) - { - return $this->whereTodayBeforeOrAfter($columns, '>=', 'or'); - } - - /** - * Add a "where date" clause to determine if a "date" column is today or after to the query. - * - * @param array|string $columns - * @param string $operator - * @param string $boolean - * @return $this - */ - protected function whereTodayBeforeOrAfter($columns, $operator, $boolean) - { - $value = Carbon::today()->format('Y-m-d'); - - foreach (Arr::wrap($columns) as $column) { - $this->addDateBasedWhere('Date', $column, $operator, $value, $boolean); - } - - return $this; - } -} diff --git a/vendor/illuminate/database/Concerns/CompilesJsonPaths.php b/vendor/illuminate/database/Concerns/CompilesJsonPaths.php deleted file mode 100644 index fb62914..0000000 --- a/vendor/illuminate/database/Concerns/CompilesJsonPaths.php +++ /dev/null @@ -1,65 +0,0 @@ -', $column, 2); - - $field = $this->wrap($parts[0]); - - $path = count($parts) > 1 ? ', '.$this->wrapJsonPath($parts[1], '->') : ''; - - return [$field, $path]; - } - - /** - * Wrap the given JSON path. - * - * @param string $value - * @param string $delimiter - * @return string - */ - protected function wrapJsonPath($value, $delimiter = '->') - { - $value = preg_replace("/([\\\\]+)?\\'/", "''", $value); - - $jsonPath = (new Collection(explode($delimiter, $value))) - ->map(fn ($segment) => $this->wrapJsonPathSegment($segment)) - ->join('.'); - - return "'$".(str_starts_with($jsonPath, '[') ? '' : '.').$jsonPath."'"; - } - - /** - * Wrap the given JSON path segment. - * - * @param string $segment - * @return string - */ - protected function wrapJsonPathSegment($segment) - { - if (preg_match('/(\[[^\]]+\])+$/', $segment, $parts)) { - $key = Str::beforeLast($segment, $parts[0]); - - if (! empty($key)) { - return '"'.$key.'"'.$parts[0]; - } - - return $parts[0]; - } - - return '"'.$segment.'"'; - } -} diff --git a/vendor/illuminate/database/Concerns/ExplainsQueries.php b/vendor/illuminate/database/Concerns/ExplainsQueries.php deleted file mode 100644 index 7168de1..0000000 --- a/vendor/illuminate/database/Concerns/ExplainsQueries.php +++ /dev/null @@ -1,24 +0,0 @@ -toSql(); - - $bindings = $this->getBindings(); - - $explanation = $this->getConnection()->select('EXPLAIN '.$sql, $bindings); - - return new Collection($explanation); - } -} diff --git a/vendor/illuminate/database/Concerns/ManagesTransactions.php b/vendor/illuminate/database/Concerns/ManagesTransactions.php deleted file mode 100644 index e7ac094..0000000 --- a/vendor/illuminate/database/Concerns/ManagesTransactions.php +++ /dev/null @@ -1,353 +0,0 @@ -beginTransaction(); - - // We'll simply execute the given callback within a try / catch block and if we - // catch any exception we can rollback this transaction so that none of this - // gets actually persisted to a database or stored in a permanent fashion. - try { - $callbackResult = $callback($this); - } - - // If we catch an exception we'll rollback this transaction and try again if we - // are not out of attempts. If we are out of attempts we will just throw the - // exception back out, and let the developer handle an uncaught exception. - catch (Throwable $e) { - $this->handleTransactionException( - $e, $currentAttempt, $attempts - ); - - continue; - } - - $levelBeingCommitted = $this->transactions; - - try { - if ($this->transactions == 1) { - $this->fireConnectionEvent('committing'); - $this->getPdo()->commit(); - } - - $this->transactions = max(0, $this->transactions - 1); - } catch (Throwable $e) { - $this->handleCommitTransactionException( - $e, $currentAttempt, $attempts - ); - - continue; - } - - $this->transactionsManager?->commit( - $this->getName(), - $levelBeingCommitted, - $this->transactions - ); - - $this->fireConnectionEvent('committed'); - - return $callbackResult; - } - } - - /** - * Handle an exception encountered when running a transacted statement. - * - * @param \Throwable $e - * @param int $currentAttempt - * @param int $maxAttempts - * @return void - * - * @throws \Throwable - */ - protected function handleTransactionException(Throwable $e, $currentAttempt, $maxAttempts) - { - // On a deadlock, MySQL rolls back the entire transaction so we can't just - // retry the query. We have to throw this exception all the way out and - // let the developer handle it in another way. We will decrement too. - if ($this->causedByConcurrencyError($e) && - $this->transactions > 1) { - $this->transactions--; - - $this->transactionsManager?->rollback( - $this->getName(), $this->transactions - ); - - throw new DeadlockException($e->getMessage(), is_int($e->getCode()) ? $e->getCode() : 0, $e); - } - - // If there was an exception we will rollback this transaction and then we - // can check if we have exceeded the maximum attempt count for this and - // if we haven't we will return and try this query again in our loop. - $this->rollBack(); - - if ($this->causedByConcurrencyError($e) && - $currentAttempt < $maxAttempts) { - return; - } - - throw $e; - } - - /** - * Start a new database transaction. - * - * @return void - * - * @throws \Throwable - */ - public function beginTransaction() - { - foreach ($this->beforeStartingTransaction as $callback) { - $callback($this); - } - - $this->createTransaction(); - - $this->transactions++; - - $this->transactionsManager?->begin( - $this->getName(), $this->transactions - ); - - $this->fireConnectionEvent('beganTransaction'); - } - - /** - * Create a transaction within the database. - * - * @return void - * - * @throws \Throwable - */ - protected function createTransaction() - { - if ($this->transactions == 0) { - $this->reconnectIfMissingConnection(); - - try { - $this->getPdo()->beginTransaction(); - } catch (Throwable $e) { - $this->handleBeginTransactionException($e); - } - } elseif ($this->transactions >= 1 && $this->queryGrammar->supportsSavepoints()) { - $this->createSavepoint(); - } - } - - /** - * Create a save point within the database. - * - * @return void - * - * @throws \Throwable - */ - protected function createSavepoint() - { - $this->getPdo()->exec( - $this->queryGrammar->compileSavepoint('trans'.($this->transactions + 1)) - ); - } - - /** - * Handle an exception from a transaction beginning. - * - * @param \Throwable $e - * @return void - * - * @throws \Throwable - */ - protected function handleBeginTransactionException(Throwable $e) - { - if ($this->causedByLostConnection($e)) { - $this->reconnect(); - - $this->getPdo()->beginTransaction(); - } else { - throw $e; - } - } - - /** - * Commit the active database transaction. - * - * @return void - * - * @throws \Throwable - */ - public function commit() - { - if ($this->transactionLevel() == 1) { - $this->fireConnectionEvent('committing'); - $this->getPdo()->commit(); - } - - [$levelBeingCommitted, $this->transactions] = [ - $this->transactions, - max(0, $this->transactions - 1), - ]; - - $this->transactionsManager?->commit( - $this->getName(), $levelBeingCommitted, $this->transactions - ); - - $this->fireConnectionEvent('committed'); - } - - /** - * Handle an exception encountered when committing a transaction. - * - * @param \Throwable $e - * @param int $currentAttempt - * @param int $maxAttempts - * @return void - * - * @throws \Throwable - */ - protected function handleCommitTransactionException(Throwable $e, $currentAttempt, $maxAttempts) - { - $this->transactions = max(0, $this->transactions - 1); - - if ($this->causedByConcurrencyError($e) && $currentAttempt < $maxAttempts) { - return; - } - - if ($this->causedByLostConnection($e)) { - $this->transactions = 0; - } - - throw $e; - } - - /** - * Rollback the active database transaction. - * - * @param int|null $toLevel - * @return void - * - * @throws \Throwable - */ - public function rollBack($toLevel = null) - { - // We allow developers to rollback to a certain transaction level. We will verify - // that this given transaction level is valid before attempting to rollback to - // that level. If it's not we will just return out and not attempt anything. - $toLevel = is_null($toLevel) - ? $this->transactions - 1 - : $toLevel; - - if ($toLevel < 0 || $toLevel >= $this->transactions) { - return; - } - - // Next, we will actually perform this rollback within this database and fire the - // rollback event. We will also set the current transaction level to the given - // level that was passed into this method so it will be right from here out. - try { - $this->performRollBack($toLevel); - } catch (Throwable $e) { - $this->handleRollBackException($e); - } - - $this->transactions = $toLevel; - - $this->transactionsManager?->rollback( - $this->getName(), $this->transactions - ); - - $this->fireConnectionEvent('rollingBack'); - } - - /** - * Perform a rollback within the database. - * - * @param int $toLevel - * @return void - * - * @throws \Throwable - */ - protected function performRollBack($toLevel) - { - if ($toLevel == 0) { - $pdo = $this->getPdo(); - - if ($pdo->inTransaction()) { - $pdo->rollBack(); - } - } elseif ($this->queryGrammar->supportsSavepoints()) { - $this->getPdo()->exec( - $this->queryGrammar->compileSavepointRollBack('trans'.($toLevel + 1)) - ); - } - } - - /** - * Handle an exception from a rollback. - * - * @param \Throwable $e - * @return void - * - * @throws \Throwable - */ - protected function handleRollBackException(Throwable $e) - { - if ($this->causedByLostConnection($e)) { - $this->transactions = 0; - - $this->transactionsManager?->rollback( - $this->getName(), $this->transactions - ); - } - - throw $e; - } - - /** - * Get the number of active transactions. - * - * @return int - */ - public function transactionLevel() - { - return $this->transactions; - } - - /** - * Execute the callback after a transaction commits. - * - * @param callable $callback - * @return void - * - * @throws \RuntimeException - */ - public function afterCommit($callback) - { - if ($this->transactionsManager) { - return $this->transactionsManager->addCallback($callback); - } - - throw new RuntimeException('Transactions Manager has not been set.'); - } -} diff --git a/vendor/illuminate/database/Concerns/ParsesSearchPath.php b/vendor/illuminate/database/Concerns/ParsesSearchPath.php deleted file mode 100644 index e822c72..0000000 --- a/vendor/illuminate/database/Concerns/ParsesSearchPath.php +++ /dev/null @@ -1,25 +0,0 @@ -pdo = $pdo; - - // First we will setup the default properties. We keep track of the DB - // name we are connected to since it is needed when some reflective - // type commands are run such as checking whether a table exists. - $this->database = $database; - - $this->tablePrefix = $tablePrefix; - - $this->config = $config; - - // We need to initialize a query grammar and the query post processors - // which are both very important parts of the database abstractions - // so we initialize these to their default values while starting. - $this->useDefaultQueryGrammar(); - - $this->useDefaultPostProcessor(); - } - - /** - * Set the query grammar to the default implementation. - * - * @return void - */ - public function useDefaultQueryGrammar() - { - $this->queryGrammar = $this->getDefaultQueryGrammar(); - } - - /** - * Get the default query grammar instance. - * - * @return \Illuminate\Database\Query\Grammars\Grammar - */ - protected function getDefaultQueryGrammar() - { - ($grammar = new QueryGrammar)->setConnection($this); - - return $grammar; - } - - /** - * Set the schema grammar to the default implementation. - * - * @return void - */ - public function useDefaultSchemaGrammar() - { - $this->schemaGrammar = $this->getDefaultSchemaGrammar(); - } - - /** - * Get the default schema grammar instance. - * - * @return \Illuminate\Database\Schema\Grammars\Grammar|null - */ - protected function getDefaultSchemaGrammar() - { - // - } - - /** - * Set the query post processor to the default implementation. - * - * @return void - */ - public function useDefaultPostProcessor() - { - $this->postProcessor = $this->getDefaultPostProcessor(); - } - - /** - * Get the default post processor instance. - * - * @return \Illuminate\Database\Query\Processors\Processor - */ - protected function getDefaultPostProcessor() - { - return new Processor; - } - - /** - * Get a schema builder instance for the connection. - * - * @return \Illuminate\Database\Schema\Builder - */ - public function getSchemaBuilder() - { - if (is_null($this->schemaGrammar)) { - $this->useDefaultSchemaGrammar(); - } - - return new SchemaBuilder($this); - } - - /** - * Begin a fluent query against a database table. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Contracts\Database\Query\Expression|string $table - * @param string|null $as - * @return \Illuminate\Database\Query\Builder - */ - public function table($table, $as = null) - { - return $this->query()->from($table, $as); - } - - /** - * Get a new query builder instance. - * - * @return \Illuminate\Database\Query\Builder - */ - public function query() - { - return new QueryBuilder( - $this, $this->getQueryGrammar(), $this->getPostProcessor() - ); - } - - /** - * Run a select statement and return a single result. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return mixed - */ - public function selectOne($query, $bindings = [], $useReadPdo = true) - { - $records = $this->select($query, $bindings, $useReadPdo); - - return array_shift($records); - } - - /** - * Run a select statement and return the first column of the first row. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return mixed - * - * @throws \Illuminate\Database\MultipleColumnsSelectedException - */ - public function scalar($query, $bindings = [], $useReadPdo = true) - { - $record = $this->selectOne($query, $bindings, $useReadPdo); - - if (is_null($record)) { - return null; - } - - $record = (array) $record; - - if (count($record) > 1) { - throw new MultipleColumnsSelectedException; - } - - return reset($record); - } - - /** - * Run a select statement against the database. - * - * @param string $query - * @param array $bindings - * @return array - */ - public function selectFromWriteConnection($query, $bindings = []) - { - return $this->select($query, $bindings, false); - } - - /** - * Run a select statement against the database. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return array - */ - public function select($query, $bindings = [], $useReadPdo = true) - { - return $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) { - if ($this->pretending()) { - return []; - } - - // For select statements, we'll simply execute the query and return an array - // of the database result set. Each element in the array will be a single - // row from the database table, and will either be an array or objects. - $statement = $this->prepared( - $this->getPdoForSelect($useReadPdo)->prepare($query) - ); - - $this->bindValues($statement, $this->prepareBindings($bindings)); - - $statement->execute(); - - return $statement->fetchAll(); - }); - } - - /** - * Run a select statement against the database and returns all of the result sets. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return array - */ - public function selectResultSets($query, $bindings = [], $useReadPdo = true) - { - return $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) { - if ($this->pretending()) { - return []; - } - - $statement = $this->prepared( - $this->getPdoForSelect($useReadPdo)->prepare($query) - ); - - $this->bindValues($statement, $this->prepareBindings($bindings)); - - $statement->execute(); - - $sets = []; - - do { - $sets[] = $statement->fetchAll(); - } while ($statement->nextRowset()); - - return $sets; - }); - } - - /** - * Run a select statement against the database and returns a generator. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return \Generator - */ - public function cursor($query, $bindings = [], $useReadPdo = true) - { - $statement = $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) { - if ($this->pretending()) { - return []; - } - - // First we will create a statement for the query. Then, we will set the fetch - // mode and prepare the bindings for the query. Once that's done we will be - // ready to execute the query against the database and return the cursor. - $statement = $this->prepared($this->getPdoForSelect($useReadPdo) - ->prepare($query)); - - $this->bindValues( - $statement, $this->prepareBindings($bindings) - ); - - // Next, we'll execute the query against the database and return the statement - // so we can return the cursor. The cursor will use a PHP generator to give - // back one row at a time without using a bunch of memory to render them. - $statement->execute(); - - return $statement; - }); - - while ($record = $statement->fetch()) { - yield $record; - } - } - - /** - * Configure the PDO prepared statement. - * - * @param \PDOStatement $statement - * @return \PDOStatement - */ - protected function prepared(PDOStatement $statement) - { - $statement->setFetchMode($this->fetchMode); - - $this->event(new StatementPrepared($this, $statement)); - - return $statement; - } - - /** - * Get the PDO connection to use for a select query. - * - * @param bool $useReadPdo - * @return \PDO - */ - protected function getPdoForSelect($useReadPdo = true) - { - return $useReadPdo ? $this->getReadPdo() : $this->getPdo(); - } - - /** - * Run an insert statement against the database. - * - * @param string $query - * @param array $bindings - * @return bool - */ - public function insert($query, $bindings = []) - { - return $this->statement($query, $bindings); - } - - /** - * Run an update statement against the database. - * - * @param string $query - * @param array $bindings - * @return int - */ - public function update($query, $bindings = []) - { - return $this->affectingStatement($query, $bindings); - } - - /** - * Run a delete statement against the database. - * - * @param string $query - * @param array $bindings - * @return int - */ - public function delete($query, $bindings = []) - { - return $this->affectingStatement($query, $bindings); - } - - /** - * Execute an SQL statement and return the boolean result. - * - * @param string $query - * @param array $bindings - * @return bool - */ - public function statement($query, $bindings = []) - { - return $this->run($query, $bindings, function ($query, $bindings) { - if ($this->pretending()) { - return true; - } - - $statement = $this->getPdo()->prepare($query); - - $this->bindValues($statement, $this->prepareBindings($bindings)); - - $this->recordsHaveBeenModified(); - - return $statement->execute(); - }); - } - - /** - * Run an SQL statement and get the number of rows affected. - * - * @param string $query - * @param array $bindings - * @return int - */ - public function affectingStatement($query, $bindings = []) - { - return $this->run($query, $bindings, function ($query, $bindings) { - if ($this->pretending()) { - return 0; - } - - // For update or delete statements, we want to get the number of rows affected - // by the statement and return that back to the developer. We'll first need - // to execute the statement and then we'll use PDO to fetch the affected. - $statement = $this->getPdo()->prepare($query); - - $this->bindValues($statement, $this->prepareBindings($bindings)); - - $statement->execute(); - - $this->recordsHaveBeenModified( - ($count = $statement->rowCount()) > 0 - ); - - return $count; - }); - } - - /** - * Run a raw, unprepared query against the PDO connection. - * - * @param string $query - * @return bool - */ - public function unprepared($query) - { - return $this->run($query, [], function ($query) { - if ($this->pretending()) { - return true; - } - - $this->recordsHaveBeenModified( - $change = $this->getPdo()->exec($query) !== false - ); - - return $change; - }); - } - - /** - * Get the number of open connections for the database. - * - * @return int|null - */ - public function threadCount() - { - $query = $this->getQueryGrammar()->compileThreadCount(); - - return $query ? $this->scalar($query) : null; - } - - /** - * Execute the given callback in "dry run" mode. - * - * @param \Closure $callback - * @return array - */ - public function pretend(Closure $callback) - { - return $this->withFreshQueryLog(function () use ($callback) { - $this->pretending = true; - - // Basically to make the database connection "pretend", we will just return - // the default values for all the query methods, then we will return an - // array of queries that were "executed" within the Closure callback. - $callback($this); - - $this->pretending = false; - - return $this->queryLog; - }); - } - - /** - * Execute the given callback without "pretending". - * - * @param \Closure $callback - * @return mixed - */ - public function withoutPretending(Closure $callback) - { - if (! $this->pretending) { - return $callback(); - } - - $this->pretending = false; - - try { - return $callback(); - } finally { - $this->pretending = true; - } - } - - /** - * Execute the given callback in "dry run" mode. - * - * @param \Closure $callback - * @return array - */ - protected function withFreshQueryLog($callback) - { - $loggingQueries = $this->loggingQueries; - - // First we will back up the value of the logging queries property and then - // we'll be ready to run callbacks. This query log will also get cleared - // so we will have a new log of all the queries that are executed now. - $this->enableQueryLog(); - - $this->queryLog = []; - - // Now we'll execute this callback and capture the result. Once it has been - // executed we will restore the value of query logging and give back the - // value of the callback so the original callers can have the results. - $result = $callback(); - - $this->loggingQueries = $loggingQueries; - - return $result; - } - - /** - * Bind values to their parameters in the given statement. - * - * @param \PDOStatement $statement - * @param array $bindings - * @return void - */ - public function bindValues($statement, $bindings) - { - foreach ($bindings as $key => $value) { - $statement->bindValue( - is_string($key) ? $key : $key + 1, - $value, - match (true) { - is_int($value) => PDO::PARAM_INT, - is_resource($value) => PDO::PARAM_LOB, - default => PDO::PARAM_STR - }, - ); - } - } - - /** - * Prepare the query bindings for execution. - * - * @param array $bindings - * @return array - */ - public function prepareBindings(array $bindings) - { - $grammar = $this->getQueryGrammar(); - - foreach ($bindings as $key => $value) { - // We need to transform all instances of DateTimeInterface into the actual - // date string. Each query grammar maintains its own date string format - // so we'll just ask the grammar for the format to get from the date. - if ($value instanceof DateTimeInterface) { - $bindings[$key] = $value->format($grammar->getDateFormat()); - } elseif (is_bool($value)) { - $bindings[$key] = (int) $value; - } - } - - return $bindings; - } - - /** - * Run a SQL statement and log its execution context. - * - * @param string $query - * @param array $bindings - * @param \Closure $callback - * @return mixed - * - * @throws \Illuminate\Database\QueryException - */ - protected function run($query, $bindings, Closure $callback) - { - foreach ($this->beforeExecutingCallbacks as $beforeExecutingCallback) { - $beforeExecutingCallback($query, $bindings, $this); - } - - $this->reconnectIfMissingConnection(); - - $start = microtime(true); - - // Here we will run this query. If an exception occurs we'll determine if it was - // caused by a connection that has been lost. If that is the cause, we'll try - // to re-establish connection and re-run the query with a fresh connection. - try { - $result = $this->runQueryCallback($query, $bindings, $callback); - } catch (QueryException $e) { - $result = $this->handleQueryException( - $e, $query, $bindings, $callback - ); - } - - // Once we have run the query we will calculate the time that it took to run and - // then log the query, bindings, and execution time so we will report them on - // the event that the developer needs them. We'll log time in milliseconds. - $this->logQuery( - $query, $bindings, $this->getElapsedTime($start) - ); - - return $result; - } - - /** - * Run a SQL statement. - * - * @param string $query - * @param array $bindings - * @param \Closure $callback - * @return mixed - * - * @throws \Illuminate\Database\QueryException - */ - protected function runQueryCallback($query, $bindings, Closure $callback) - { - // To execute the statement, we'll simply call the callback, which will actually - // run the SQL against the PDO connection. Then we can calculate the time it - // took to execute and log the query SQL, bindings and time in our memory. - try { - return $callback($query, $bindings); - } - - // If an exception occurs when attempting to run a query, we'll format the error - // message to include the bindings with SQL, which will make this exception a - // lot more helpful to the developer instead of just the database's errors. - catch (Exception $e) { - if ($this->isUniqueConstraintError($e)) { - throw new UniqueConstraintViolationException( - $this->getName(), $query, $this->prepareBindings($bindings), $e - ); - } - - throw new QueryException( - $this->getName(), $query, $this->prepareBindings($bindings), $e - ); - } - } - - /** - * Determine if the given database exception was caused by a unique constraint violation. - * - * @param \Exception $exception - * @return bool - */ - protected function isUniqueConstraintError(Exception $exception) - { - return false; - } - - /** - * Log a query in the connection's query log. - * - * @param string $query - * @param array $bindings - * @param float|null $time - * @return void - */ - public function logQuery($query, $bindings, $time = null) - { - $this->totalQueryDuration += $time ?? 0.0; - - $this->event(new QueryExecuted($query, $bindings, $time, $this)); - - $query = $this->pretending === true - ? $this->queryGrammar?->substituteBindingsIntoRawSql($query, $bindings) ?? $query - : $query; - - if ($this->loggingQueries) { - $this->queryLog[] = compact('query', 'bindings', 'time'); - } - } - - /** - * Get the elapsed time since a given starting point. - * - * @param float $start - * @return float - */ - protected function getElapsedTime($start) - { - return round((microtime(true) - $start) * 1000, 2); - } - - /** - * Register a callback to be invoked when the connection queries for longer than a given amount of time. - * - * @param \DateTimeInterface|\Carbon\CarbonInterval|float|int $threshold - * @param callable $handler - * @return void - */ - public function whenQueryingForLongerThan($threshold, $handler) - { - $threshold = $threshold instanceof DateTimeInterface - ? $this->secondsUntil($threshold) * 1000 - : $threshold; - - $threshold = $threshold instanceof CarbonInterval - ? $threshold->totalMilliseconds - : $threshold; - - $this->queryDurationHandlers[] = [ - 'has_run' => false, - 'handler' => $handler, - ]; - - $key = count($this->queryDurationHandlers) - 1; - - $this->listen(function ($event) use ($threshold, $handler, $key) { - if (! $this->queryDurationHandlers[$key]['has_run'] && $this->totalQueryDuration() > $threshold) { - $handler($this, $event); - - $this->queryDurationHandlers[$key]['has_run'] = true; - } - }); - } - - /** - * Allow all the query duration handlers to run again, even if they have already run. - * - * @return void - */ - public function allowQueryDurationHandlersToRunAgain() - { - foreach ($this->queryDurationHandlers as $key => $queryDurationHandler) { - $this->queryDurationHandlers[$key]['has_run'] = false; - } - } - - /** - * Get the duration of all run queries in milliseconds. - * - * @return float - */ - public function totalQueryDuration() - { - return $this->totalQueryDuration; - } - - /** - * Reset the duration of all run queries. - * - * @return void - */ - public function resetTotalQueryDuration() - { - $this->totalQueryDuration = 0.0; - } - - /** - * Handle a query exception. - * - * @param \Illuminate\Database\QueryException $e - * @param string $query - * @param array $bindings - * @param \Closure $callback - * @return mixed - * - * @throws \Illuminate\Database\QueryException - */ - protected function handleQueryException(QueryException $e, $query, $bindings, Closure $callback) - { - if ($this->transactions >= 1) { - throw $e; - } - - return $this->tryAgainIfCausedByLostConnection( - $e, $query, $bindings, $callback - ); - } - - /** - * Handle a query exception that occurred during query execution. - * - * @param \Illuminate\Database\QueryException $e - * @param string $query - * @param array $bindings - * @param \Closure $callback - * @return mixed - * - * @throws \Illuminate\Database\QueryException - */ - protected function tryAgainIfCausedByLostConnection(QueryException $e, $query, $bindings, Closure $callback) - { - if ($this->causedByLostConnection($e->getPrevious())) { - $this->reconnect(); - - return $this->runQueryCallback($query, $bindings, $callback); - } - - throw $e; - } - - /** - * Reconnect to the database. - * - * @return mixed|false - * - * @throws \Illuminate\Database\LostConnectionException - */ - public function reconnect() - { - if (is_callable($this->reconnector)) { - return call_user_func($this->reconnector, $this); - } - - throw new LostConnectionException('Lost connection and no reconnector available.'); - } - - /** - * Reconnect to the database if a PDO connection is missing. - * - * @return void - */ - public function reconnectIfMissingConnection() - { - if (is_null($this->pdo)) { - $this->reconnect(); - } - } - - /** - * Disconnect from the underlying PDO connection. - * - * @return void - */ - public function disconnect() - { - $this->setPdo(null)->setReadPdo(null); - } - - /** - * Register a hook to be run just before a database transaction is started. - * - * @param \Closure $callback - * @return $this - */ - public function beforeStartingTransaction(Closure $callback) - { - $this->beforeStartingTransaction[] = $callback; - - return $this; - } - - /** - * Register a hook to be run just before a database query is executed. - * - * @param \Closure $callback - * @return $this - */ - public function beforeExecuting(Closure $callback) - { - $this->beforeExecutingCallbacks[] = $callback; - - return $this; - } - - /** - * Register a database query listener with the connection. - * - * @param \Closure $callback - * @return void - */ - public function listen(Closure $callback) - { - $this->events?->listen(Events\QueryExecuted::class, $callback); - } - - /** - * Fire an event for this connection. - * - * @param string $event - * @return array|null - */ - protected function fireConnectionEvent($event) - { - return $this->events?->dispatch(match ($event) { - 'beganTransaction' => new TransactionBeginning($this), - 'committed' => new TransactionCommitted($this), - 'committing' => new TransactionCommitting($this), - 'rollingBack' => new TransactionRolledBack($this), - default => null, - }); - } - - /** - * Fire the given event if possible. - * - * @param mixed $event - * @return void - */ - protected function event($event) - { - $this->events?->dispatch($event); - } - - /** - * Get a new raw query expression. - * - * @param mixed $value - * @return \Illuminate\Contracts\Database\Query\Expression - */ - public function raw($value) - { - return new Expression($value); - } - - /** - * Escape a value for safe SQL embedding. - * - * @param string|float|int|bool|null $value - * @param bool $binary - * @return string - */ - public function escape($value, $binary = false) - { - if ($value === null) { - return 'null'; - } elseif ($binary) { - return $this->escapeBinary($value); - } elseif (is_int($value) || is_float($value)) { - return (string) $value; - } elseif (is_bool($value)) { - return $this->escapeBool($value); - } elseif (is_array($value)) { - throw new RuntimeException('The database connection does not support escaping arrays.'); - } else { - if (str_contains($value, "\00")) { - throw new RuntimeException('Strings with null bytes cannot be escaped. Use the binary escape option.'); - } - - if (preg_match('//u', $value) === false) { - throw new RuntimeException('Strings with invalid UTF-8 byte sequences cannot be escaped.'); - } - - return $this->escapeString($value); - } - } - - /** - * Escape a string value for safe SQL embedding. - * - * @param string $value - * @return string - */ - protected function escapeString($value) - { - return $this->getReadPdo()->quote($value); - } - - /** - * Escape a boolean value for safe SQL embedding. - * - * @param bool $value - * @return string - */ - protected function escapeBool($value) - { - return $value ? '1' : '0'; - } - - /** - * Escape a binary value for safe SQL embedding. - * - * @param string $value - * @return string - */ - protected function escapeBinary($value) - { - throw new RuntimeException('The database connection does not support escaping binary values.'); - } - - /** - * Determine if the database connection has modified any database records. - * - * @return bool - */ - public function hasModifiedRecords() - { - return $this->recordsModified; - } - - /** - * Indicate if any records have been modified. - * - * @param bool $value - * @return void - */ - public function recordsHaveBeenModified($value = true) - { - if (! $this->recordsModified) { - $this->recordsModified = $value; - } - } - - /** - * Set the record modification state. - * - * @param bool $value - * @return $this - */ - public function setRecordModificationState(bool $value) - { - $this->recordsModified = $value; - - return $this; - } - - /** - * Reset the record modification state. - * - * @return void - */ - public function forgetRecordModificationState() - { - $this->recordsModified = false; - } - - /** - * Indicate that the connection should use the write PDO connection for reads. - * - * @param bool $value - * @return $this - */ - public function useWriteConnectionWhenReading($value = true) - { - $this->readOnWriteConnection = $value; - - return $this; - } - - /** - * Get the current PDO connection. - * - * @return \PDO - */ - public function getPdo() - { - if ($this->pdo instanceof Closure) { - return $this->pdo = call_user_func($this->pdo); - } - - return $this->pdo; - } - - /** - * Get the current PDO connection parameter without executing any reconnect logic. - * - * @return \PDO|\Closure|null - */ - public function getRawPdo() - { - return $this->pdo; - } - - /** - * Get the current PDO connection used for reading. - * - * @return \PDO - */ - public function getReadPdo() - { - if ($this->transactions > 0) { - return $this->getPdo(); - } - - if ($this->readOnWriteConnection || - ($this->recordsModified && $this->getConfig('sticky'))) { - return $this->getPdo(); - } - - if ($this->readPdo instanceof Closure) { - return $this->readPdo = call_user_func($this->readPdo); - } - - return $this->readPdo ?: $this->getPdo(); - } - - /** - * Get the current read PDO connection parameter without executing any reconnect logic. - * - * @return \PDO|\Closure|null - */ - public function getRawReadPdo() - { - return $this->readPdo; - } - - /** - * Set the PDO connection. - * - * @param \PDO|\Closure|null $pdo - * @return $this - */ - public function setPdo($pdo) - { - $this->transactions = 0; - - $this->pdo = $pdo; - - return $this; - } - - /** - * Set the PDO connection used for reading. - * - * @param \PDO|\Closure|null $pdo - * @return $this - */ - public function setReadPdo($pdo) - { - $this->readPdo = $pdo; - - return $this; - } - - /** - * Set the reconnect instance on the connection. - * - * @param callable $reconnector - * @return $this - */ - public function setReconnector(callable $reconnector) - { - $this->reconnector = $reconnector; - - return $this; - } - - /** - * Get the database connection name. - * - * @return string|null - */ - public function getName() - { - return $this->getConfig('name'); - } - - /** - * Get the database connection full name. - * - * @return string|null - */ - public function getNameWithReadWriteType() - { - return $this->getName().($this->readWriteType ? '::'.$this->readWriteType : ''); - } - - /** - * Get an option from the configuration options. - * - * @param string|null $option - * @return mixed - */ - public function getConfig($option = null) - { - return Arr::get($this->config, $option); - } - - /** - * Get the PDO driver name. - * - * @return string - */ - public function getDriverName() - { - return $this->getConfig('driver'); - } - - /** - * Get a human-readable name for the given connection driver. - * - * @return string - */ - public function getDriverTitle() - { - return $this->getDriverName(); - } - - /** - * Get the query grammar used by the connection. - * - * @return \Illuminate\Database\Query\Grammars\Grammar - */ - public function getQueryGrammar() - { - return $this->queryGrammar; - } - - /** - * Set the query grammar used by the connection. - * - * @param \Illuminate\Database\Query\Grammars\Grammar $grammar - * @return $this - */ - public function setQueryGrammar(Query\Grammars\Grammar $grammar) - { - $this->queryGrammar = $grammar; - - return $this; - } - - /** - * Get the schema grammar used by the connection. - * - * @return \Illuminate\Database\Schema\Grammars\Grammar - */ - public function getSchemaGrammar() - { - return $this->schemaGrammar; - } - - /** - * Set the schema grammar used by the connection. - * - * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar - * @return $this - */ - public function setSchemaGrammar(Schema\Grammars\Grammar $grammar) - { - $this->schemaGrammar = $grammar; - - return $this; - } - - /** - * Get the query post processor used by the connection. - * - * @return \Illuminate\Database\Query\Processors\Processor - */ - public function getPostProcessor() - { - return $this->postProcessor; - } - - /** - * Set the query post processor used by the connection. - * - * @param \Illuminate\Database\Query\Processors\Processor $processor - * @return $this - */ - public function setPostProcessor(Processor $processor) - { - $this->postProcessor = $processor; - - return $this; - } - - /** - * Get the event dispatcher used by the connection. - * - * @return \Illuminate\Contracts\Events\Dispatcher - */ - public function getEventDispatcher() - { - return $this->events; - } - - /** - * Set the event dispatcher instance on the connection. - * - * @param \Illuminate\Contracts\Events\Dispatcher $events - * @return $this - */ - public function setEventDispatcher(Dispatcher $events) - { - $this->events = $events; - - return $this; - } - - /** - * Unset the event dispatcher for this connection. - * - * @return void - */ - public function unsetEventDispatcher() - { - $this->events = null; - } - - /** - * Set the transaction manager instance on the connection. - * - * @param \Illuminate\Database\DatabaseTransactionsManager $manager - * @return $this - */ - public function setTransactionManager($manager) - { - $this->transactionsManager = $manager; - - return $this; - } - - /** - * Unset the transaction manager for this connection. - * - * @return void - */ - public function unsetTransactionManager() - { - $this->transactionsManager = null; - } - - /** - * Determine if the connection is in a "dry run". - * - * @return bool - */ - public function pretending() - { - return $this->pretending === true; - } - - /** - * Get the connection query log. - * - * @return array - */ - public function getQueryLog() - { - return $this->queryLog; - } - - /** - * Get the connection query log with embedded bindings. - * - * @return array - */ - public function getRawQueryLog() - { - return array_map(fn (array $log) => [ - 'raw_query' => $this->queryGrammar->substituteBindingsIntoRawSql( - $log['query'], - $this->prepareBindings($log['bindings']) - ), - 'time' => $log['time'], - ], $this->getQueryLog()); - } - - /** - * Clear the query log. - * - * @return void - */ - public function flushQueryLog() - { - $this->queryLog = []; - } - - /** - * Enable the query log on the connection. - * - * @return void - */ - public function enableQueryLog() - { - $this->loggingQueries = true; - } - - /** - * Disable the query log on the connection. - * - * @return void - */ - public function disableQueryLog() - { - $this->loggingQueries = false; - } - - /** - * Determine whether we're logging queries. - * - * @return bool - */ - public function logging() - { - return $this->loggingQueries; - } - - /** - * Get the name of the connected database. - * - * @return string - */ - public function getDatabaseName() - { - return $this->database; - } - - /** - * Set the name of the connected database. - * - * @param string $database - * @return $this - */ - public function setDatabaseName($database) - { - $this->database = $database; - - return $this; - } - - /** - * Set the read / write type of the connection. - * - * @param string|null $readWriteType - * @return $this - */ - public function setReadWriteType($readWriteType) - { - $this->readWriteType = $readWriteType; - - return $this; - } - - /** - * Get the table prefix for the connection. - * - * @return string - */ - public function getTablePrefix() - { - return $this->tablePrefix; - } - - /** - * Set the table prefix in use by the connection. - * - * @param string $prefix - * @return $this - */ - public function setTablePrefix($prefix) - { - $this->tablePrefix = $prefix; - - $this->getQueryGrammar()->setTablePrefix($prefix); - - return $this; - } - - /** - * Set the table prefix and return the grammar. - * - * @template TGrammar of \Illuminate\Database\Grammar - * - * @param TGrammar $grammar - * @return TGrammar - */ - public function withTablePrefix(Grammar $grammar) - { - $grammar->setTablePrefix($this->tablePrefix); - - return $grammar; - } - - /** - * Execute the given callback without table prefix. - * - * @param \Closure $callback - * @return void - */ - public function withoutTablePrefix(Closure $callback): void - { - $tablePrefix = $this->getTablePrefix(); - - $this->setTablePrefix(''); - - $callback($this); - - $this->setTablePrefix($tablePrefix); - } - - /** - * Get the server version for the connection. - * - * @return string - */ - public function getServerVersion(): string - { - return $this->getPdo()->getAttribute(PDO::ATTR_SERVER_VERSION); - } - - /** - * Register a connection resolver. - * - * @param string $driver - * @param \Closure $callback - * @return void - */ - public static function resolverFor($driver, Closure $callback) - { - static::$resolvers[$driver] = $callback; - } - - /** - * Get the connection resolver for the given driver. - * - * @param string $driver - * @return \Closure|null - */ - public static function getResolver($driver) - { - return static::$resolvers[$driver] ?? null; - } -} diff --git a/vendor/illuminate/database/ConnectionInterface.php b/vendor/illuminate/database/ConnectionInterface.php deleted file mode 100644 index 288adb4..0000000 --- a/vendor/illuminate/database/ConnectionInterface.php +++ /dev/null @@ -1,182 +0,0 @@ - $connections - * @return void - */ - public function __construct(array $connections = []) - { - foreach ($connections as $name => $connection) { - $this->addConnection($name, $connection); - } - } - - /** - * Get a database connection instance. - * - * @param string|null $name - * @return \Illuminate\Database\ConnectionInterface - */ - public function connection($name = null) - { - if (is_null($name)) { - $name = $this->getDefaultConnection(); - } - - return $this->connections[$name]; - } - - /** - * Add a connection to the resolver. - * - * @param string $name - * @param \Illuminate\Database\ConnectionInterface $connection - * @return void - */ - public function addConnection($name, ConnectionInterface $connection) - { - $this->connections[$name] = $connection; - } - - /** - * Check if a connection has been registered. - * - * @param string $name - * @return bool - */ - public function hasConnection($name) - { - return isset($this->connections[$name]); - } - - /** - * Get the default connection name. - * - * @return string - */ - public function getDefaultConnection() - { - return $this->default; - } - - /** - * Set the default connection name. - * - * @param string $name - * @return void - */ - public function setDefaultConnection($name) - { - $this->default = $name; - } -} diff --git a/vendor/illuminate/database/ConnectionResolverInterface.php b/vendor/illuminate/database/ConnectionResolverInterface.php deleted file mode 100644 index b31e5a7..0000000 --- a/vendor/illuminate/database/ConnectionResolverInterface.php +++ /dev/null @@ -1,29 +0,0 @@ -container = $container; - } - - /** - * Establish a PDO connection based on the configuration. - * - * @param array $config - * @param string|null $name - * @return \Illuminate\Database\Connection - */ - public function make(array $config, $name = null) - { - $config = $this->parseConfig($config, $name); - - if (isset($config['read'])) { - return $this->createReadWriteConnection($config); - } - - return $this->createSingleConnection($config); - } - - /** - * Parse and prepare the database configuration. - * - * @param array $config - * @param string $name - * @return array - */ - protected function parseConfig(array $config, $name) - { - return Arr::add(Arr::add($config, 'prefix', ''), 'name', $name); - } - - /** - * Create a single database connection instance. - * - * @param array $config - * @return \Illuminate\Database\Connection - */ - protected function createSingleConnection(array $config) - { - $pdo = $this->createPdoResolver($config); - - return $this->createConnection( - $config['driver'], $pdo, $config['database'], $config['prefix'], $config - ); - } - - /** - * Create a read / write database connection instance. - * - * @param array $config - * @return \Illuminate\Database\Connection - */ - protected function createReadWriteConnection(array $config) - { - $connection = $this->createSingleConnection($this->getWriteConfig($config)); - - return $connection->setReadPdo($this->createReadPdo($config)); - } - - /** - * Create a new PDO instance for reading. - * - * @param array $config - * @return \Closure - */ - protected function createReadPdo(array $config) - { - return $this->createPdoResolver($this->getReadConfig($config)); - } - - /** - * Get the read configuration for a read / write connection. - * - * @param array $config - * @return array - */ - protected function getReadConfig(array $config) - { - return $this->mergeReadWriteConfig( - $config, $this->getReadWriteConfig($config, 'read') - ); - } - - /** - * Get the write configuration for a read / write connection. - * - * @param array $config - * @return array - */ - protected function getWriteConfig(array $config) - { - return $this->mergeReadWriteConfig( - $config, $this->getReadWriteConfig($config, 'write') - ); - } - - /** - * Get a read / write level configuration. - * - * @param array $config - * @param string $type - * @return array - */ - protected function getReadWriteConfig(array $config, $type) - { - return isset($config[$type][0]) - ? Arr::random($config[$type]) - : $config[$type]; - } - - /** - * Merge a configuration for a read / write connection. - * - * @param array $config - * @param array $merge - * @return array - */ - protected function mergeReadWriteConfig(array $config, array $merge) - { - return Arr::except(array_merge($config, $merge), ['read', 'write']); - } - - /** - * Create a new Closure that resolves to a PDO instance. - * - * @param array $config - * @return \Closure - */ - protected function createPdoResolver(array $config) - { - return array_key_exists('host', $config) - ? $this->createPdoResolverWithHosts($config) - : $this->createPdoResolverWithoutHosts($config); - } - - /** - * Create a new Closure that resolves to a PDO instance with a specific host or an array of hosts. - * - * @param array $config - * @return \Closure - * - * @throws \PDOException - */ - protected function createPdoResolverWithHosts(array $config) - { - return function () use ($config) { - foreach (Arr::shuffle($this->parseHosts($config)) as $host) { - $config['host'] = $host; - - try { - return $this->createConnector($config)->connect($config); - } catch (PDOException $e) { - continue; - } - } - - if (isset($e)) { - throw $e; - } - }; - } - - /** - * Parse the hosts configuration item into an array. - * - * @param array $config - * @return array - * - * @throws \InvalidArgumentException - */ - protected function parseHosts(array $config) - { - $hosts = Arr::wrap($config['host']); - - if (empty($hosts)) { - throw new InvalidArgumentException('Database hosts array is empty.'); - } - - return $hosts; - } - - /** - * Create a new Closure that resolves to a PDO instance where there is no configured host. - * - * @param array $config - * @return \Closure - */ - protected function createPdoResolverWithoutHosts(array $config) - { - return fn () => $this->createConnector($config)->connect($config); - } - - /** - * Create a connector instance based on the configuration. - * - * @param array $config - * @return \Illuminate\Database\Connectors\ConnectorInterface - * - * @throws \InvalidArgumentException - */ - public function createConnector(array $config) - { - if (! isset($config['driver'])) { - throw new InvalidArgumentException('A driver must be specified.'); - } - - if ($this->container->bound($key = "db.connector.{$config['driver']}")) { - return $this->container->make($key); - } - - return match ($config['driver']) { - 'mysql' => new MySqlConnector, - 'mariadb' => new MariaDbConnector, - 'pgsql' => new PostgresConnector, - 'sqlite' => new SQLiteConnector, - 'sqlsrv' => new SqlServerConnector, - default => throw new InvalidArgumentException("Unsupported driver [{$config['driver']}]."), - }; - } - - /** - * Create a new connection instance. - * - * @param string $driver - * @param \PDO|\Closure $connection - * @param string $database - * @param string $prefix - * @param array $config - * @return \Illuminate\Database\Connection - * - * @throws \InvalidArgumentException - */ - protected function createConnection($driver, $connection, $database, $prefix = '', array $config = []) - { - if ($resolver = Connection::getResolver($driver)) { - return $resolver($connection, $database, $prefix, $config); - } - - return match ($driver) { - 'mysql' => new MySqlConnection($connection, $database, $prefix, $config), - 'mariadb' => new MariaDbConnection($connection, $database, $prefix, $config), - 'pgsql' => new PostgresConnection($connection, $database, $prefix, $config), - 'sqlite' => new SQLiteConnection($connection, $database, $prefix, $config), - 'sqlsrv' => new SqlServerConnection($connection, $database, $prefix, $config), - default => throw new InvalidArgumentException("Unsupported driver [{$driver}]."), - }; - } -} diff --git a/vendor/illuminate/database/Connectors/Connector.php b/vendor/illuminate/database/Connectors/Connector.php deleted file mode 100644 index a40bd2c..0000000 --- a/vendor/illuminate/database/Connectors/Connector.php +++ /dev/null @@ -1,124 +0,0 @@ - PDO::CASE_NATURAL, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, - PDO::ATTR_STRINGIFY_FETCHES => false, - PDO::ATTR_EMULATE_PREPARES => false, - ]; - - /** - * Create a new PDO connection. - * - * @param string $dsn - * @param array $config - * @param array $options - * @return \PDO - * - * @throws \Exception - */ - public function createConnection($dsn, array $config, array $options) - { - [$username, $password] = [ - $config['username'] ?? null, $config['password'] ?? null, - ]; - - try { - return $this->createPdoConnection( - $dsn, $username, $password, $options - ); - } catch (Exception $e) { - return $this->tryAgainIfCausedByLostConnection( - $e, $dsn, $username, $password, $options - ); - } - } - - /** - * Create a new PDO connection instance. - * - * @param string $dsn - * @param string $username - * @param string $password - * @param array $options - * @return \PDO - */ - protected function createPdoConnection($dsn, $username, #[\SensitiveParameter] $password, $options) - { - return version_compare(phpversion(), '8.4.0', '<') - ? new PDO($dsn, $username, $password, $options) - : PDO::connect($dsn, $username, $password, $options); /** @phpstan-ignore staticMethod.notFound (PHP 8.4) */ - } - - /** - * Handle an exception that occurred during connect execution. - * - * @param \Throwable $e - * @param string $dsn - * @param string $username - * @param string $password - * @param array $options - * @return \PDO - * - * @throws \Throwable - */ - protected function tryAgainIfCausedByLostConnection(Throwable $e, $dsn, $username, #[\SensitiveParameter] $password, $options) - { - if ($this->causedByLostConnection($e)) { - return $this->createPdoConnection($dsn, $username, $password, $options); - } - - throw $e; - } - - /** - * Get the PDO options based on the configuration. - * - * @param array $config - * @return array - */ - public function getOptions(array $config) - { - $options = $config['options'] ?? []; - - return array_diff_key($this->options, $options) + $options; - } - - /** - * Get the default PDO connection options. - * - * @return array - */ - public function getDefaultOptions() - { - return $this->options; - } - - /** - * Set the default PDO connection options. - * - * @param array $options - * @return void - */ - public function setDefaultOptions(array $options) - { - $this->options = $options; - } -} diff --git a/vendor/illuminate/database/Connectors/ConnectorInterface.php b/vendor/illuminate/database/Connectors/ConnectorInterface.php deleted file mode 100644 index 08597ac..0000000 --- a/vendor/illuminate/database/Connectors/ConnectorInterface.php +++ /dev/null @@ -1,14 +0,0 @@ -getDsn($config); - - $options = $this->getOptions($config); - - // We need to grab the PDO options that should be used while making the brand - // new connection instance. The PDO options control various aspects of the - // connection's behavior, and some might be specified by the developers. - $connection = $this->createConnection($dsn, $config, $options); - - if (! empty($config['database']) && - (! isset($config['use_db_after_connecting']) || - $config['use_db_after_connecting'])) { - $connection->exec("use `{$config['database']}`;"); - } - - $this->configureConnection($connection, $config); - - return $connection; - } - - /** - * Create a DSN string from a configuration. - * - * Chooses socket or host/port based on the 'unix_socket' config value. - * - * @param array $config - * @return string - */ - protected function getDsn(array $config) - { - return $this->hasSocket($config) - ? $this->getSocketDsn($config) - : $this->getHostDsn($config); - } - - /** - * Determine if the given configuration array has a UNIX socket value. - * - * @param array $config - * @return bool - */ - protected function hasSocket(array $config) - { - return isset($config['unix_socket']) && ! empty($config['unix_socket']); - } - - /** - * Get the DSN string for a socket configuration. - * - * @param array $config - * @return string - */ - protected function getSocketDsn(array $config) - { - return "mysql:unix_socket={$config['unix_socket']};dbname={$config['database']}"; - } - - /** - * Get the DSN string for a host / port configuration. - * - * @param array $config - * @return string - */ - protected function getHostDsn(array $config) - { - return isset($config['port']) - ? "mysql:host={$config['host']};port={$config['port']};dbname={$config['database']}" - : "mysql:host={$config['host']};dbname={$config['database']}"; - } - - /** - * Configure the given PDO connection. - * - * @param \PDO $connection - * @param array $config - * @return void - */ - protected function configureConnection(PDO $connection, array $config) - { - if (isset($config['isolation_level'])) { - $connection->exec(sprintf('SET SESSION TRANSACTION ISOLATION LEVEL %s;', $config['isolation_level'])); - } - - $statements = []; - - if (isset($config['charset'])) { - if (isset($config['collation'])) { - $statements[] = sprintf("NAMES '%s' COLLATE '%s'", $config['charset'], $config['collation']); - } else { - $statements[] = sprintf("NAMES '%s'", $config['charset']); - } - } - - if (isset($config['timezone'])) { - $statements[] = sprintf("time_zone='%s'", $config['timezone']); - } - - $sqlMode = $this->getSqlMode($connection, $config); - - if ($sqlMode !== null) { - $statements[] = sprintf("SESSION sql_mode='%s'", $sqlMode); - } - - if ($statements !== []) { - $connection->exec(sprintf('SET %s;', implode(', ', $statements))); - } - } - - /** - * Get the sql_mode value. - * - * @param \PDO $connection - * @param array $config - * @return string|null - */ - protected function getSqlMode(PDO $connection, array $config) - { - if (isset($config['modes'])) { - return implode(',', $config['modes']); - } - - if (! isset($config['strict'])) { - return null; - } - - if (! $config['strict']) { - return 'NO_ENGINE_SUBSTITUTION'; - } - - $version = $config['version'] ?? $connection->getAttribute(PDO::ATTR_SERVER_VERSION); - - if (version_compare($version, '8.0.11') >= 0) { - return 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; - } - - return 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; - } -} diff --git a/vendor/illuminate/database/Connectors/PostgresConnector.php b/vendor/illuminate/database/Connectors/PostgresConnector.php deleted file mode 100644 index 31d2ff4..0000000 --- a/vendor/illuminate/database/Connectors/PostgresConnector.php +++ /dev/null @@ -1,187 +0,0 @@ - PDO::CASE_NATURAL, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, - PDO::ATTR_STRINGIFY_FETCHES => false, - ]; - - /** - * Establish a database connection. - * - * @param array $config - * @return \PDO - */ - public function connect(array $config) - { - // First we'll create the basic DSN and connection instance connecting to the - // using the configuration option specified by the developer. We will also - // set the default character set on the connections to UTF-8 by default. - $connection = $this->createConnection( - $this->getDsn($config), $config, $this->getOptions($config) - ); - - $this->configureIsolationLevel($connection, $config); - - // Next, we will check to see if a timezone has been specified in this config - // and if it has we will issue a statement to modify the timezone with the - // database. Setting this DB timezone is an optional configuration item. - $this->configureTimezone($connection, $config); - - $this->configureSearchPath($connection, $config); - - $this->configureSynchronousCommit($connection, $config); - - return $connection; - } - - /** - * Create a DSN string from a configuration. - * - * @param array $config - * @return string - */ - protected function getDsn(array $config) - { - // First we will create the basic DSN setup as well as the port if it is in - // in the configuration options. This will give us the basic DSN we will - // need to establish the PDO connections and return them back for use. - extract($config, EXTR_SKIP); - - $host = isset($host) ? "host={$host};" : ''; - - // Sometimes - users may need to connect to a database that has a different - // name than the database used for "information_schema" queries. This is - // typically the case if using "pgbouncer" type software when pooling. - $database = $connect_via_database ?? $database ?? null; - $port = $connect_via_port ?? $port ?? null; - - $dsn = "pgsql:{$host}dbname='{$database}'"; - - // If a port was specified, we will add it to this Postgres DSN connections - // format. Once we have done that we are ready to return this connection - // string back out for usage, as this has been fully constructed here. - if (! is_null($port)) { - $dsn .= ";port={$port}"; - } - - if (isset($charset)) { - $dsn .= ";client_encoding='{$charset}'"; - } - - // Postgres allows an application_name to be set by the user and this name is - // used to when monitoring the application with pg_stat_activity. So we'll - // determine if the option has been specified and run a statement if so. - if (isset($application_name)) { - $dsn .= ";application_name='".str_replace("'", "\'", $application_name)."'"; - } - - return $this->addSslOptions($dsn, $config); - } - - /** - * Add the SSL options to the DSN. - * - * @param string $dsn - * @param array $config - * @return string - */ - protected function addSslOptions($dsn, array $config) - { - foreach (['sslmode', 'sslcert', 'sslkey', 'sslrootcert'] as $option) { - if (isset($config[$option])) { - $dsn .= ";{$option}={$config[$option]}"; - } - } - - return $dsn; - } - - /** - * Set the connection transaction isolation level. - * - * @param \PDO $connection - * @param array $config - * @return void - */ - protected function configureIsolationLevel($connection, array $config) - { - if (isset($config['isolation_level'])) { - $connection->prepare("set session characteristics as transaction isolation level {$config['isolation_level']}")->execute(); - } - } - - /** - * Set the timezone on the connection. - * - * @param \PDO $connection - * @param array $config - * @return void - */ - protected function configureTimezone($connection, array $config) - { - if (isset($config['timezone'])) { - $timezone = $config['timezone']; - - $connection->prepare("set time zone '{$timezone}'")->execute(); - } - } - - /** - * Set the "search_path" on the database connection. - * - * @param \PDO $connection - * @param array $config - * @return void - */ - protected function configureSearchPath($connection, $config) - { - if (isset($config['search_path']) || isset($config['schema'])) { - $searchPath = $this->quoteSearchPath( - $this->parseSearchPath($config['search_path'] ?? $config['schema']) - ); - - $connection->prepare("set search_path to {$searchPath}")->execute(); - } - } - - /** - * Format the search path for the DSN. - * - * @param array $searchPath - * @return string - */ - protected function quoteSearchPath($searchPath) - { - return count($searchPath) === 1 ? '"'.$searchPath[0].'"' : '"'.implode('", "', $searchPath).'"'; - } - - /** - * Configure the synchronous_commit setting. - * - * @param \PDO $connection - * @param array $config - * @return void - */ - protected function configureSynchronousCommit($connection, array $config) - { - if (isset($config['synchronous_commit'])) { - $connection->prepare("set synchronous_commit to '{$config['synchronous_commit']}'")->execute(); - } - } -} diff --git a/vendor/illuminate/database/Connectors/SQLiteConnector.php b/vendor/illuminate/database/Connectors/SQLiteConnector.php deleted file mode 100644 index 8ffdd81..0000000 --- a/vendor/illuminate/database/Connectors/SQLiteConnector.php +++ /dev/null @@ -1,42 +0,0 @@ -getOptions($config); - - // SQLite supports "in-memory" databases that only last as long as the owning - // connection does. These are useful for tests or for short lifetime store - // querying. In-memory databases shall be anonymous (:memory:) or named. - if ($config['database'] === ':memory:' || - str_contains($config['database'], '?mode=memory') || - str_contains($config['database'], '&mode=memory') - ) { - return $this->createConnection('sqlite:'.$config['database'], $config, $options); - } - - $path = realpath($config['database']) ?: realpath(base_path($config['database'])); - - // Here we'll verify that the SQLite database exists before going any further - // as the developer probably wants to know if the database exists and this - // SQLite driver will not throw any exception if it does not by default. - if ($path === false) { - throw new SQLiteDatabaseDoesNotExistException($config['database']); - } - - return $this->createConnection("sqlite:{$path}", $config, $options); - } -} diff --git a/vendor/illuminate/database/Connectors/SqlServerConnector.php b/vendor/illuminate/database/Connectors/SqlServerConnector.php deleted file mode 100644 index b6ed47d..0000000 --- a/vendor/illuminate/database/Connectors/SqlServerConnector.php +++ /dev/null @@ -1,233 +0,0 @@ - PDO::CASE_NATURAL, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, - PDO::ATTR_STRINGIFY_FETCHES => false, - ]; - - /** - * Establish a database connection. - * - * @param array $config - * @return \PDO - */ - public function connect(array $config) - { - $options = $this->getOptions($config); - - $connection = $this->createConnection($this->getDsn($config), $config, $options); - - $this->configureIsolationLevel($connection, $config); - - return $connection; - } - - /** - * Set the connection transaction isolation level. - * - * https://learn.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql - * - * @param \PDO $connection - * @param array $config - * @return void - */ - protected function configureIsolationLevel($connection, array $config) - { - if (! isset($config['isolation_level'])) { - return; - } - - $connection->prepare( - "SET TRANSACTION ISOLATION LEVEL {$config['isolation_level']}" - )->execute(); - } - - /** - * Create a DSN string from a configuration. - * - * @param array $config - * @return string - */ - protected function getDsn(array $config) - { - // First we will create the basic DSN setup as well as the port if it is in - // in the configuration options. This will give us the basic DSN we will - // need to establish the PDO connections and return them back for use. - if ($this->prefersOdbc($config)) { - return $this->getOdbcDsn($config); - } - - if (in_array('sqlsrv', $this->getAvailableDrivers())) { - return $this->getSqlSrvDsn($config); - } else { - return $this->getDblibDsn($config); - } - } - - /** - * Determine if the database configuration prefers ODBC. - * - * @param array $config - * @return bool - */ - protected function prefersOdbc(array $config) - { - return in_array('odbc', $this->getAvailableDrivers()) && - ($config['odbc'] ?? null) === true; - } - - /** - * Get the DSN string for a DbLib connection. - * - * @param array $config - * @return string - */ - protected function getDblibDsn(array $config) - { - return $this->buildConnectString('dblib', array_merge([ - 'host' => $this->buildHostString($config, ':'), - 'dbname' => $config['database'], - ], Arr::only($config, ['appname', 'charset', 'version']))); - } - - /** - * Get the DSN string for an ODBC connection. - * - * @param array $config - * @return string - */ - protected function getOdbcDsn(array $config) - { - return isset($config['odbc_datasource_name']) - ? 'odbc:'.$config['odbc_datasource_name'] : ''; - } - - /** - * Get the DSN string for a SqlSrv connection. - * - * @param array $config - * @return string - */ - protected function getSqlSrvDsn(array $config) - { - $arguments = [ - 'Server' => $this->buildHostString($config, ','), - ]; - - if (isset($config['database'])) { - $arguments['Database'] = $config['database']; - } - - if (isset($config['readonly'])) { - $arguments['ApplicationIntent'] = 'ReadOnly'; - } - - if (isset($config['pooling']) && $config['pooling'] === false) { - $arguments['ConnectionPooling'] = '0'; - } - - if (isset($config['appname'])) { - $arguments['APP'] = $config['appname']; - } - - if (isset($config['encrypt'])) { - $arguments['Encrypt'] = $config['encrypt']; - } - - if (isset($config['trust_server_certificate'])) { - $arguments['TrustServerCertificate'] = $config['trust_server_certificate']; - } - - if (isset($config['multiple_active_result_sets']) && $config['multiple_active_result_sets'] === false) { - $arguments['MultipleActiveResultSets'] = 'false'; - } - - if (isset($config['transaction_isolation'])) { - $arguments['TransactionIsolation'] = $config['transaction_isolation']; - } - - if (isset($config['multi_subnet_failover'])) { - $arguments['MultiSubnetFailover'] = $config['multi_subnet_failover']; - } - - if (isset($config['column_encryption'])) { - $arguments['ColumnEncryption'] = $config['column_encryption']; - } - - if (isset($config['key_store_authentication'])) { - $arguments['KeyStoreAuthentication'] = $config['key_store_authentication']; - } - - if (isset($config['key_store_principal_id'])) { - $arguments['KeyStorePrincipalId'] = $config['key_store_principal_id']; - } - - if (isset($config['key_store_secret'])) { - $arguments['KeyStoreSecret'] = $config['key_store_secret']; - } - - if (isset($config['login_timeout'])) { - $arguments['LoginTimeout'] = $config['login_timeout']; - } - - if (isset($config['authentication'])) { - $arguments['Authentication'] = $config['authentication']; - } - - return $this->buildConnectString('sqlsrv', $arguments); - } - - /** - * Build a connection string from the given arguments. - * - * @param string $driver - * @param array $arguments - * @return string - */ - protected function buildConnectString($driver, array $arguments) - { - return $driver.':'.implode(';', array_map(function ($key) use ($arguments) { - return sprintf('%s=%s', $key, $arguments[$key]); - }, array_keys($arguments))); - } - - /** - * Build a host string from the given configuration. - * - * @param array $config - * @param string $separator - * @return string - */ - protected function buildHostString(array $config, $separator) - { - if (empty($config['port'])) { - return $config['host']; - } - - return $config['host'].$separator.$config['port']; - } - - /** - * Get the available PDO drivers. - * - * @return array - */ - protected function getAvailableDrivers() - { - return PDO::getAvailableDrivers(); - } -} diff --git a/vendor/illuminate/database/Console/DatabaseInspectionCommand.php b/vendor/illuminate/database/Console/DatabaseInspectionCommand.php deleted file mode 100644 index 00fc925..0000000 --- a/vendor/illuminate/database/Console/DatabaseInspectionCommand.php +++ /dev/null @@ -1,66 +0,0 @@ -getDriverTitle(); - } - - /** - * Get the number of open connections for a database. - * - * @param \Illuminate\Database\ConnectionInterface $connection - * @return int|null - * - * @deprecated - */ - protected function getConnectionCount(ConnectionInterface $connection) - { - return $connection->threadCount(); - } - - /** - * Get the connection configuration details for the given connection. - * - * @param string|null $database - * @return array - */ - protected function getConfigFromDatabase($database) - { - $database ??= config('database.default'); - - return Arr::except(config('database.connections.'.$database), ['password']); - } - - /** - * Remove the table prefix from a table name, if it exists. - * - * @param \Illuminate\Database\ConnectionInterface $connection - * @param string $table - * @return string - */ - protected function withoutTablePrefix(ConnectionInterface $connection, string $table) - { - $prefix = $connection->getTablePrefix(); - - return str_starts_with($table, $prefix) - ? substr($table, strlen($prefix)) - : $table; - } -} diff --git a/vendor/illuminate/database/Console/DbCommand.php b/vendor/illuminate/database/Console/DbCommand.php deleted file mode 100644 index 36b6db3..0000000 --- a/vendor/illuminate/database/Console/DbCommand.php +++ /dev/null @@ -1,251 +0,0 @@ -getConnection(); - - if (! isset($connection['host']) && $connection['driver'] !== 'sqlite') { - $this->components->error('No host specified for this database connection.'); - $this->line(' Use the [--read] and [--write] options to specify a read or write connection.'); - $this->newLine(); - - return Command::FAILURE; - } - - try { - (new Process( - array_merge([$command = $this->getCommand($connection)], $this->commandArguments($connection)), - null, - $this->commandEnvironment($connection) - ))->setTimeout(null)->setTty(true)->mustRun(function ($type, $buffer) { - $this->output->write($buffer); - }); - } catch (ProcessFailedException $e) { - throw_unless($e->getProcess()->getExitCode() === 127, $e); - - $this->error("{$command} not found in path."); - - return Command::FAILURE; - } - - return 0; - } - - /** - * Get the database connection configuration. - * - * @return array - * - * @throws \UnexpectedValueException - */ - public function getConnection() - { - $connection = $this->laravel['config']['database.connections.'. - (($db = $this->argument('connection')) ?? $this->laravel['config']['database.default']) - ]; - - if (empty($connection)) { - throw new UnexpectedValueException("Invalid database connection [{$db}]."); - } - - if (! empty($connection['url'])) { - $connection = (new ConfigurationUrlParser)->parseConfiguration($connection); - } - - if ($this->option('read')) { - if (is_array($connection['read']['host'])) { - $connection['read']['host'] = $connection['read']['host'][0]; - } - - $connection = array_merge($connection, $connection['read']); - } elseif ($this->option('write')) { - if (is_array($connection['write']['host'])) { - $connection['write']['host'] = $connection['write']['host'][0]; - } - - $connection = array_merge($connection, $connection['write']); - } - - return $connection; - } - - /** - * Get the arguments for the database client command. - * - * @param array $connection - * @return array - */ - public function commandArguments(array $connection) - { - $driver = ucfirst($connection['driver']); - - return $this->{"get{$driver}Arguments"}($connection); - } - - /** - * Get the environment variables for the database client command. - * - * @param array $connection - * @return array|null - */ - public function commandEnvironment(array $connection) - { - $driver = ucfirst($connection['driver']); - - if (method_exists($this, "get{$driver}Environment")) { - return $this->{"get{$driver}Environment"}($connection); - } - - return null; - } - - /** - * Get the database client command to run. - * - * @param array $connection - * @return string - */ - public function getCommand(array $connection) - { - return [ - 'mysql' => 'mysql', - 'mariadb' => 'mysql', - 'pgsql' => 'psql', - 'sqlite' => 'sqlite3', - 'sqlsrv' => 'sqlcmd', - ][$connection['driver']]; - } - - /** - * Get the arguments for the MySQL CLI. - * - * @param array $connection - * @return array - */ - protected function getMysqlArguments(array $connection) - { - return array_merge([ - '--host='.$connection['host'], - '--port='.$connection['port'], - '--user='.$connection['username'], - ], $this->getOptionalArguments([ - 'password' => '--password='.$connection['password'], - 'unix_socket' => '--socket='.($connection['unix_socket'] ?? ''), - 'charset' => '--default-character-set='.($connection['charset'] ?? ''), - ], $connection), [$connection['database']]); - } - - /** - * Get the arguments for the MariaDB CLI. - * - * @param array $connection - * @return array - */ - protected function getMariaDbArguments(array $connection) - { - return $this->getMysqlArguments($connection); - } - - /** - * Get the arguments for the Postgres CLI. - * - * @param array $connection - * @return array - */ - protected function getPgsqlArguments(array $connection) - { - return [$connection['database']]; - } - - /** - * Get the arguments for the SQLite CLI. - * - * @param array $connection - * @return array - */ - protected function getSqliteArguments(array $connection) - { - return [$connection['database']]; - } - - /** - * Get the arguments for the SQL Server CLI. - * - * @param array $connection - * @return array - */ - protected function getSqlsrvArguments(array $connection) - { - return array_merge(...$this->getOptionalArguments([ - 'database' => ['-d', $connection['database']], - 'username' => ['-U', $connection['username']], - 'password' => ['-P', $connection['password']], - 'host' => ['-S', 'tcp:'.$connection['host'] - .($connection['port'] ? ','.$connection['port'] : ''), ], - 'trust_server_certificate' => ['-C'], - ], $connection)); - } - - /** - * Get the environment variables for the Postgres CLI. - * - * @param array $connection - * @return array|null - */ - protected function getPgsqlEnvironment(array $connection) - { - return array_merge(...$this->getOptionalArguments([ - 'username' => ['PGUSER' => $connection['username']], - 'host' => ['PGHOST' => $connection['host']], - 'port' => ['PGPORT' => $connection['port']], - 'password' => ['PGPASSWORD' => $connection['password']], - ], $connection)); - } - - /** - * Get the optional arguments based on the connection configuration. - * - * @param array $args - * @param array $connection - * @return array - */ - protected function getOptionalArguments(array $args, array $connection) - { - return array_values(array_filter($args, function ($key) use ($connection) { - return ! empty($connection[$key]); - }, ARRAY_FILTER_USE_KEY)); - } -} diff --git a/vendor/illuminate/database/Console/DumpCommand.php b/vendor/illuminate/database/Console/DumpCommand.php deleted file mode 100644 index b27d6c6..0000000 --- a/vendor/illuminate/database/Console/DumpCommand.php +++ /dev/null @@ -1,97 +0,0 @@ -connection($database = $this->input->getOption('database')); - - $this->schemaState($connection)->dump( - $connection, $path = $this->path($connection) - ); - - $dispatcher->dispatch(new SchemaDumped($connection, $path)); - - $info = 'Database schema dumped'; - - if ($this->option('prune')) { - (new Filesystem)->deleteDirectory( - $path = database_path('migrations'), $preserve = false - ); - - $info .= ' and pruned'; - - $dispatcher->dispatch(new MigrationsPruned($connection, $path)); - } - - $this->components->info($info.' successfully.'); - } - - /** - * Create a schema state instance for the given connection. - * - * @param \Illuminate\Database\Connection $connection - * @return mixed - */ - protected function schemaState(Connection $connection) - { - $migrations = Config::get('database.migrations', 'migrations'); - - $migrationTable = is_array($migrations) ? ($migrations['table'] ?? 'migrations') : $migrations; - - return $connection->getSchemaState() - ->withMigrationTable($migrationTable) - ->handleOutputUsing(function ($type, $buffer) { - $this->output->write($buffer); - }); - } - - /** - * Get the path that the dump should be written to. - * - * @param \Illuminate\Database\Connection $connection - */ - protected function path(Connection $connection) - { - return tap($this->option('path') ?: database_path('schema/'.$connection->getName().'-schema.sql'), function ($path) { - (new Filesystem)->ensureDirectoryExists(dirname($path)); - }); - } -} diff --git a/vendor/illuminate/database/Console/Factories/FactoryMakeCommand.php b/vendor/illuminate/database/Console/Factories/FactoryMakeCommand.php deleted file mode 100644 index 495a33c..0000000 --- a/vendor/illuminate/database/Console/Factories/FactoryMakeCommand.php +++ /dev/null @@ -1,144 +0,0 @@ -resolveStubPath('/stubs/factory.stub'); - } - - /** - * Resolve the fully-qualified path to the stub. - * - * @param string $stub - * @return string - */ - protected function resolveStubPath($stub) - { - return file_exists($customPath = $this->laravel->basePath(trim($stub, '/'))) - ? $customPath - : __DIR__.$stub; - } - - /** - * Build the class with the given name. - * - * @param string $name - * @return string - */ - protected function buildClass($name) - { - $factory = class_basename(Str::ucfirst(str_replace('Factory', '', $name))); - - $namespaceModel = $this->option('model') - ? $this->qualifyModel($this->option('model')) - : $this->qualifyModel($this->guessModelName($name)); - - $model = class_basename($namespaceModel); - - $namespace = $this->getNamespace( - Str::replaceFirst($this->rootNamespace(), 'Database\\Factories\\', $this->qualifyClass($this->getNameInput())) - ); - - $replace = [ - '{{ factoryNamespace }}' => $namespace, - 'NamespacedDummyModel' => $namespaceModel, - '{{ namespacedModel }}' => $namespaceModel, - '{{namespacedModel}}' => $namespaceModel, - 'DummyModel' => $model, - '{{ model }}' => $model, - '{{model}}' => $model, - '{{ factory }}' => $factory, - '{{factory}}' => $factory, - ]; - - return str_replace( - array_keys($replace), array_values($replace), parent::buildClass($name) - ); - } - - /** - * Get the destination class path. - * - * @param string $name - * @return string - */ - protected function getPath($name) - { - $name = (new Stringable($name))->replaceFirst($this->rootNamespace(), '')->finish('Factory')->value(); - - return $this->laravel->databasePath().'/factories/'.str_replace('\\', '/', $name).'.php'; - } - - /** - * Guess the model name from the Factory name or return a default model name. - * - * @param string $name - * @return string - */ - protected function guessModelName($name) - { - if (str_ends_with($name, 'Factory')) { - $name = substr($name, 0, -7); - } - - $modelName = $this->qualifyModel(Str::after($name, $this->rootNamespace())); - - if (class_exists($modelName)) { - return $modelName; - } - - if (is_dir(app_path('Models/'))) { - return $this->rootNamespace().'Models\Model'; - } - - return $this->rootNamespace().'Model'; - } - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return [ - ['model', 'm', InputOption::VALUE_OPTIONAL, 'The name of the model'], - ]; - } -} diff --git a/vendor/illuminate/database/Console/Factories/stubs/factory.stub b/vendor/illuminate/database/Console/Factories/stubs/factory.stub deleted file mode 100644 index f931493..0000000 --- a/vendor/illuminate/database/Console/Factories/stubs/factory.stub +++ /dev/null @@ -1,23 +0,0 @@ - - */ -class {{ factory }}Factory extends Factory -{ - /** - * Define the model's default state. - * - * @return array - */ - public function definition(): array - { - return [ - // - ]; - } -} diff --git a/vendor/illuminate/database/Console/Migrations/BaseCommand.php b/vendor/illuminate/database/Console/Migrations/BaseCommand.php deleted file mode 100644 index d2a8aee..0000000 --- a/vendor/illuminate/database/Console/Migrations/BaseCommand.php +++ /dev/null @@ -1,52 +0,0 @@ -input->hasOption('path') && $this->option('path')) { - return (new Collection($this->option('path')))->map(function ($path) { - return ! $this->usingRealPath() - ? $this->laravel->basePath().'/'.$path - : $path; - })->all(); - } - - return array_merge( - $this->migrator->paths(), [$this->getMigrationPath()] - ); - } - - /** - * Determine if the given path(s) are pre-resolved "real" paths. - * - * @return bool - */ - protected function usingRealPath() - { - return $this->input->hasOption('realpath') && $this->option('realpath'); - } - - /** - * Get the path to the migration directory. - * - * @return string - */ - protected function getMigrationPath() - { - return $this->laravel->databasePath().DIRECTORY_SEPARATOR.'migrations'; - } -} diff --git a/vendor/illuminate/database/Console/Migrations/FreshCommand.php b/vendor/illuminate/database/Console/Migrations/FreshCommand.php deleted file mode 100644 index 45900ff..0000000 --- a/vendor/illuminate/database/Console/Migrations/FreshCommand.php +++ /dev/null @@ -1,149 +0,0 @@ -migrator = $migrator; - } - - /** - * Execute the console command. - * - * @return int - */ - public function handle() - { - if ($this->isProhibited() || - ! $this->confirmToProceed()) { - return Command::FAILURE; - } - - $database = $this->input->getOption('database'); - - $this->migrator->usingConnection($database, function () use ($database) { - if ($this->migrator->repositoryExists()) { - $this->newLine(); - - $this->components->task('Dropping all tables', fn () => $this->callSilent('db:wipe', array_filter([ - '--database' => $database, - '--drop-views' => $this->option('drop-views'), - '--drop-types' => $this->option('drop-types'), - '--force' => true, - ])) == 0); - } - }); - - $this->newLine(); - - $this->call('migrate', array_filter([ - '--database' => $database, - '--path' => $this->input->getOption('path'), - '--realpath' => $this->input->getOption('realpath'), - '--schema-path' => $this->input->getOption('schema-path'), - '--force' => true, - '--step' => $this->option('step'), - ])); - - if ($this->laravel->bound(Dispatcher::class)) { - $this->laravel[Dispatcher::class]->dispatch( - new DatabaseRefreshed($database, $this->needsSeeding()) - ); - } - - if ($this->needsSeeding()) { - $this->runSeeder($database); - } - - return 0; - } - - /** - * Determine if the developer has requested database seeding. - * - * @return bool - */ - protected function needsSeeding() - { - return $this->option('seed') || $this->option('seeder'); - } - - /** - * Run the database seeder command. - * - * @param string $database - * @return void - */ - protected function runSeeder($database) - { - $this->call('db:seed', array_filter([ - '--database' => $database, - '--class' => $this->option('seeder') ?: 'Database\\Seeders\\DatabaseSeeder', - '--force' => true, - ])); - } - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return [ - ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to use'], - ['drop-views', null, InputOption::VALUE_NONE, 'Drop all tables and views'], - ['drop-types', null, InputOption::VALUE_NONE, 'Drop all tables and types (Postgres only)'], - ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production'], - ['path', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The path(s) to the migrations files to be executed'], - ['realpath', null, InputOption::VALUE_NONE, 'Indicate any provided migration file paths are pre-resolved absolute paths'], - ['schema-path', null, InputOption::VALUE_OPTIONAL, 'The path to a schema dump file'], - ['seed', null, InputOption::VALUE_NONE, 'Indicates if the seed task should be re-run'], - ['seeder', null, InputOption::VALUE_OPTIONAL, 'The class name of the root seeder'], - ['step', null, InputOption::VALUE_NONE, 'Force the migrations to be run so they can be rolled back individually'], - ]; - } -} diff --git a/vendor/illuminate/database/Console/Migrations/InstallCommand.php b/vendor/illuminate/database/Console/Migrations/InstallCommand.php deleted file mode 100644 index 144ff51..0000000 --- a/vendor/illuminate/database/Console/Migrations/InstallCommand.php +++ /dev/null @@ -1,72 +0,0 @@ -repository = $repository; - } - - /** - * Execute the console command. - * - * @return void - */ - public function handle() - { - $this->repository->setSource($this->input->getOption('database')); - - $this->repository->createRepository(); - - $this->components->info('Migration table created successfully.'); - } - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return [ - ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to use'], - ]; - } -} diff --git a/vendor/illuminate/database/Console/Migrations/MigrateCommand.php b/vendor/illuminate/database/Console/Migrations/MigrateCommand.php deleted file mode 100644 index 6345985..0000000 --- a/vendor/illuminate/database/Console/Migrations/MigrateCommand.php +++ /dev/null @@ -1,342 +0,0 @@ -migrator = $migrator; - $this->dispatcher = $dispatcher; - } - - /** - * Execute the console command. - * - * @return int - */ - public function handle() - { - if (! $this->confirmToProceed()) { - return 1; - } - - try { - $this->runMigrations(); - } catch (Throwable $e) { - if ($this->option('graceful')) { - $this->components->warn($e->getMessage()); - - return 0; - } - - throw $e; - } - - return 0; - } - - /** - * Run the pending migrations. - * - * @return void - */ - protected function runMigrations() - { - $this->migrator->usingConnection($this->option('database'), function () { - $this->prepareDatabase(); - - // Next, we will check to see if a path option has been defined. If it has - // we will use the path relative to the root of this installation folder - // so that migrations may be run for any path within the applications. - $this->migrator->setOutput($this->output) - ->run($this->getMigrationPaths(), [ - 'pretend' => $this->option('pretend'), - 'step' => $this->option('step'), - ]); - - // Finally, if the "seed" option has been given, we will re-run the database - // seed task to re-populate the database, which is convenient when adding - // a migration and a seed at the same time, as it is only this command. - if ($this->option('seed') && ! $this->option('pretend')) { - $this->call('db:seed', [ - '--class' => $this->option('seeder') ?: 'Database\\Seeders\\DatabaseSeeder', - '--force' => true, - ]); - } - }); - } - - /** - * Prepare the migration database for running. - * - * @return void - */ - protected function prepareDatabase() - { - if (! $this->repositoryExists()) { - $this->components->info('Preparing database.'); - - $this->components->task('Creating migration table', function () { - return $this->callSilent('migrate:install', array_filter([ - '--database' => $this->option('database'), - ])) == 0; - }); - - $this->newLine(); - } - - if (! $this->migrator->hasRunAnyMigrations() && ! $this->option('pretend')) { - $this->loadSchemaState(); - } - } - - /** - * Determine if the migrator repository exists. - * - * @return bool - */ - protected function repositoryExists() - { - return retry(2, fn () => $this->migrator->repositoryExists(), 0, function ($e) { - try { - return $this->handleMissingDatabase($e->getPrevious()); - } catch (Throwable) { - return false; - } - }); - } - - /** - * Attempt to create the database if it is missing. - * - * @param \Throwable $e - * @return bool - */ - protected function handleMissingDatabase(Throwable $e) - { - if ($e instanceof SQLiteDatabaseDoesNotExistException) { - return $this->createMissingSqliteDatabase($e->path); - } - - $connection = $this->migrator->resolveConnection($this->option('database')); - - if (! $e instanceof PDOException) { - return false; - } - - if (($e->getCode() === 1049 && in_array($connection->getDriverName(), ['mysql', 'mariadb'])) || - (($e->errorInfo[0] ?? null) == '08006' && - $connection->getDriverName() == 'pgsql' && - Str::contains($e->getMessage(), '"'.$connection->getDatabaseName().'"'))) { - return $this->createMissingMySqlOrPgsqlDatabase($connection); - } - - return false; - } - - /** - * Create a missing SQLite database. - * - * @param string $path - * @return bool - * - * @throws \RuntimeException - */ - protected function createMissingSqliteDatabase($path) - { - if ($this->option('force')) { - return touch($path); - } - - if ($this->option('no-interaction')) { - return false; - } - - $this->components->warn('The SQLite database configured for this application does not exist: '.$path); - - if (! confirm('Would you like to create it?', default: true)) { - $this->components->info('Operation cancelled. No database was created.'); - - throw new RuntimeException('Database was not created. Aborting migration.'); - } - - return touch($path); - } - - /** - * Create a missing MySQL or Postgres database. - * - * @param \Illuminate\Database\Connection $connection - * @return bool - * - * @throws \RuntimeException - */ - protected function createMissingMySqlOrPgsqlDatabase($connection) - { - if ($this->laravel['config']->get("database.connections.{$connection->getName()}.database") !== $connection->getDatabaseName()) { - return false; - } - - if (! $this->option('force') && $this->option('no-interaction')) { - return false; - } - - if (! $this->option('force') && ! $this->option('no-interaction')) { - $this->components->warn("The database '{$connection->getDatabaseName()}' does not exist on the '{$connection->getName()}' connection."); - - if (! confirm('Would you like to create it?', default: true)) { - $this->components->info('Operation cancelled. No database was created.'); - - throw new RuntimeException('Database was not created. Aborting migration.'); - } - } - try { - $this->laravel['config']->set( - "database.connections.{$connection->getName()}.database", - match ($connection->getDriverName()) { - 'mysql', 'mariadb' => null, - 'pgsql' => 'postgres', - }, - ); - - $this->laravel['db']->purge(); - - $freshConnection = $this->migrator->resolveConnection($this->option('database')); - - return tap($freshConnection->unprepared( - match ($connection->getDriverName()) { - 'mysql', 'mariadb' => "CREATE DATABASE IF NOT EXISTS `{$connection->getDatabaseName()}`", - 'pgsql' => 'CREATE DATABASE "'.$connection->getDatabaseName().'"', - } - ), function () { - $this->laravel['db']->purge(); - }); - } finally { - $this->laravel['config']->set("database.connections.{$connection->getName()}.database", $connection->getDatabaseName()); - } - } - - /** - * Load the schema state to seed the initial database schema structure. - * - * @return void - */ - protected function loadSchemaState() - { - $connection = $this->migrator->resolveConnection($this->option('database')); - - // First, we will make sure that the connection supports schema loading and that - // the schema file exists before we proceed any further. If not, we will just - // continue with the standard migration operation as normal without errors. - if ($connection instanceof SqlServerConnection || - ! is_file($path = $this->schemaPath($connection))) { - return; - } - - $this->components->info('Loading stored database schemas.'); - - $this->components->task($path, function () use ($connection, $path) { - // Since the schema file will create the "migrations" table and reload it to its - // proper state, we need to delete it here so we don't get an error that this - // table already exists when the stored database schema file gets executed. - $this->migrator->deleteRepository(); - - $connection->getSchemaState()->handleOutputUsing(function ($type, $buffer) { - $this->output->write($buffer); - })->load($path); - }); - - $this->newLine(); - - // Finally, we will fire an event that this schema has been loaded so developers - // can perform any post schema load tasks that are necessary in listeners for - // this event, which may seed the database tables with some necessary data. - $this->dispatcher->dispatch( - new SchemaLoaded($connection, $path) - ); - } - - /** - * Get the path to the stored schema for the given connection. - * - * @param \Illuminate\Database\Connection $connection - * @return string - */ - protected function schemaPath($connection) - { - if ($this->option('schema-path')) { - return $this->option('schema-path'); - } - - if (file_exists($path = database_path('schema/'.$connection->getName().'-schema.dump'))) { - return $path; - } - - return database_path('schema/'.$connection->getName().'-schema.sql'); - } -} diff --git a/vendor/illuminate/database/Console/Migrations/MigrateMakeCommand.php b/vendor/illuminate/database/Console/Migrations/MigrateMakeCommand.php deleted file mode 100644 index 367f148..0000000 --- a/vendor/illuminate/database/Console/Migrations/MigrateMakeCommand.php +++ /dev/null @@ -1,146 +0,0 @@ -creator = $creator; - $this->composer = $composer; - } - - /** - * Execute the console command. - * - * @return void - */ - public function handle() - { - // It's possible for the developer to specify the tables to modify in this - // schema operation. The developer may also specify if this table needs - // to be freshly created so we can create the appropriate migrations. - $name = Str::snake(trim($this->input->getArgument('name'))); - - $table = $this->input->getOption('table'); - - $create = $this->input->getOption('create') ?: false; - - // If no table was given as an option but a create option is given then we - // will use the "create" option as the table name. This allows the devs - // to pass a table name into this option as a short-cut for creating. - if (! $table && is_string($create)) { - $table = $create; - - $create = true; - } - - // Next, we will attempt to guess the table name if this the migration has - // "create" in the name. This will allow us to provide a convenient way - // of creating migrations that create new tables for the application. - if (! $table) { - [$table, $create] = TableGuesser::guess($name); - } - - // Now we are ready to write the migration out to disk. Once we've written - // the migration out, we will dump-autoload for the entire framework to - // make sure that the migrations are registered by the class loaders. - $this->writeMigration($name, $table, $create); - } - - /** - * Write the migration file to disk. - * - * @param string $name - * @param string $table - * @param bool $create - * @return void - */ - protected function writeMigration($name, $table, $create) - { - $file = $this->creator->create( - $name, $this->getMigrationPath(), $table, $create - ); - - $this->components->info(sprintf('Migration [%s] created successfully.', $file)); - } - - /** - * Get migration path (either specified by '--path' option or default location). - * - * @return string - */ - protected function getMigrationPath() - { - if (! is_null($targetPath = $this->input->getOption('path'))) { - return ! $this->usingRealPath() - ? $this->laravel->basePath().'/'.$targetPath - : $targetPath; - } - - return parent::getMigrationPath(); - } - - /** - * Prompt for missing input arguments using the returned questions. - * - * @return array - */ - protected function promptForMissingArgumentsUsing() - { - return [ - 'name' => ['What should the migration be named?', 'E.g. create_flights_table'], - ]; - } -} diff --git a/vendor/illuminate/database/Console/Migrations/RefreshCommand.php b/vendor/illuminate/database/Console/Migrations/RefreshCommand.php deleted file mode 100644 index 7d74f5b..0000000 --- a/vendor/illuminate/database/Console/Migrations/RefreshCommand.php +++ /dev/null @@ -1,163 +0,0 @@ -isProhibited() || - ! $this->confirmToProceed()) { - return Command::FAILURE; - } - - // Next we'll gather some of the options so that we can have the right options - // to pass to the commands. This includes options such as which database to - // use and the path to use for the migration. Then we'll run the command. - $database = $this->input->getOption('database'); - - $path = $this->input->getOption('path'); - - // If the "step" option is specified it means we only want to rollback a small - // number of migrations before migrating again. For example, the user might - // only rollback and remigrate the latest four migrations instead of all. - $step = $this->input->getOption('step') ?: 0; - - if ($step > 0) { - $this->runRollback($database, $path, $step); - } else { - $this->runReset($database, $path); - } - - // The refresh command is essentially just a brief aggregate of a few other of - // the migration commands and just provides a convenient wrapper to execute - // them in succession. We'll also see if we need to re-seed the database. - $this->call('migrate', array_filter([ - '--database' => $database, - '--path' => $path, - '--realpath' => $this->input->getOption('realpath'), - '--force' => true, - ])); - - if ($this->laravel->bound(Dispatcher::class)) { - $this->laravel[Dispatcher::class]->dispatch( - new DatabaseRefreshed($database, $this->needsSeeding()) - ); - } - - if ($this->needsSeeding()) { - $this->runSeeder($database); - } - - return 0; - } - - /** - * Run the rollback command. - * - * @param string $database - * @param string $path - * @param int $step - * @return void - */ - protected function runRollback($database, $path, $step) - { - $this->call('migrate:rollback', array_filter([ - '--database' => $database, - '--path' => $path, - '--realpath' => $this->input->getOption('realpath'), - '--step' => $step, - '--force' => true, - ])); - } - - /** - * Run the reset command. - * - * @param string $database - * @param string $path - * @return void - */ - protected function runReset($database, $path) - { - $this->call('migrate:reset', array_filter([ - '--database' => $database, - '--path' => $path, - '--realpath' => $this->input->getOption('realpath'), - '--force' => true, - ])); - } - - /** - * Determine if the developer has requested database seeding. - * - * @return bool - */ - protected function needsSeeding() - { - return $this->option('seed') || $this->option('seeder'); - } - - /** - * Run the database seeder command. - * - * @param string $database - * @return void - */ - protected function runSeeder($database) - { - $this->call('db:seed', array_filter([ - '--database' => $database, - '--class' => $this->option('seeder') ?: 'Database\\Seeders\\DatabaseSeeder', - '--force' => true, - ])); - } - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return [ - ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to use'], - ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production'], - ['path', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The path(s) to the migrations files to be executed'], - ['realpath', null, InputOption::VALUE_NONE, 'Indicate any provided migration file paths are pre-resolved absolute paths'], - ['seed', null, InputOption::VALUE_NONE, 'Indicates if the seed task should be re-run'], - ['seeder', null, InputOption::VALUE_OPTIONAL, 'The class name of the root seeder'], - ['step', null, InputOption::VALUE_OPTIONAL, 'The number of migrations to be reverted & re-run'], - ]; - } -} diff --git a/vendor/illuminate/database/Console/Migrations/ResetCommand.php b/vendor/illuminate/database/Console/Migrations/ResetCommand.php deleted file mode 100644 index 85ccae9..0000000 --- a/vendor/illuminate/database/Console/Migrations/ResetCommand.php +++ /dev/null @@ -1,96 +0,0 @@ -migrator = $migrator; - } - - /** - * Execute the console command. - * - * @return int - */ - public function handle() - { - if ($this->isProhibited() || - ! $this->confirmToProceed()) { - return Command::FAILURE; - } - - return $this->migrator->usingConnection($this->option('database'), function () { - // First, we'll make sure that the migration table actually exists before we - // start trying to rollback and re-run all of the migrations. If it's not - // present we'll just bail out with an info message for the developers. - if (! $this->migrator->repositoryExists()) { - return $this->components->warn('Migration table not found.'); - } - - $this->migrator->setOutput($this->output)->reset( - $this->getMigrationPaths(), $this->option('pretend') - ); - }); - } - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return [ - ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to use'], - - ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production'], - - ['path', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The path(s) to the migrations files to be executed'], - - ['realpath', null, InputOption::VALUE_NONE, 'Indicate any provided migration file paths are pre-resolved absolute paths'], - - ['pretend', null, InputOption::VALUE_NONE, 'Dump the SQL queries that would be run'], - ]; - } -} diff --git a/vendor/illuminate/database/Console/Migrations/RollbackCommand.php b/vendor/illuminate/database/Console/Migrations/RollbackCommand.php deleted file mode 100644 index 8846a5e..0000000 --- a/vendor/illuminate/database/Console/Migrations/RollbackCommand.php +++ /dev/null @@ -1,93 +0,0 @@ -migrator = $migrator; - } - - /** - * Execute the console command. - * - * @return int - */ - public function handle() - { - if ($this->isProhibited() || - ! $this->confirmToProceed()) { - return Command::FAILURE; - } - - $this->migrator->usingConnection($this->option('database'), function () { - $this->migrator->setOutput($this->output)->rollback( - $this->getMigrationPaths(), [ - 'pretend' => $this->option('pretend'), - 'step' => (int) $this->option('step'), - 'batch' => (int) $this->option('batch'), - ] - ); - }); - - return 0; - } - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return [ - ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to use'], - ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production'], - ['path', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The path(s) to the migrations files to be executed'], - ['realpath', null, InputOption::VALUE_NONE, 'Indicate any provided migration file paths are pre-resolved absolute paths'], - ['pretend', null, InputOption::VALUE_NONE, 'Dump the SQL queries that would be run'], - ['step', null, InputOption::VALUE_OPTIONAL, 'The number of migrations to be reverted'], - ['batch', null, InputOption::VALUE_REQUIRED, 'The batch of migrations (identified by their batch number) to be reverted'], - ]; - } -} diff --git a/vendor/illuminate/database/Console/Migrations/StatusCommand.php b/vendor/illuminate/database/Console/Migrations/StatusCommand.php deleted file mode 100644 index 378c4a7..0000000 --- a/vendor/illuminate/database/Console/Migrations/StatusCommand.php +++ /dev/null @@ -1,143 +0,0 @@ -migrator = $migrator; - } - - /** - * Execute the console command. - * - * @return int|null - */ - public function handle() - { - return $this->migrator->usingConnection($this->option('database'), function () { - if (! $this->migrator->repositoryExists()) { - $this->components->error('Migration table not found.'); - - return 1; - } - - $ran = $this->migrator->getRepository()->getRan(); - - $batches = $this->migrator->getRepository()->getMigrationBatches(); - - $migrations = $this->getStatusFor($ran, $batches) - ->when($this->option('pending') !== false, fn ($collection) => $collection->filter(function ($migration) { - return (new Stringable($migration[1]))->contains('Pending'); - })); - - if (count($migrations) > 0) { - $this->newLine(); - - $this->components->twoColumnDetail('Migration name', 'Batch / Status'); - - $migrations - ->each( - fn ($migration) => $this->components->twoColumnDetail($migration[0], $migration[1]) - ); - - $this->newLine(); - } elseif ($this->option('pending') !== false) { - $this->components->info('No pending migrations'); - } else { - $this->components->info('No migrations found'); - } - - if ($this->option('pending') && $migrations->some(fn ($m) => (new Stringable($m[1]))->contains('Pending'))) { - return $this->option('pending'); - } - }); - } - - /** - * Get the status for the given run migrations. - * - * @param array $ran - * @param array $batches - * @return \Illuminate\Support\Collection - */ - protected function getStatusFor(array $ran, array $batches) - { - return (new Collection($this->getAllMigrationFiles())) - ->map(function ($migration) use ($ran, $batches) { - $migrationName = $this->migrator->getMigrationName($migration); - - $status = in_array($migrationName, $ran) - ? 'Ran' - : 'Pending'; - - if (in_array($migrationName, $ran)) { - $status = '['.$batches[$migrationName].'] '.$status; - } - - return [$migrationName, $status]; - }); - } - - /** - * Get an array of all of the migration files. - * - * @return array - */ - protected function getAllMigrationFiles() - { - return $this->migrator->getMigrationFiles($this->getMigrationPaths()); - } - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return [ - ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to use'], - ['pending', null, InputOption::VALUE_OPTIONAL, 'Only list pending migrations', false], - ['path', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The path(s) to the migrations files to use'], - ['realpath', null, InputOption::VALUE_NONE, 'Indicate any provided migration file paths are pre-resolved absolute paths'], - ]; - } -} diff --git a/vendor/illuminate/database/Console/Migrations/TableGuesser.php b/vendor/illuminate/database/Console/Migrations/TableGuesser.php deleted file mode 100644 index 30bd530..0000000 --- a/vendor/illuminate/database/Console/Migrations/TableGuesser.php +++ /dev/null @@ -1,37 +0,0 @@ -connection = $connection; - $this->events = $events; - } - - /** - * Execute the console command. - * - * @return void - */ - public function handle() - { - $databases = $this->parseDatabases($this->option('databases')); - - $this->displayConnections($databases); - - if ($this->option('max')) { - $this->dispatchEvents($databases); - } - } - - /** - * Parse the database into an array of the connections. - * - * @param string $databases - * @return \Illuminate\Support\Collection - */ - protected function parseDatabases($databases) - { - return (new Collection(explode(',', $databases)))->map(function ($database) { - if (! $database) { - $database = $this->laravel['config']['database.default']; - } - - $maxConnections = $this->option('max'); - - $connections = $this->connection->connection($database)->threadCount(); - - return [ - 'database' => $database, - 'connections' => $connections, - 'status' => $maxConnections && $connections >= $maxConnections ? 'ALERT' : 'OK', - ]; - }); - } - - /** - * Display the databases and their connection counts in the console. - * - * @param \Illuminate\Support\Collection $databases - * @return void - */ - protected function displayConnections($databases) - { - $this->newLine(); - - $this->components->twoColumnDetail('Database name', 'Connections'); - - $databases->each(function ($database) { - $status = '['.$database['connections'].'] '.$database['status']; - - $this->components->twoColumnDetail($database['database'], $status); - }); - - $this->newLine(); - } - - /** - * Dispatch the database monitoring events. - * - * @param \Illuminate\Support\Collection $databases - * @return void - */ - protected function dispatchEvents($databases) - { - $databases->each(function ($database) { - if ($database['status'] === 'OK') { - return; - } - - $this->events->dispatch( - new DatabaseBusy( - $database['database'], - $database['connections'] - ) - ); - }); - } -} diff --git a/vendor/illuminate/database/Console/PruneCommand.php b/vendor/illuminate/database/Console/PruneCommand.php deleted file mode 100644 index db8dead..0000000 --- a/vendor/illuminate/database/Console/PruneCommand.php +++ /dev/null @@ -1,202 +0,0 @@ -models(); - - if ($models->isEmpty()) { - $this->components->info('No prunable models found.'); - - return; - } - - if ($this->option('pretend')) { - $models->each(function ($model) { - $this->pretendToPrune($model); - }); - - return; - } - - $pruning = []; - - $events->listen(ModelsPruned::class, function ($event) use (&$pruning) { - if (! in_array($event->model, $pruning)) { - $pruning[] = $event->model; - - $this->newLine(); - - $this->components->info(sprintf('Pruning [%s] records.', $event->model)); - } - - $this->components->twoColumnDetail($event->model, "{$event->count} records"); - }); - - $events->dispatch(new ModelPruningStarting($models->all())); - - $models->each(function ($model) { - $this->pruneModel($model); - }); - - $events->dispatch(new ModelPruningFinished($models->all())); - - $events->forget(ModelsPruned::class); - } - - /** - * Prune the given model. - * - * @param string $model - * @return void - */ - protected function pruneModel(string $model) - { - $instance = new $model; - - $chunkSize = property_exists($instance, 'prunableChunkSize') - ? $instance->prunableChunkSize - : $this->option('chunk'); - - $total = $this->isPrunable($model) - ? $instance->pruneAll($chunkSize) - : 0; - - if ($total == 0) { - $this->components->info("No prunable [$model] records found."); - } - } - - /** - * Determine the models that should be pruned. - * - * @return \Illuminate\Support\Collection - */ - protected function models() - { - if (! empty($models = $this->option('model'))) { - return (new Collection($models))->filter(function ($model) { - return class_exists($model); - })->values(); - } - - $except = $this->option('except'); - - if (! empty($models) && ! empty($except)) { - throw new InvalidArgumentException('The --models and --except options cannot be combined.'); - } - - return (new Collection(Finder::create()->in($this->getPath())->files()->name('*.php'))) - ->map(function ($model) { - $namespace = $this->laravel->getNamespace(); - - return $namespace.str_replace( - ['/', '.php'], - ['\\', ''], - Str::after($model->getRealPath(), realpath(app_path()).DIRECTORY_SEPARATOR) - ); - })->when(! empty($except), function ($models) use ($except) { - return $models->reject(function ($model) use ($except) { - return in_array($model, $except); - }); - })->filter(function ($model) { - return class_exists($model); - })->filter(function ($model) { - return $this->isPrunable($model); - })->values(); - } - - /** - * Get the path where models are located. - * - * @return string[]|string - */ - protected function getPath() - { - if (! empty($path = $this->option('path'))) { - return (new Collection($path)) - ->map(fn ($path) => base_path($path)) - ->all(); - } - - return app_path('Models'); - } - - /** - * Determine if the given model class is prunable. - * - * @param string $model - * @return bool - */ - protected function isPrunable($model) - { - $uses = class_uses_recursive($model); - - return in_array(Prunable::class, $uses) || in_array(MassPrunable::class, $uses); - } - - /** - * Display how many models will be pruned. - * - * @param string $model - * @return void - */ - protected function pretendToPrune($model) - { - $instance = new $model; - - $count = $instance->prunable() - ->when(in_array(SoftDeletes::class, class_uses_recursive(get_class($instance))), function ($query) { - $query->withTrashed(); - })->count(); - - if ($count === 0) { - $this->components->info("No prunable [$model] records found."); - } else { - $this->components->info("{$count} [{$model}] records will be pruned."); - } - } -} diff --git a/vendor/illuminate/database/Console/Seeds/SeedCommand.php b/vendor/illuminate/database/Console/Seeds/SeedCommand.php deleted file mode 100644 index 4ce2b02..0000000 --- a/vendor/illuminate/database/Console/Seeds/SeedCommand.php +++ /dev/null @@ -1,140 +0,0 @@ -resolver = $resolver; - } - - /** - * Execute the console command. - * - * @return int - */ - public function handle() - { - if (! $this->confirmToProceed()) { - return 1; - } - - $this->components->info('Seeding database.'); - - $previousConnection = $this->resolver->getDefaultConnection(); - - $this->resolver->setDefaultConnection($this->getDatabase()); - - Model::unguarded(function () { - $this->getSeeder()->__invoke(); - }); - - if ($previousConnection) { - $this->resolver->setDefaultConnection($previousConnection); - } - - return 0; - } - - /** - * Get a seeder instance from the container. - * - * @return \Illuminate\Database\Seeder - */ - protected function getSeeder() - { - $class = $this->input->getArgument('class') ?? $this->input->getOption('class'); - - if (! str_contains($class, '\\')) { - $class = 'Database\\Seeders\\'.$class; - } - - if ($class === 'Database\\Seeders\\DatabaseSeeder' && - ! class_exists($class)) { - $class = 'DatabaseSeeder'; - } - - return $this->laravel->make($class) - ->setContainer($this->laravel) - ->setCommand($this); - } - - /** - * Get the name of the database connection to use. - * - * @return string - */ - protected function getDatabase() - { - $database = $this->input->getOption('database'); - - return $database ?: $this->laravel['config']['database.default']; - } - - /** - * Get the console command arguments. - * - * @return array - */ - protected function getArguments() - { - return [ - ['class', InputArgument::OPTIONAL, 'The class name of the root seeder', null], - ]; - } - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return [ - ['class', null, InputOption::VALUE_OPTIONAL, 'The class name of the root seeder', 'Database\\Seeders\\DatabaseSeeder'], - ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to seed'], - ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production'], - ]; - } -} diff --git a/vendor/illuminate/database/Console/Seeds/SeederMakeCommand.php b/vendor/illuminate/database/Console/Seeds/SeederMakeCommand.php deleted file mode 100644 index c021bbb..0000000 --- a/vendor/illuminate/database/Console/Seeds/SeederMakeCommand.php +++ /dev/null @@ -1,92 +0,0 @@ -resolveStubPath('/stubs/seeder.stub'); - } - - /** - * Resolve the fully-qualified path to the stub. - * - * @param string $stub - * @return string - */ - protected function resolveStubPath($stub) - { - return is_file($customPath = $this->laravel->basePath(trim($stub, '/'))) - ? $customPath - : __DIR__.$stub; - } - - /** - * Get the destination class path. - * - * @param string $name - * @return string - */ - protected function getPath($name) - { - $name = str_replace('\\', '/', Str::replaceFirst($this->rootNamespace(), '', $name)); - - if (is_dir($this->laravel->databasePath().'/seeds')) { - return $this->laravel->databasePath().'/seeds/'.$name.'.php'; - } - - return $this->laravel->databasePath().'/seeders/'.$name.'.php'; - } - - /** - * Get the root namespace for the class. - * - * @return string - */ - protected function rootNamespace() - { - return 'Database\Seeders\\'; - } -} diff --git a/vendor/illuminate/database/Console/Seeds/WithoutModelEvents.php b/vendor/illuminate/database/Console/Seeds/WithoutModelEvents.php deleted file mode 100644 index acd9ec3..0000000 --- a/vendor/illuminate/database/Console/Seeds/WithoutModelEvents.php +++ /dev/null @@ -1,19 +0,0 @@ - Model::withoutEvents($callback); - } -} diff --git a/vendor/illuminate/database/Console/Seeds/stubs/seeder.stub b/vendor/illuminate/database/Console/Seeds/stubs/seeder.stub deleted file mode 100644 index 8b5403f..0000000 --- a/vendor/illuminate/database/Console/Seeds/stubs/seeder.stub +++ /dev/null @@ -1,17 +0,0 @@ - Note: This can be slow on large databases } - {--views : Show the database views Note: This can be slow on large databases } - {--types : Show the user defined types}'; - - /** - * The console command description. - * - * @var string - */ - protected $description = 'Display information about the given database'; - - /** - * Execute the console command. - * - * @param \Illuminate\Database\ConnectionResolverInterface $connections - * @return int - */ - public function handle(ConnectionResolverInterface $connections) - { - $connection = $connections->connection($database = $this->input->getOption('database')); - - $schema = $connection->getSchemaBuilder(); - - $data = [ - 'platform' => [ - 'config' => $this->getConfigFromDatabase($database), - 'name' => $connection->getDriverTitle(), - 'connection' => $connection->getName(), - 'version' => $connection->getServerVersion(), - 'open_connections' => $connection->threadCount(), - ], - 'tables' => $this->tables($connection, $schema), - ]; - - if ($this->option('views')) { - $data['views'] = $this->views($connection, $schema); - } - - if ($this->option('types')) { - $data['types'] = $this->types($connection, $schema); - } - - $this->display($data); - - return 0; - } - - /** - * Get information regarding the tables within the database. - * - * @param \Illuminate\Database\ConnectionInterface $connection - * @param \Illuminate\Database\Schema\Builder $schema - * @return \Illuminate\Support\Collection - */ - protected function tables(ConnectionInterface $connection, Builder $schema) - { - return (new Collection($schema->getTables()))->map(fn ($table) => [ - 'table' => $table['name'], - 'schema' => $table['schema'], - 'size' => $table['size'], - 'rows' => $this->option('counts') - ? ($connection->table($table['schema'] ? $table['schema'].'.'.$table['name'] : $table['name'])->count()) - : null, - 'engine' => $table['engine'], - 'collation' => $table['collation'], - 'comment' => $table['comment'], - ]); - } - - /** - * Get information regarding the views within the database. - * - * @param \Illuminate\Database\ConnectionInterface $connection - * @param \Illuminate\Database\Schema\Builder $schema - * @return \Illuminate\Support\Collection - */ - protected function views(ConnectionInterface $connection, Builder $schema) - { - return (new Collection($schema->getViews())) - ->reject(fn ($view) => (new Stringable($view['name']))->startsWith(['pg_catalog', 'information_schema', 'spt_'])) - ->map(fn ($view) => [ - 'view' => $view['name'], - 'schema' => $view['schema'], - 'rows' => $connection->table($view['schema'] ? $view['schema'].'.'.$view['name'] : $view['name'])->count(), - ]); - } - - /** - * Get information regarding the user-defined types within the database. - * - * @param \Illuminate\Database\ConnectionInterface $connection - * @param \Illuminate\Database\Schema\Builder $schema - * @return \Illuminate\Support\Collection - */ - protected function types(ConnectionInterface $connection, Builder $schema) - { - return (new Collection($schema->getTypes())) - ->map(fn ($type) => [ - 'name' => $type['name'], - 'schema' => $type['schema'], - 'type' => $type['type'], - 'category' => $type['category'], - ]); - } - - /** - * Render the database information. - * - * @param array $data - * @return void - */ - protected function display(array $data) - { - $this->option('json') ? $this->displayJson($data) : $this->displayForCli($data); - } - - /** - * Render the database information as JSON. - * - * @param array $data - * @return void - */ - protected function displayJson(array $data) - { - $this->output->writeln(json_encode($data)); - } - - /** - * Render the database information formatted for the CLI. - * - * @param array $data - * @return void - */ - protected function displayForCli(array $data) - { - $platform = $data['platform']; - $tables = $data['tables']; - $views = $data['views'] ?? null; - $types = $data['types'] ?? null; - - $this->newLine(); - - $this->components->twoColumnDetail(''.$platform['name'].'', $platform['version']); - $this->components->twoColumnDetail('Connection', $platform['connection']); - $this->components->twoColumnDetail('Database', Arr::get($platform['config'], 'database')); - $this->components->twoColumnDetail('Host', Arr::get($platform['config'], 'host')); - $this->components->twoColumnDetail('Port', Arr::get($platform['config'], 'port')); - $this->components->twoColumnDetail('Username', Arr::get($platform['config'], 'username')); - $this->components->twoColumnDetail('URL', Arr::get($platform['config'], 'url')); - $this->components->twoColumnDetail('Open Connections', $platform['open_connections']); - $this->components->twoColumnDetail('Tables', $tables->count()); - - if ($tableSizeSum = $tables->sum('size')) { - $this->components->twoColumnDetail('Total Size', Number::fileSize($tableSizeSum, 2)); - } - - $this->newLine(); - - if ($tables->isNotEmpty()) { - $hasSchema = ! is_null($tables->first()['schema']); - - $this->components->twoColumnDetail( - ($hasSchema ? 'Schema / ' : '').'Table', - 'Size'.($this->option('counts') ? ' / Rows' : '') - ); - - $tables->each(function ($table) { - $tableSize = is_null($table['size']) ? null : Number::fileSize($table['size'], 2); - - $this->components->twoColumnDetail( - ($table['schema'] ? $table['schema'].' / ' : '').$table['table'].($this->output->isVerbose() ? ' '.$table['engine'].'' : null), - ($tableSize ?? '—').($this->option('counts') ? ' / '.Number::format($table['rows']).'' : '') - ); - - if ($this->output->isVerbose()) { - if ($table['comment']) { - $this->components->bulletList([ - $table['comment'], - ]); - } - } - }); - - $this->newLine(); - } - - if ($views && $views->isNotEmpty()) { - $hasSchema = ! is_null($views->first()['schema']); - - $this->components->twoColumnDetail( - ($hasSchema ? 'Schema / ' : '').'View', - 'Rows' - ); - - $views->each(fn ($view) => $this->components->twoColumnDetail( - ($view['schema'] ? $view['schema'].' / ' : '').$view['view'], - Number::format($view['rows']) - )); - - $this->newLine(); - } - - if ($types && $types->isNotEmpty()) { - $hasSchema = ! is_null($types->first()['schema']); - - $this->components->twoColumnDetail( - ($hasSchema ? 'Schema / ' : '').'Type', - 'Type / Category' - ); - - $types->each(fn ($type) => $this->components->twoColumnDetail( - ($type['schema'] ? $type['schema'].' / ' : '').$type['name'], - $type['type'].' / '.$type['category'] - )); - - $this->newLine(); - } - } -} diff --git a/vendor/illuminate/database/Console/ShowModelCommand.php b/vendor/illuminate/database/Console/ShowModelCommand.php deleted file mode 100644 index 3e99153..0000000 --- a/vendor/illuminate/database/Console/ShowModelCommand.php +++ /dev/null @@ -1,214 +0,0 @@ -inspect( - $this->argument('model'), - $this->option('database') - ); - } catch (BindingResolutionException $e) { - $this->components->error($e->getMessage()); - - return 1; - } - - $this->display( - $info['class'], - $info['database'], - $info['table'], - $info['policy'], - $info['attributes'], - $info['relations'], - $info['events'], - $info['observers'] - ); - - return 0; - } - - /** - * Render the model information. - * - * @param class-string<\Illuminate\Database\Eloquent\Model> $class - * @param string $database - * @param string $table - * @param class-string|null $policy - * @param \Illuminate\Support\Collection $attributes - * @param \Illuminate\Support\Collection $relations - * @param \Illuminate\Support\Collection $events - * @param \Illuminate\Support\Collection $observers - * @return void - */ - protected function display($class, $database, $table, $policy, $attributes, $relations, $events, $observers) - { - $this->option('json') - ? $this->displayJson($class, $database, $table, $policy, $attributes, $relations, $events, $observers) - : $this->displayCli($class, $database, $table, $policy, $attributes, $relations, $events, $observers); - } - - /** - * Render the model information as JSON. - * - * @param class-string<\Illuminate\Database\Eloquent\Model> $class - * @param string $database - * @param string $table - * @param class-string|null $policy - * @param \Illuminate\Support\Collection $attributes - * @param \Illuminate\Support\Collection $relations - * @param \Illuminate\Support\Collection $events - * @param \Illuminate\Support\Collection $observers - * @return void - */ - protected function displayJson($class, $database, $table, $policy, $attributes, $relations, $events, $observers) - { - $this->output->writeln( - (new Collection([ - 'class' => $class, - 'database' => $database, - 'table' => $table, - 'policy' => $policy, - 'attributes' => $attributes, - 'relations' => $relations, - 'events' => $events, - 'observers' => $observers, - ]))->toJson() - ); - } - - /** - * Render the model information for the CLI. - * - * @param class-string<\Illuminate\Database\Eloquent\Model> $class - * @param string $database - * @param string $table - * @param class-string|null $policy - * @param \Illuminate\Support\Collection $attributes - * @param \Illuminate\Support\Collection $relations - * @param \Illuminate\Support\Collection $events - * @param \Illuminate\Support\Collection $observers - * @return void - */ - protected function displayCli($class, $database, $table, $policy, $attributes, $relations, $events, $observers) - { - $this->newLine(); - - $this->components->twoColumnDetail(''.$class.''); - $this->components->twoColumnDetail('Database', $database); - $this->components->twoColumnDetail('Table', $table); - - if ($policy) { - $this->components->twoColumnDetail('Policy', $policy); - } - - $this->newLine(); - - $this->components->twoColumnDetail( - 'Attributes', - 'type / cast', - ); - - foreach ($attributes as $attribute) { - $first = trim(sprintf( - '%s %s', - $attribute['name'], - (new Collection(['increments', 'unique', 'nullable', 'fillable', 'hidden', 'appended'])) - ->filter(fn ($property) => $attribute[$property]) - ->map(fn ($property) => sprintf('%s', $property)) - ->implode(', ') - )); - - $second = (new Collection([ - $attribute['type'], - $attribute['cast'] ? ''.$attribute['cast'].'' : null, - ]))->filter()->implode(' / '); - - $this->components->twoColumnDetail($first, $second); - - if ($attribute['default'] !== null) { - $this->components->bulletList( - [sprintf('default: %s', $attribute['default'])], - OutputInterface::VERBOSITY_VERBOSE - ); - } - } - - $this->newLine(); - - $this->components->twoColumnDetail('Relations'); - - foreach ($relations as $relation) { - $this->components->twoColumnDetail( - sprintf('%s %s', $relation['name'], $relation['type']), - $relation['related'] - ); - } - - $this->newLine(); - - $this->components->twoColumnDetail('Events'); - - if ($events->count()) { - foreach ($events as $event) { - $this->components->twoColumnDetail( - sprintf('%s', $event['event']), - sprintf('%s', $event['class']), - ); - } - } - - $this->newLine(); - - $this->components->twoColumnDetail('Observers'); - - if ($observers->count()) { - foreach ($observers as $observer) { - $this->components->twoColumnDetail( - sprintf('%s', $observer['event']), - implode(', ', $observer['observer']) - ); - } - } - - $this->newLine(); - } -} diff --git a/vendor/illuminate/database/Console/TableCommand.php b/vendor/illuminate/database/Console/TableCommand.php deleted file mode 100644 index ccde5c2..0000000 --- a/vendor/illuminate/database/Console/TableCommand.php +++ /dev/null @@ -1,264 +0,0 @@ -connection($this->input->getOption('database')); - $schema = $connection->getSchemaBuilder(); - $tables = (new Collection($schema->getTables())) - ->keyBy(fn ($table) => $table['schema'] ? $table['schema'].'.'.$table['name'] : $table['name']) - ->all(); - - $tableName = $this->argument('table') ?: select( - 'Which table would you like to inspect?', - array_keys($tables) - ); - - $table = $tables[$tableName] ?? Arr::first($tables, fn ($table) => $table['name'] === $tableName); - - if (! $table) { - $this->components->warn("Table [{$tableName}] doesn't exist."); - - return 1; - } - - $tableName = ($table['schema'] ? $table['schema'].'.' : '').$this->withoutTablePrefix($connection, $table['name']); - - $columns = $this->columns($schema, $tableName); - $indexes = $this->indexes($schema, $tableName); - $foreignKeys = $this->foreignKeys($schema, $tableName); - - $data = [ - 'table' => [ - 'schema' => $table['schema'], - 'name' => $table['name'], - 'columns' => count($columns), - 'size' => $table['size'], - 'comment' => $table['comment'], - 'collation' => $table['collation'], - 'engine' => $table['engine'], - ], - 'columns' => $columns, - 'indexes' => $indexes, - 'foreign_keys' => $foreignKeys, - ]; - - $this->display($data); - - return 0; - } - - /** - * Get the information regarding the table's columns. - * - * @param \Illuminate\Database\Schema\Builder $schema - * @param string $table - * @return \Illuminate\Support\Collection - */ - protected function columns(Builder $schema, string $table) - { - return (new Collection($schema->getColumns($table)))->map(fn ($column) => [ - 'column' => $column['name'], - 'attributes' => $this->getAttributesForColumn($column), - 'default' => $column['default'], - 'type' => $column['type'], - ]); - } - - /** - * Get the attributes for a table column. - * - * @param array $column - * @return \Illuminate\Support\Collection - */ - protected function getAttributesForColumn($column) - { - return (new Collection([ - $column['type_name'], - $column['generation'] ? $column['generation']['type'] : null, - $column['auto_increment'] ? 'autoincrement' : null, - $column['nullable'] ? 'nullable' : null, - $column['collation'], - ]))->filter(); - } - - /** - * Get the information regarding the table's indexes. - * - * @param \Illuminate\Database\Schema\Builder $schema - * @param string $table - * @return \Illuminate\Support\Collection - */ - protected function indexes(Builder $schema, string $table) - { - return (new Collection($schema->getIndexes($table)))->map(fn ($index) => [ - 'name' => $index['name'], - 'columns' => new Collection($index['columns']), - 'attributes' => $this->getAttributesForIndex($index), - ]); - } - - /** - * Get the attributes for a table index. - * - * @param array $index - * @return \Illuminate\Support\Collection - */ - protected function getAttributesForIndex($index) - { - return (new Collection([ - $index['type'], - count($index['columns']) > 1 ? 'compound' : null, - $index['unique'] && ! $index['primary'] ? 'unique' : null, - $index['primary'] ? 'primary' : null, - ]))->filter(); - } - - /** - * Get the information regarding the table's foreign keys. - * - * @param \Illuminate\Database\Schema\Builder $schema - * @param string $table - * @return \Illuminate\Support\Collection - */ - protected function foreignKeys(Builder $schema, string $table) - { - return (new Collection($schema->getForeignKeys($table)))->map(fn ($foreignKey) => [ - 'name' => $foreignKey['name'], - 'columns' => new Collection($foreignKey['columns']), - 'foreign_schema' => $foreignKey['foreign_schema'], - 'foreign_table' => $foreignKey['foreign_table'], - 'foreign_columns' => new Collection($foreignKey['foreign_columns']), - 'on_update' => $foreignKey['on_update'], - 'on_delete' => $foreignKey['on_delete'], - ]); - } - - /** - * Render the table information. - * - * @param array $data - * @return void - */ - protected function display(array $data) - { - $this->option('json') ? $this->displayJson($data) : $this->displayForCli($data); - } - - /** - * Render the table information as JSON. - * - * @param array $data - * @return void - */ - protected function displayJson(array $data) - { - $this->output->writeln(json_encode($data)); - } - - /** - * Render the table information formatted for the CLI. - * - * @param array $data - * @return void - */ - protected function displayForCli(array $data) - { - [$table, $columns, $indexes, $foreignKeys] = [ - $data['table'], $data['columns'], $data['indexes'], $data['foreign_keys'], - ]; - - $this->newLine(); - - $this->components->twoColumnDetail(''.($table['schema'] ? $table['schema'].'.'.$table['name'] : $table['name']).'', $table['comment'] ? ''.$table['comment'].'' : null); - $this->components->twoColumnDetail('Columns', $table['columns']); - - if (! is_null($table['size'])) { - $this->components->twoColumnDetail('Size', Number::fileSize($table['size'], 2)); - } - - if ($table['engine']) { - $this->components->twoColumnDetail('Engine', $table['engine']); - } - - if ($table['collation']) { - $this->components->twoColumnDetail('Collation', $table['collation']); - } - - $this->newLine(); - - if ($columns->isNotEmpty()) { - $this->components->twoColumnDetail('Column', 'Type'); - - $columns->each(function ($column) { - $this->components->twoColumnDetail( - $column['column'].' '.$column['attributes']->implode(', ').'', - (! is_null($column['default']) ? ''.$column['default'].' ' : '').$column['type'] - ); - }); - - $this->newLine(); - } - - if ($indexes->isNotEmpty()) { - $this->components->twoColumnDetail('Index'); - - $indexes->each(function ($index) { - $this->components->twoColumnDetail( - $index['name'].' '.$index['columns']->implode(', ').'', - $index['attributes']->implode(', ') - ); - }); - - $this->newLine(); - } - - if ($foreignKeys->isNotEmpty()) { - $this->components->twoColumnDetail('Foreign Key', 'On Update / On Delete'); - - $foreignKeys->each(function ($foreignKey) { - $this->components->twoColumnDetail( - $foreignKey['name'].' '.$foreignKey['columns']->implode(', ').' references '.$foreignKey['foreign_columns']->implode(', ').' on '.$foreignKey['foreign_table'].'', - $foreignKey['on_update'].' / '.$foreignKey['on_delete'], - ); - }); - - $this->newLine(); - } - } -} diff --git a/vendor/illuminate/database/Console/WipeCommand.php b/vendor/illuminate/database/Console/WipeCommand.php deleted file mode 100644 index 754c9ee..0000000 --- a/vendor/illuminate/database/Console/WipeCommand.php +++ /dev/null @@ -1,116 +0,0 @@ -isProhibited() || - ! $this->confirmToProceed()) { - return Command::FAILURE; - } - - $database = $this->input->getOption('database'); - - if ($this->option('drop-views')) { - $this->dropAllViews($database); - - $this->components->info('Dropped all views successfully.'); - } - - $this->dropAllTables($database); - - $this->components->info('Dropped all tables successfully.'); - - if ($this->option('drop-types')) { - $this->dropAllTypes($database); - - $this->components->info('Dropped all types successfully.'); - } - - return 0; - } - - /** - * Drop all of the database tables. - * - * @param string $database - * @return void - */ - protected function dropAllTables($database) - { - $this->laravel['db']->connection($database) - ->getSchemaBuilder() - ->dropAllTables(); - } - - /** - * Drop all of the database views. - * - * @param string $database - * @return void - */ - protected function dropAllViews($database) - { - $this->laravel['db']->connection($database) - ->getSchemaBuilder() - ->dropAllViews(); - } - - /** - * Drop all of the database types. - * - * @param string $database - * @return void - */ - protected function dropAllTypes($database) - { - $this->laravel['db']->connection($database) - ->getSchemaBuilder() - ->dropAllTypes(); - } - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return [ - ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to use'], - ['drop-views', null, InputOption::VALUE_NONE, 'Drop all tables and views'], - ['drop-types', null, InputOption::VALUE_NONE, 'Drop all tables and types (Postgres only)'], - ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production'], - ]; - } -} diff --git a/vendor/illuminate/database/DatabaseManager.php b/vendor/illuminate/database/DatabaseManager.php deleted file mode 100644 index 34ba2cc..0000000 --- a/vendor/illuminate/database/DatabaseManager.php +++ /dev/null @@ -1,497 +0,0 @@ - - */ - protected $connections = []; - - /** - * The dynamically configured (DB::build) connection configurations. - * - * @var array - */ - protected $dynamicConnectionConfigurations = []; - - /** - * The custom connection resolvers. - * - * @var array - */ - protected $extensions = []; - - /** - * The callback to be executed to reconnect to a database. - * - * @var callable - */ - protected $reconnector; - - /** - * Create a new database manager instance. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @param \Illuminate\Database\Connectors\ConnectionFactory $factory - * @return void - */ - public function __construct($app, ConnectionFactory $factory) - { - $this->app = $app; - $this->factory = $factory; - - $this->reconnector = function ($connection) { - $connection->setPdo( - $this->reconnect($connection->getNameWithReadWriteType())->getRawPdo() - ); - }; - } - - /** - * Get a database connection instance. - * - * @param string|null $name - * @return \Illuminate\Database\Connection - */ - public function connection($name = null) - { - $name = $name ?: $this->getDefaultConnection(); - - [$database, $type] = $this->parseConnectionName($name); - - // If we haven't created this connection, we'll create it based on the config - // provided in the application. Once we've created the connections we will - // set the "fetch mode" for PDO which determines the query return types. - if (! isset($this->connections[$name])) { - $this->connections[$name] = $this->configure( - $this->makeConnection($database), $type - ); - - $this->dispatchConnectionEstablishedEvent($this->connections[$name]); - } - - return $this->connections[$name]; - } - - /** - * Build a database connection instance from the given configuration. - * - * @param array $config - * @return \Illuminate\Database\ConnectionInterface - */ - public function build(array $config) - { - if (! isset($config['name'])) { - $config['name'] = static::calculateDynamicConnectionName($config); - } - - $this->dynamicConnectionConfigurations[$config['name']] = $config; - - return $this->connectUsing($config['name'], $config, true); - } - - /** - * Calculate the dynamic connection name for an on-demand connection based on its configuration. - * - * @param array $config - * @return string - */ - public static function calculateDynamicConnectionName(array $config) - { - return 'dynamic_'.md5((new Collection($config))->map(function ($value, $key) { - return $key.(is_string($value) || is_int($value) ? $value : ''); - })->implode('')); - } - - /** - * Get a database connection instance from the given configuration. - * - * @param string $name - * @param array $config - * @param bool $force - * @return \Illuminate\Database\ConnectionInterface - */ - public function connectUsing(string $name, array $config, bool $force = false) - { - if ($force) { - $this->purge($name); - } - - if (isset($this->connections[$name])) { - throw new RuntimeException("Cannot establish connection [$name] because another connection with that name already exists."); - } - - $connection = $this->configure( - $this->factory->make($config, $name), null - ); - - $this->dispatchConnectionEstablishedEvent($connection); - - return tap($connection, fn ($connection) => $this->connections[$name] = $connection); - } - - /** - * Parse the connection into an array of the name and read / write type. - * - * @param string $name - * @return array - */ - protected function parseConnectionName($name) - { - $name = $name ?: $this->getDefaultConnection(); - - return Str::endsWith($name, ['::read', '::write']) - ? explode('::', $name, 2) : [$name, null]; - } - - /** - * Make the database connection instance. - * - * @param string $name - * @return \Illuminate\Database\Connection - */ - protected function makeConnection($name) - { - $config = $this->configuration($name); - - // First we will check by the connection name to see if an extension has been - // registered specifically for that connection. If it has we will call the - // Closure and pass it the config allowing it to resolve the connection. - if (isset($this->extensions[$name])) { - return call_user_func($this->extensions[$name], $config, $name); - } - - // Next we will check to see if an extension has been registered for a driver - // and will call the Closure if so, which allows us to have a more generic - // resolver for the drivers themselves which applies to all connections. - if (isset($this->extensions[$driver = $config['driver']])) { - return call_user_func($this->extensions[$driver], $config, $name); - } - - return $this->factory->make($config, $name); - } - - /** - * Get the configuration for a connection. - * - * @param string $name - * @return array - * - * @throws \InvalidArgumentException - */ - protected function configuration($name) - { - $name = $name ?: $this->getDefaultConnection(); - - $connections = $this->app['config']['database.connections']; - - $config = $this->dynamicConnectionConfigurations[$name] ?? Arr::get($connections, $name); - - if (is_null($config)) { - throw new InvalidArgumentException("Database connection [{$name}] not configured."); - } - - return (new ConfigurationUrlParser) - ->parseConfiguration($config); - } - - /** - * Prepare the database connection instance. - * - * @param \Illuminate\Database\Connection $connection - * @param string $type - * @return \Illuminate\Database\Connection - */ - protected function configure(Connection $connection, $type) - { - $connection = $this->setPdoForType($connection, $type)->setReadWriteType($type); - - // First we'll set the fetch mode and a few other dependencies of the database - // connection. This method basically just configures and prepares it to get - // used by the application. Once we're finished we'll return it back out. - if ($this->app->bound('events')) { - $connection->setEventDispatcher($this->app['events']); - } - - if ($this->app->bound('db.transactions')) { - $connection->setTransactionManager($this->app['db.transactions']); - } - - // Here we'll set a reconnector callback. This reconnector can be any callable - // so we will set a Closure to reconnect from this manager with the name of - // the connection, which will allow us to reconnect from the connections. - $connection->setReconnector($this->reconnector); - - return $connection; - } - - /** - * Dispatch the ConnectionEstablished event if the event dispatcher is available. - * - * @param \Illuminate\Database\Connection $connection - * @return void - */ - protected function dispatchConnectionEstablishedEvent(Connection $connection) - { - if (! $this->app->bound('events')) { - return; - } - - $this->app['events']->dispatch( - new ConnectionEstablished($connection) - ); - } - - /** - * Prepare the read / write mode for database connection instance. - * - * @param \Illuminate\Database\Connection $connection - * @param string|null $type - * @return \Illuminate\Database\Connection - */ - protected function setPdoForType(Connection $connection, $type = null) - { - if ($type === 'read') { - $connection->setPdo($connection->getReadPdo()); - } elseif ($type === 'write') { - $connection->setReadPdo($connection->getPdo()); - } - - return $connection; - } - - /** - * Disconnect from the given database and remove from local cache. - * - * @param string|null $name - * @return void - */ - public function purge($name = null) - { - $name = $name ?: $this->getDefaultConnection(); - - $this->disconnect($name); - - unset($this->connections[$name]); - } - - /** - * Disconnect from the given database. - * - * @param string|null $name - * @return void - */ - public function disconnect($name = null) - { - if (isset($this->connections[$name = $name ?: $this->getDefaultConnection()])) { - $this->connections[$name]->disconnect(); - } - } - - /** - * Reconnect to the given database. - * - * @param string|null $name - * @return \Illuminate\Database\Connection - */ - public function reconnect($name = null) - { - $this->disconnect($name = $name ?: $this->getDefaultConnection()); - - if (! isset($this->connections[$name])) { - return $this->connection($name); - } - - return $this->refreshPdoConnections($name); - } - - /** - * Set the default database connection for the callback execution. - * - * @param string $name - * @param callable $callback - * @return mixed - */ - public function usingConnection($name, callable $callback) - { - $previousName = $this->getDefaultConnection(); - - $this->setDefaultConnection($name); - - return tap($callback(), function () use ($previousName) { - $this->setDefaultConnection($previousName); - }); - } - - /** - * Refresh the PDO connections on a given connection. - * - * @param string $name - * @return \Illuminate\Database\Connection - */ - protected function refreshPdoConnections($name) - { - [$database, $type] = $this->parseConnectionName($name); - - $fresh = $this->configure( - $this->makeConnection($database), $type - ); - - return $this->connections[$name] - ->setPdo($fresh->getRawPdo()) - ->setReadPdo($fresh->getRawReadPdo()); - } - - /** - * Get the default connection name. - * - * @return string - */ - public function getDefaultConnection() - { - return $this->app['config']['database.default']; - } - - /** - * Set the default connection name. - * - * @param string $name - * @return void - */ - public function setDefaultConnection($name) - { - $this->app['config']['database.default'] = $name; - } - - /** - * Get all of the supported drivers. - * - * @return string[] - */ - public function supportedDrivers() - { - return ['mysql', 'mariadb', 'pgsql', 'sqlite', 'sqlsrv']; - } - - /** - * Get all of the drivers that are actually available. - * - * @return string[] - */ - public function availableDrivers() - { - return array_intersect( - $this->supportedDrivers(), - str_replace('dblib', 'sqlsrv', PDO::getAvailableDrivers()) - ); - } - - /** - * Register an extension connection resolver. - * - * @param string $name - * @param callable $resolver - * @return void - */ - public function extend($name, callable $resolver) - { - $this->extensions[$name] = $resolver; - } - - /** - * Remove an extension connection resolver. - * - * @param string $name - * @return void - */ - public function forgetExtension($name) - { - unset($this->extensions[$name]); - } - - /** - * Return all of the created connections. - * - * @return array - */ - public function getConnections() - { - return $this->connections; - } - - /** - * Set the database reconnector callback. - * - * @param callable $reconnector - * @return void - */ - public function setReconnector(callable $reconnector) - { - $this->reconnector = $reconnector; - } - - /** - * Set the application instance used by the manager. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return $this - */ - public function setApplication($app) - { - $this->app = $app; - - return $this; - } - - /** - * Dynamically pass methods to the default connection. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - if (static::hasMacro($method)) { - return $this->macroCall($method, $parameters); - } - - return $this->connection()->$method(...$parameters); - } -} diff --git a/vendor/illuminate/database/DatabaseServiceProvider.php b/vendor/illuminate/database/DatabaseServiceProvider.php deleted file mode 100644 index e322cad..0000000 --- a/vendor/illuminate/database/DatabaseServiceProvider.php +++ /dev/null @@ -1,113 +0,0 @@ -app['db']); - - Model::setEventDispatcher($this->app['events']); - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - Model::clearBootedModels(); - - $this->registerConnectionServices(); - $this->registerFakerGenerator(); - $this->registerQueueableEntityResolver(); - } - - /** - * Register the primary database bindings. - * - * @return void - */ - protected function registerConnectionServices() - { - // The connection factory is used to create the actual connection instances on - // the database. We will inject the factory into the manager so that it may - // make the connections while they are actually needed and not of before. - $this->app->singleton('db.factory', function ($app) { - return new ConnectionFactory($app); - }); - - // The database manager is used to resolve various connections, since multiple - // connections might be managed. It also implements the connection resolver - // interface which may be used by other components requiring connections. - $this->app->singleton('db', function ($app) { - return new DatabaseManager($app, $app['db.factory']); - }); - - $this->app->bind('db.connection', function ($app) { - return $app['db']->connection(); - }); - - $this->app->bind('db.schema', function ($app) { - return $app['db']->connection()->getSchemaBuilder(); - }); - - $this->app->singleton('db.transactions', function ($app) { - return new DatabaseTransactionsManager; - }); - } - - /** - * Register the Faker Generator instance in the container. - * - * @return void - */ - protected function registerFakerGenerator() - { - $this->app->singleton(FakerGenerator::class, function ($app, $parameters) { - $locale = $parameters['locale'] ?? $app['config']->get('app.faker_locale', 'en_US'); - - if (! isset(static::$fakers[$locale])) { - static::$fakers[$locale] = FakerFactory::create($locale); - } - - static::$fakers[$locale]->unique(true); - - return static::$fakers[$locale]; - }); - } - - /** - * Register the queueable entity resolver implementation. - * - * @return void - */ - protected function registerQueueableEntityResolver() - { - $this->app->singleton(EntityResolver::class, function () { - return new QueueEntityResolver; - }); - } -} diff --git a/vendor/illuminate/database/DatabaseTransactionRecord.php b/vendor/illuminate/database/DatabaseTransactionRecord.php deleted file mode 100644 index c35acb1..0000000 --- a/vendor/illuminate/database/DatabaseTransactionRecord.php +++ /dev/null @@ -1,82 +0,0 @@ -connection = $connection; - $this->level = $level; - $this->parent = $parent; - } - - /** - * Register a callback to be executed after committing. - * - * @param callable $callback - * @return void - */ - public function addCallback($callback) - { - $this->callbacks[] = $callback; - } - - /** - * Execute all of the callbacks. - * - * @return void - */ - public function executeCallbacks() - { - foreach ($this->callbacks as $callback) { - $callback(); - } - } - - /** - * Get all of the callbacks. - * - * @return array - */ - public function getCallbacks() - { - return $this->callbacks; - } -} diff --git a/vendor/illuminate/database/DatabaseTransactionsManager.php b/vendor/illuminate/database/DatabaseTransactionsManager.php deleted file mode 100644 index ee2889a..0000000 --- a/vendor/illuminate/database/DatabaseTransactionsManager.php +++ /dev/null @@ -1,248 +0,0 @@ - - */ - protected $committedTransactions; - - /** - * All of the pending transactions. - * - * @var \Illuminate\Support\Collection - */ - protected $pendingTransactions; - - /** - * The current transaction. - * - * @var array - */ - protected $currentTransaction = []; - - /** - * Create a new database transactions manager instance. - * - * @return void - */ - public function __construct() - { - $this->committedTransactions = new Collection; - $this->pendingTransactions = new Collection; - } - - /** - * Start a new database transaction. - * - * @param string $connection - * @param int $level - * @return void - */ - public function begin($connection, $level) - { - $this->pendingTransactions->push( - $newTransaction = new DatabaseTransactionRecord( - $connection, - $level, - $this->currentTransaction[$connection] ?? null - ) - ); - - $this->currentTransaction[$connection] = $newTransaction; - } - - /** - * Commit the root database transaction and execute callbacks. - * - * @param string $connection - * @param int $levelBeingCommitted - * @param int $newTransactionLevel - * @return array - */ - public function commit($connection, $levelBeingCommitted, $newTransactionLevel) - { - $this->stageTransactions($connection, $levelBeingCommitted); - - if (isset($this->currentTransaction[$connection])) { - $this->currentTransaction[$connection] = $this->currentTransaction[$connection]->parent; - } - - if (! $this->afterCommitCallbacksShouldBeExecuted($newTransactionLevel) && - $newTransactionLevel !== 0) { - return []; - } - - // This method is only called when the root database transaction is committed so there - // shouldn't be any pending transactions, but going to clear them here anyways just - // in case. This method could be refactored to receive a level in the future too. - $this->pendingTransactions = $this->pendingTransactions->reject( - fn ($transaction) => $transaction->connection === $connection && - $transaction->level >= $levelBeingCommitted - )->values(); - - [$forThisConnection, $forOtherConnections] = $this->committedTransactions->partition( - fn ($transaction) => $transaction->connection == $connection - ); - - $this->committedTransactions = $forOtherConnections->values(); - - $forThisConnection->map->executeCallbacks(); - - return $forThisConnection; - } - - /** - * Move relevant pending transactions to a committed state. - * - * @param string $connection - * @param int $levelBeingCommitted - * @return void - */ - public function stageTransactions($connection, $levelBeingCommitted) - { - $this->committedTransactions = $this->committedTransactions->merge( - $this->pendingTransactions->filter( - fn ($transaction) => $transaction->connection === $connection && - $transaction->level >= $levelBeingCommitted - ) - ); - - $this->pendingTransactions = $this->pendingTransactions->reject( - fn ($transaction) => $transaction->connection === $connection && - $transaction->level >= $levelBeingCommitted - ); - } - - /** - * Rollback the active database transaction. - * - * @param string $connection - * @param int $newTransactionLevel - * @return void - */ - public function rollback($connection, $newTransactionLevel) - { - if ($newTransactionLevel === 0) { - $this->removeAllTransactionsForConnection($connection); - } else { - $this->pendingTransactions = $this->pendingTransactions->reject( - fn ($transaction) => $transaction->connection == $connection && - $transaction->level > $newTransactionLevel - )->values(); - - if ($this->currentTransaction) { - do { - $this->removeCommittedTransactionsThatAreChildrenOf($this->currentTransaction[$connection]); - - $this->currentTransaction[$connection] = $this->currentTransaction[$connection]->parent; - } while ( - isset($this->currentTransaction[$connection]) && - $this->currentTransaction[$connection]->level > $newTransactionLevel - ); - } - } - } - - /** - * Remove all pending, completed, and current transactions for the given connection name. - * - * @param string $connection - * @return void - */ - protected function removeAllTransactionsForConnection($connection) - { - $this->currentTransaction[$connection] = null; - - $this->pendingTransactions = $this->pendingTransactions->reject( - fn ($transaction) => $transaction->connection == $connection - )->values(); - - $this->committedTransactions = $this->committedTransactions->reject( - fn ($transaction) => $transaction->connection == $connection - )->values(); - } - - /** - * Remove all transactions that are children of the given transaction. - * - * @param \Illuminate\Database\DatabaseTransactionRecord $transaction - * @return void - */ - protected function removeCommittedTransactionsThatAreChildrenOf(DatabaseTransactionRecord $transaction) - { - [$removedTransactions, $this->committedTransactions] = $this->committedTransactions->partition( - fn ($committed) => $committed->connection == $transaction->connection && - $committed->parent === $transaction - ); - - // There may be multiple deeply nested transactions that have already committed that we - // also need to remove. We will recurse down the children of all removed transaction - // instances until there are no more deeply nested child transactions for removal. - $removedTransactions->each( - fn ($transaction) => $this->removeCommittedTransactionsThatAreChildrenOf($transaction) - ); - } - - /** - * Register a transaction callback. - * - * @param callable $callback - * @return void - */ - public function addCallback($callback) - { - if ($current = $this->callbackApplicableTransactions()->last()) { - return $current->addCallback($callback); - } - - $callback(); - } - - /** - * Get the transactions that are applicable to callbacks. - * - * @return \Illuminate\Support\Collection - */ - public function callbackApplicableTransactions() - { - return $this->pendingTransactions; - } - - /** - * Determine if after commit callbacks should be executed for the given transaction level. - * - * @param int $level - * @return bool - */ - public function afterCommitCallbacksShouldBeExecuted($level) - { - return $level === 0; - } - - /** - * Get all of the pending transactions. - * - * @return \Illuminate\Support\Collection - */ - public function getPendingTransactions() - { - return $this->pendingTransactions; - } - - /** - * Get all of the committed transactions. - * - * @return \Illuminate\Support\Collection - */ - public function getCommittedTransactions() - { - return $this->committedTransactions; - } -} diff --git a/vendor/illuminate/database/DeadlockException.php b/vendor/illuminate/database/DeadlockException.php deleted file mode 100644 index 375a39b..0000000 --- a/vendor/illuminate/database/DeadlockException.php +++ /dev/null @@ -1,10 +0,0 @@ -getCode() === 40001 || $e->getCode() === '40001')) { - return true; - } - - $message = $e->getMessage(); - - return Str::contains($message, [ - 'Deadlock found when trying to get lock', - 'deadlock detected', - 'The database file is locked', - 'database is locked', - 'database table is locked', - 'A table in the database is locked', - 'has been chosen as the deadlock victim', - 'Lock wait timeout exceeded; try restarting transaction', - 'WSREP detected deadlock/conflict and aborted the transaction. Try restarting the transaction', - ]); - } -} diff --git a/vendor/illuminate/database/DetectsLostConnections.php b/vendor/illuminate/database/DetectsLostConnections.php deleted file mode 100644 index f489b28..0000000 --- a/vendor/illuminate/database/DetectsLostConnections.php +++ /dev/null @@ -1,86 +0,0 @@ -getMessage(); - - return Str::contains($message, [ - 'server has gone away', - 'Server has gone away', - 'no connection to the server', - 'Lost connection', - 'is dead or not enabled', - 'Error while sending', - 'decryption failed or bad record mac', - 'server closed the connection unexpectedly', - 'SSL connection has been closed unexpectedly', - 'Error writing data to the connection', - 'Resource deadlock avoided', - 'Transaction() on null', - 'child connection forced to terminate due to client_idle_limit', - 'query_wait_timeout', - 'reset by peer', - 'Physical connection is not usable', - 'TCP Provider: Error code 0x68', - 'ORA-03114', - 'Packets out of order. Expected', - 'Adaptive Server connection failed', - 'Communication link failure', - 'connection is no longer usable', - 'Login timeout expired', - 'SQLSTATE[HY000] [2002] Connection refused', - 'running with the --read-only option so it cannot execute this statement', - 'The connection is broken and recovery is not possible. The connection is marked by the client driver as unrecoverable. No attempt was made to restore the connection.', - 'SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Try again', - 'SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known', - 'SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for', - 'SQLSTATE[HY000]: General error: 7 SSL SYSCALL error: EOF detected', - 'SQLSTATE[HY000] [2002] Connection timed out', - 'SSL: Connection timed out', - 'SQLSTATE[HY000]: General error: 1105 The last transaction was aborted due to Seamless Scaling. Please retry.', - 'Temporary failure in name resolution', - 'SQLSTATE[08S01]: Communication link failure', - 'SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host', - 'SQLSTATE[HY000]: General error: 7 SSL SYSCALL error: No route to host', - 'The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.', - 'SQLSTATE[08006] [7] could not translate host name', - 'TCP Provider: Error code 0x274C', - 'SQLSTATE[HY000] [2002] No such file or directory', - 'SSL: Operation timed out', - 'Reason: Server is in script upgrade mode. Only administrator can connect at this time.', - 'Unknown $curl_error_code: 77', - 'SSL: Handshake timed out', - 'SSL error: sslv3 alert unexpected message', - 'unrecognized SSL error code:', - 'SQLSTATE[HY000] [2002] No connection could be made because the target machine actively refused it', - 'SQLSTATE[HY000] [2002] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond', - 'SQLSTATE[HY000] [2002] Network is unreachable', - 'SQLSTATE[HY000] [2002] The requested address is not valid in its context', - 'SQLSTATE[HY000] [2002] A socket operation was attempted to an unreachable network', - 'SQLSTATE[HY000] [2002] Operation now in progress', - 'SQLSTATE[HY000] [2002] Operation in progress', - 'SQLSTATE[HY000]: General error: 3989', - 'went away', - 'No such file or directory', - 'server is shutting down', - 'failed to connect to', - 'Channel connection is closed', - 'Connection lost', - 'Broken pipe', - 'SQLSTATE[25006]: Read only sql transaction: 7', - ]); - } -} diff --git a/vendor/illuminate/database/Eloquent/Attributes/CollectedBy.php b/vendor/illuminate/database/Eloquent/Attributes/CollectedBy.php deleted file mode 100644 index 14eb3a4..0000000 --- a/vendor/illuminate/database/Eloquent/Attributes/CollectedBy.php +++ /dev/null @@ -1,19 +0,0 @@ -> $collectionClass - * @return void - */ - public function __construct(public string $collectionClass) - { - } -} diff --git a/vendor/illuminate/database/Eloquent/Attributes/ObservedBy.php b/vendor/illuminate/database/Eloquent/Attributes/ObservedBy.php deleted file mode 100644 index 3db5182..0000000 --- a/vendor/illuminate/database/Eloquent/Attributes/ObservedBy.php +++ /dev/null @@ -1,19 +0,0 @@ - $factoryClass - * @return void - */ - public function __construct(public string $factoryClass) - { - } -} diff --git a/vendor/illuminate/database/Eloquent/BroadcastableModelEventOccurred.php b/vendor/illuminate/database/Eloquent/BroadcastableModelEventOccurred.php deleted file mode 100644 index 84eaf9e..0000000 --- a/vendor/illuminate/database/Eloquent/BroadcastableModelEventOccurred.php +++ /dev/null @@ -1,145 +0,0 @@ -model = $model; - $this->event = $event; - } - - /** - * The channels the event should broadcast on. - * - * @return array - */ - public function broadcastOn() - { - $channels = empty($this->channels) - ? ($this->model->broadcastOn($this->event) ?: []) - : $this->channels; - - return (new BaseCollection($channels)) - ->map(fn ($channel) => $channel instanceof Model ? new PrivateChannel($channel) : $channel) - ->all(); - } - - /** - * The name the event should broadcast as. - * - * @return string - */ - public function broadcastAs() - { - $default = class_basename($this->model).ucfirst($this->event); - - return method_exists($this->model, 'broadcastAs') - ? ($this->model->broadcastAs($this->event) ?: $default) - : $default; - } - - /** - * Get the data that should be sent with the broadcasted event. - * - * @return array|null - */ - public function broadcastWith() - { - return method_exists($this->model, 'broadcastWith') - ? $this->model->broadcastWith($this->event) - : null; - } - - /** - * Manually specify the channels the event should broadcast on. - * - * @param array $channels - * @return $this - */ - public function onChannels(array $channels) - { - $this->channels = $channels; - - return $this; - } - - /** - * Determine if the event should be broadcast synchronously. - * - * @return bool - */ - public function shouldBroadcastNow() - { - return $this->event === 'deleted' && - ! method_exists($this->model, 'bootSoftDeletes'); - } - - /** - * Get the event name. - * - * @return string - */ - public function event() - { - return $this->event; - } -} diff --git a/vendor/illuminate/database/Eloquent/BroadcastsEvents.php b/vendor/illuminate/database/Eloquent/BroadcastsEvents.php deleted file mode 100644 index f075dbc..0000000 --- a/vendor/illuminate/database/Eloquent/BroadcastsEvents.php +++ /dev/null @@ -1,197 +0,0 @@ -broadcastCreated(); - }); - - static::updated(function ($model) { - $model->broadcastUpdated(); - }); - - if (method_exists(static::class, 'bootSoftDeletes')) { - static::softDeleted(function ($model) { - $model->broadcastTrashed(); - }); - - static::restored(function ($model) { - $model->broadcastRestored(); - }); - } - - static::deleted(function ($model) { - $model->broadcastDeleted(); - }); - } - - /** - * Broadcast that the model was created. - * - * @param \Illuminate\Broadcasting\Channel|\Illuminate\Contracts\Broadcasting\HasBroadcastChannel|array|null $channels - * @return \Illuminate\Broadcasting\PendingBroadcast - */ - public function broadcastCreated($channels = null) - { - return $this->broadcastIfBroadcastChannelsExistForEvent( - $this->newBroadcastableModelEvent('created'), 'created', $channels - ); - } - - /** - * Broadcast that the model was updated. - * - * @param \Illuminate\Broadcasting\Channel|\Illuminate\Contracts\Broadcasting\HasBroadcastChannel|array|null $channels - * @return \Illuminate\Broadcasting\PendingBroadcast - */ - public function broadcastUpdated($channels = null) - { - return $this->broadcastIfBroadcastChannelsExistForEvent( - $this->newBroadcastableModelEvent('updated'), 'updated', $channels - ); - } - - /** - * Broadcast that the model was trashed. - * - * @param \Illuminate\Broadcasting\Channel|\Illuminate\Contracts\Broadcasting\HasBroadcastChannel|array|null $channels - * @return \Illuminate\Broadcasting\PendingBroadcast - */ - public function broadcastTrashed($channels = null) - { - return $this->broadcastIfBroadcastChannelsExistForEvent( - $this->newBroadcastableModelEvent('trashed'), 'trashed', $channels - ); - } - - /** - * Broadcast that the model was restored. - * - * @param \Illuminate\Broadcasting\Channel|\Illuminate\Contracts\Broadcasting\HasBroadcastChannel|array|null $channels - * @return \Illuminate\Broadcasting\PendingBroadcast - */ - public function broadcastRestored($channels = null) - { - return $this->broadcastIfBroadcastChannelsExistForEvent( - $this->newBroadcastableModelEvent('restored'), 'restored', $channels - ); - } - - /** - * Broadcast that the model was deleted. - * - * @param \Illuminate\Broadcasting\Channel|\Illuminate\Contracts\Broadcasting\HasBroadcastChannel|array|null $channels - * @return \Illuminate\Broadcasting\PendingBroadcast - */ - public function broadcastDeleted($channels = null) - { - return $this->broadcastIfBroadcastChannelsExistForEvent( - $this->newBroadcastableModelEvent('deleted'), 'deleted', $channels - ); - } - - /** - * Broadcast the given event instance if channels are configured for the model event. - * - * @param mixed $instance - * @param string $event - * @param mixed $channels - * @return \Illuminate\Broadcasting\PendingBroadcast|null - */ - protected function broadcastIfBroadcastChannelsExistForEvent($instance, $event, $channels = null) - { - if (! static::$isBroadcasting) { - return; - } - - if (! empty($this->broadcastOn($event)) || ! empty($channels)) { - return broadcast($instance->onChannels(Arr::wrap($channels))); - } - } - - /** - * Create a new broadcastable model event event. - * - * @param string $event - * @return mixed - */ - public function newBroadcastableModelEvent($event) - { - return tap($this->newBroadcastableEvent($event), function ($event) { - $event->connection = property_exists($this, 'broadcastConnection') - ? $this->broadcastConnection - : $this->broadcastConnection(); - - $event->queue = property_exists($this, 'broadcastQueue') - ? $this->broadcastQueue - : $this->broadcastQueue(); - - $event->afterCommit = property_exists($this, 'broadcastAfterCommit') - ? $this->broadcastAfterCommit - : $this->broadcastAfterCommit(); - }); - } - - /** - * Create a new broadcastable model event for the model. - * - * @param string $event - * @return \Illuminate\Database\Eloquent\BroadcastableModelEventOccurred - */ - protected function newBroadcastableEvent(string $event) - { - return new BroadcastableModelEventOccurred($this, $event); - } - - /** - * Get the channels that model events should broadcast on. - * - * @param string $event - * @return \Illuminate\Broadcasting\Channel|array - */ - public function broadcastOn($event) - { - return [$this]; - } - - /** - * Get the queue connection that should be used to broadcast model events. - * - * @return string|null - */ - public function broadcastConnection() - { - // - } - - /** - * Get the queue that should be used to broadcast model events. - * - * @return string|null - */ - public function broadcastQueue() - { - // - } - - /** - * Determine if the model event broadcast queued job should be dispatched after all transactions are committed. - * - * @return bool - */ - public function broadcastAfterCommit() - { - return false; - } -} diff --git a/vendor/illuminate/database/Eloquent/BroadcastsEventsAfterCommit.php b/vendor/illuminate/database/Eloquent/BroadcastsEventsAfterCommit.php deleted file mode 100644 index 806af70..0000000 --- a/vendor/illuminate/database/Eloquent/BroadcastsEventsAfterCommit.php +++ /dev/null @@ -1,18 +0,0 @@ - */ - use BuildsQueries, ForwardsCalls, QueriesRelationships { - BuildsQueries::sole as baseSole; - } - - /** - * The base query builder instance. - * - * @var \Illuminate\Database\Query\Builder - */ - protected $query; - - /** - * The model being queried. - * - * @var TModel - */ - protected $model; - - /** - * The attributes that should be added to new models created by this builder. - * - * @var array - */ - public $pendingAttributes = []; - - /** - * The relationships that should be eager loaded. - * - * @var array - */ - protected $eagerLoad = []; - - /** - * All of the globally registered builder macros. - * - * @var array - */ - protected static $macros = []; - - /** - * All of the locally registered builder macros. - * - * @var array - */ - protected $localMacros = []; - - /** - * A replacement for the typical delete function. - * - * @var \Closure - */ - protected $onDelete; - - /** - * The properties that should be returned from query builder. - * - * @var string[] - */ - protected $propertyPassthru = [ - 'from', - ]; - - /** - * The methods that should be returned from query builder. - * - * @var string[] - */ - protected $passthru = [ - 'aggregate', - 'average', - 'avg', - 'count', - 'dd', - 'ddrawsql', - 'doesntexist', - 'doesntexistor', - 'dump', - 'dumprawsql', - 'exists', - 'existsor', - 'explain', - 'getbindings', - 'getconnection', - 'getgrammar', - 'getrawbindings', - 'implode', - 'insert', - 'insertgetid', - 'insertorignore', - 'insertusing', - 'insertorignoreusing', - 'max', - 'min', - 'numericaggregate', - 'raw', - 'rawvalue', - 'sum', - 'tosql', - 'torawsql', - ]; - - /** - * Applied global scopes. - * - * @var array - */ - protected $scopes = []; - - /** - * Removed global scopes. - * - * @var array - */ - protected $removedScopes = []; - - /** - * The callbacks that should be invoked after retrieving data from the database. - * - * @var array - */ - protected $afterQueryCallbacks = []; - - /** - * The callbacks that should be invoked on clone. - * - * @var array - */ - protected $onCloneCallbacks = []; - - /** - * Create a new Eloquent query builder instance. - * - * @param \Illuminate\Database\Query\Builder $query - * @return void - */ - public function __construct(QueryBuilder $query) - { - $this->query = $query; - } - - /** - * Create and return an un-saved model instance. - * - * @param array $attributes - * @return TModel - */ - public function make(array $attributes = []) - { - return $this->newModelInstance($attributes); - } - - /** - * Register a new global scope. - * - * @param string $identifier - * @param \Illuminate\Database\Eloquent\Scope|\Closure $scope - * @return $this - */ - public function withGlobalScope($identifier, $scope) - { - $this->scopes[$identifier] = $scope; - - if (method_exists($scope, 'extend')) { - $scope->extend($this); - } - - return $this; - } - - /** - * Remove a registered global scope. - * - * @param \Illuminate\Database\Eloquent\Scope|string $scope - * @return $this - */ - public function withoutGlobalScope($scope) - { - if (! is_string($scope)) { - $scope = get_class($scope); - } - - unset($this->scopes[$scope]); - - $this->removedScopes[] = $scope; - - return $this; - } - - /** - * Remove all or passed registered global scopes. - * - * @param array|null $scopes - * @return $this - */ - public function withoutGlobalScopes(?array $scopes = null) - { - if (! is_array($scopes)) { - $scopes = array_keys($this->scopes); - } - - foreach ($scopes as $scope) { - $this->withoutGlobalScope($scope); - } - - return $this; - } - - /** - * Get an array of global scopes that were removed from the query. - * - * @return array - */ - public function removedScopes() - { - return $this->removedScopes; - } - - /** - * Add a where clause on the primary key to the query. - * - * @param mixed $id - * @return $this - */ - public function whereKey($id) - { - if ($id instanceof Model) { - $id = $id->getKey(); - } - - if (is_array($id) || $id instanceof Arrayable) { - if (in_array($this->model->getKeyType(), ['int', 'integer'])) { - $this->query->whereIntegerInRaw($this->model->getQualifiedKeyName(), $id); - } else { - $this->query->whereIn($this->model->getQualifiedKeyName(), $id); - } - - return $this; - } - - if ($id !== null && $this->model->getKeyType() === 'string') { - $id = (string) $id; - } - - return $this->where($this->model->getQualifiedKeyName(), '=', $id); - } - - /** - * Add a where clause on the primary key to the query. - * - * @param mixed $id - * @return $this - */ - public function whereKeyNot($id) - { - if ($id instanceof Model) { - $id = $id->getKey(); - } - - if (is_array($id) || $id instanceof Arrayable) { - if (in_array($this->model->getKeyType(), ['int', 'integer'])) { - $this->query->whereIntegerNotInRaw($this->model->getQualifiedKeyName(), $id); - } else { - $this->query->whereNotIn($this->model->getQualifiedKeyName(), $id); - } - - return $this; - } - - if ($id !== null && $this->model->getKeyType() === 'string') { - $id = (string) $id; - } - - return $this->where($this->model->getQualifiedKeyName(), '!=', $id); - } - - /** - * Add a basic where clause to the query. - * - * @param (\Closure(static): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return $this - */ - public function where($column, $operator = null, $value = null, $boolean = 'and') - { - if ($column instanceof Closure && is_null($operator)) { - $column($query = $this->model->newQueryWithoutRelationships()); - - $this->eagerLoad = array_merge($this->eagerLoad, $query->getEagerLoads()); - - $this->query->addNestedWhereQuery($query->getQuery(), $boolean); - } else { - $this->query->where(...func_get_args()); - } - - return $this; - } - - /** - * Add a basic where clause to the query, and return the first result. - * - * @param (\Closure(static): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return TModel|null - */ - public function firstWhere($column, $operator = null, $value = null, $boolean = 'and') - { - return $this->where(...func_get_args())->first(); - } - - /** - * Add an "or where" clause to the query. - * - * @param (\Closure(static): mixed)|array|string|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhere($column, $operator = null, $value = null) - { - [$value, $operator] = $this->query->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - return $this->where($column, $operator, $value, 'or'); - } - - /** - * Add a basic "where not" clause to the query. - * - * @param (\Closure(static): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return $this - */ - public function whereNot($column, $operator = null, $value = null, $boolean = 'and') - { - return $this->where($column, $operator, $value, $boolean.' not'); - } - - /** - * Add an "or where not" clause to the query. - * - * @param (\Closure(static): mixed)|array|string|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhereNot($column, $operator = null, $value = null) - { - return $this->whereNot($column, $operator, $value, 'or'); - } - - /** - * Add an "order by" clause for a timestamp to the query. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return $this - */ - public function latest($column = null) - { - if (is_null($column)) { - $column = $this->model->getCreatedAtColumn() ?? 'created_at'; - } - - $this->query->latest($column); - - return $this; - } - - /** - * Add an "order by" clause for a timestamp to the query. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return $this - */ - public function oldest($column = null) - { - if (is_null($column)) { - $column = $this->model->getCreatedAtColumn() ?? 'created_at'; - } - - $this->query->oldest($column); - - return $this; - } - - /** - * Create a collection of models from plain arrays. - * - * @param array $items - * @return \Illuminate\Database\Eloquent\Collection - */ - public function hydrate(array $items) - { - $instance = $this->newModelInstance(); - - return $instance->newCollection(array_map(function ($item) use ($items, $instance) { - $model = $instance->newFromBuilder($item); - - if (count($items) > 1) { - $model->preventsLazyLoading = Model::preventsLazyLoading(); - } - - return $model; - }, $items)); - } - - /** - * Create a collection of models from a raw query. - * - * @param string $query - * @param array $bindings - * @return \Illuminate\Database\Eloquent\Collection - */ - public function fromQuery($query, $bindings = []) - { - return $this->hydrate( - $this->query->getConnection()->select($query, $bindings) - ); - } - - /** - * Find a model by its primary key. - * - * @param mixed $id - * @param array|string $columns - * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TModel|null) - */ - public function find($id, $columns = ['*']) - { - if (is_array($id) || $id instanceof Arrayable) { - return $this->findMany($id, $columns); - } - - return $this->whereKey($id)->first($columns); - } - - /** - * Find a sole model by its primary key. - * - * @param mixed $id - * @param array|string $columns - * @return TModel - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - * @throws \Illuminate\Database\MultipleRecordsFoundException - */ - public function findSole($id, $columns = ['*']) - { - return $this->whereKey($id)->sole($columns); - } - - /** - * Find multiple models by their primary keys. - * - * @param \Illuminate\Contracts\Support\Arrayable|array $ids - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Collection - */ - public function findMany($ids, $columns = ['*']) - { - $ids = $ids instanceof Arrayable ? $ids->toArray() : $ids; - - if (empty($ids)) { - return $this->model->newCollection(); - } - - return $this->whereKey($ids)->get($columns); - } - - /** - * Find a model by its primary key or throw an exception. - * - * @param mixed $id - * @param array|string $columns - * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TModel) - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function findOrFail($id, $columns = ['*']) - { - $result = $this->find($id, $columns); - - $id = $id instanceof Arrayable ? $id->toArray() : $id; - - if (is_array($id)) { - if (count($result) !== count(array_unique($id))) { - throw (new ModelNotFoundException)->setModel( - get_class($this->model), array_diff($id, $result->modelKeys()) - ); - } - - return $result; - } - - if (is_null($result)) { - throw (new ModelNotFoundException)->setModel( - get_class($this->model), $id - ); - } - - return $result; - } - - /** - * Find a model by its primary key or return fresh model instance. - * - * @param mixed $id - * @param array|string $columns - * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TModel) - */ - public function findOrNew($id, $columns = ['*']) - { - if (! is_null($model = $this->find($id, $columns))) { - return $model; - } - - return $this->newModelInstance(); - } - - /** - * Find a model by its primary key or call a callback. - * - * @template TValue - * - * @param mixed $id - * @param (\Closure(): TValue)|list|string $columns - * @param (\Closure(): TValue)|null $callback - * @return ( - * $id is (\Illuminate\Contracts\Support\Arrayable|array) - * ? \Illuminate\Database\Eloquent\Collection - * : TModel|TValue - * ) - */ - public function findOr($id, $columns = ['*'], ?Closure $callback = null) - { - if ($columns instanceof Closure) { - $callback = $columns; - - $columns = ['*']; - } - - if (! is_null($model = $this->find($id, $columns))) { - return $model; - } - - return $callback(); - } - - /** - * Get the first record matching the attributes or instantiate it. - * - * @param array $attributes - * @param array $values - * @return TModel - */ - public function firstOrNew(array $attributes = [], array $values = []) - { - if (! is_null($instance = $this->where($attributes)->first())) { - return $instance; - } - - return $this->newModelInstance(array_merge($attributes, $values)); - } - - /** - * Get the first record matching the attributes. If the record is not found, create it. - * - * @param array $attributes - * @param array $values - * @return TModel - */ - public function firstOrCreate(array $attributes = [], array $values = []) - { - if (! is_null($instance = (clone $this)->where($attributes)->first())) { - return $instance; - } - - return $this->createOrFirst($attributes, $values); - } - - /** - * Attempt to create the record. If a unique constraint violation occurs, attempt to find the matching record. - * - * @param array $attributes - * @param array $values - * @return TModel - */ - public function createOrFirst(array $attributes = [], array $values = []) - { - try { - return $this->withSavepointIfNeeded(fn () => $this->create(array_merge($attributes, $values))); - } catch (UniqueConstraintViolationException $e) { - return $this->useWritePdo()->where($attributes)->first() ?? throw $e; - } - } - - /** - * Create or update a record matching the attributes, and fill it with values. - * - * @param array $attributes - * @param array $values - * @return TModel - */ - public function updateOrCreate(array $attributes, array $values = []) - { - return tap($this->firstOrCreate($attributes, $values), function ($instance) use ($values) { - if (! $instance->wasRecentlyCreated) { - $instance->fill($values)->save(); - } - }); - } - - /** - * Create a record matching the attributes, or increment the existing record. - * - * @param array $attributes - * @param string $column - * @param int|float $default - * @param int|float $step - * @param array $extra - * @return TModel - */ - public function incrementOrCreate(array $attributes, string $column = 'count', $default = 1, $step = 1, array $extra = []) - { - return tap($this->firstOrCreate($attributes, [$column => $default]), function ($instance) use ($column, $step, $extra) { - if (! $instance->wasRecentlyCreated) { - $instance->increment($column, $step, $extra); - } - }); - } - - /** - * Execute the query and get the first result or throw an exception. - * - * @param array|string $columns - * @return TModel - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function firstOrFail($columns = ['*']) - { - if (! is_null($model = $this->first($columns))) { - return $model; - } - - throw (new ModelNotFoundException)->setModel(get_class($this->model)); - } - - /** - * Execute the query and get the first result or call a callback. - * - * @template TValue - * - * @param (\Closure(): TValue)|list $columns - * @param (\Closure(): TValue)|null $callback - * @return TModel|TValue - */ - public function firstOr($columns = ['*'], ?Closure $callback = null) - { - if ($columns instanceof Closure) { - $callback = $columns; - - $columns = ['*']; - } - - if (! is_null($model = $this->first($columns))) { - return $model; - } - - return $callback(); - } - - /** - * Execute the query and get the first result if it's the sole matching record. - * - * @param array|string $columns - * @return TModel - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - * @throws \Illuminate\Database\MultipleRecordsFoundException - */ - public function sole($columns = ['*']) - { - try { - return $this->baseSole($columns); - } catch (RecordsNotFoundException) { - throw (new ModelNotFoundException)->setModel(get_class($this->model)); - } - } - - /** - * Get a single column's value from the first result of a query. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return mixed - */ - public function value($column) - { - if ($result = $this->first([$column])) { - $column = $column instanceof Expression ? $column->getValue($this->getGrammar()) : $column; - - return $result->{Str::afterLast($column, '.')}; - } - } - - /** - * Get a single column's value from the first result of a query if it's the sole matching record. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return mixed - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - * @throws \Illuminate\Database\MultipleRecordsFoundException - */ - public function soleValue($column) - { - $column = $column instanceof Expression ? $column->getValue($this->getGrammar()) : $column; - - return $this->sole([$column])->{Str::afterLast($column, '.')}; - } - - /** - * Get a single column's value from the first result of the query or throw an exception. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return mixed - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function valueOrFail($column) - { - $column = $column instanceof Expression ? $column->getValue($this->getGrammar()) : $column; - - return $this->firstOrFail([$column])->{Str::afterLast($column, '.')}; - } - - /** - * Execute the query as a "select" statement. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Collection - */ - public function get($columns = ['*']) - { - $builder = $this->applyScopes(); - - // If we actually found models we will also eager load any relationships that - // have been specified as needing to be eager loaded, which will solve the - // n+1 query issue for the developers to avoid running a lot of queries. - if (count($models = $builder->getModels($columns)) > 0) { - $models = $builder->eagerLoadRelations($models); - } - - return $this->applyAfterQueryCallbacks( - $builder->getModel()->newCollection($models) - ); - } - - /** - * Get the hydrated models without eager loading. - * - * @param array|string $columns - * @return array - */ - public function getModels($columns = ['*']) - { - return $this->model->hydrate( - $this->query->get($columns)->all() - )->all(); - } - - /** - * Eager load the relationships for the models. - * - * @param array $models - * @return array - */ - public function eagerLoadRelations(array $models) - { - foreach ($this->eagerLoad as $name => $constraints) { - // For nested eager loads we'll skip loading them here and they will be set as an - // eager load on the query to retrieve the relation so that they will be eager - // loaded on that query, because that is where they get hydrated as models. - if (! str_contains($name, '.')) { - $models = $this->eagerLoadRelation($models, $name, $constraints); - } - } - - return $models; - } - - /** - * Eagerly load the relationship on a set of models. - * - * @param array $models - * @param string $name - * @param \Closure $constraints - * @return array - */ - protected function eagerLoadRelation(array $models, $name, Closure $constraints) - { - // First we will "back up" the existing where conditions on the query so we can - // add our eager constraints. Then we will merge the wheres that were on the - // query back to it in order that any where conditions might be specified. - $relation = $this->getRelation($name); - - $relation->addEagerConstraints($models); - - $constraints($relation); - - // Once we have the results, we just match those back up to their parent models - // using the relationship instance. Then we just return the finished arrays - // of models which have been eagerly hydrated and are readied for return. - return $relation->match( - $relation->initRelation($models, $name), - $relation->getEager(), $name - ); - } - - /** - * Get the relation instance for the given relation name. - * - * @param string $name - * @return \Illuminate\Database\Eloquent\Relations\Relation<\Illuminate\Database\Eloquent\Model, TModel, *> - */ - public function getRelation($name) - { - // We want to run a relationship query without any constrains so that we will - // not have to remove these where clauses manually which gets really hacky - // and error prone. We don't want constraints because we add eager ones. - $relation = Relation::noConstraints(function () use ($name) { - try { - return $this->getModel()->newInstance()->$name(); - } catch (BadMethodCallException) { - throw RelationNotFoundException::make($this->getModel(), $name); - } - }); - - $nested = $this->relationsNestedUnder($name); - - // If there are nested relationships set on the query, we will put those onto - // the query instances so that they can be handled after this relationship - // is loaded. In this way they will all trickle down as they are loaded. - if (count($nested) > 0) { - $relation->getQuery()->with($nested); - } - - return $relation; - } - - /** - * Get the deeply nested relations for a given top-level relation. - * - * @param string $relation - * @return array - */ - protected function relationsNestedUnder($relation) - { - $nested = []; - - // We are basically looking for any relationships that are nested deeper than - // the given top-level relationship. We will just check for any relations - // that start with the given top relations and adds them to our arrays. - foreach ($this->eagerLoad as $name => $constraints) { - if ($this->isNestedUnder($relation, $name)) { - $nested[substr($name, strlen($relation.'.'))] = $constraints; - } - } - - return $nested; - } - - /** - * Determine if the relationship is nested. - * - * @param string $relation - * @param string $name - * @return bool - */ - protected function isNestedUnder($relation, $name) - { - return str_contains($name, '.') && str_starts_with($name, $relation.'.'); - } - - /** - * Register a closure to be invoked after the query is executed. - * - * @param \Closure $callback - * @return $this - */ - public function afterQuery(Closure $callback) - { - $this->afterQueryCallbacks[] = $callback; - - return $this; - } - - /** - * Invoke the "after query" modification callbacks. - * - * @param mixed $result - * @return mixed - */ - public function applyAfterQueryCallbacks($result) - { - foreach ($this->afterQueryCallbacks as $afterQueryCallback) { - $result = $afterQueryCallback($result) ?: $result; - } - - return $result; - } - - /** - * Get a lazy collection for the given query. - * - * @return \Illuminate\Support\LazyCollection - */ - public function cursor() - { - return $this->applyScopes()->query->cursor()->map(function ($record) { - $model = $this->newModelInstance()->newFromBuilder($record); - - return $this->applyAfterQueryCallbacks($this->newModelInstance()->newCollection([$model]))->first(); - })->reject(fn ($model) => is_null($model)); - } - - /** - * Add a generic "order by" clause if the query doesn't already have one. - * - * @return void - */ - protected function enforceOrderBy() - { - if (empty($this->query->orders) && empty($this->query->unionOrders)) { - $this->orderBy($this->model->getQualifiedKeyName(), 'asc'); - } - } - - /** - * Get a collection with the values of a given column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param string|null $key - * @return \Illuminate\Support\Collection - */ - public function pluck($column, $key = null) - { - $results = $this->toBase()->pluck($column, $key); - - $column = $column instanceof Expression ? $column->getValue($this->getGrammar()) : $column; - - $column = Str::after($column, "{$this->model->getTable()}."); - - // If the model has a mutator for the requested column, we will spin through - // the results and mutate the values so that the mutated version of these - // columns are returned as you would expect from these Eloquent models. - if (! $this->model->hasAnyGetMutator($column) && - ! $this->model->hasCast($column) && - ! in_array($column, $this->model->getDates())) { - return $this->applyAfterQueryCallbacks($results); - } - - return $this->applyAfterQueryCallbacks( - $results->map(function ($value) use ($column) { - return $this->model->newFromBuilder([$column => $value])->{$column}; - }) - ); - } - - /** - * Paginate the given query. - * - * @param int|null|\Closure $perPage - * @param array|string $columns - * @param string $pageName - * @param int|null $page - * @param \Closure|int|null $total - * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator - * - * @throws \InvalidArgumentException - */ - public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null, $total = null) - { - $page = $page ?: Paginator::resolveCurrentPage($pageName); - - $total = value($total) ?? $this->toBase()->getCountForPagination(); - - $perPage = value($perPage, $total) ?: $this->model->getPerPage(); - - $results = $total - ? $this->forPage($page, $perPage)->get($columns) - : $this->model->newCollection(); - - return $this->paginator($results, $total, $perPage, $page, [ - 'path' => Paginator::resolveCurrentPath(), - 'pageName' => $pageName, - ]); - } - - /** - * Paginate the given query into a simple paginator. - * - * @param int|null $perPage - * @param array|string $columns - * @param string $pageName - * @param int|null $page - * @return \Illuminate\Contracts\Pagination\Paginator - */ - public function simplePaginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) - { - $page = $page ?: Paginator::resolveCurrentPage($pageName); - - $perPage = $perPage ?: $this->model->getPerPage(); - - // Next we will set the limit and offset for this query so that when we get the - // results we get the proper section of results. Then, we'll create the full - // paginator instances for these results with the given page and per page. - $this->skip(($page - 1) * $perPage)->take($perPage + 1); - - return $this->simplePaginator($this->get($columns), $perPage, $page, [ - 'path' => Paginator::resolveCurrentPath(), - 'pageName' => $pageName, - ]); - } - - /** - * Paginate the given query into a cursor paginator. - * - * @param int|null $perPage - * @param array|string $columns - * @param string $cursorName - * @param \Illuminate\Pagination\Cursor|string|null $cursor - * @return \Illuminate\Contracts\Pagination\CursorPaginator - */ - public function cursorPaginate($perPage = null, $columns = ['*'], $cursorName = 'cursor', $cursor = null) - { - $perPage = $perPage ?: $this->model->getPerPage(); - - return $this->paginateUsingCursor($perPage, $columns, $cursorName, $cursor); - } - - /** - * Ensure the proper order by required for cursor pagination. - * - * @param bool $shouldReverse - * @return \Illuminate\Support\Collection - */ - protected function ensureOrderForCursorPagination($shouldReverse = false) - { - if (empty($this->query->orders) && empty($this->query->unionOrders)) { - $this->enforceOrderBy(); - } - - $reverseDirection = function ($order) { - if (! isset($order['direction'])) { - return $order; - } - - $order['direction'] = $order['direction'] === 'asc' ? 'desc' : 'asc'; - - return $order; - }; - - if ($shouldReverse) { - $this->query->orders = (new BaseCollection($this->query->orders))->map($reverseDirection)->toArray(); - $this->query->unionOrders = (new BaseCollection($this->query->unionOrders))->map($reverseDirection)->toArray(); - } - - $orders = ! empty($this->query->unionOrders) ? $this->query->unionOrders : $this->query->orders; - - return (new BaseCollection($orders)) - ->filter(fn ($order) => Arr::has($order, 'direction')) - ->values(); - } - - /** - * Save a new model and return the instance. - * - * @param array $attributes - * @return TModel - */ - public function create(array $attributes = []) - { - return tap($this->newModelInstance($attributes), function ($instance) { - $instance->save(); - }); - } - - /** - * Save a new model and return the instance without raising model events. - * - * @param array $attributes - * @return TModel - */ - public function createQuietly(array $attributes = []) - { - return Model::withoutEvents(fn () => $this->create($attributes)); - } - - /** - * Save a new model and return the instance. Allow mass-assignment. - * - * @param array $attributes - * @return TModel - */ - public function forceCreate(array $attributes) - { - return $this->model->unguarded(function () use ($attributes) { - return $this->newModelInstance()->create($attributes); - }); - } - - /** - * Save a new model instance with mass assignment without raising model events. - * - * @param array $attributes - * @return TModel - */ - public function forceCreateQuietly(array $attributes = []) - { - return Model::withoutEvents(fn () => $this->forceCreate($attributes)); - } - - /** - * Update records in the database. - * - * @param array $values - * @return int - */ - public function update(array $values) - { - return $this->toBase()->update($this->addUpdatedAtColumn($values)); - } - - /** - * Insert new records or update the existing ones. - * - * @param array $values - * @param array|string $uniqueBy - * @param array|null $update - * @return int - */ - public function upsert(array $values, $uniqueBy, $update = null) - { - if (empty($values)) { - return 0; - } - - if (! is_array(reset($values))) { - $values = [$values]; - } - - if (is_null($update)) { - $update = array_keys(reset($values)); - } - - return $this->toBase()->upsert( - $this->addTimestampsToUpsertValues($this->addUniqueIdsToUpsertValues($values)), - $uniqueBy, - $this->addUpdatedAtToUpsertColumns($update) - ); - } - - /** - * Update the column's update timestamp. - * - * @param string|null $column - * @return int|false - */ - public function touch($column = null) - { - $time = $this->model->freshTimestamp(); - - if ($column) { - return $this->toBase()->update([$column => $time]); - } - - $column = $this->model->getUpdatedAtColumn(); - - if (! $this->model->usesTimestamps() || is_null($column)) { - return false; - } - - return $this->toBase()->update([$column => $time]); - } - - /** - * Increment a column's value by a given amount. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param float|int $amount - * @param array $extra - * @return int - */ - public function increment($column, $amount = 1, array $extra = []) - { - return $this->toBase()->increment( - $column, $amount, $this->addUpdatedAtColumn($extra) - ); - } - - /** - * Decrement a column's value by a given amount. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param float|int $amount - * @param array $extra - * @return int - */ - public function decrement($column, $amount = 1, array $extra = []) - { - return $this->toBase()->decrement( - $column, $amount, $this->addUpdatedAtColumn($extra) - ); - } - - /** - * Add the "updated at" column to an array of values. - * - * @param array $values - * @return array - */ - protected function addUpdatedAtColumn(array $values) - { - if (! $this->model->usesTimestamps() || - is_null($this->model->getUpdatedAtColumn())) { - return $values; - } - - $column = $this->model->getUpdatedAtColumn(); - - if (! array_key_exists($column, $values)) { - $timestamp = $this->model->freshTimestampString(); - - if ( - $this->model->hasSetMutator($column) - || $this->model->hasAttributeSetMutator($column) - || $this->model->hasCast($column) - ) { - $timestamp = $this->model->newInstance() - ->forceFill([$column => $timestamp]) - ->getAttributes()[$column] ?? $timestamp; - } - - $values = array_merge([$column => $timestamp], $values); - } - - $segments = preg_split('/\s+as\s+/i', $this->query->from); - - $qualifiedColumn = end($segments).'.'.$column; - - $values[$qualifiedColumn] = Arr::get($values, $qualifiedColumn, $values[$column]); - - unset($values[$column]); - - return $values; - } - - /** - * Add unique IDs to the inserted values. - * - * @param array $values - * @return array - */ - protected function addUniqueIdsToUpsertValues(array $values) - { - if (! $this->model->usesUniqueIds()) { - return $values; - } - - foreach ($this->model->uniqueIds() as $uniqueIdAttribute) { - foreach ($values as &$row) { - if (! array_key_exists($uniqueIdAttribute, $row)) { - $row = array_merge([$uniqueIdAttribute => $this->model->newUniqueId()], $row); - } - } - } - - return $values; - } - - /** - * Add timestamps to the inserted values. - * - * @param array $values - * @return array - */ - protected function addTimestampsToUpsertValues(array $values) - { - if (! $this->model->usesTimestamps()) { - return $values; - } - - $timestamp = $this->model->freshTimestampString(); - - $columns = array_filter([ - $this->model->getCreatedAtColumn(), - $this->model->getUpdatedAtColumn(), - ]); - - foreach ($columns as $column) { - foreach ($values as &$row) { - $row = array_merge([$column => $timestamp], $row); - } - } - - return $values; - } - - /** - * Add the "updated at" column to the updated columns. - * - * @param array $update - * @return array - */ - protected function addUpdatedAtToUpsertColumns(array $update) - { - if (! $this->model->usesTimestamps()) { - return $update; - } - - $column = $this->model->getUpdatedAtColumn(); - - if (! is_null($column) && - ! array_key_exists($column, $update) && - ! in_array($column, $update)) { - $update[] = $column; - } - - return $update; - } - - /** - * Delete records from the database. - * - * @return mixed - */ - public function delete() - { - if (isset($this->onDelete)) { - return call_user_func($this->onDelete, $this); - } - - return $this->toBase()->delete(); - } - - /** - * Run the default delete function on the builder. - * - * Since we do not apply scopes here, the row will actually be deleted. - * - * @return mixed - */ - public function forceDelete() - { - return $this->query->delete(); - } - - /** - * Register a replacement for the default delete function. - * - * @param \Closure $callback - * @return void - */ - public function onDelete(Closure $callback) - { - $this->onDelete = $callback; - } - - /** - * Determine if the given model has a scope. - * - * @param string $scope - * @return bool - */ - public function hasNamedScope($scope) - { - return $this->model && $this->model->hasNamedScope($scope); - } - - /** - * Call the given local model scopes. - * - * @param array|string $scopes - * @return static|mixed - */ - public function scopes($scopes) - { - $builder = $this; - - foreach (Arr::wrap($scopes) as $scope => $parameters) { - // If the scope key is an integer, then the scope was passed as the value and - // the parameter list is empty, so we will format the scope name and these - // parameters here. Then, we'll be ready to call the scope on the model. - if (is_int($scope)) { - [$scope, $parameters] = [$parameters, []]; - } - - // Next we'll pass the scope callback to the callScope method which will take - // care of grouping the "wheres" properly so the logical order doesn't get - // messed up when adding scopes. Then we'll return back out the builder. - $builder = $builder->callNamedScope( - $scope, Arr::wrap($parameters) - ); - } - - return $builder; - } - - /** - * Apply the scopes to the Eloquent builder instance and return it. - * - * @return static - */ - public function applyScopes() - { - if (! $this->scopes) { - return $this; - } - - $builder = clone $this; - - foreach ($this->scopes as $identifier => $scope) { - if (! isset($builder->scopes[$identifier])) { - continue; - } - - $builder->callScope(function (self $builder) use ($scope) { - // If the scope is a Closure we will just go ahead and call the scope with the - // builder instance. The "callScope" method will properly group the clauses - // that are added to this query so "where" clauses maintain proper logic. - if ($scope instanceof Closure) { - $scope($builder); - } - - // If the scope is a scope object, we will call the apply method on this scope - // passing in the builder and the model instance. After we run all of these - // scopes we will return back the builder instance to the outside caller. - if ($scope instanceof Scope) { - $scope->apply($builder, $this->getModel()); - } - }); - } - - return $builder; - } - - /** - * Apply the given scope on the current builder instance. - * - * @param callable $scope - * @param array $parameters - * @return mixed - */ - protected function callScope(callable $scope, array $parameters = []) - { - array_unshift($parameters, $this); - - $query = $this->getQuery(); - - // We will keep track of how many wheres are on the query before running the - // scope so that we can properly group the added scope constraints in the - // query as their own isolated nested where statement and avoid issues. - $originalWhereCount = is_null($query->wheres) - ? 0 : count($query->wheres); - - $result = $scope(...$parameters) ?? $this; - - if (count((array) $query->wheres) > $originalWhereCount) { - $this->addNewWheresWithinGroup($query, $originalWhereCount); - } - - return $result; - } - - /** - * Apply the given named scope on the current builder instance. - * - * @param string $scope - * @param array $parameters - * @return mixed - */ - protected function callNamedScope($scope, array $parameters = []) - { - return $this->callScope(function (...$parameters) use ($scope) { - return $this->model->callNamedScope($scope, $parameters); - }, $parameters); - } - - /** - * Nest where conditions by slicing them at the given where count. - * - * @param \Illuminate\Database\Query\Builder $query - * @param int $originalWhereCount - * @return void - */ - protected function addNewWheresWithinGroup(QueryBuilder $query, $originalWhereCount) - { - // Here, we totally remove all of the where clauses since we are going to - // rebuild them as nested queries by slicing the groups of wheres into - // their own sections. This is to prevent any confusing logic order. - $allWheres = $query->wheres; - - $query->wheres = []; - - $this->groupWhereSliceForScope( - $query, array_slice($allWheres, 0, $originalWhereCount) - ); - - $this->groupWhereSliceForScope( - $query, array_slice($allWheres, $originalWhereCount) - ); - } - - /** - * Slice where conditions at the given offset and add them to the query as a nested condition. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $whereSlice - * @return void - */ - protected function groupWhereSliceForScope(QueryBuilder $query, $whereSlice) - { - $whereBooleans = (new BaseCollection($whereSlice))->pluck('boolean'); - - // Here we'll check if the given subset of where clauses contains any "or" - // booleans and in this case create a nested where expression. That way - // we don't add any unnecessary nesting thus keeping the query clean. - if ($whereBooleans->contains(fn ($logicalOperator) => str_contains($logicalOperator, 'or'))) { - $query->wheres[] = $this->createNestedWhere( - $whereSlice, str_replace(' not', '', $whereBooleans->first()) - ); - } else { - $query->wheres = array_merge($query->wheres, $whereSlice); - } - } - - /** - * Create a where array with nested where conditions. - * - * @param array $whereSlice - * @param string $boolean - * @return array - */ - protected function createNestedWhere($whereSlice, $boolean = 'and') - { - $whereGroup = $this->getQuery()->forNestedWhere(); - - $whereGroup->wheres = $whereSlice; - - return ['type' => 'Nested', 'query' => $whereGroup, 'boolean' => $boolean]; - } - - /** - * Set the relationships that should be eager loaded. - * - * @param array): mixed)|string>|string $relations - * @param (\Closure(\Illuminate\Database\Eloquent\Relations\Relation<*,*,*>): mixed)|string|null $callback - * @return $this - */ - public function with($relations, $callback = null) - { - if ($callback instanceof Closure) { - $eagerLoad = $this->parseWithRelations([$relations => $callback]); - } else { - $eagerLoad = $this->parseWithRelations(is_string($relations) ? func_get_args() : $relations); - } - - $this->eagerLoad = array_merge($this->eagerLoad, $eagerLoad); - - return $this; - } - - /** - * Prevent the specified relations from being eager loaded. - * - * @param mixed $relations - * @return $this - */ - public function without($relations) - { - $this->eagerLoad = array_diff_key($this->eagerLoad, array_flip( - is_string($relations) ? func_get_args() : $relations - )); - - return $this; - } - - /** - * Set the relationships that should be eager loaded while removing any previously added eager loading specifications. - * - * @param array): mixed)|string>|string $relations - * @return $this - */ - public function withOnly($relations) - { - $this->eagerLoad = []; - - return $this->with($relations); - } - - /** - * Create a new instance of the model being queried. - * - * @param array $attributes - * @return TModel - */ - public function newModelInstance($attributes = []) - { - $attributes = array_merge($this->pendingAttributes, $attributes); - - return $this->model->newInstance($attributes)->setConnection( - $this->query->getConnection()->getName() - ); - } - - /** - * Parse a list of relations into individuals. - * - * @param array $relations - * @return array - */ - protected function parseWithRelations(array $relations) - { - if ($relations === []) { - return []; - } - - $results = []; - - foreach ($this->prepareNestedWithRelationships($relations) as $name => $constraints) { - // We need to separate out any nested includes, which allows the developers - // to load deep relationships using "dots" without stating each level of - // the relationship with its own key in the array of eager-load names. - $results = $this->addNestedWiths($name, $results); - - $results[$name] = $constraints; - } - - return $results; - } - - /** - * Prepare nested with relationships. - * - * @param array $relations - * @param string $prefix - * @return array - */ - protected function prepareNestedWithRelationships($relations, $prefix = '') - { - $preparedRelationships = []; - - if ($prefix !== '') { - $prefix .= '.'; - } - - // If any of the relationships are formatted with the [$attribute => array()] - // syntax, we shall loop over the nested relations and prepend each key of - // this array while flattening into the traditional dot notation format. - foreach ($relations as $key => $value) { - if (! is_string($key) || ! is_array($value)) { - continue; - } - - [$attribute, $attributeSelectConstraint] = $this->parseNameAndAttributeSelectionConstraint($key); - - $preparedRelationships = array_merge( - $preparedRelationships, - ["{$prefix}{$attribute}" => $attributeSelectConstraint], - $this->prepareNestedWithRelationships($value, "{$prefix}{$attribute}"), - ); - - unset($relations[$key]); - } - - // We now know that the remaining relationships are in a dot notation format - // and may be a string or Closure. We'll loop over them and ensure all of - // the present Closures are merged + strings are made into constraints. - foreach ($relations as $key => $value) { - if (is_numeric($key) && is_string($value)) { - [$key, $value] = $this->parseNameAndAttributeSelectionConstraint($value); - } - - $preparedRelationships[$prefix.$key] = $this->combineConstraints([ - $value, - $preparedRelationships[$prefix.$key] ?? static function () { - // - }, - ]); - } - - return $preparedRelationships; - } - - /** - * Combine an array of constraints into a single constraint. - * - * @param array $constraints - * @return \Closure - */ - protected function combineConstraints(array $constraints) - { - return function ($builder) use ($constraints) { - foreach ($constraints as $constraint) { - $builder = $constraint($builder) ?? $builder; - } - - return $builder; - }; - } - - /** - * Parse the attribute select constraints from the name. - * - * @param string $name - * @return array - */ - protected function parseNameAndAttributeSelectionConstraint($name) - { - return str_contains($name, ':') - ? $this->createSelectWithConstraint($name) - : [$name, static function () { - // - }]; - } - - /** - * Create a constraint to select the given columns for the relation. - * - * @param string $name - * @return array - */ - protected function createSelectWithConstraint($name) - { - return [explode(':', $name)[0], static function ($query) use ($name) { - $query->select(array_map(static function ($column) use ($query) { - return $query instanceof BelongsToMany - ? $query->getRelated()->qualifyColumn($column) - : $column; - }, explode(',', explode(':', $name)[1]))); - }]; - } - - /** - * Parse the nested relationships in a relation. - * - * @param string $name - * @param array $results - * @return array - */ - protected function addNestedWiths($name, $results) - { - $progress = []; - - // If the relation has already been set on the result array, we will not set it - // again, since that would override any constraints that were already placed - // on the relationships. We will only set the ones that are not specified. - foreach (explode('.', $name) as $segment) { - $progress[] = $segment; - - if (! isset($results[$last = implode('.', $progress)])) { - $results[$last] = static function () { - // - }; - } - } - - return $results; - } - - /** - * Specify attributes that should be added to any new models created by this builder. - * - * The given key / value pairs will also be added as where conditions to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|array|string $attributes - * @param mixed $value - * @return $this - */ - public function withAttributes(Expression|array|string $attributes, $value = null) - { - if (! is_array($attributes)) { - $attributes = [$attributes => $value]; - } - - foreach ($attributes as $column => $value) { - $this->where($this->qualifyColumn($column), $value); - } - - $this->pendingAttributes = array_merge($this->pendingAttributes, $attributes); - - return $this; - } - - /** - * Apply query-time casts to the model instance. - * - * @param array $casts - * @return $this - */ - public function withCasts($casts) - { - $this->model->mergeCasts($casts); - - return $this; - } - - /** - * Execute the given Closure within a transaction savepoint if needed. - * - * @template TModelValue - * - * @param \Closure(): TModelValue $scope - * @return TModelValue - */ - public function withSavepointIfNeeded(Closure $scope): mixed - { - return $this->getQuery()->getConnection()->transactionLevel() > 0 - ? $this->getQuery()->getConnection()->transaction($scope) - : $scope(); - } - - /** - * Get the Eloquent builder instances that are used in the union of the query. - * - * @return \Illuminate\Support\Collection - */ - protected function getUnionBuilders() - { - return isset($this->query->unions) - ? (new BaseCollection($this->query->unions))->pluck('query') - : new BaseCollection; - } - - /** - * Get the underlying query builder instance. - * - * @return \Illuminate\Database\Query\Builder - */ - public function getQuery() - { - return $this->query; - } - - /** - * Set the underlying query builder instance. - * - * @param \Illuminate\Database\Query\Builder $query - * @return $this - */ - public function setQuery($query) - { - $this->query = $query; - - return $this; - } - - /** - * Get a base query builder instance. - * - * @return \Illuminate\Database\Query\Builder - */ - public function toBase() - { - return $this->applyScopes()->getQuery(); - } - - /** - * Get the relationships being eagerly loaded. - * - * @return array - */ - public function getEagerLoads() - { - return $this->eagerLoad; - } - - /** - * Set the relationships being eagerly loaded. - * - * @param array $eagerLoad - * @return $this - */ - public function setEagerLoads(array $eagerLoad) - { - $this->eagerLoad = $eagerLoad; - - return $this; - } - - /** - * Indicate that the given relationships should not be eagerly loaded. - * - * @param array $relations - * @return $this - */ - public function withoutEagerLoad(array $relations) - { - $relations = array_diff(array_keys($this->model->getRelations()), $relations); - - return $this->with($relations); - } - - /** - * Flush the relationships being eagerly loaded. - * - * @return $this - */ - public function withoutEagerLoads() - { - return $this->setEagerLoads([]); - } - - /** - * Get the default key name of the table. - * - * @return string - */ - protected function defaultKeyName() - { - return $this->getModel()->getKeyName(); - } - - /** - * Get the model instance being queried. - * - * @return TModel - */ - public function getModel() - { - return $this->model; - } - - /** - * Set a model instance for the model being queried. - * - * @template TModelNew of \Illuminate\Database\Eloquent\Model - * - * @param TModelNew $model - * @return static - */ - public function setModel(Model $model) - { - $this->model = $model; - - $this->query->from($model->getTable()); - - return $this; - } - - /** - * Qualify the given column name by the model's table. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return string - */ - public function qualifyColumn($column) - { - $column = $column instanceof Expression ? $column->getValue($this->getGrammar()) : $column; - - return $this->model->qualifyColumn($column); - } - - /** - * Qualify the given columns with the model's table. - * - * @param array|\Illuminate\Contracts\Database\Query\Expression $columns - * @return array - */ - public function qualifyColumns($columns) - { - return $this->model->qualifyColumns($columns); - } - - /** - * Get the given macro by name. - * - * @param string $name - * @return \Closure - */ - public function getMacro($name) - { - return Arr::get($this->localMacros, $name); - } - - /** - * Checks if a macro is registered. - * - * @param string $name - * @return bool - */ - public function hasMacro($name) - { - return isset($this->localMacros[$name]); - } - - /** - * Get the given global macro by name. - * - * @param string $name - * @return \Closure - */ - public static function getGlobalMacro($name) - { - return Arr::get(static::$macros, $name); - } - - /** - * Checks if a global macro is registered. - * - * @param string $name - * @return bool - */ - public static function hasGlobalMacro($name) - { - return isset(static::$macros[$name]); - } - - /** - * Dynamically access builder proxies. - * - * @param string $key - * @return mixed - * - * @throws \Exception - */ - public function __get($key) - { - if (in_array($key, ['orWhere', 'whereNot', 'orWhereNot'])) { - return new HigherOrderBuilderProxy($this, $key); - } - - if (in_array($key, $this->propertyPassthru)) { - return $this->toBase()->{$key}; - } - - throw new Exception("Property [{$key}] does not exist on the Eloquent builder instance."); - } - - /** - * Dynamically handle calls into the query instance. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - if ($method === 'macro') { - $this->localMacros[$parameters[0]] = $parameters[1]; - - return; - } - - if ($this->hasMacro($method)) { - array_unshift($parameters, $this); - - return $this->localMacros[$method](...$parameters); - } - - if (static::hasGlobalMacro($method)) { - $callable = static::$macros[$method]; - - if ($callable instanceof Closure) { - $callable = $callable->bindTo($this, static::class); - } - - return $callable(...$parameters); - } - - if ($this->hasNamedScope($method)) { - return $this->callNamedScope($method, $parameters); - } - - if (in_array(strtolower($method), $this->passthru)) { - return $this->toBase()->{$method}(...$parameters); - } - - $this->forwardCallTo($this->query, $method, $parameters); - - return $this; - } - - /** - * Dynamically handle calls into the query instance. - * - * @param string $method - * @param array $parameters - * @return mixed - * - * @throws \BadMethodCallException - */ - public static function __callStatic($method, $parameters) - { - if ($method === 'macro') { - static::$macros[$parameters[0]] = $parameters[1]; - - return; - } - - if ($method === 'mixin') { - return static::registerMixin($parameters[0], $parameters[1] ?? true); - } - - if (! static::hasGlobalMacro($method)) { - static::throwBadMethodCallException($method); - } - - $callable = static::$macros[$method]; - - if ($callable instanceof Closure) { - $callable = $callable->bindTo(null, static::class); - } - - return $callable(...$parameters); - } - - /** - * Register the given mixin with the builder. - * - * @param string $mixin - * @param bool $replace - * @return void - */ - protected static function registerMixin($mixin, $replace) - { - $methods = (new ReflectionClass($mixin))->getMethods( - ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED - ); - - foreach ($methods as $method) { - if ($replace || ! static::hasGlobalMacro($method->name)) { - static::macro($method->name, $method->invoke($mixin)); - } - } - } - - /** - * Clone the Eloquent query builder. - * - * @return static - */ - public function clone() - { - return clone $this; - } - - /** - * Register a closure to be invoked on a clone. - * - * @param \Closure $callback - * @return $this - */ - public function onClone(Closure $callback) - { - $this->onCloneCallbacks[] = $callback; - - return $this; - } - - /** - * Force a clone of the underlying query builder when cloning. - * - * @return void - */ - public function __clone() - { - $this->query = clone $this->query; - - foreach ($this->onCloneCallbacks as $onCloneCallback) { - $onCloneCallback($this); - } - } -} diff --git a/vendor/illuminate/database/Eloquent/Casts/ArrayObject.php b/vendor/illuminate/database/Eloquent/Casts/ArrayObject.php deleted file mode 100644 index 563545d..0000000 --- a/vendor/illuminate/database/Eloquent/Casts/ArrayObject.php +++ /dev/null @@ -1,47 +0,0 @@ - - */ -class ArrayObject extends BaseArrayObject implements Arrayable, JsonSerializable -{ - /** - * Get a collection containing the underlying array. - * - * @return \Illuminate\Support\Collection - */ - public function collect() - { - return new Collection($this->getArrayCopy()); - } - - /** - * Get the instance as an array. - * - * @return array - */ - public function toArray() - { - return $this->getArrayCopy(); - } - - /** - * Get the array that should be JSON serialized. - * - * @return array - */ - public function jsonSerialize(): array - { - return $this->getArrayCopy(); - } -} diff --git a/vendor/illuminate/database/Eloquent/Casts/AsArrayObject.php b/vendor/illuminate/database/Eloquent/Casts/AsArrayObject.php deleted file mode 100644 index 5ee80d0..0000000 --- a/vendor/illuminate/database/Eloquent/Casts/AsArrayObject.php +++ /dev/null @@ -1,42 +0,0 @@ -, iterable> - */ - public static function castUsing(array $arguments) - { - return new class implements CastsAttributes - { - public function get($model, $key, $value, $attributes) - { - if (! isset($attributes[$key])) { - return; - } - - $data = Json::decode($attributes[$key]); - - return is_array($data) ? new ArrayObject($data, ArrayObject::ARRAY_AS_PROPS) : null; - } - - public function set($model, $key, $value, $attributes) - { - return [$key => Json::encode($value)]; - } - - public function serialize($model, string $key, $value, array $attributes) - { - return $value->getArrayCopy(); - } - }; - } -} diff --git a/vendor/illuminate/database/Eloquent/Casts/AsCollection.php b/vendor/illuminate/database/Eloquent/Casts/AsCollection.php deleted file mode 100644 index e71df5a..0000000 --- a/vendor/illuminate/database/Eloquent/Casts/AsCollection.php +++ /dev/null @@ -1,60 +0,0 @@ -, iterable> - */ - public static function castUsing(array $arguments) - { - return new class($arguments) implements CastsAttributes - { - public function __construct(protected array $arguments) - { - } - - public function get($model, $key, $value, $attributes) - { - if (! isset($attributes[$key])) { - return; - } - - $data = Json::decode($attributes[$key]); - - $collectionClass = $this->arguments[0] ?? Collection::class; - - if (! is_a($collectionClass, Collection::class, true)) { - throw new InvalidArgumentException('The provided class must extend ['.Collection::class.'].'); - } - - return is_array($data) ? new $collectionClass($data) : null; - } - - public function set($model, $key, $value, $attributes) - { - return [$key => Json::encode($value)]; - } - }; - } - - /** - * Specify the collection for the cast. - * - * @param class-string $class - * @return string - */ - public static function using($class) - { - return static::class.':'.$class; - } -} diff --git a/vendor/illuminate/database/Eloquent/Casts/AsEncryptedArrayObject.php b/vendor/illuminate/database/Eloquent/Casts/AsEncryptedArrayObject.php deleted file mode 100644 index 448f23d..0000000 --- a/vendor/illuminate/database/Eloquent/Casts/AsEncryptedArrayObject.php +++ /dev/null @@ -1,45 +0,0 @@ -, iterable> - */ - public static function castUsing(array $arguments) - { - return new class implements CastsAttributes - { - public function get($model, $key, $value, $attributes) - { - if (isset($attributes[$key])) { - return new ArrayObject(Json::decode(Crypt::decryptString($attributes[$key]))); - } - - return null; - } - - public function set($model, $key, $value, $attributes) - { - if (! is_null($value)) { - return [$key => Crypt::encryptString(Json::encode($value))]; - } - - return null; - } - - public function serialize($model, string $key, $value, array $attributes) - { - return ! is_null($value) ? $value->getArrayCopy() : null; - } - }; - } -} diff --git a/vendor/illuminate/database/Eloquent/Casts/AsEncryptedCollection.php b/vendor/illuminate/database/Eloquent/Casts/AsEncryptedCollection.php deleted file mode 100644 index a192d2b..0000000 --- a/vendor/illuminate/database/Eloquent/Casts/AsEncryptedCollection.php +++ /dev/null @@ -1,63 +0,0 @@ -, iterable> - */ - public static function castUsing(array $arguments) - { - return new class($arguments) implements CastsAttributes - { - public function __construct(protected array $arguments) - { - } - - public function get($model, $key, $value, $attributes) - { - $collectionClass = $this->arguments[0] ?? Collection::class; - - if (! is_a($collectionClass, Collection::class, true)) { - throw new InvalidArgumentException('The provided class must extend ['.Collection::class.'].'); - } - - if (isset($attributes[$key])) { - return new $collectionClass(Json::decode(Crypt::decryptString($attributes[$key]))); - } - - return null; - } - - public function set($model, $key, $value, $attributes) - { - if (! is_null($value)) { - return [$key => Crypt::encryptString(Json::encode($value))]; - } - - return null; - } - }; - } - - /** - * Specify the collection for the cast. - * - * @param class-string $class - * @return string - */ - public static function using($class) - { - return static::class.':'.$class; - } -} diff --git a/vendor/illuminate/database/Eloquent/Casts/AsEnumArrayObject.php b/vendor/illuminate/database/Eloquent/Casts/AsEnumArrayObject.php deleted file mode 100644 index 273089b..0000000 --- a/vendor/illuminate/database/Eloquent/Casts/AsEnumArrayObject.php +++ /dev/null @@ -1,97 +0,0 @@ -} $arguments - * @return \Illuminate\Contracts\Database\Eloquent\CastsAttributes<\Illuminate\Database\Eloquent\Casts\ArrayObject, iterable> - */ - public static function castUsing(array $arguments) - { - return new class($arguments) implements CastsAttributes - { - protected $arguments; - - public function __construct(array $arguments) - { - $this->arguments = $arguments; - } - - public function get($model, $key, $value, $attributes) - { - if (! isset($attributes[$key])) { - return; - } - - $data = Json::decode($attributes[$key]); - - if (! is_array($data)) { - return; - } - - $enumClass = $this->arguments[0]; - - return new ArrayObject((new Collection($data))->map(function ($value) use ($enumClass) { - return is_subclass_of($enumClass, BackedEnum::class) - ? $enumClass::from($value) - : constant($enumClass.'::'.$value); - })->toArray()); - } - - public function set($model, $key, $value, $attributes) - { - if ($value === null) { - return [$key => null]; - } - - $storable = []; - - foreach ($value as $enum) { - $storable[] = $this->getStorableEnumValue($enum); - } - - return [$key => Json::encode($storable)]; - } - - public function serialize($model, string $key, $value, array $attributes) - { - return (new Collection($value->getArrayCopy()))->map(function ($enum) { - return $this->getStorableEnumValue($enum); - })->toArray(); - } - - protected function getStorableEnumValue($enum) - { - if (is_string($enum) || is_int($enum)) { - return $enum; - } - - return enum_value($enum); - } - }; - } - - /** - * Specify the Enum for the cast. - * - * @param class-string $class - * @return string - */ - public static function of($class) - { - return static::class.':'.$class; - } -} diff --git a/vendor/illuminate/database/Eloquent/Casts/AsEnumCollection.php b/vendor/illuminate/database/Eloquent/Casts/AsEnumCollection.php deleted file mode 100644 index 044c457..0000000 --- a/vendor/illuminate/database/Eloquent/Casts/AsEnumCollection.php +++ /dev/null @@ -1,93 +0,0 @@ -} $arguments - * @return \Illuminate\Contracts\Database\Eloquent\CastsAttributes<\Illuminate\Support\Collection, iterable> - */ - public static function castUsing(array $arguments) - { - return new class($arguments) implements CastsAttributes - { - protected $arguments; - - public function __construct(array $arguments) - { - $this->arguments = $arguments; - } - - public function get($model, $key, $value, $attributes) - { - if (! isset($attributes[$key])) { - return; - } - - $data = Json::decode($attributes[$key]); - - if (! is_array($data)) { - return; - } - - $enumClass = $this->arguments[0]; - - return (new Collection($data))->map(function ($value) use ($enumClass) { - return is_subclass_of($enumClass, BackedEnum::class) - ? $enumClass::from($value) - : constant($enumClass.'::'.$value); - }); - } - - public function set($model, $key, $value, $attributes) - { - $value = $value !== null - ? Json::encode((new Collection($value))->map(function ($enum) { - return $this->getStorableEnumValue($enum); - })->jsonSerialize()) - : null; - - return [$key => $value]; - } - - public function serialize($model, string $key, $value, array $attributes) - { - return (new Collection($value))->map(function ($enum) { - return $this->getStorableEnumValue($enum); - })->toArray(); - } - - protected function getStorableEnumValue($enum) - { - if (is_string($enum) || is_int($enum)) { - return $enum; - } - - return enum_value($enum); - } - }; - } - - /** - * Specify the Enum for the cast. - * - * @param class-string $class - * @return string - */ - public static function of($class) - { - return static::class.':'.$class; - } -} diff --git a/vendor/illuminate/database/Eloquent/Casts/AsStringable.php b/vendor/illuminate/database/Eloquent/Casts/AsStringable.php deleted file mode 100644 index 4f6c787..0000000 --- a/vendor/illuminate/database/Eloquent/Casts/AsStringable.php +++ /dev/null @@ -1,32 +0,0 @@ - - */ - public static function castUsing(array $arguments) - { - return new class implements CastsAttributes - { - public function get($model, $key, $value, $attributes) - { - return isset($value) ? new Stringable($value) : null; - } - - public function set($model, $key, $value, $attributes) - { - return isset($value) ? (string) $value : null; - } - }; - } -} diff --git a/vendor/illuminate/database/Eloquent/Casts/Attribute.php b/vendor/illuminate/database/Eloquent/Casts/Attribute.php deleted file mode 100644 index 4fe2d80..0000000 --- a/vendor/illuminate/database/Eloquent/Casts/Attribute.php +++ /dev/null @@ -1,105 +0,0 @@ -get = $get; - $this->set = $set; - } - - /** - * Create a new attribute accessor / mutator. - * - * @param callable|null $get - * @param callable|null $set - * @return static - */ - public static function make(?callable $get = null, ?callable $set = null): static - { - return new static($get, $set); - } - - /** - * Create a new attribute accessor. - * - * @param callable $get - * @return static - */ - public static function get(callable $get) - { - return new static($get); - } - - /** - * Create a new attribute mutator. - * - * @param callable $set - * @return static - */ - public static function set(callable $set) - { - return new static(null, $set); - } - - /** - * Disable object caching for the attribute. - * - * @return static - */ - public function withoutObjectCaching() - { - $this->withObjectCaching = false; - - return $this; - } - - /** - * Enable caching for the attribute. - * - * @return static - */ - public function shouldCache() - { - $this->withCaching = true; - - return $this; - } -} diff --git a/vendor/illuminate/database/Eloquent/Casts/Json.php b/vendor/illuminate/database/Eloquent/Casts/Json.php deleted file mode 100644 index 6b1a3dc..0000000 --- a/vendor/illuminate/database/Eloquent/Casts/Json.php +++ /dev/null @@ -1,54 +0,0 @@ - - */ -class Collection extends BaseCollection implements QueueableCollection -{ - use InteractsWithDictionary; - - /** - * Find a model in the collection by key. - * - * @template TFindDefault - * - * @param mixed $key - * @param TFindDefault $default - * @return ($key is (\Illuminate\Contracts\Support\Arrayable|array) ? static : TModel|TFindDefault) - */ - public function find($key, $default = null) - { - if ($key instanceof Model) { - $key = $key->getKey(); - } - - if ($key instanceof Arrayable) { - $key = $key->toArray(); - } - - if (is_array($key)) { - if ($this->isEmpty()) { - return new static; - } - - return $this->whereIn($this->first()->getKeyName(), $key); - } - - return Arr::first($this->items, fn ($model) => $model->getKey() == $key, $default); - } - - /** - * Find a model in the collection by key or throw an exception. - * - * @param mixed $key - * @return TModel - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function findOrFail($key) - { - $result = $this->find($key); - - if (is_array($key) && count($result) === count(array_unique($key))) { - return $result; - } elseif (! is_array($key) && ! is_null($result)) { - return $result; - } - - $exception = new ModelNotFoundException; - - if (! $model = head($this->items)) { - throw $exception; - } - - $ids = is_array($key) ? array_diff($key, $result->modelKeys()) : $key; - - $exception->setModel(get_class($model), $ids); - - throw $exception; - } - - /** - * Load a set of relationships onto the collection. - * - * @param array): mixed)|string>|string $relations - * @return $this - */ - public function load($relations) - { - if ($this->isNotEmpty()) { - if (is_string($relations)) { - $relations = func_get_args(); - } - - $query = $this->first()->newQueryWithoutRelationships()->with($relations); - - $this->items = $query->eagerLoadRelations($this->items); - } - - return $this; - } - - /** - * Load a set of aggregations over relationship's column onto the collection. - * - * @param array): mixed)|string>|string $relations - * @param string $column - * @param string|null $function - * @return $this - */ - public function loadAggregate($relations, $column, $function = null) - { - if ($this->isEmpty()) { - return $this; - } - - $models = $this->first()->newModelQuery() - ->whereKey($this->modelKeys()) - ->select($this->first()->getKeyName()) - ->withAggregate($relations, $column, $function) - ->get() - ->keyBy($this->first()->getKeyName()); - - $attributes = Arr::except( - array_keys($models->first()->getAttributes()), - $models->first()->getKeyName() - ); - - $this->each(function ($model) use ($models, $attributes) { - $extraAttributes = Arr::only($models->get($model->getKey())->getAttributes(), $attributes); - - $model->forceFill($extraAttributes) - ->syncOriginalAttributes($attributes) - ->mergeCasts($models->get($model->getKey())->getCasts()); - }); - - return $this; - } - - /** - * Load a set of relationship counts onto the collection. - * - * @param array): mixed)|string>|string $relations - * @return $this - */ - public function loadCount($relations) - { - return $this->loadAggregate($relations, '*', 'count'); - } - - /** - * Load a set of relationship's max column values onto the collection. - * - * @param array): mixed)|string>|string $relations - * @param string $column - * @return $this - */ - public function loadMax($relations, $column) - { - return $this->loadAggregate($relations, $column, 'max'); - } - - /** - * Load a set of relationship's min column values onto the collection. - * - * @param array): mixed)|string>|string $relations - * @param string $column - * @return $this - */ - public function loadMin($relations, $column) - { - return $this->loadAggregate($relations, $column, 'min'); - } - - /** - * Load a set of relationship's column summations onto the collection. - * - * @param array): mixed)|string>|string $relations - * @param string $column - * @return $this - */ - public function loadSum($relations, $column) - { - return $this->loadAggregate($relations, $column, 'sum'); - } - - /** - * Load a set of relationship's average column values onto the collection. - * - * @param array): mixed)|string>|string $relations - * @param string $column - * @return $this - */ - public function loadAvg($relations, $column) - { - return $this->loadAggregate($relations, $column, 'avg'); - } - - /** - * Load a set of related existences onto the collection. - * - * @param array): mixed)|string>|string $relations - * @return $this - */ - public function loadExists($relations) - { - return $this->loadAggregate($relations, '*', 'exists'); - } - - /** - * Load a set of relationships onto the collection if they are not already eager loaded. - * - * @param array): mixed)|string>|string $relations - * @return $this - */ - public function loadMissing($relations) - { - if (is_string($relations)) { - $relations = func_get_args(); - } - - foreach ($relations as $key => $value) { - if (is_numeric($key)) { - $key = $value; - } - - $segments = explode('.', explode(':', $key)[0]); - - if (str_contains($key, ':')) { - $segments[count($segments) - 1] .= ':'.explode(':', $key)[1]; - } - - $path = []; - - foreach ($segments as $segment) { - $path[] = [$segment => $segment]; - } - - if (is_callable($value)) { - $path[count($segments) - 1][end($segments)] = $value; - } - - $this->loadMissingRelation($this, $path); - } - - return $this; - } - - /** - * Load a relationship path if it is not already eager loaded. - * - * @param \Illuminate\Database\Eloquent\Collection $models - * @param array $path - * @return void - */ - protected function loadMissingRelation(self $models, array $path) - { - $relation = array_shift($path); - - $name = explode(':', key($relation))[0]; - - if (is_string(reset($relation))) { - $relation = reset($relation); - } - - $models->filter(fn ($model) => ! is_null($model) && ! $model->relationLoaded($name))->load($relation); - - if (empty($path)) { - return; - } - - $models = $models->pluck($name)->filter(); - - if ($models->first() instanceof BaseCollection) { - $models = $models->collapse(); - } - - $this->loadMissingRelation(new static($models), $path); - } - - /** - * Load a set of relationships onto the mixed relationship collection. - * - * @param string $relation - * @param array): mixed)|string> $relations - * @return $this - */ - public function loadMorph($relation, $relations) - { - $this->pluck($relation) - ->filter() - ->groupBy(fn ($model) => get_class($model)) - ->each(fn ($models, $className) => static::make($models)->load($relations[$className] ?? [])); - - return $this; - } - - /** - * Load a set of relationship counts onto the mixed relationship collection. - * - * @param string $relation - * @param array): mixed)|string> $relations - * @return $this - */ - public function loadMorphCount($relation, $relations) - { - $this->pluck($relation) - ->filter() - ->groupBy(fn ($model) => get_class($model)) - ->each(fn ($models, $className) => static::make($models)->loadCount($relations[$className] ?? [])); - - return $this; - } - - /** - * Determine if a key exists in the collection. - * - * @param (callable(TModel, TKey): bool)|TModel|string|int $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function contains($key, $operator = null, $value = null) - { - if (func_num_args() > 1 || $this->useAsCallable($key)) { - return parent::contains(...func_get_args()); - } - - if ($key instanceof Model) { - return parent::contains(fn ($model) => $model->is($key)); - } - - return parent::contains(fn ($model) => $model->getKey() == $key); - } - - /** - * Determine if a key does not exist in the collection. - * - * @param (callable(TModel, TKey): bool)|TModel|string|int $key - * @param mixed $operator - * @param mixed $value - * @return bool - */ - public function doesntContain($key, $operator = null, $value = null) - { - return ! $this->contains(...func_get_args()); - } - - /** - * Get the array of primary keys. - * - * @return array - */ - public function modelKeys() - { - return array_map(fn ($model) => $model->getKey(), $this->items); - } - - /** - * Merge the collection with the given items. - * - * @param iterable $items - * @return static - */ - public function merge($items) - { - $dictionary = $this->getDictionary(); - - foreach ($items as $item) { - $dictionary[$this->getDictionaryKey($item->getKey())] = $item; - } - - return new static(array_values($dictionary)); - } - - /** - * Run a map over each of the items. - * - * @template TMapValue - * - * @param callable(TModel, TKey): TMapValue $callback - * @return \Illuminate\Support\Collection|static - */ - public function map(callable $callback) - { - $result = parent::map($callback); - - return $result->contains(fn ($item) => ! $item instanceof Model) ? $result->toBase() : $result; - } - - /** - * Run an associative map over each of the items. - * - * The callback should return an associative array with a single key / value pair. - * - * @template TMapWithKeysKey of array-key - * @template TMapWithKeysValue - * - * @param callable(TModel, TKey): array $callback - * @return \Illuminate\Support\Collection|static - */ - public function mapWithKeys(callable $callback) - { - $result = parent::mapWithKeys($callback); - - return $result->contains(fn ($item) => ! $item instanceof Model) ? $result->toBase() : $result; - } - - /** - * Reload a fresh model instance from the database for all the entities. - * - * @param array|string $with - * @return static - */ - public function fresh($with = []) - { - if ($this->isEmpty()) { - return new static; - } - - $model = $this->first(); - - $freshModels = $model->newQueryWithoutScopes() - ->with(is_string($with) ? func_get_args() : $with) - ->whereIn($model->getKeyName(), $this->modelKeys()) - ->get() - ->getDictionary(); - - return $this->filter(fn ($model) => $model->exists && isset($freshModels[$model->getKey()])) - ->map(fn ($model) => $freshModels[$model->getKey()]); - } - - /** - * Diff the collection with the given items. - * - * @param iterable $items - * @return static - */ - public function diff($items) - { - $diff = new static; - - $dictionary = $this->getDictionary($items); - - foreach ($this->items as $item) { - if (! isset($dictionary[$this->getDictionaryKey($item->getKey())])) { - $diff->add($item); - } - } - - return $diff; - } - - /** - * Intersect the collection with the given items. - * - * @param iterable $items - * @return static - */ - public function intersect($items) - { - $intersect = new static; - - if (empty($items)) { - return $intersect; - } - - $dictionary = $this->getDictionary($items); - - foreach ($this->items as $item) { - if (isset($dictionary[$this->getDictionaryKey($item->getKey())])) { - $intersect->add($item); - } - } - - return $intersect; - } - - /** - * Return only unique items from the collection. - * - * @param (callable(TModel, TKey): mixed)|string|null $key - * @param bool $strict - * @return static - */ - public function unique($key = null, $strict = false) - { - if (! is_null($key)) { - return parent::unique($key, $strict); - } - - return new static(array_values($this->getDictionary())); - } - - /** - * Returns only the models from the collection with the specified keys. - * - * @param array|null $keys - * @return static - */ - public function only($keys) - { - if (is_null($keys)) { - return new static($this->items); - } - - $dictionary = Arr::only($this->getDictionary(), array_map($this->getDictionaryKey(...), (array) $keys)); - - return new static(array_values($dictionary)); - } - - /** - * Returns all models in the collection except the models with specified keys. - * - * @param array|null $keys - * @return static - */ - public function except($keys) - { - if (is_null($keys)) { - return new static($this->items); - } - - $dictionary = Arr::except($this->getDictionary(), array_map($this->getDictionaryKey(...), (array) $keys)); - - return new static(array_values($dictionary)); - } - - /** - * Make the given, typically visible, attributes hidden across the entire collection. - * - * @param array|string $attributes - * @return $this - */ - public function makeHidden($attributes) - { - return $this->each->makeHidden($attributes); - } - - /** - * Make the given, typically hidden, attributes visible across the entire collection. - * - * @param array|string $attributes - * @return $this - */ - public function makeVisible($attributes) - { - return $this->each->makeVisible($attributes); - } - - /** - * Set the visible attributes across the entire collection. - * - * @param array $visible - * @return $this - */ - public function setVisible($visible) - { - return $this->each->setVisible($visible); - } - - /** - * Set the hidden attributes across the entire collection. - * - * @param array $hidden - * @return $this - */ - public function setHidden($hidden) - { - return $this->each->setHidden($hidden); - } - - /** - * Append an attribute across the entire collection. - * - * @param array|string $attributes - * @return $this - */ - public function append($attributes) - { - return $this->each->append($attributes); - } - - /** - * Get a dictionary keyed by primary keys. - * - * @param iterable|null $items - * @return array - */ - public function getDictionary($items = null) - { - $items = is_null($items) ? $this->items : $items; - - $dictionary = []; - - foreach ($items as $value) { - $dictionary[$this->getDictionaryKey($value->getKey())] = $value; - } - - return $dictionary; - } - - /** - * The following methods are intercepted to always return base collections. - */ - - /** - * Count the number of items in the collection by a field or using a callback. - * - * @param (callable(TModel, TKey): array-key)|string|null $countBy - * @return \Illuminate\Support\Collection - */ - public function countBy($countBy = null) - { - return $this->toBase()->countBy($countBy); - } - - /** - * Collapse the collection of items into a single array. - * - * @return \Illuminate\Support\Collection - */ - public function collapse() - { - return $this->toBase()->collapse(); - } - - /** - * Get a flattened array of the items in the collection. - * - * @param int $depth - * @return \Illuminate\Support\Collection - */ - public function flatten($depth = INF) - { - return $this->toBase()->flatten($depth); - } - - /** - * Flip the items in the collection. - * - * @return \Illuminate\Support\Collection - */ - public function flip() - { - return $this->toBase()->flip(); - } - - /** - * Get the keys of the collection items. - * - * @return \Illuminate\Support\Collection - */ - public function keys() - { - return $this->toBase()->keys(); - } - - /** - * Pad collection to the specified length with a value. - * - * @template TPadValue - * - * @param int $size - * @param TPadValue $value - * @return \Illuminate\Support\Collection - */ - public function pad($size, $value) - { - return $this->toBase()->pad($size, $value); - } - - /** - * Get an array with the values of a given key. - * - * @param string|array|null $value - * @param string|null $key - * @return \Illuminate\Support\Collection - */ - public function pluck($value, $key = null) - { - return $this->toBase()->pluck($value, $key); - } - - /** - * Zip the collection together with one or more arrays. - * - * @template TZipValue - * - * @param \Illuminate\Contracts\Support\Arrayable|iterable ...$items - * @return \Illuminate\Support\Collection> - */ - public function zip($items) - { - return $this->toBase()->zip(...func_get_args()); - } - - /** - * Get the comparison function to detect duplicates. - * - * @param bool $strict - * @return callable(TModel, TModel): bool - */ - protected function duplicateComparator($strict) - { - return fn ($a, $b) => $a->is($b); - } - - /** - * Get the type of the entities being queued. - * - * @return string|null - * - * @throws \LogicException - */ - public function getQueueableClass() - { - if ($this->isEmpty()) { - return; - } - - $class = $this->getQueueableModelClass($this->first()); - - $this->each(function ($model) use ($class) { - if ($this->getQueueableModelClass($model) !== $class) { - throw new LogicException('Queueing collections with multiple model types is not supported.'); - } - }); - - return $class; - } - - /** - * Get the queueable class name for the given model. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return string - */ - protected function getQueueableModelClass($model) - { - return method_exists($model, 'getQueueableClassName') - ? $model->getQueueableClassName() - : get_class($model); - } - - /** - * Get the identifiers for all of the entities. - * - * @return array - */ - public function getQueueableIds() - { - if ($this->isEmpty()) { - return []; - } - - return $this->first() instanceof QueueableEntity - ? $this->map->getQueueableId()->all() - : $this->modelKeys(); - } - - /** - * Get the relationships of the entities being queued. - * - * @return array - */ - public function getQueueableRelations() - { - if ($this->isEmpty()) { - return []; - } - - $relations = $this->map->getQueueableRelations()->all(); - - if (count($relations) === 0 || $relations === [[]]) { - return []; - } elseif (count($relations) === 1) { - return reset($relations); - } else { - return array_intersect(...array_values($relations)); - } - } - - /** - * Get the connection of the entities being queued. - * - * @return string|null - * - * @throws \LogicException - */ - public function getQueueableConnection() - { - if ($this->isEmpty()) { - return; - } - - $connection = $this->first()->getConnectionName(); - - $this->each(function ($model) use ($connection) { - if ($model->getConnectionName() !== $connection) { - throw new LogicException('Queueing collections with multiple model connections is not supported.'); - } - }); - - return $connection; - } - - /** - * Get the Eloquent query builder from the collection. - * - * @return \Illuminate\Database\Eloquent\Builder - * - * @throws \LogicException - */ - public function toQuery() - { - $model = $this->first(); - - if (! $model) { - throw new LogicException('Unable to create query for empty collection.'); - } - - $class = get_class($model); - - if ($this->filter(fn ($model) => ! $model instanceof $class)->isNotEmpty()) { - throw new LogicException('Unable to create query for collection with mixed types.'); - } - - return $model->newModelQuery()->whereKey($this->modelKeys()); - } -} diff --git a/vendor/illuminate/database/Eloquent/Concerns/GuardsAttributes.php b/vendor/illuminate/database/Eloquent/Concerns/GuardsAttributes.php deleted file mode 100644 index 67229b4..0000000 --- a/vendor/illuminate/database/Eloquent/Concerns/GuardsAttributes.php +++ /dev/null @@ -1,260 +0,0 @@ - - */ - protected $fillable = []; - - /** - * The attributes that aren't mass assignable. - * - * @var array|bool - */ - protected $guarded = ['*']; - - /** - * Indicates if all mass assignment is enabled. - * - * @var bool - */ - protected static $unguarded = false; - - /** - * The actual columns that exist on the database and can be guarded. - * - * @var array - */ - protected static $guardableColumns = []; - - /** - * Get the fillable attributes for the model. - * - * @return array - */ - public function getFillable() - { - return $this->fillable; - } - - /** - * Set the fillable attributes for the model. - * - * @param array $fillable - * @return $this - */ - public function fillable(array $fillable) - { - $this->fillable = $fillable; - - return $this; - } - - /** - * Merge new fillable attributes with existing fillable attributes on the model. - * - * @param array $fillable - * @return $this - */ - public function mergeFillable(array $fillable) - { - $this->fillable = array_values(array_unique(array_merge($this->fillable, $fillable))); - - return $this; - } - - /** - * Get the guarded attributes for the model. - * - * @return array - */ - public function getGuarded() - { - return $this->guarded === false - ? [] - : $this->guarded; - } - - /** - * Set the guarded attributes for the model. - * - * @param array $guarded - * @return $this - */ - public function guard(array $guarded) - { - $this->guarded = $guarded; - - return $this; - } - - /** - * Merge new guarded attributes with existing guarded attributes on the model. - * - * @param array $guarded - * @return $this - */ - public function mergeGuarded(array $guarded) - { - $this->guarded = array_values(array_unique(array_merge($this->guarded, $guarded))); - - return $this; - } - - /** - * Disable all mass assignable restrictions. - * - * @param bool $state - * @return void - */ - public static function unguard($state = true) - { - static::$unguarded = $state; - } - - /** - * Enable the mass assignment restrictions. - * - * @return void - */ - public static function reguard() - { - static::$unguarded = false; - } - - /** - * Determine if the current state is "unguarded". - * - * @return bool - */ - public static function isUnguarded() - { - return static::$unguarded; - } - - /** - * Run the given callable while being unguarded. - * - * @param callable $callback - * @return mixed - */ - public static function unguarded(callable $callback) - { - if (static::$unguarded) { - return $callback(); - } - - static::unguard(); - - try { - return $callback(); - } finally { - static::reguard(); - } - } - - /** - * Determine if the given attribute may be mass assigned. - * - * @param string $key - * @return bool - */ - public function isFillable($key) - { - if (static::$unguarded) { - return true; - } - - // If the key is in the "fillable" array, we can of course assume that it's - // a fillable attribute. Otherwise, we will check the guarded array when - // we need to determine if the attribute is black-listed on the model. - if (in_array($key, $this->getFillable())) { - return true; - } - - // If the attribute is explicitly listed in the "guarded" array then we can - // return false immediately. This means this attribute is definitely not - // fillable and there is no point in going any further in this method. - if ($this->isGuarded($key)) { - return false; - } - - return empty($this->getFillable()) && - ! str_contains($key, '.') && - ! str_starts_with($key, '_'); - } - - /** - * Determine if the given key is guarded. - * - * @param string $key - * @return bool - */ - public function isGuarded($key) - { - if (empty($this->getGuarded())) { - return false; - } - - return $this->getGuarded() == ['*'] || - ! empty(preg_grep('/^'.preg_quote($key, '/').'$/i', $this->getGuarded())) || - ! $this->isGuardableColumn($key); - } - - /** - * Determine if the given column is a valid, guardable column. - * - * @param string $key - * @return bool - */ - protected function isGuardableColumn($key) - { - if ($this->hasSetMutator($key) || $this->hasAttributeSetMutator($key)) { - return true; - } - - if (! isset(static::$guardableColumns[get_class($this)])) { - $columns = $this->getConnection() - ->getSchemaBuilder() - ->getColumnListing($this->getTable()); - - if (empty($columns)) { - return true; - } - - static::$guardableColumns[get_class($this)] = $columns; - } - - return in_array($key, static::$guardableColumns[get_class($this)]); - } - - /** - * Determine if the model is totally guarded. - * - * @return bool - */ - public function totallyGuarded() - { - return count($this->getFillable()) === 0 && $this->getGuarded() == ['*']; - } - - /** - * Get the fillable attributes of a given array. - * - * @param array $attributes - * @return array - */ - protected function fillableFromArray(array $attributes) - { - if (count($this->getFillable()) > 0 && ! static::$unguarded) { - return array_intersect_key($attributes, array_flip($this->getFillable())); - } - - return $attributes; - } -} diff --git a/vendor/illuminate/database/Eloquent/Concerns/HasAttributes.php b/vendor/illuminate/database/Eloquent/Concerns/HasAttributes.php deleted file mode 100644 index d02f8f6..0000000 --- a/vendor/illuminate/database/Eloquent/Concerns/HasAttributes.php +++ /dev/null @@ -1,2375 +0,0 @@ -casts = $this->ensureCastsAreStringValues( - array_merge($this->casts, $this->casts()), - ); - } - - /** - * Convert the model's attributes to an array. - * - * @return array - */ - public function attributesToArray() - { - // If an attribute is a date, we will cast it to a string after converting it - // to a DateTime / Carbon instance. This is so we will get some consistent - // formatting while accessing attributes vs. arraying / JSONing a model. - $attributes = $this->addDateAttributesToArray( - $attributes = $this->getArrayableAttributes() - ); - - $attributes = $this->addMutatedAttributesToArray( - $attributes, $mutatedAttributes = $this->getMutatedAttributes() - ); - - // Next we will handle any casts that have been setup for this model and cast - // the values to their appropriate type. If the attribute has a mutator we - // will not perform the cast on those attributes to avoid any confusion. - $attributes = $this->addCastAttributesToArray( - $attributes, $mutatedAttributes - ); - - // Here we will grab all of the appended, calculated attributes to this model - // as these attributes are not really in the attributes array, but are run - // when we need to array or JSON the model for convenience to the coder. - foreach ($this->getArrayableAppends() as $key) { - $attributes[$key] = $this->mutateAttributeForArray($key, null); - } - - return $attributes; - } - - /** - * Add the date attributes to the attributes array. - * - * @param array $attributes - * @return array - */ - protected function addDateAttributesToArray(array $attributes) - { - foreach ($this->getDates() as $key) { - if (! isset($attributes[$key])) { - continue; - } - - $attributes[$key] = $this->serializeDate( - $this->asDateTime($attributes[$key]) - ); - } - - return $attributes; - } - - /** - * Add the mutated attributes to the attributes array. - * - * @param array $attributes - * @param array $mutatedAttributes - * @return array - */ - protected function addMutatedAttributesToArray(array $attributes, array $mutatedAttributes) - { - foreach ($mutatedAttributes as $key) { - // We want to spin through all the mutated attributes for this model and call - // the mutator for the attribute. We cache off every mutated attributes so - // we don't have to constantly check on attributes that actually change. - if (! array_key_exists($key, $attributes)) { - continue; - } - - // Next, we will call the mutator for this attribute so that we can get these - // mutated attribute's actual values. After we finish mutating each of the - // attributes we will return this final array of the mutated attributes. - $attributes[$key] = $this->mutateAttributeForArray( - $key, $attributes[$key] - ); - } - - return $attributes; - } - - /** - * Add the casted attributes to the attributes array. - * - * @param array $attributes - * @param array $mutatedAttributes - * @return array - */ - protected function addCastAttributesToArray(array $attributes, array $mutatedAttributes) - { - foreach ($this->getCasts() as $key => $value) { - if (! array_key_exists($key, $attributes) || - in_array($key, $mutatedAttributes)) { - continue; - } - - // Here we will cast the attribute. Then, if the cast is a date or datetime cast - // then we will serialize the date for the array. This will convert the dates - // to strings based on the date format specified for these Eloquent models. - $attributes[$key] = $this->castAttribute( - $key, $attributes[$key] - ); - - // If the attribute cast was a date or a datetime, we will serialize the date as - // a string. This allows the developers to customize how dates are serialized - // into an array without affecting how they are persisted into the storage. - if (isset($attributes[$key]) && in_array($value, ['date', 'datetime', 'immutable_date', 'immutable_datetime'])) { - $attributes[$key] = $this->serializeDate($attributes[$key]); - } - - if (isset($attributes[$key]) && ($this->isCustomDateTimeCast($value) || - $this->isImmutableCustomDateTimeCast($value))) { - $attributes[$key] = $attributes[$key]->format(explode(':', $value, 2)[1]); - } - - if ($attributes[$key] instanceof DateTimeInterface && - $this->isClassCastable($key)) { - $attributes[$key] = $this->serializeDate($attributes[$key]); - } - - if (isset($attributes[$key]) && $this->isClassSerializable($key)) { - $attributes[$key] = $this->serializeClassCastableAttribute($key, $attributes[$key]); - } - - if ($this->isEnumCastable($key) && (! ($attributes[$key] ?? null) instanceof Arrayable)) { - $attributes[$key] = isset($attributes[$key]) ? $this->getStorableEnumValue($this->getCasts()[$key], $attributes[$key]) : null; - } - - if ($attributes[$key] instanceof Arrayable) { - $attributes[$key] = $attributes[$key]->toArray(); - } - } - - return $attributes; - } - - /** - * Get an attribute array of all arrayable attributes. - * - * @return array - */ - protected function getArrayableAttributes() - { - return $this->getArrayableItems($this->getAttributes()); - } - - /** - * Get all of the appendable values that are arrayable. - * - * @return array - */ - protected function getArrayableAppends() - { - if (! count($this->appends)) { - return []; - } - - return $this->getArrayableItems( - array_combine($this->appends, $this->appends) - ); - } - - /** - * Get the model's relationships in array form. - * - * @return array - */ - public function relationsToArray() - { - $attributes = []; - - foreach ($this->getArrayableRelations() as $key => $value) { - // If the values implement the Arrayable interface we can just call this - // toArray method on the instances which will convert both models and - // collections to their proper array form and we'll set the values. - if ($value instanceof Arrayable) { - $relation = $value->toArray(); - } - - // If the value is null, we'll still go ahead and set it in this list of - // attributes, since null is used to represent empty relationships if - // it has a has one or belongs to type relationships on the models. - elseif (is_null($value)) { - $relation = $value; - } - - // If the relationships snake-casing is enabled, we will snake case this - // key so that the relation attribute is snake cased in this returned - // array to the developers, making this consistent with attributes. - if (static::$snakeAttributes) { - $key = Str::snake($key); - } - - // If the relation value has been set, we will set it on this attributes - // list for returning. If it was not arrayable or null, we'll not set - // the value on the array because it is some type of invalid value. - if (array_key_exists('relation', get_defined_vars())) { // check if $relation is in scope (could be null) - $attributes[$key] = $relation ?? null; - } - - unset($relation); - } - - return $attributes; - } - - /** - * Get an attribute array of all arrayable relations. - * - * @return array - */ - protected function getArrayableRelations() - { - return $this->getArrayableItems($this->relations); - } - - /** - * Get an attribute array of all arrayable values. - * - * @param array $values - * @return array - */ - protected function getArrayableItems(array $values) - { - if (count($this->getVisible()) > 0) { - $values = array_intersect_key($values, array_flip($this->getVisible())); - } - - if (count($this->getHidden()) > 0) { - $values = array_diff_key($values, array_flip($this->getHidden())); - } - - return $values; - } - - /** - * Determine whether an attribute exists on the model. - * - * @param string $key - * @return bool - */ - public function hasAttribute($key) - { - if (! $key) { - return false; - } - - return array_key_exists($key, $this->attributes) || - array_key_exists($key, $this->casts) || - $this->hasGetMutator($key) || - $this->hasAttributeMutator($key) || - $this->isClassCastable($key); - } - - /** - * Get an attribute from the model. - * - * @param string $key - * @return mixed - */ - public function getAttribute($key) - { - if (! $key) { - return; - } - - // If the attribute exists in the attribute array or has a "get" mutator we will - // get the attribute's value. Otherwise, we will proceed as if the developers - // are asking for a relationship's value. This covers both types of values. - if ($this->hasAttribute($key)) { - return $this->getAttributeValue($key); - } - - // Here we will determine if the model base class itself contains this given key - // since we don't want to treat any of those methods as relationships because - // they are all intended as helper methods and none of these are relations. - if (method_exists(self::class, $key)) { - return $this->throwMissingAttributeExceptionIfApplicable($key); - } - - return $this->isRelation($key) || $this->relationLoaded($key) - ? $this->getRelationValue($key) - : $this->throwMissingAttributeExceptionIfApplicable($key); - } - - /** - * Either throw a missing attribute exception or return null depending on Eloquent's configuration. - * - * @param string $key - * @return null - * - * @throws \Illuminate\Database\Eloquent\MissingAttributeException - */ - protected function throwMissingAttributeExceptionIfApplicable($key) - { - if ($this->exists && - ! $this->wasRecentlyCreated && - static::preventsAccessingMissingAttributes()) { - if (isset(static::$missingAttributeViolationCallback)) { - return call_user_func(static::$missingAttributeViolationCallback, $this, $key); - } - - throw new MissingAttributeException($this, $key); - } - - return null; - } - - /** - * Get a plain attribute (not a relationship). - * - * @param string $key - * @return mixed - */ - public function getAttributeValue($key) - { - return $this->transformModelValue($key, $this->getAttributeFromArray($key)); - } - - /** - * Get an attribute from the $attributes array. - * - * @param string $key - * @return mixed - */ - protected function getAttributeFromArray($key) - { - return $this->getAttributes()[$key] ?? null; - } - - /** - * Get a relationship. - * - * @param string $key - * @return mixed - */ - public function getRelationValue($key) - { - // If the key already exists in the relationships array, it just means the - // relationship has already been loaded, so we'll just return it out of - // here because there is no need to query within the relations twice. - if ($this->relationLoaded($key)) { - return $this->relations[$key]; - } - - if (! $this->isRelation($key)) { - return; - } - - if ($this->preventsLazyLoading) { - $this->handleLazyLoadingViolation($key); - } - - // If the "attribute" exists as a method on the model, we will just assume - // it is a relationship and will load and return results from the query - // and hydrate the relationship's value on the "relationships" array. - return $this->getRelationshipFromMethod($key); - } - - /** - * Determine if the given key is a relationship method on the model. - * - * @param string $key - * @return bool - */ - public function isRelation($key) - { - if ($this->hasAttributeMutator($key)) { - return false; - } - - return method_exists($this, $key) || - $this->relationResolver(static::class, $key); - } - - /** - * Handle a lazy loading violation. - * - * @param string $key - * @return mixed - */ - protected function handleLazyLoadingViolation($key) - { - if (isset(static::$lazyLoadingViolationCallback)) { - return call_user_func(static::$lazyLoadingViolationCallback, $this, $key); - } - - if (! $this->exists || $this->wasRecentlyCreated) { - return; - } - - throw new LazyLoadingViolationException($this, $key); - } - - /** - * Get a relationship value from a method. - * - * @param string $method - * @return mixed - * - * @throws \LogicException - */ - protected function getRelationshipFromMethod($method) - { - $relation = $this->$method(); - - if (! $relation instanceof Relation) { - if (is_null($relation)) { - throw new LogicException(sprintf( - '%s::%s must return a relationship instance, but "null" was returned. Was the "return" keyword used?', static::class, $method - )); - } - - throw new LogicException(sprintf( - '%s::%s must return a relationship instance.', static::class, $method - )); - } - - return tap($relation->getResults(), function ($results) use ($method) { - $this->setRelation($method, $results); - }); - } - - /** - * Determine if a get mutator exists for an attribute. - * - * @param string $key - * @return bool - */ - public function hasGetMutator($key) - { - return method_exists($this, 'get'.Str::studly($key).'Attribute'); - } - - /** - * Determine if a "Attribute" return type marked mutator exists for an attribute. - * - * @param string $key - * @return bool - */ - public function hasAttributeMutator($key) - { - if (isset(static::$attributeMutatorCache[get_class($this)][$key])) { - return static::$attributeMutatorCache[get_class($this)][$key]; - } - - if (! method_exists($this, $method = Str::camel($key))) { - return static::$attributeMutatorCache[get_class($this)][$key] = false; - } - - $returnType = (new ReflectionMethod($this, $method))->getReturnType(); - - return static::$attributeMutatorCache[get_class($this)][$key] = - $returnType instanceof ReflectionNamedType && - $returnType->getName() === Attribute::class; - } - - /** - * Determine if a "Attribute" return type marked get mutator exists for an attribute. - * - * @param string $key - * @return bool - */ - public function hasAttributeGetMutator($key) - { - if (isset(static::$getAttributeMutatorCache[get_class($this)][$key])) { - return static::$getAttributeMutatorCache[get_class($this)][$key]; - } - - if (! $this->hasAttributeMutator($key)) { - return static::$getAttributeMutatorCache[get_class($this)][$key] = false; - } - - return static::$getAttributeMutatorCache[get_class($this)][$key] = is_callable($this->{Str::camel($key)}()->get); - } - - /** - * Determine if any get mutator exists for an attribute. - * - * @param string $key - * @return bool - */ - public function hasAnyGetMutator($key) - { - return $this->hasGetMutator($key) || $this->hasAttributeGetMutator($key); - } - - /** - * Get the value of an attribute using its mutator. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function mutateAttribute($key, $value) - { - return $this->{'get'.Str::studly($key).'Attribute'}($value); - } - - /** - * Get the value of an "Attribute" return type marked attribute using its mutator. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function mutateAttributeMarkedAttribute($key, $value) - { - if (array_key_exists($key, $this->attributeCastCache)) { - return $this->attributeCastCache[$key]; - } - - $attribute = $this->{Str::camel($key)}(); - - $value = call_user_func($attribute->get ?: function ($value) { - return $value; - }, $value, $this->attributes); - - if ($attribute->withCaching || (is_object($value) && $attribute->withObjectCaching)) { - $this->attributeCastCache[$key] = $value; - } else { - unset($this->attributeCastCache[$key]); - } - - return $value; - } - - /** - * Get the value of an attribute using its mutator for array conversion. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function mutateAttributeForArray($key, $value) - { - if ($this->isClassCastable($key)) { - $value = $this->getClassCastableAttributeValue($key, $value); - } elseif (isset(static::$getAttributeMutatorCache[get_class($this)][$key]) && - static::$getAttributeMutatorCache[get_class($this)][$key] === true) { - $value = $this->mutateAttributeMarkedAttribute($key, $value); - - $value = $value instanceof DateTimeInterface - ? $this->serializeDate($value) - : $value; - } else { - $value = $this->mutateAttribute($key, $value); - } - - return $value instanceof Arrayable ? $value->toArray() : $value; - } - - /** - * Merge new casts with existing casts on the model. - * - * @param array $casts - * @return $this - */ - public function mergeCasts($casts) - { - $casts = $this->ensureCastsAreStringValues($casts); - - $this->casts = array_merge($this->casts, $casts); - - return $this; - } - - /** - * Ensure that the given casts are strings. - * - * @param array $casts - * @return array - */ - protected function ensureCastsAreStringValues($casts) - { - foreach ($casts as $attribute => $cast) { - $casts[$attribute] = match (true) { - is_array($cast) => value(function () use ($cast) { - if (count($cast) === 1) { - return $cast[0]; - } - - [$cast, $arguments] = [array_shift($cast), $cast]; - - return $cast.':'.implode(',', $arguments); - }), - default => $cast, - }; - } - - return $casts; - } - - /** - * Cast an attribute to a native PHP type. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function castAttribute($key, $value) - { - $castType = $this->getCastType($key); - - if (is_null($value) && in_array($castType, static::$primitiveCastTypes)) { - return $value; - } - - // If the key is one of the encrypted castable types, we'll first decrypt - // the value and update the cast type so we may leverage the following - // logic for casting this value to any additionally specified types. - if ($this->isEncryptedCastable($key)) { - $value = $this->fromEncryptedString($value); - - $castType = Str::after($castType, 'encrypted:'); - } - - switch ($castType) { - case 'int': - case 'integer': - return (int) $value; - case 'real': - case 'float': - case 'double': - return $this->fromFloat($value); - case 'decimal': - return $this->asDecimal($value, explode(':', $this->getCasts()[$key], 2)[1]); - case 'string': - return (string) $value; - case 'bool': - case 'boolean': - return (bool) $value; - case 'object': - return $this->fromJson($value, true); - case 'array': - case 'json': - return $this->fromJson($value); - case 'collection': - return new BaseCollection($this->fromJson($value)); - case 'date': - return $this->asDate($value); - case 'datetime': - case 'custom_datetime': - return $this->asDateTime($value); - case 'immutable_date': - return $this->asDate($value)->toImmutable(); - case 'immutable_custom_datetime': - case 'immutable_datetime': - return $this->asDateTime($value)->toImmutable(); - case 'timestamp': - return $this->asTimestamp($value); - } - - if ($this->isEnumCastable($key)) { - return $this->getEnumCastableAttributeValue($key, $value); - } - - if ($this->isClassCastable($key)) { - return $this->getClassCastableAttributeValue($key, $value); - } - - return $value; - } - - /** - * Cast the given attribute using a custom cast class. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function getClassCastableAttributeValue($key, $value) - { - $caster = $this->resolveCasterClass($key); - - $objectCachingDisabled = $caster->withoutObjectCaching ?? false; - - if (isset($this->classCastCache[$key]) && ! $objectCachingDisabled) { - return $this->classCastCache[$key]; - } else { - $value = $caster instanceof CastsInboundAttributes - ? $value - : $caster->get($this, $key, $value, $this->attributes); - - if ($caster instanceof CastsInboundAttributes || - ! is_object($value) || - $objectCachingDisabled) { - unset($this->classCastCache[$key]); - } else { - $this->classCastCache[$key] = $value; - } - - return $value; - } - } - - /** - * Cast the given attribute to an enum. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function getEnumCastableAttributeValue($key, $value) - { - if (is_null($value)) { - return; - } - - $castType = $this->getCasts()[$key]; - - if ($value instanceof $castType) { - return $value; - } - - return $this->getEnumCaseFromValue($castType, $value); - } - - /** - * Get the type of cast for a model attribute. - * - * @param string $key - * @return string - */ - protected function getCastType($key) - { - $castType = $this->getCasts()[$key]; - - if (isset(static::$castTypeCache[$castType])) { - return static::$castTypeCache[$castType]; - } - - if ($this->isCustomDateTimeCast($castType)) { - $convertedCastType = 'custom_datetime'; - } elseif ($this->isImmutableCustomDateTimeCast($castType)) { - $convertedCastType = 'immutable_custom_datetime'; - } elseif ($this->isDecimalCast($castType)) { - $convertedCastType = 'decimal'; - } elseif (class_exists($castType)) { - $convertedCastType = $castType; - } else { - $convertedCastType = trim(strtolower($castType)); - } - - return static::$castTypeCache[$castType] = $convertedCastType; - } - - /** - * Increment or decrement the given attribute using the custom cast class. - * - * @param string $method - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function deviateClassCastableAttribute($method, $key, $value) - { - return $this->resolveCasterClass($key)->{$method}( - $this, $key, $value, $this->attributes - ); - } - - /** - * Serialize the given attribute using the custom cast class. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function serializeClassCastableAttribute($key, $value) - { - return $this->resolveCasterClass($key)->serialize( - $this, $key, $value, $this->attributes - ); - } - - /** - * Determine if the cast type is a custom date time cast. - * - * @param string $cast - * @return bool - */ - protected function isCustomDateTimeCast($cast) - { - return str_starts_with($cast, 'date:') || - str_starts_with($cast, 'datetime:'); - } - - /** - * Determine if the cast type is an immutable custom date time cast. - * - * @param string $cast - * @return bool - */ - protected function isImmutableCustomDateTimeCast($cast) - { - return str_starts_with($cast, 'immutable_date:') || - str_starts_with($cast, 'immutable_datetime:'); - } - - /** - * Determine if the cast type is a decimal cast. - * - * @param string $cast - * @return bool - */ - protected function isDecimalCast($cast) - { - return str_starts_with($cast, 'decimal:'); - } - - /** - * Set a given attribute on the model. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - public function setAttribute($key, $value) - { - // First we will check for the presence of a mutator for the set operation - // which simply lets the developers tweak the attribute as it is set on - // this model, such as "json_encoding" a listing of data for storage. - if ($this->hasSetMutator($key)) { - return $this->setMutatedAttributeValue($key, $value); - } elseif ($this->hasAttributeSetMutator($key)) { - return $this->setAttributeMarkedMutatedAttributeValue($key, $value); - } - - // If an attribute is listed as a "date", we'll convert it from a DateTime - // instance into a form proper for storage on the database tables using - // the connection grammar's date format. We will auto set the values. - elseif (! is_null($value) && $this->isDateAttribute($key)) { - $value = $this->fromDateTime($value); - } - - if ($this->isEnumCastable($key)) { - $this->setEnumCastableAttribute($key, $value); - - return $this; - } - - if ($this->isClassCastable($key)) { - $this->setClassCastableAttribute($key, $value); - - return $this; - } - - if (! is_null($value) && $this->isJsonCastable($key)) { - $value = $this->castAttributeAsJson($key, $value); - } - - // If this attribute contains a JSON ->, we'll set the proper value in the - // attribute's underlying array. This takes care of properly nesting an - // attribute in the array's value in the case of deeply nested items. - if (str_contains($key, '->')) { - return $this->fillJsonAttribute($key, $value); - } - - if (! is_null($value) && $this->isEncryptedCastable($key)) { - $value = $this->castAttributeAsEncryptedString($key, $value); - } - - if (! is_null($value) && $this->hasCast($key, 'hashed')) { - $value = $this->castAttributeAsHashedString($key, $value); - } - - $this->attributes[$key] = $value; - - return $this; - } - - /** - * Determine if a set mutator exists for an attribute. - * - * @param string $key - * @return bool - */ - public function hasSetMutator($key) - { - return method_exists($this, 'set'.Str::studly($key).'Attribute'); - } - - /** - * Determine if an "Attribute" return type marked set mutator exists for an attribute. - * - * @param string $key - * @return bool - */ - public function hasAttributeSetMutator($key) - { - $class = get_class($this); - - if (isset(static::$setAttributeMutatorCache[$class][$key])) { - return static::$setAttributeMutatorCache[$class][$key]; - } - - if (! method_exists($this, $method = Str::camel($key))) { - return static::$setAttributeMutatorCache[$class][$key] = false; - } - - $returnType = (new ReflectionMethod($this, $method))->getReturnType(); - - return static::$setAttributeMutatorCache[$class][$key] = - $returnType instanceof ReflectionNamedType && - $returnType->getName() === Attribute::class && - is_callable($this->{$method}()->set); - } - - /** - * Set the value of an attribute using its mutator. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function setMutatedAttributeValue($key, $value) - { - return $this->{'set'.Str::studly($key).'Attribute'}($value); - } - - /** - * Set the value of a "Attribute" return type marked attribute using its mutator. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function setAttributeMarkedMutatedAttributeValue($key, $value) - { - $attribute = $this->{Str::camel($key)}(); - - $callback = $attribute->set ?: function ($value) use ($key) { - $this->attributes[$key] = $value; - }; - - $this->attributes = array_merge( - $this->attributes, - $this->normalizeCastClassResponse( - $key, $callback($value, $this->attributes) - ) - ); - - if ($attribute->withCaching || (is_object($value) && $attribute->withObjectCaching)) { - $this->attributeCastCache[$key] = $value; - } else { - unset($this->attributeCastCache[$key]); - } - - return $this; - } - - /** - * Determine if the given attribute is a date or date castable. - * - * @param string $key - * @return bool - */ - protected function isDateAttribute($key) - { - return in_array($key, $this->getDates(), true) || - $this->isDateCastable($key); - } - - /** - * Set a given JSON attribute on the model. - * - * @param string $key - * @param mixed $value - * @return $this - */ - public function fillJsonAttribute($key, $value) - { - [$key, $path] = explode('->', $key, 2); - - $value = $this->asJson($this->getArrayAttributeWithValue( - $path, $key, $value - )); - - $this->attributes[$key] = $this->isEncryptedCastable($key) - ? $this->castAttributeAsEncryptedString($key, $value) - : $value; - - if ($this->isClassCastable($key)) { - unset($this->classCastCache[$key]); - } - - return $this; - } - - /** - * Set the value of a class castable attribute. - * - * @param string $key - * @param mixed $value - * @return void - */ - protected function setClassCastableAttribute($key, $value) - { - $caster = $this->resolveCasterClass($key); - - $this->attributes = array_replace( - $this->attributes, - $this->normalizeCastClassResponse($key, $caster->set( - $this, $key, $value, $this->attributes - )) - ); - - if ($caster instanceof CastsInboundAttributes || - ! is_object($value) || - ($caster->withoutObjectCaching ?? false)) { - unset($this->classCastCache[$key]); - } else { - $this->classCastCache[$key] = $value; - } - } - - /** - * Set the value of an enum castable attribute. - * - * @param string $key - * @param \UnitEnum|string|int|null $value - * @return void - */ - protected function setEnumCastableAttribute($key, $value) - { - $enumClass = $this->getCasts()[$key]; - - if (! isset($value)) { - $this->attributes[$key] = null; - } elseif (is_object($value)) { - $this->attributes[$key] = $this->getStorableEnumValue($enumClass, $value); - } else { - $this->attributes[$key] = $this->getStorableEnumValue( - $enumClass, $this->getEnumCaseFromValue($enumClass, $value) - ); - } - } - - /** - * Get an enum case instance from a given class and value. - * - * @param string $enumClass - * @param string|int $value - * @return \UnitEnum|\BackedEnum - */ - protected function getEnumCaseFromValue($enumClass, $value) - { - return is_subclass_of($enumClass, BackedEnum::class) - ? $enumClass::from($value) - : constant($enumClass.'::'.$value); - } - - /** - * Get the storable value from the given enum. - * - * @param string $expectedEnum - * @param \UnitEnum|\BackedEnum $value - * @return string|int - */ - protected function getStorableEnumValue($expectedEnum, $value) - { - if (! $value instanceof $expectedEnum) { - throw new ValueError(sprintf('Value [%s] is not of the expected enum type [%s].', var_export($value, true), $expectedEnum)); - } - - return enum_value($value); - } - - /** - * Get an array attribute with the given key and value set. - * - * @param string $path - * @param string $key - * @param mixed $value - * @return $this - */ - protected function getArrayAttributeWithValue($path, $key, $value) - { - return tap($this->getArrayAttributeByKey($key), function (&$array) use ($path, $value) { - Arr::set($array, str_replace('->', '.', $path), $value); - }); - } - - /** - * Get an array attribute or return an empty array if it is not set. - * - * @param string $key - * @return array - */ - protected function getArrayAttributeByKey($key) - { - if (! isset($this->attributes[$key])) { - return []; - } - - return $this->fromJson( - $this->isEncryptedCastable($key) - ? $this->fromEncryptedString($this->attributes[$key]) - : $this->attributes[$key] - ); - } - - /** - * Cast the given attribute to JSON. - * - * @param string $key - * @param mixed $value - * @return string - */ - protected function castAttributeAsJson($key, $value) - { - $value = $this->asJson($value); - - if ($value === false) { - throw JsonEncodingException::forAttribute( - $this, $key, json_last_error_msg() - ); - } - - return $value; - } - - /** - * Encode the given value as JSON. - * - * @param mixed $value - * @return string - */ - protected function asJson($value) - { - return Json::encode($value); - } - - /** - * Decode the given JSON back into an array or object. - * - * @param string|null $value - * @param bool $asObject - * @return mixed - */ - public function fromJson($value, $asObject = false) - { - if ($value === null || $value === '') { - return null; - } - - return Json::decode($value, ! $asObject); - } - - /** - * Decrypt the given encrypted string. - * - * @param string $value - * @return mixed - */ - public function fromEncryptedString($value) - { - return static::currentEncrypter()->decrypt($value, false); - } - - /** - * Cast the given attribute to an encrypted string. - * - * @param string $key - * @param mixed $value - * @return string - */ - protected function castAttributeAsEncryptedString($key, #[\SensitiveParameter] $value) - { - return static::currentEncrypter()->encrypt($value, false); - } - - /** - * Set the encrypter instance that will be used to encrypt attributes. - * - * @param \Illuminate\Contracts\Encryption\Encrypter|null $encrypter - * @return void - */ - public static function encryptUsing($encrypter) - { - static::$encrypter = $encrypter; - } - - /** - * Get the current encrypter being used by the model. - * - * @return \Illuminate\Contracts\Encryption\Encrypter - */ - protected static function currentEncrypter() - { - return static::$encrypter ?? Crypt::getFacadeRoot(); - } - - /** - * Cast the given attribute to a hashed string. - * - * @param string $key - * @param mixed $value - * @return string - */ - protected function castAttributeAsHashedString($key, #[\SensitiveParameter] $value) - { - if ($value === null) { - return null; - } - - if (! Hash::isHashed($value)) { - return Hash::make($value); - } - - /** @phpstan-ignore staticMethod.notFound */ - if (! Hash::verifyConfiguration($value)) { - throw new RuntimeException("Could not verify the hashed value's configuration."); - } - - return $value; - } - - /** - * Decode the given float. - * - * @param mixed $value - * @return mixed - */ - public function fromFloat($value) - { - return match ((string) $value) { - 'Infinity' => INF, - '-Infinity' => -INF, - 'NaN' => NAN, - default => (float) $value, - }; - } - - /** - * Return a decimal as string. - * - * @param float|string $value - * @param int $decimals - * @return string - */ - protected function asDecimal($value, $decimals) - { - try { - return (string) BigDecimal::of($value)->toScale($decimals, RoundingMode::HALF_UP); - } catch (BrickMathException $e) { - throw new MathException('Unable to cast value to a decimal.', previous: $e); - } - } - - /** - * Return a timestamp as DateTime object with time set to 00:00:00. - * - * @param mixed $value - * @return \Illuminate\Support\Carbon - */ - protected function asDate($value) - { - return $this->asDateTime($value)->startOfDay(); - } - - /** - * Return a timestamp as DateTime object. - * - * @param mixed $value - * @return \Illuminate\Support\Carbon - */ - protected function asDateTime($value) - { - // If this value is already a Carbon instance, we shall just return it as is. - // This prevents us having to re-instantiate a Carbon instance when we know - // it already is one, which wouldn't be fulfilled by the DateTime check. - if ($value instanceof CarbonInterface) { - return Date::instance($value); - } - - // If the value is already a DateTime instance, we will just skip the rest of - // these checks since they will be a waste of time, and hinder performance - // when checking the field. We will just return the DateTime right away. - if ($value instanceof DateTimeInterface) { - return Date::parse( - $value->format('Y-m-d H:i:s.u'), $value->getTimezone() - ); - } - - // If this value is an integer, we will assume it is a UNIX timestamp's value - // and format a Carbon object from this timestamp. This allows flexibility - // when defining your date fields as they might be UNIX timestamps here. - if (is_numeric($value)) { - return Date::createFromTimestamp($value, date_default_timezone_get()); - } - - // If the value is in simply year, month, day format, we will instantiate the - // Carbon instances from that format. Again, this provides for simple date - // fields on the database, while still supporting Carbonized conversion. - if ($this->isStandardDateFormat($value)) { - return Date::instance(Carbon::createFromFormat('Y-m-d', $value)->startOfDay()); - } - - $format = $this->getDateFormat(); - - // Finally, we will just assume this date is in the format used by default on - // the database connection and use that format to create the Carbon object - // that is returned back out to the developers after we convert it here. - try { - $date = Date::createFromFormat($format, $value); - } catch (InvalidArgumentException) { - $date = false; - } - - return $date ?: Date::parse($value); - } - - /** - * Determine if the given value is a standard date format. - * - * @param string $value - * @return bool - */ - protected function isStandardDateFormat($value) - { - return preg_match('/^(\d{4})-(\d{1,2})-(\d{1,2})$/', $value); - } - - /** - * Convert a DateTime to a storable string. - * - * @param mixed $value - * @return string|null - */ - public function fromDateTime($value) - { - return empty($value) ? $value : $this->asDateTime($value)->format( - $this->getDateFormat() - ); - } - - /** - * Return a timestamp as unix timestamp. - * - * @param mixed $value - * @return int - */ - protected function asTimestamp($value) - { - return $this->asDateTime($value)->getTimestamp(); - } - - /** - * Prepare a date for array / JSON serialization. - * - * @param \DateTimeInterface $date - * @return string - */ - protected function serializeDate(DateTimeInterface $date) - { - return $date instanceof DateTimeImmutable ? - CarbonImmutable::instance($date)->toJSON() : - Carbon::instance($date)->toJSON(); - } - - /** - * Get the attributes that should be converted to dates. - * - * @return array - */ - public function getDates() - { - return $this->usesTimestamps() ? [ - $this->getCreatedAtColumn(), - $this->getUpdatedAtColumn(), - ] : []; - } - - /** - * Get the format for database stored dates. - * - * @return string - */ - public function getDateFormat() - { - return $this->dateFormat ?: $this->getConnection()->getQueryGrammar()->getDateFormat(); - } - - /** - * Set the date format used by the model. - * - * @param string $format - * @return $this - */ - public function setDateFormat($format) - { - $this->dateFormat = $format; - - return $this; - } - - /** - * Determine whether an attribute should be cast to a native type. - * - * @param string $key - * @param array|string|null $types - * @return bool - */ - public function hasCast($key, $types = null) - { - if (array_key_exists($key, $this->getCasts())) { - return $types ? in_array($this->getCastType($key), (array) $types, true) : true; - } - - return false; - } - - /** - * Get the attributes that should be cast. - * - * @return array - */ - public function getCasts() - { - if ($this->getIncrementing()) { - return array_merge([$this->getKeyName() => $this->getKeyType()], $this->casts); - } - - return $this->casts; - } - - /** - * Get the attributes that should be cast. - * - * @return array - */ - protected function casts() - { - return []; - } - - /** - * Determine whether a value is Date / DateTime castable for inbound manipulation. - * - * @param string $key - * @return bool - */ - protected function isDateCastable($key) - { - return $this->hasCast($key, ['date', 'datetime', 'immutable_date', 'immutable_datetime']); - } - - /** - * Determine whether a value is Date / DateTime custom-castable for inbound manipulation. - * - * @param string $key - * @return bool - */ - protected function isDateCastableWithCustomFormat($key) - { - return $this->hasCast($key, ['custom_datetime', 'immutable_custom_datetime']); - } - - /** - * Determine whether a value is JSON castable for inbound manipulation. - * - * @param string $key - * @return bool - */ - protected function isJsonCastable($key) - { - return $this->hasCast($key, ['array', 'json', 'object', 'collection', 'encrypted:array', 'encrypted:collection', 'encrypted:json', 'encrypted:object']); - } - - /** - * Determine whether a value is an encrypted castable for inbound manipulation. - * - * @param string $key - * @return bool - */ - protected function isEncryptedCastable($key) - { - return $this->hasCast($key, ['encrypted', 'encrypted:array', 'encrypted:collection', 'encrypted:json', 'encrypted:object']); - } - - /** - * Determine if the given key is cast using a custom class. - * - * @param string $key - * @return bool - * - * @throws \Illuminate\Database\Eloquent\InvalidCastException - */ - protected function isClassCastable($key) - { - $casts = $this->getCasts(); - - if (! array_key_exists($key, $casts)) { - return false; - } - - $castType = $this->parseCasterClass($casts[$key]); - - if (in_array($castType, static::$primitiveCastTypes)) { - return false; - } - - if (class_exists($castType)) { - return true; - } - - throw new InvalidCastException($this->getModel(), $key, $castType); - } - - /** - * Determine if the given key is cast using an enum. - * - * @param string $key - * @return bool - */ - protected function isEnumCastable($key) - { - $casts = $this->getCasts(); - - if (! array_key_exists($key, $casts)) { - return false; - } - - $castType = $casts[$key]; - - if (in_array($castType, static::$primitiveCastTypes)) { - return false; - } - - return enum_exists($castType); - } - - /** - * Determine if the key is deviable using a custom class. - * - * @param string $key - * @return bool - * - * @throws \Illuminate\Database\Eloquent\InvalidCastException - */ - protected function isClassDeviable($key) - { - if (! $this->isClassCastable($key)) { - return false; - } - - $castType = $this->resolveCasterClass($key); - - return method_exists($castType::class, 'increment') && method_exists($castType::class, 'decrement'); - } - - /** - * Determine if the key is serializable using a custom class. - * - * @param string $key - * @return bool - * - * @throws \Illuminate\Database\Eloquent\InvalidCastException - */ - protected function isClassSerializable($key) - { - return ! $this->isEnumCastable($key) && - $this->isClassCastable($key) && - method_exists($this->resolveCasterClass($key), 'serialize'); - } - - /** - * Resolve the custom caster class for a given key. - * - * @param string $key - * @return mixed - */ - protected function resolveCasterClass($key) - { - $castType = $this->getCasts()[$key]; - - $arguments = []; - - if (is_string($castType) && str_contains($castType, ':')) { - $segments = explode(':', $castType, 2); - - $castType = $segments[0]; - $arguments = explode(',', $segments[1]); - } - - if (is_subclass_of($castType, Castable::class)) { - $castType = $castType::castUsing($arguments); - } - - if (is_object($castType)) { - return $castType; - } - - return new $castType(...$arguments); - } - - /** - * Parse the given caster class, removing any arguments. - * - * @param string $class - * @return string - */ - protected function parseCasterClass($class) - { - return ! str_contains($class, ':') - ? $class - : explode(':', $class, 2)[0]; - } - - /** - * Merge the cast class and attribute cast attributes back into the model. - * - * @return void - */ - protected function mergeAttributesFromCachedCasts() - { - $this->mergeAttributesFromClassCasts(); - $this->mergeAttributesFromAttributeCasts(); - } - - /** - * Merge the cast class attributes back into the model. - * - * @return void - */ - protected function mergeAttributesFromClassCasts() - { - foreach ($this->classCastCache as $key => $value) { - $caster = $this->resolveCasterClass($key); - - $this->attributes = array_merge( - $this->attributes, - $caster instanceof CastsInboundAttributes - ? [$key => $value] - : $this->normalizeCastClassResponse($key, $caster->set($this, $key, $value, $this->attributes)) - ); - } - } - - /** - * Merge the cast class attributes back into the model. - * - * @return void - */ - protected function mergeAttributesFromAttributeCasts() - { - foreach ($this->attributeCastCache as $key => $value) { - $attribute = $this->{Str::camel($key)}(); - - if ($attribute->get && ! $attribute->set) { - continue; - } - - $callback = $attribute->set ?: function ($value) use ($key) { - $this->attributes[$key] = $value; - }; - - $this->attributes = array_merge( - $this->attributes, - $this->normalizeCastClassResponse( - $key, $callback($value, $this->attributes) - ) - ); - } - } - - /** - * Normalize the response from a custom class caster. - * - * @param string $key - * @param mixed $value - * @return array - */ - protected function normalizeCastClassResponse($key, $value) - { - return is_array($value) ? $value : [$key => $value]; - } - - /** - * Get all of the current attributes on the model. - * - * @return array - */ - public function getAttributes() - { - $this->mergeAttributesFromCachedCasts(); - - return $this->attributes; - } - - /** - * Get all of the current attributes on the model for an insert operation. - * - * @return array - */ - protected function getAttributesForInsert() - { - return $this->getAttributes(); - } - - /** - * Set the array of model attributes. No checking is done. - * - * @param array $attributes - * @param bool $sync - * @return $this - */ - public function setRawAttributes(array $attributes, $sync = false) - { - $this->attributes = $attributes; - - if ($sync) { - $this->syncOriginal(); - } - - $this->classCastCache = []; - $this->attributeCastCache = []; - - return $this; - } - - /** - * Get the model's original attribute values. - * - * @param string|null $key - * @param mixed $default - * @return mixed|array - */ - public function getOriginal($key = null, $default = null) - { - return (new static)->setRawAttributes( - $this->original, $sync = true - )->getOriginalWithoutRewindingModel($key, $default); - } - - /** - * Get the model's original attribute values. - * - * @param string|null $key - * @param mixed $default - * @return mixed|array - */ - protected function getOriginalWithoutRewindingModel($key = null, $default = null) - { - if ($key) { - return $this->transformModelValue( - $key, Arr::get($this->original, $key, $default) - ); - } - - return (new Collection($this->original)) - ->mapWithKeys(fn ($value, $key) => [$key => $this->transformModelValue($key, $value)]) - ->all(); - } - - /** - * Get the model's raw original attribute values. - * - * @param string|null $key - * @param mixed $default - * @return mixed|array - */ - public function getRawOriginal($key = null, $default = null) - { - return Arr::get($this->original, $key, $default); - } - - /** - * Get a subset of the model's attributes. - * - * @param array|mixed $attributes - * @return array - */ - public function only($attributes) - { - $results = []; - - foreach (is_array($attributes) ? $attributes : func_get_args() as $attribute) { - $results[$attribute] = $this->getAttribute($attribute); - } - - return $results; - } - - /** - * Sync the original attributes with the current. - * - * @return $this - */ - public function syncOriginal() - { - $this->original = $this->getAttributes(); - - return $this; - } - - /** - * Sync a single original attribute with its current value. - * - * @param string $attribute - * @return $this - */ - public function syncOriginalAttribute($attribute) - { - return $this->syncOriginalAttributes($attribute); - } - - /** - * Sync multiple original attribute with their current values. - * - * @param array|string $attributes - * @return $this - */ - public function syncOriginalAttributes($attributes) - { - $attributes = is_array($attributes) ? $attributes : func_get_args(); - - $modelAttributes = $this->getAttributes(); - - foreach ($attributes as $attribute) { - $this->original[$attribute] = $modelAttributes[$attribute]; - } - - return $this; - } - - /** - * Sync the changed attributes. - * - * @return $this - */ - public function syncChanges() - { - $this->changes = $this->getDirty(); - - return $this; - } - - /** - * Determine if the model or any of the given attribute(s) have been modified. - * - * @param array|string|null $attributes - * @return bool - */ - public function isDirty($attributes = null) - { - return $this->hasChanges( - $this->getDirty(), is_array($attributes) ? $attributes : func_get_args() - ); - } - - /** - * Determine if the model or all the given attribute(s) have remained the same. - * - * @param array|string|null $attributes - * @return bool - */ - public function isClean($attributes = null) - { - return ! $this->isDirty(...func_get_args()); - } - - /** - * Discard attribute changes and reset the attributes to their original state. - * - * @return $this - */ - public function discardChanges() - { - [$this->attributes, $this->changes] = [$this->original, []]; - - return $this; - } - - /** - * Determine if the model or any of the given attribute(s) were changed when the model was last saved. - * - * @param array|string|null $attributes - * @return bool - */ - public function wasChanged($attributes = null) - { - return $this->hasChanges( - $this->getChanges(), is_array($attributes) ? $attributes : func_get_args() - ); - } - - /** - * Determine if any of the given attributes were changed when the model was last saved. - * - * @param array $changes - * @param array|string|null $attributes - * @return bool - */ - protected function hasChanges($changes, $attributes = null) - { - // If no specific attributes were provided, we will just see if the dirty array - // already contains any attributes. If it does we will just return that this - // count is greater than zero. Else, we need to check specific attributes. - if (empty($attributes)) { - return count($changes) > 0; - } - - // Here we will spin through every attribute and see if this is in the array of - // dirty attributes. If it is, we will return true and if we make it through - // all of the attributes for the entire array we will return false at end. - foreach (Arr::wrap($attributes) as $attribute) { - if (array_key_exists($attribute, $changes)) { - return true; - } - } - - return false; - } - - /** - * Get the attributes that have been changed since the last sync. - * - * @return array - */ - public function getDirty() - { - $dirty = []; - - foreach ($this->getAttributes() as $key => $value) { - if (! $this->originalIsEquivalent($key)) { - $dirty[$key] = $value; - } - } - - return $dirty; - } - - /** - * Get the attributes that have been changed since the last sync for an update operation. - * - * @return array - */ - protected function getDirtyForUpdate() - { - return $this->getDirty(); - } - - /** - * Get the attributes that were changed when the model was last saved. - * - * @return array - */ - public function getChanges() - { - return $this->changes; - } - - /** - * Determine if the new and old values for a given key are equivalent. - * - * @param string $key - * @return bool - */ - public function originalIsEquivalent($key) - { - if (! array_key_exists($key, $this->original)) { - return false; - } - - $attribute = Arr::get($this->attributes, $key); - $original = Arr::get($this->original, $key); - - if ($attribute === $original) { - return true; - } elseif (is_null($attribute)) { - return false; - } elseif ($this->isDateAttribute($key) || $this->isDateCastableWithCustomFormat($key)) { - return $this->fromDateTime($attribute) === - $this->fromDateTime($original); - } elseif ($this->hasCast($key, ['object', 'collection'])) { - return $this->fromJson($attribute) === - $this->fromJson($original); - } elseif ($this->hasCast($key, ['real', 'float', 'double'])) { - if ($original === null) { - return false; - } - - return abs($this->castAttribute($key, $attribute) - $this->castAttribute($key, $original)) < PHP_FLOAT_EPSILON * 4; - } elseif ($this->isEncryptedCastable($key) && ! empty(static::currentEncrypter()->getPreviousKeys())) { - return false; - } elseif ($this->hasCast($key, static::$primitiveCastTypes)) { - return $this->castAttribute($key, $attribute) === - $this->castAttribute($key, $original); - } elseif ($this->isClassCastable($key) && Str::startsWith($this->getCasts()[$key], [AsArrayObject::class, AsCollection::class])) { - return $this->fromJson($attribute) === $this->fromJson($original); - } elseif ($this->isClassCastable($key) && Str::startsWith($this->getCasts()[$key], [AsEnumArrayObject::class, AsEnumCollection::class])) { - return $this->fromJson($attribute) === $this->fromJson($original); - } elseif ($this->isClassCastable($key) && $original !== null && Str::startsWith($this->getCasts()[$key], [AsEncryptedArrayObject::class, AsEncryptedCollection::class])) { - if (empty(static::currentEncrypter()->getPreviousKeys())) { - return $this->fromEncryptedString($attribute) === $this->fromEncryptedString($original); - } - - return false; - } - - return is_numeric($attribute) && is_numeric($original) - && strcmp((string) $attribute, (string) $original) === 0; - } - - /** - * Transform a raw model value using mutators, casts, etc. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function transformModelValue($key, $value) - { - // If the attribute has a get mutator, we will call that then return what - // it returns as the value, which is useful for transforming values on - // retrieval from the model to a form that is more useful for usage. - if ($this->hasGetMutator($key)) { - return $this->mutateAttribute($key, $value); - } elseif ($this->hasAttributeGetMutator($key)) { - return $this->mutateAttributeMarkedAttribute($key, $value); - } - - // If the attribute exists within the cast array, we will convert it to - // an appropriate native PHP type dependent upon the associated value - // given with the key in the pair. Dayle made this comment line up. - if ($this->hasCast($key)) { - if (static::preventsAccessingMissingAttributes() && - ! array_key_exists($key, $this->attributes) && - ($this->isEnumCastable($key) || - in_array($this->getCastType($key), static::$primitiveCastTypes))) { - $this->throwMissingAttributeExceptionIfApplicable($key); - } - - return $this->castAttribute($key, $value); - } - - // If the attribute is listed as a date, we will convert it to a DateTime - // instance on retrieval, which makes it quite convenient to work with - // date fields without having to create a mutator for each property. - if ($value !== null - && \in_array($key, $this->getDates(), false)) { - return $this->asDateTime($value); - } - - return $value; - } - - /** - * Append attributes to query when building a query. - * - * @param array|string $attributes - * @return $this - */ - public function append($attributes) - { - $this->appends = array_values(array_unique( - array_merge($this->appends, is_string($attributes) ? func_get_args() : $attributes) - )); - - return $this; - } - - /** - * Get the accessors that are being appended to model arrays. - * - * @return array - */ - public function getAppends() - { - return $this->appends; - } - - /** - * Set the accessors to append to model arrays. - * - * @param array $appends - * @return $this - */ - public function setAppends(array $appends) - { - $this->appends = $appends; - - return $this; - } - - /** - * Return whether the accessor attribute has been appended. - * - * @param string $attribute - * @return bool - */ - public function hasAppended($attribute) - { - return in_array($attribute, $this->appends); - } - - /** - * Get the mutated attributes for a given instance. - * - * @return array - */ - public function getMutatedAttributes() - { - if (! isset(static::$mutatorCache[static::class])) { - static::cacheMutatedAttributes($this); - } - - return static::$mutatorCache[static::class]; - } - - /** - * Extract and cache all the mutated attributes of a class. - * - * @param object|string $classOrInstance - * @return void - */ - public static function cacheMutatedAttributes($classOrInstance) - { - $reflection = new ReflectionClass($classOrInstance); - - $class = $reflection->getName(); - - static::$getAttributeMutatorCache[$class] = (new Collection($attributeMutatorMethods = static::getAttributeMarkedMutatorMethods($classOrInstance))) - ->mapWithKeys(fn ($match) => [lcfirst(static::$snakeAttributes ? Str::snake($match) : $match) => true]) - ->all(); - - static::$mutatorCache[$class] = (new Collection(static::getMutatorMethods($class))) - ->merge($attributeMutatorMethods) - ->map(fn ($match) => lcfirst(static::$snakeAttributes ? Str::snake($match) : $match)) - ->all(); - } - - /** - * Get all of the attribute mutator methods. - * - * @param mixed $class - * @return array - */ - protected static function getMutatorMethods($class) - { - preg_match_all('/(?<=^|;)get([^;]+?)Attribute(;|$)/', implode(';', get_class_methods($class)), $matches); - - return $matches[1]; - } - - /** - * Get all of the "Attribute" return typed attribute mutator methods. - * - * @param mixed $class - * @return array - */ - protected static function getAttributeMarkedMutatorMethods($class) - { - $instance = is_object($class) ? $class : new $class; - - return (new Collection((new ReflectionClass($instance))->getMethods()))->filter(function ($method) use ($instance) { - $returnType = $method->getReturnType(); - - if ($returnType instanceof ReflectionNamedType && - $returnType->getName() === Attribute::class) { - if (is_callable($method->invoke($instance)->get)) { - return true; - } - } - - return false; - })->map->name->values()->all(); - } -} diff --git a/vendor/illuminate/database/Eloquent/Concerns/HasEvents.php b/vendor/illuminate/database/Eloquent/Concerns/HasEvents.php deleted file mode 100644 index 7456197..0000000 --- a/vendor/illuminate/database/Eloquent/Concerns/HasEvents.php +++ /dev/null @@ -1,461 +0,0 @@ -getAttributes(ObservedBy::class))) - ->map(fn ($attribute) => $attribute->getArguments()) - ->flatten() - ->when($isEloquentGrandchild, function (Collection $attributes) { - return (new Collection(get_parent_class(static::class)::resolveObserveAttributes())) - ->merge($attributes); - }) - ->all(); - } - - /** - * Register observers with the model. - * - * @param object|array|string $classes - * @return void - * - * @throws \RuntimeException - */ - public static function observe($classes) - { - $instance = new static; - - foreach (Arr::wrap($classes) as $class) { - $instance->registerObserver($class); - } - } - - /** - * Register a single observer with the model. - * - * @param object|string $class - * @return void - * - * @throws \RuntimeException - */ - protected function registerObserver($class) - { - $className = $this->resolveObserverClassName($class); - - // When registering a model observer, we will spin through the possible events - // and determine if this observer has that method. If it does, we will hook - // it into the model's event system, making it convenient to watch these. - foreach ($this->getObservableEvents() as $event) { - if (method_exists($class, $event)) { - static::registerModelEvent($event, $className.'@'.$event); - } - } - } - - /** - * Resolve the observer's class name from an object or string. - * - * @param object|string $class - * @return string - * - * @throws \InvalidArgumentException - */ - private function resolveObserverClassName($class) - { - if (is_object($class)) { - return get_class($class); - } - - if (class_exists($class)) { - return $class; - } - - throw new InvalidArgumentException('Unable to find observer: '.$class); - } - - /** - * Get the observable event names. - * - * @return array - */ - public function getObservableEvents() - { - return array_merge( - [ - 'retrieved', 'creating', 'created', 'updating', 'updated', - 'saving', 'saved', 'restoring', 'restored', 'replicating', - 'deleting', 'deleted', 'forceDeleting', 'forceDeleted', - ], - $this->observables - ); - } - - /** - * Set the observable event names. - * - * @param array $observables - * @return $this - */ - public function setObservableEvents(array $observables) - { - $this->observables = $observables; - - return $this; - } - - /** - * Add an observable event name. - * - * @param array|mixed $observables - * @return void - */ - public function addObservableEvents($observables) - { - $this->observables = array_unique(array_merge( - $this->observables, is_array($observables) ? $observables : func_get_args() - )); - } - - /** - * Remove an observable event name. - * - * @param array|mixed $observables - * @return void - */ - public function removeObservableEvents($observables) - { - $this->observables = array_diff( - $this->observables, is_array($observables) ? $observables : func_get_args() - ); - } - - /** - * Register a model event with the dispatcher. - * - * @param string $event - * @param \Illuminate\Events\QueuedClosure|callable|array|class-string $callback - * @return void - */ - protected static function registerModelEvent($event, $callback) - { - if (isset(static::$dispatcher)) { - $name = static::class; - - static::$dispatcher->listen("eloquent.{$event}: {$name}", $callback); - } - } - - /** - * Fire the given event for the model. - * - * @param string $event - * @param bool $halt - * @return mixed - */ - protected function fireModelEvent($event, $halt = true) - { - if (! isset(static::$dispatcher)) { - return true; - } - - // First, we will get the proper method to call on the event dispatcher, and then we - // will attempt to fire a custom, object based event for the given event. If that - // returns a result we can return that result, or we'll call the string events. - $method = $halt ? 'until' : 'dispatch'; - - $result = $this->filterModelEventResults( - $this->fireCustomModelEvent($event, $method) - ); - - if ($result === false) { - return false; - } - - return ! empty($result) ? $result : static::$dispatcher->{$method}( - "eloquent.{$event}: ".static::class, $this - ); - } - - /** - * Fire a custom model event for the given event. - * - * @param string $event - * @param string $method - * @return mixed|null - */ - protected function fireCustomModelEvent($event, $method) - { - if (! isset($this->dispatchesEvents[$event])) { - return; - } - - $result = static::$dispatcher->$method(new $this->dispatchesEvents[$event]($this)); - - if (! is_null($result)) { - return $result; - } - } - - /** - * Filter the model event results. - * - * @param mixed $result - * @return mixed - */ - protected function filterModelEventResults($result) - { - if (is_array($result)) { - $result = array_filter($result, function ($response) { - return ! is_null($response); - }); - } - - return $result; - } - - /** - * Register a retrieved model event with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|array|class-string $callback - * @return void - */ - public static function retrieved($callback) - { - static::registerModelEvent('retrieved', $callback); - } - - /** - * Register a saving model event with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|array|class-string $callback - * @return void - */ - public static function saving($callback) - { - static::registerModelEvent('saving', $callback); - } - - /** - * Register a saved model event with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|array|class-string $callback - * @return void - */ - public static function saved($callback) - { - static::registerModelEvent('saved', $callback); - } - - /** - * Register an updating model event with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|array|class-string $callback - * @return void - */ - public static function updating($callback) - { - static::registerModelEvent('updating', $callback); - } - - /** - * Register an updated model event with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|array|class-string $callback - * @return void - */ - public static function updated($callback) - { - static::registerModelEvent('updated', $callback); - } - - /** - * Register a creating model event with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|array|class-string $callback - * @return void - */ - public static function creating($callback) - { - static::registerModelEvent('creating', $callback); - } - - /** - * Register a created model event with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|array|class-string $callback - * @return void - */ - public static function created($callback) - { - static::registerModelEvent('created', $callback); - } - - /** - * Register a replicating model event with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|array|class-string $callback - * @return void - */ - public static function replicating($callback) - { - static::registerModelEvent('replicating', $callback); - } - - /** - * Register a deleting model event with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|array|class-string $callback - * @return void - */ - public static function deleting($callback) - { - static::registerModelEvent('deleting', $callback); - } - - /** - * Register a deleted model event with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|array|class-string $callback - * @return void - */ - public static function deleted($callback) - { - static::registerModelEvent('deleted', $callback); - } - - /** - * Remove all the event listeners for the model. - * - * @return void - */ - public static function flushEventListeners() - { - if (! isset(static::$dispatcher)) { - return; - } - - $instance = new static; - - foreach ($instance->getObservableEvents() as $event) { - static::$dispatcher->forget("eloquent.{$event}: ".static::class); - } - - foreach ($instance->dispatchesEvents as $event) { - static::$dispatcher->forget($event); - } - } - - /** - * Get the event map for the model. - * - * @return array - */ - public function dispatchesEvents() - { - return $this->dispatchesEvents; - } - - /** - * Get the event dispatcher instance. - * - * @return \Illuminate\Contracts\Events\Dispatcher|null - */ - public static function getEventDispatcher() - { - return static::$dispatcher; - } - - /** - * Set the event dispatcher instance. - * - * @param \Illuminate\Contracts\Events\Dispatcher $dispatcher - * @return void - */ - public static function setEventDispatcher(Dispatcher $dispatcher) - { - static::$dispatcher = $dispatcher; - } - - /** - * Unset the event dispatcher for models. - * - * @return void - */ - public static function unsetEventDispatcher() - { - static::$dispatcher = null; - } - - /** - * Execute a callback without firing any model events for any model type. - * - * @param callable $callback - * @return mixed - */ - public static function withoutEvents(callable $callback) - { - $dispatcher = static::getEventDispatcher(); - - if ($dispatcher) { - static::setEventDispatcher(new NullDispatcher($dispatcher)); - } - - try { - return $callback(); - } finally { - if ($dispatcher) { - static::setEventDispatcher($dispatcher); - } - } - } -} diff --git a/vendor/illuminate/database/Eloquent/Concerns/HasGlobalScopes.php b/vendor/illuminate/database/Eloquent/Concerns/HasGlobalScopes.php deleted file mode 100644 index df69409..0000000 --- a/vendor/illuminate/database/Eloquent/Concerns/HasGlobalScopes.php +++ /dev/null @@ -1,139 +0,0 @@ -getAttributes(ScopedBy::class))) - ->map(fn ($attribute) => $attribute->getArguments()) - ->flatten() - ->all(); - } - - /** - * Register a new global scope on the model. - * - * @param \Illuminate\Database\Eloquent\Scope|(\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string $scope - * @param \Illuminate\Database\Eloquent\Scope|(\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $implementation - * @return mixed - * - * @throws \InvalidArgumentException - */ - public static function addGlobalScope($scope, $implementation = null) - { - if (is_string($scope) && ($implementation instanceof Closure || $implementation instanceof Scope)) { - return static::$globalScopes[static::class][$scope] = $implementation; - } elseif ($scope instanceof Closure) { - return static::$globalScopes[static::class][spl_object_hash($scope)] = $scope; - } elseif ($scope instanceof Scope) { - return static::$globalScopes[static::class][get_class($scope)] = $scope; - } elseif (is_string($scope) && class_exists($scope) && is_subclass_of($scope, Scope::class)) { - return static::$globalScopes[static::class][$scope] = new $scope; - } - - throw new InvalidArgumentException('Global scope must be an instance of Closure or Scope or be a class name of a class extending '.Scope::class); - } - - /** - * Register multiple global scopes on the model. - * - * @param array $scopes - * @return void - */ - public static function addGlobalScopes(array $scopes) - { - foreach ($scopes as $key => $scope) { - if (is_string($key)) { - static::addGlobalScope($key, $scope); - } else { - static::addGlobalScope($scope); - } - } - } - - /** - * Determine if a model has a global scope. - * - * @param \Illuminate\Database\Eloquent\Scope|string $scope - * @return bool - */ - public static function hasGlobalScope($scope) - { - return ! is_null(static::getGlobalScope($scope)); - } - - /** - * Get a global scope registered with the model. - * - * @param \Illuminate\Database\Eloquent\Scope|string $scope - * @return \Illuminate\Database\Eloquent\Scope|(\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null - */ - public static function getGlobalScope($scope) - { - if (is_string($scope)) { - return Arr::get(static::$globalScopes, static::class.'.'.$scope); - } - - return Arr::get( - static::$globalScopes, static::class.'.'.get_class($scope) - ); - } - - /** - * Get all of the global scopes that are currently registered. - * - * @return array - */ - public static function getAllGlobalScopes() - { - return static::$globalScopes; - } - - /** - * Set the current global scopes. - * - * @param array $scopes - * @return void - */ - public static function setAllGlobalScopes($scopes) - { - static::$globalScopes = $scopes; - } - - /** - * Get the global scopes for this class instance. - * - * @return array - */ - public function getGlobalScopes() - { - return Arr::get(static::$globalScopes, static::class, []); - } -} diff --git a/vendor/illuminate/database/Eloquent/Concerns/HasRelationships.php b/vendor/illuminate/database/Eloquent/Concerns/HasRelationships.php deleted file mode 100644 index b991fd0..0000000 --- a/vendor/illuminate/database/Eloquent/Concerns/HasRelationships.php +++ /dev/null @@ -1,997 +0,0 @@ - $class - * @param string $key - * @return Closure|null - */ - public function relationResolver($class, $key) - { - if ($resolver = static::$relationResolvers[$class][$key] ?? null) { - return $resolver; - } - - if ($parent = get_parent_class($class)) { - return $this->relationResolver($parent, $key); - } - - return null; - } - - /** - * Define a dynamic relation resolver. - * - * @param string $name - * @param \Closure $callback - * @return void - */ - public static function resolveRelationUsing($name, Closure $callback) - { - static::$relationResolvers = array_replace_recursive( - static::$relationResolvers, - [static::class => [$name => $callback]] - ); - } - - /** - * Define a one-to-one relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $related - * @param string|null $foreignKey - * @param string|null $localKey - * @return \Illuminate\Database\Eloquent\Relations\HasOne - */ - public function hasOne($related, $foreignKey = null, $localKey = null) - { - $instance = $this->newRelatedInstance($related); - - $foreignKey = $foreignKey ?: $this->getForeignKey(); - - $localKey = $localKey ?: $this->getKeyName(); - - return $this->newHasOne($instance->newQuery(), $this, $instance->qualifyColumn($foreignKey), $localKey); - } - - /** - * Instantiate a new HasOne relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TDeclaringModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string $foreignKey - * @param string $localKey - * @return \Illuminate\Database\Eloquent\Relations\HasOne - */ - protected function newHasOne(Builder $query, Model $parent, $foreignKey, $localKey) - { - return new HasOne($query, $parent, $foreignKey, $localKey); - } - - /** - * Define a has-one-through relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TIntermediateModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $related - * @param class-string $through - * @param string|null $firstKey - * @param string|null $secondKey - * @param string|null $localKey - * @param string|null $secondLocalKey - * @return \Illuminate\Database\Eloquent\Relations\HasOneThrough - */ - public function hasOneThrough($related, $through, $firstKey = null, $secondKey = null, $localKey = null, $secondLocalKey = null) - { - $through = $this->newRelatedThroughInstance($through); - - $firstKey = $firstKey ?: $this->getForeignKey(); - - $secondKey = $secondKey ?: $through->getForeignKey(); - - return $this->newHasOneThrough( - $this->newRelatedInstance($related)->newQuery(), $this, $through, - $firstKey, $secondKey, $localKey ?: $this->getKeyName(), - $secondLocalKey ?: $through->getKeyName() - ); - } - - /** - * Instantiate a new HasOneThrough relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TIntermediateModel of \Illuminate\Database\Eloquent\Model - * @template TDeclaringModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $farParent - * @param TIntermediateModel $throughParent - * @param string $firstKey - * @param string $secondKey - * @param string $localKey - * @param string $secondLocalKey - * @return \Illuminate\Database\Eloquent\Relations\HasOneThrough - */ - protected function newHasOneThrough(Builder $query, Model $farParent, Model $throughParent, $firstKey, $secondKey, $localKey, $secondLocalKey) - { - return new HasOneThrough($query, $farParent, $throughParent, $firstKey, $secondKey, $localKey, $secondLocalKey); - } - - /** - * Define a polymorphic one-to-one relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $related - * @param string $name - * @param string|null $type - * @param string|null $id - * @param string|null $localKey - * @return \Illuminate\Database\Eloquent\Relations\MorphOne - */ - public function morphOne($related, $name, $type = null, $id = null, $localKey = null) - { - $instance = $this->newRelatedInstance($related); - - [$type, $id] = $this->getMorphs($name, $type, $id); - - $localKey = $localKey ?: $this->getKeyName(); - - return $this->newMorphOne($instance->newQuery(), $this, $instance->qualifyColumn($type), $instance->qualifyColumn($id), $localKey); - } - - /** - * Instantiate a new MorphOne relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TDeclaringModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string $type - * @param string $id - * @param string $localKey - * @return \Illuminate\Database\Eloquent\Relations\MorphOne - */ - protected function newMorphOne(Builder $query, Model $parent, $type, $id, $localKey) - { - return new MorphOne($query, $parent, $type, $id, $localKey); - } - - /** - * Define an inverse one-to-one or many relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $related - * @param string|null $foreignKey - * @param string|null $ownerKey - * @param string|null $relation - * @return \Illuminate\Database\Eloquent\Relations\BelongsTo - */ - public function belongsTo($related, $foreignKey = null, $ownerKey = null, $relation = null) - { - // If no relation name was given, we will use this debug backtrace to extract - // the calling method's name and use that as the relationship name as most - // of the time this will be what we desire to use for the relationships. - if (is_null($relation)) { - $relation = $this->guessBelongsToRelation(); - } - - $instance = $this->newRelatedInstance($related); - - // If no foreign key was supplied, we can use a backtrace to guess the proper - // foreign key name by using the name of the relationship function, which - // when combined with an "_id" should conventionally match the columns. - if (is_null($foreignKey)) { - $foreignKey = Str::snake($relation).'_'.$instance->getKeyName(); - } - - // Once we have the foreign key names we'll just create a new Eloquent query - // for the related models and return the relationship instance which will - // actually be responsible for retrieving and hydrating every relation. - $ownerKey = $ownerKey ?: $instance->getKeyName(); - - return $this->newBelongsTo( - $instance->newQuery(), $this, $foreignKey, $ownerKey, $relation - ); - } - - /** - * Instantiate a new BelongsTo relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TDeclaringModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $child - * @param string $foreignKey - * @param string $ownerKey - * @param string $relation - * @return \Illuminate\Database\Eloquent\Relations\BelongsTo - */ - protected function newBelongsTo(Builder $query, Model $child, $foreignKey, $ownerKey, $relation) - { - return new BelongsTo($query, $child, $foreignKey, $ownerKey, $relation); - } - - /** - * Define a polymorphic, inverse one-to-one or many relationship. - * - * @param string|null $name - * @param string|null $type - * @param string|null $id - * @param string|null $ownerKey - * @return \Illuminate\Database\Eloquent\Relations\MorphTo<\Illuminate\Database\Eloquent\Model, $this> - */ - public function morphTo($name = null, $type = null, $id = null, $ownerKey = null) - { - // If no name is provided, we will use the backtrace to get the function name - // since that is most likely the name of the polymorphic interface. We can - // use that to get both the class and foreign key that will be utilized. - $name = $name ?: $this->guessBelongsToRelation(); - - [$type, $id] = $this->getMorphs( - Str::snake($name), $type, $id - ); - - // If the type value is null it is probably safe to assume we're eager loading - // the relationship. In this case we'll just pass in a dummy query where we - // need to remove any eager loads that may already be defined on a model. - return is_null($class = $this->getAttributeFromArray($type)) || $class === '' - ? $this->morphEagerTo($name, $type, $id, $ownerKey) - : $this->morphInstanceTo($class, $name, $type, $id, $ownerKey); - } - - /** - * Define a polymorphic, inverse one-to-one or many relationship. - * - * @param string $name - * @param string $type - * @param string $id - * @param string|null $ownerKey - * @return \Illuminate\Database\Eloquent\Relations\MorphTo<\Illuminate\Database\Eloquent\Model, $this> - */ - protected function morphEagerTo($name, $type, $id, $ownerKey) - { - return $this->newMorphTo( - $this->newQuery()->setEagerLoads([]), $this, $id, $ownerKey, $type, $name - ); - } - - /** - * Define a polymorphic, inverse one-to-one or many relationship. - * - * @param string $target - * @param string $name - * @param string $type - * @param string $id - * @param string|null $ownerKey - * @return \Illuminate\Database\Eloquent\Relations\MorphTo<\Illuminate\Database\Eloquent\Model, $this> - */ - protected function morphInstanceTo($target, $name, $type, $id, $ownerKey) - { - $instance = $this->newRelatedInstance( - static::getActualClassNameForMorph($target) - ); - - return $this->newMorphTo( - $instance->newQuery(), $this, $id, $ownerKey ?? $instance->getKeyName(), $type, $name - ); - } - - /** - * Instantiate a new MorphTo relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TDeclaringModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string $foreignKey - * @param string|null $ownerKey - * @param string $type - * @param string $relation - * @return \Illuminate\Database\Eloquent\Relations\MorphTo - */ - protected function newMorphTo(Builder $query, Model $parent, $foreignKey, $ownerKey, $type, $relation) - { - return new MorphTo($query, $parent, $foreignKey, $ownerKey, $type, $relation); - } - - /** - * Retrieve the actual class name for a given morph class. - * - * @param string $class - * @return string - */ - public static function getActualClassNameForMorph($class) - { - return Arr::get(Relation::morphMap() ?: [], $class, $class); - } - - /** - * Guess the "belongs to" relationship name. - * - * @return string - */ - protected function guessBelongsToRelation() - { - [$one, $two, $caller] = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3); - - return $caller['function']; - } - - /** - * Create a pending has-many-through or has-one-through relationship. - * - * @template TIntermediateModel of \Illuminate\Database\Eloquent\Model - * - * @param string|\Illuminate\Database\Eloquent\Relations\HasMany|\Illuminate\Database\Eloquent\Relations\HasOne $relationship - * @return ( - * $relationship is string - * ? \Illuminate\Database\Eloquent\PendingHasThroughRelationship<\Illuminate\Database\Eloquent\Model, $this> - * : ( - * $relationship is \Illuminate\Database\Eloquent\Relations\HasMany - * ? \Illuminate\Database\Eloquent\PendingHasThroughRelationship> - * : \Illuminate\Database\Eloquent\PendingHasThroughRelationship> - * ) - * ) - */ - public function through($relationship) - { - if (is_string($relationship)) { - $relationship = $this->{$relationship}(); - } - - return new PendingHasThroughRelationship($this, $relationship); - } - - /** - * Define a one-to-many relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $related - * @param string|null $foreignKey - * @param string|null $localKey - * @return \Illuminate\Database\Eloquent\Relations\HasMany - */ - public function hasMany($related, $foreignKey = null, $localKey = null) - { - $instance = $this->newRelatedInstance($related); - - $foreignKey = $foreignKey ?: $this->getForeignKey(); - - $localKey = $localKey ?: $this->getKeyName(); - - return $this->newHasMany( - $instance->newQuery(), $this, $instance->qualifyColumn($foreignKey), $localKey - ); - } - - /** - * Instantiate a new HasMany relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TDeclaringModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string $foreignKey - * @param string $localKey - * @return \Illuminate\Database\Eloquent\Relations\HasMany - */ - protected function newHasMany(Builder $query, Model $parent, $foreignKey, $localKey) - { - return new HasMany($query, $parent, $foreignKey, $localKey); - } - - /** - * Define a has-many-through relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TIntermediateModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $related - * @param class-string $through - * @param string|null $firstKey - * @param string|null $secondKey - * @param string|null $localKey - * @param string|null $secondLocalKey - * @return \Illuminate\Database\Eloquent\Relations\HasManyThrough - */ - public function hasManyThrough($related, $through, $firstKey = null, $secondKey = null, $localKey = null, $secondLocalKey = null) - { - $through = $this->newRelatedThroughInstance($through); - - $firstKey = $firstKey ?: $this->getForeignKey(); - - $secondKey = $secondKey ?: $through->getForeignKey(); - - return $this->newHasManyThrough( - $this->newRelatedInstance($related)->newQuery(), - $this, - $through, - $firstKey, - $secondKey, - $localKey ?: $this->getKeyName(), - $secondLocalKey ?: $through->getKeyName() - ); - } - - /** - * Instantiate a new HasManyThrough relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TIntermediateModel of \Illuminate\Database\Eloquent\Model - * @template TDeclaringModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $farParent - * @param TIntermediateModel $throughParent - * @param string $firstKey - * @param string $secondKey - * @param string $localKey - * @param string $secondLocalKey - * @return \Illuminate\Database\Eloquent\Relations\HasManyThrough - */ - protected function newHasManyThrough(Builder $query, Model $farParent, Model $throughParent, $firstKey, $secondKey, $localKey, $secondLocalKey) - { - return new HasManyThrough($query, $farParent, $throughParent, $firstKey, $secondKey, $localKey, $secondLocalKey); - } - - /** - * Define a polymorphic one-to-many relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $related - * @param string $name - * @param string|null $type - * @param string|null $id - * @param string|null $localKey - * @return \Illuminate\Database\Eloquent\Relations\MorphMany - */ - public function morphMany($related, $name, $type = null, $id = null, $localKey = null) - { - $instance = $this->newRelatedInstance($related); - - // Here we will gather up the morph type and ID for the relationship so that we - // can properly query the intermediate table of a relation. Finally, we will - // get the table and create the relationship instances for the developers. - [$type, $id] = $this->getMorphs($name, $type, $id); - - $localKey = $localKey ?: $this->getKeyName(); - - return $this->newMorphMany($instance->newQuery(), $this, $instance->qualifyColumn($type), $instance->qualifyColumn($id), $localKey); - } - - /** - * Instantiate a new MorphMany relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TDeclaringModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string $type - * @param string $id - * @param string $localKey - * @return \Illuminate\Database\Eloquent\Relations\MorphMany - */ - protected function newMorphMany(Builder $query, Model $parent, $type, $id, $localKey) - { - return new MorphMany($query, $parent, $type, $id, $localKey); - } - - /** - * Define a many-to-many relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $related - * @param string|class-string<\Illuminate\Database\Eloquent\Model>|null $table - * @param string|null $foreignPivotKey - * @param string|null $relatedPivotKey - * @param string|null $parentKey - * @param string|null $relatedKey - * @param string|null $relation - * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany - */ - public function belongsToMany($related, $table = null, $foreignPivotKey = null, $relatedPivotKey = null, - $parentKey = null, $relatedKey = null, $relation = null) - { - // If no relationship name was passed, we will pull backtraces to get the - // name of the calling function. We will use that function name as the - // title of this relation since that is a great convention to apply. - if (is_null($relation)) { - $relation = $this->guessBelongsToManyRelation(); - } - - // First, we'll need to determine the foreign key and "other key" for the - // relationship. Once we have determined the keys we'll make the query - // instances as well as the relationship instances we need for this. - $instance = $this->newRelatedInstance($related); - - $foreignPivotKey = $foreignPivotKey ?: $this->getForeignKey(); - - $relatedPivotKey = $relatedPivotKey ?: $instance->getForeignKey(); - - // If no table name was provided, we can guess it by concatenating the two - // models using underscores in alphabetical order. The two model names - // are transformed to snake case from their default CamelCase also. - if (is_null($table)) { - $table = $this->joiningTable($related, $instance); - } - - return $this->newBelongsToMany( - $instance->newQuery(), $this, $table, $foreignPivotKey, - $relatedPivotKey, $parentKey ?: $this->getKeyName(), - $relatedKey ?: $instance->getKeyName(), $relation - ); - } - - /** - * Instantiate a new BelongsToMany relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TDeclaringModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string|class-string<\Illuminate\Database\Eloquent\Model> $table - * @param string $foreignPivotKey - * @param string $relatedPivotKey - * @param string $parentKey - * @param string $relatedKey - * @param string|null $relationName - * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany - */ - protected function newBelongsToMany(Builder $query, Model $parent, $table, $foreignPivotKey, $relatedPivotKey, - $parentKey, $relatedKey, $relationName = null) - { - return new BelongsToMany($query, $parent, $table, $foreignPivotKey, $relatedPivotKey, $parentKey, $relatedKey, $relationName); - } - - /** - * Define a polymorphic many-to-many relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $related - * @param string $name - * @param string|null $table - * @param string|null $foreignPivotKey - * @param string|null $relatedPivotKey - * @param string|null $parentKey - * @param string|null $relatedKey - * @param string|null $relation - * @param bool $inverse - * @return \Illuminate\Database\Eloquent\Relations\MorphToMany - */ - public function morphToMany($related, $name, $table = null, $foreignPivotKey = null, - $relatedPivotKey = null, $parentKey = null, - $relatedKey = null, $relation = null, $inverse = false) - { - $relation = $relation ?: $this->guessBelongsToManyRelation(); - - // First, we will need to determine the foreign key and "other key" for the - // relationship. Once we have determined the keys we will make the query - // instances, as well as the relationship instances we need for these. - $instance = $this->newRelatedInstance($related); - - $foreignPivotKey = $foreignPivotKey ?: $name.'_id'; - - $relatedPivotKey = $relatedPivotKey ?: $instance->getForeignKey(); - - // Now we're ready to create a new query builder for the related model and - // the relationship instances for this relation. This relation will set - // appropriate query constraints then entirely manage the hydrations. - if (! $table) { - $words = preg_split('/(_)/u', $name, -1, PREG_SPLIT_DELIM_CAPTURE); - - $lastWord = array_pop($words); - - $table = implode('', $words).Str::plural($lastWord); - } - - return $this->newMorphToMany( - $instance->newQuery(), $this, $name, $table, - $foreignPivotKey, $relatedPivotKey, $parentKey ?: $this->getKeyName(), - $relatedKey ?: $instance->getKeyName(), $relation, $inverse - ); - } - - /** - * Instantiate a new MorphToMany relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TDeclaringModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string $name - * @param string $table - * @param string $foreignPivotKey - * @param string $relatedPivotKey - * @param string $parentKey - * @param string $relatedKey - * @param string|null $relationName - * @param bool $inverse - * @return \Illuminate\Database\Eloquent\Relations\MorphToMany - */ - protected function newMorphToMany(Builder $query, Model $parent, $name, $table, $foreignPivotKey, - $relatedPivotKey, $parentKey, $relatedKey, - $relationName = null, $inverse = false) - { - return new MorphToMany($query, $parent, $name, $table, $foreignPivotKey, $relatedPivotKey, $parentKey, $relatedKey, - $relationName, $inverse); - } - - /** - * Define a polymorphic, inverse many-to-many relationship. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $related - * @param string $name - * @param string|null $table - * @param string|null $foreignPivotKey - * @param string|null $relatedPivotKey - * @param string|null $parentKey - * @param string|null $relatedKey - * @param string|null $relation - * @return \Illuminate\Database\Eloquent\Relations\MorphToMany - */ - public function morphedByMany($related, $name, $table = null, $foreignPivotKey = null, - $relatedPivotKey = null, $parentKey = null, $relatedKey = null, $relation = null) - { - $foreignPivotKey = $foreignPivotKey ?: $this->getForeignKey(); - - // For the inverse of the polymorphic many-to-many relations, we will change - // the way we determine the foreign and other keys, as it is the opposite - // of the morph-to-many method since we're figuring out these inverses. - $relatedPivotKey = $relatedPivotKey ?: $name.'_id'; - - return $this->morphToMany( - $related, $name, $table, $foreignPivotKey, - $relatedPivotKey, $parentKey, $relatedKey, $relation, true - ); - } - - /** - * Get the relationship name of the belongsToMany relationship. - * - * @return string|null - */ - protected function guessBelongsToManyRelation() - { - $caller = Arr::first(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), function ($trace) { - return ! in_array( - $trace['function'], - array_merge(static::$manyMethods, ['guessBelongsToManyRelation']) - ); - }); - - return ! is_null($caller) ? $caller['function'] : null; - } - - /** - * Get the joining table name for a many-to-many relation. - * - * @param string $related - * @param \Illuminate\Database\Eloquent\Model|null $instance - * @return string - */ - public function joiningTable($related, $instance = null) - { - // The joining table name, by convention, is simply the snake cased models - // sorted alphabetically and concatenated with an underscore, so we can - // just sort the models and join them together to get the table name. - $segments = [ - $instance ? $instance->joiningTableSegment() - : Str::snake(class_basename($related)), - $this->joiningTableSegment(), - ]; - - // Now that we have the model names in an array we can just sort them and - // use the implode function to join them together with an underscores, - // which is typically used by convention within the database system. - sort($segments); - - return strtolower(implode('_', $segments)); - } - - /** - * Get this model's half of the intermediate table name for belongsToMany relationships. - * - * @return string - */ - public function joiningTableSegment() - { - return Str::snake(class_basename($this)); - } - - /** - * Determine if the model touches a given relation. - * - * @param string $relation - * @return bool - */ - public function touches($relation) - { - return in_array($relation, $this->getTouchedRelations()); - } - - /** - * Touch the owning relations of the model. - * - * @return void - */ - public function touchOwners() - { - $this->withoutRecursion(function () { - foreach ($this->getTouchedRelations() as $relation) { - $this->$relation()->touch(); - - if ($this->$relation instanceof self) { - $this->$relation->fireModelEvent('saved', false); - - $this->$relation->touchOwners(); - } elseif ($this->$relation instanceof EloquentCollection) { - $this->$relation->each->touchOwners(); - } - } - }); - } - - /** - * Get the polymorphic relationship columns. - * - * @param string $name - * @param string $type - * @param string $id - * @return array - */ - protected function getMorphs($name, $type, $id) - { - return [$type ?: $name.'_type', $id ?: $name.'_id']; - } - - /** - * Get the class name for polymorphic relations. - * - * @return string - */ - public function getMorphClass() - { - $morphMap = Relation::morphMap(); - - if (! empty($morphMap) && in_array(static::class, $morphMap)) { - return array_search(static::class, $morphMap, true); - } - - if (static::class === Pivot::class) { - return static::class; - } - - if (Relation::requiresMorphMap()) { - throw new ClassMorphViolationException($this); - } - - return static::class; - } - - /** - * Create a new model instance for a related model. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $class - * @return TRelatedModel - */ - protected function newRelatedInstance($class) - { - return tap(new $class, function ($instance) { - if (! $instance->getConnectionName()) { - $instance->setConnection($this->connection); - } - }); - } - - /** - * Create a new model instance for a related "through" model. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param class-string $class - * @return TRelatedModel - */ - protected function newRelatedThroughInstance($class) - { - return new $class; - } - - /** - * Get all the loaded relations for the instance. - * - * @return array - */ - public function getRelations() - { - return $this->relations; - } - - /** - * Get a specified relationship. - * - * @param string $relation - * @return mixed - */ - public function getRelation($relation) - { - return $this->relations[$relation]; - } - - /** - * Determine if the given relation is loaded. - * - * @param string $key - * @return bool - */ - public function relationLoaded($key) - { - return array_key_exists($key, $this->relations); - } - - /** - * Set the given relationship on the model. - * - * @param string $relation - * @param mixed $value - * @return $this - */ - public function setRelation($relation, $value) - { - $this->relations[$relation] = $value; - - return $this; - } - - /** - * Unset a loaded relationship. - * - * @param string $relation - * @return $this - */ - public function unsetRelation($relation) - { - unset($this->relations[$relation]); - - return $this; - } - - /** - * Set the entire relations array on the model. - * - * @param array $relations - * @return $this - */ - public function setRelations(array $relations) - { - $this->relations = $relations; - - return $this; - } - - /** - * Duplicate the instance and unset all the loaded relations. - * - * @return $this - */ - public function withoutRelations() - { - $model = clone $this; - - return $model->unsetRelations(); - } - - /** - * Unset all the loaded relations for the instance. - * - * @return $this - */ - public function unsetRelations() - { - $this->relations = []; - - return $this; - } - - /** - * Get the relationships that are touched on save. - * - * @return array - */ - public function getTouchedRelations() - { - return $this->touches; - } - - /** - * Set the relationships that are touched on save. - * - * @param array $touches - * @return $this - */ - public function setTouchedRelations(array $touches) - { - $this->touches = $touches; - - return $this; - } -} diff --git a/vendor/illuminate/database/Eloquent/Concerns/HasTimestamps.php b/vendor/illuminate/database/Eloquent/Concerns/HasTimestamps.php deleted file mode 100644 index 19a7c25..0000000 --- a/vendor/illuminate/database/Eloquent/Concerns/HasTimestamps.php +++ /dev/null @@ -1,232 +0,0 @@ -$attribute = $this->freshTimestamp(); - - return $this->save(); - } - - if (! $this->usesTimestamps()) { - return false; - } - - $this->updateTimestamps(); - - return $this->save(); - } - - /** - * Update the model's update timestamp without raising any events. - * - * @param string|null $attribute - * @return bool - */ - public function touchQuietly($attribute = null) - { - return static::withoutEvents(fn () => $this->touch($attribute)); - } - - /** - * Update the creation and update timestamps. - * - * @return $this - */ - public function updateTimestamps() - { - $time = $this->freshTimestamp(); - - $updatedAtColumn = $this->getUpdatedAtColumn(); - - if (! is_null($updatedAtColumn) && ! $this->isDirty($updatedAtColumn)) { - $this->setUpdatedAt($time); - } - - $createdAtColumn = $this->getCreatedAtColumn(); - - if (! $this->exists && ! is_null($createdAtColumn) && ! $this->isDirty($createdAtColumn)) { - $this->setCreatedAt($time); - } - - return $this; - } - - /** - * Set the value of the "created at" attribute. - * - * @param mixed $value - * @return $this - */ - public function setCreatedAt($value) - { - $this->{$this->getCreatedAtColumn()} = $value; - - return $this; - } - - /** - * Set the value of the "updated at" attribute. - * - * @param mixed $value - * @return $this - */ - public function setUpdatedAt($value) - { - $this->{$this->getUpdatedAtColumn()} = $value; - - return $this; - } - - /** - * Get a fresh timestamp for the model. - * - * @return \Illuminate\Support\Carbon - */ - public function freshTimestamp() - { - return Date::now(); - } - - /** - * Get a fresh timestamp for the model. - * - * @return string - */ - public function freshTimestampString() - { - return $this->fromDateTime($this->freshTimestamp()); - } - - /** - * Determine if the model uses timestamps. - * - * @return bool - */ - public function usesTimestamps() - { - return $this->timestamps && ! static::isIgnoringTimestamps($this::class); - } - - /** - * Get the name of the "created at" column. - * - * @return string|null - */ - public function getCreatedAtColumn() - { - return static::CREATED_AT; - } - - /** - * Get the name of the "updated at" column. - * - * @return string|null - */ - public function getUpdatedAtColumn() - { - return static::UPDATED_AT; - } - - /** - * Get the fully qualified "created at" column. - * - * @return string|null - */ - public function getQualifiedCreatedAtColumn() - { - $column = $this->getCreatedAtColumn(); - - return $column ? $this->qualifyColumn($column) : null; - } - - /** - * Get the fully qualified "updated at" column. - * - * @return string|null - */ - public function getQualifiedUpdatedAtColumn() - { - $column = $this->getUpdatedAtColumn(); - - return $column ? $this->qualifyColumn($column) : null; - } - - /** - * Disable timestamps for the current class during the given callback scope. - * - * @param callable $callback - * @return mixed - */ - public static function withoutTimestamps(callable $callback) - { - return static::withoutTimestampsOn([static::class], $callback); - } - - /** - * Disable timestamps for the given model classes during the given callback scope. - * - * @param array $models - * @param callable $callback - * @return mixed - */ - public static function withoutTimestampsOn($models, $callback) - { - static::$ignoreTimestampsOn = array_values(array_merge(static::$ignoreTimestampsOn, $models)); - - try { - return $callback(); - } finally { - foreach ($models as $model) { - if (($key = array_search($model, static::$ignoreTimestampsOn, true)) !== false) { - unset(static::$ignoreTimestampsOn[$key]); - } - } - } - } - - /** - * Determine if the given model is ignoring timestamps / touches. - * - * @param string|null $class - * @return bool - */ - public static function isIgnoringTimestamps($class = null) - { - $class ??= static::class; - - foreach (static::$ignoreTimestampsOn as $ignoredClass) { - if ($class === $ignoredClass || is_subclass_of($class, $ignoredClass)) { - return true; - } - } - - return false; - } -} diff --git a/vendor/illuminate/database/Eloquent/Concerns/HasUlids.php b/vendor/illuminate/database/Eloquent/Concerns/HasUlids.php deleted file mode 100644 index 344f973..0000000 --- a/vendor/illuminate/database/Eloquent/Concerns/HasUlids.php +++ /dev/null @@ -1,31 +0,0 @@ -usesUniqueIds; - } - - /** - * Generate unique keys for the model. - * - * @return void - */ - public function setUniqueIds() - { - foreach ($this->uniqueIds() as $column) { - if (empty($this->{$column})) { - $this->{$column} = $this->newUniqueId(); - } - } - } - - /** - * Generate a new key for the model. - * - * @return string - */ - public function newUniqueId() - { - return null; - } - - /** - * Get the columns that should receive a unique identifier. - * - * @return array - */ - public function uniqueIds() - { - return []; - } -} diff --git a/vendor/illuminate/database/Eloquent/Concerns/HasUniqueStringIds.php b/vendor/illuminate/database/Eloquent/Concerns/HasUniqueStringIds.php deleted file mode 100644 index 324961f..0000000 --- a/vendor/illuminate/database/Eloquent/Concerns/HasUniqueStringIds.php +++ /dev/null @@ -1,108 +0,0 @@ -usesUniqueIds = true; - } - - /** - * Get the columns that should receive a unique identifier. - * - * @return array - */ - public function uniqueIds() - { - return $this->usesUniqueIds() ? [$this->getKeyName()] : parent::uniqueIds(); - } - - /** - * Retrieve the model for a bound value. - * - * @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\Relation<*, *, *> $query - * @param mixed $value - * @param string|null $field - * @return \Illuminate\Contracts\Database\Eloquent\Builder - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function resolveRouteBindingQuery($query, $value, $field = null) - { - if ($field && in_array($field, $this->uniqueIds()) && ! $this->isValidUniqueId($value)) { - $this->handleInvalidUniqueId($value, $field); - } - - if (! $field && in_array($this->getRouteKeyName(), $this->uniqueIds()) && ! $this->isValidUniqueId($value)) { - $this->handleInvalidUniqueId($value, $field); - } - - return parent::resolveRouteBindingQuery($query, $value, $field); - } - - /** - * Get the auto-incrementing key type. - * - * @return string - */ - public function getKeyType() - { - if (in_array($this->getKeyName(), $this->uniqueIds())) { - return 'string'; - } - - return parent::getKeyType(); - } - - /** - * Get the value indicating whether the IDs are incrementing. - * - * @return bool - */ - public function getIncrementing() - { - if (in_array($this->getKeyName(), $this->uniqueIds())) { - return false; - } - - return parent::getIncrementing(); - } - - /** - * Throw an exception for the given invalid unique ID. - * - * @param mixed $value - * @param string|null $field - * @return never - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - */ - protected function handleInvalidUniqueId($value, $field) - { - throw (new ModelNotFoundException)->setModel(get_class($this), $value); - } -} diff --git a/vendor/illuminate/database/Eloquent/Concerns/HasUuids.php b/vendor/illuminate/database/Eloquent/Concerns/HasUuids.php deleted file mode 100644 index 8d6c35a..0000000 --- a/vendor/illuminate/database/Eloquent/Concerns/HasUuids.php +++ /dev/null @@ -1,31 +0,0 @@ - - */ - protected $hidden = []; - - /** - * The attributes that should be visible in serialization. - * - * @var array - */ - protected $visible = []; - - /** - * Get the hidden attributes for the model. - * - * @return array - */ - public function getHidden() - { - return $this->hidden; - } - - /** - * Set the hidden attributes for the model. - * - * @param array $hidden - * @return $this - */ - public function setHidden(array $hidden) - { - $this->hidden = $hidden; - - return $this; - } - - /** - * Get the visible attributes for the model. - * - * @return array - */ - public function getVisible() - { - return $this->visible; - } - - /** - * Set the visible attributes for the model. - * - * @param array $visible - * @return $this - */ - public function setVisible(array $visible) - { - $this->visible = $visible; - - return $this; - } - - /** - * Make the given, typically hidden, attributes visible. - * - * @param array|string|null $attributes - * @return $this - */ - public function makeVisible($attributes) - { - $attributes = is_array($attributes) ? $attributes : func_get_args(); - - $this->hidden = array_diff($this->hidden, $attributes); - - if (! empty($this->visible)) { - $this->visible = array_values(array_unique(array_merge($this->visible, $attributes))); - } - - return $this; - } - - /** - * Make the given, typically hidden, attributes visible if the given truth test passes. - * - * @param bool|\Closure $condition - * @param array|string|null $attributes - * @return $this - */ - public function makeVisibleIf($condition, $attributes) - { - return value($condition, $this) ? $this->makeVisible($attributes) : $this; - } - - /** - * Make the given, typically visible, attributes hidden. - * - * @param array|string|null $attributes - * @return $this - */ - public function makeHidden($attributes) - { - $this->hidden = array_values(array_unique(array_merge( - $this->hidden, is_array($attributes) ? $attributes : func_get_args() - ))); - - return $this; - } - - /** - * Make the given, typically visible, attributes hidden if the given truth test passes. - * - * @param bool|\Closure $condition - * @param array|string|null $attributes - * @return $this - */ - public function makeHiddenIf($condition, $attributes) - { - return value($condition, $this) ? $this->makeHidden($attributes) : $this; - } -} diff --git a/vendor/illuminate/database/Eloquent/Concerns/PreventsCircularRecursion.php b/vendor/illuminate/database/Eloquent/Concerns/PreventsCircularRecursion.php deleted file mode 100644 index 85aa66d..0000000 --- a/vendor/illuminate/database/Eloquent/Concerns/PreventsCircularRecursion.php +++ /dev/null @@ -1,107 +0,0 @@ -> - */ - protected static $recursionCache; - - /** - * Prevent a method from being called multiple times on the same object within the same call stack. - * - * @param callable $callback - * @param mixed $default - * @return mixed - */ - protected function withoutRecursion($callback, $default = null) - { - $trace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 2); - - $onceable = Onceable::tryFromTrace($trace, $callback); - - if (is_null($onceable)) { - return call_user_func($callback); - } - - $stack = static::getRecursiveCallStack($this); - - if (array_key_exists($onceable->hash, $stack)) { - return is_callable($stack[$onceable->hash]) - ? static::setRecursiveCallValue($this, $onceable->hash, call_user_func($stack[$onceable->hash])) - : $stack[$onceable->hash]; - } - - try { - static::setRecursiveCallValue($this, $onceable->hash, $default); - - return call_user_func($onceable->callable); - } finally { - static::clearRecursiveCallValue($this, $onceable->hash); - } - } - - /** - * Remove an entry from the recursion cache for an object. - * - * @param object $object - * @param string $hash - */ - protected static function clearRecursiveCallValue($object, string $hash) - { - if ($stack = Arr::except(static::getRecursiveCallStack($object), $hash)) { - static::getRecursionCache()->offsetSet($object, $stack); - } elseif (static::getRecursionCache()->offsetExists($object)) { - static::getRecursionCache()->offsetUnset($object); - } - } - - /** - * Get the stack of methods being called recursively for the current object. - * - * @param object $object - * @return array - */ - protected static function getRecursiveCallStack($object): array - { - return static::getRecursionCache()->offsetExists($object) - ? static::getRecursionCache()->offsetGet($object) - : []; - } - - /** - * Get the current recursion cache being used by the model. - * - * @return WeakMap - */ - protected static function getRecursionCache() - { - return static::$recursionCache ??= new WeakMap(); - } - - /** - * Set a value in the recursion cache for the given object and method. - * - * @param object $object - * @param string $hash - * @param mixed $value - * @return mixed - */ - protected static function setRecursiveCallValue($object, string $hash, $value) - { - static::getRecursionCache()->offsetSet( - $object, - tap(static::getRecursiveCallStack($object), fn (&$stack) => $stack[$hash] = $value), - ); - - return static::getRecursiveCallStack($object)[$hash]; - } -} diff --git a/vendor/illuminate/database/Eloquent/Concerns/QueriesRelationships.php b/vendor/illuminate/database/Eloquent/Concerns/QueriesRelationships.php deleted file mode 100644 index c6162d7..0000000 --- a/vendor/illuminate/database/Eloquent/Concerns/QueriesRelationships.php +++ /dev/null @@ -1,1061 +0,0 @@ -|string $relation - * @param string $operator - * @param int $count - * @param string $boolean - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback - * @return $this - * - * @throws \RuntimeException - */ - public function has($relation, $operator = '>=', $count = 1, $boolean = 'and', ?Closure $callback = null) - { - if (is_string($relation)) { - if (str_contains($relation, '.')) { - return $this->hasNested($relation, $operator, $count, $boolean, $callback); - } - - $relation = $this->getRelationWithoutConstraints($relation); - } - - if ($relation instanceof MorphTo) { - return $this->hasMorph($relation, ['*'], $operator, $count, $boolean, $callback); - } - - // If we only need to check for the existence of the relation, then we can optimize - // the subquery to only run a "where exists" clause instead of this full "count" - // clause. This will make these queries run much faster compared with a count. - $method = $this->canUseExistsForExistenceCheck($operator, $count) - ? 'getRelationExistenceQuery' - : 'getRelationExistenceCountQuery'; - - $hasQuery = $relation->{$method}( - $relation->getRelated()->newQueryWithoutRelationships(), $this - ); - - // Next we will call any given callback as an "anonymous" scope so they can get the - // proper logical grouping of the where clauses if needed by this Eloquent query - // builder. Then, we will be ready to finalize and return this query instance. - if ($callback) { - $hasQuery->callScope($callback); - } - - return $this->addHasWhere( - $hasQuery, $relation, $operator, $count, $boolean - ); - } - - /** - * Add nested relationship count / exists conditions to the query. - * - * Sets up recursive call to whereHas until we finish the nested relation. - * - * @param string $relations - * @param string $operator - * @param int $count - * @param string $boolean - * @param (\Closure(\Illuminate\Database\Eloquent\Builder<*>): mixed)|null $callback - * @return $this - */ - protected function hasNested($relations, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) - { - $relations = explode('.', $relations); - - $doesntHave = $operator === '<' && $count === 1; - - if ($doesntHave) { - $operator = '>='; - $count = 1; - } - - $closure = function ($q) use (&$closure, &$relations, $operator, $count, $callback) { - // In order to nest "has", we need to add count relation constraints on the - // callback Closure. We'll do this by simply passing the Closure its own - // reference to itself so it calls itself recursively on each segment. - count($relations) > 1 - ? $q->whereHas(array_shift($relations), $closure) - : $q->has(array_shift($relations), $operator, $count, 'and', $callback); - }; - - return $this->has(array_shift($relations), $doesntHave ? '<' : '>=', 1, $boolean, $closure); - } - - /** - * Add a relationship count / exists condition to the query with an "or". - * - * @param \Illuminate\Database\Eloquent\Relations\Relation<*, *, *>|string $relation - * @param string $operator - * @param int $count - * @return $this - */ - public function orHas($relation, $operator = '>=', $count = 1) - { - return $this->has($relation, $operator, $count, 'or'); - } - - /** - * Add a relationship count / exists condition to the query. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param string $boolean - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback - * @return $this - */ - public function doesntHave($relation, $boolean = 'and', ?Closure $callback = null) - { - return $this->has($relation, '<', 1, $boolean, $callback); - } - - /** - * Add a relationship count / exists condition to the query with an "or". - * - * @param \Illuminate\Database\Eloquent\Relations\Relation<*, *, *>|string $relation - * @return $this - */ - public function orDoesntHave($relation) - { - return $this->doesntHave($relation, 'or'); - } - - /** - * Add a relationship count / exists condition to the query with where clauses. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback - * @param string $operator - * @param int $count - * @return $this - */ - public function whereHas($relation, ?Closure $callback = null, $operator = '>=', $count = 1) - { - return $this->has($relation, $operator, $count, 'and', $callback); - } - - /** - * Add a relationship count / exists condition to the query with where clauses. - * - * Also load the relationship with the same condition. - * - * @param string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder<*>|\Illuminate\Database\Eloquent\Relations\Relation<*, *, *>): mixed)|null $callback - * @param string $operator - * @param int $count - * @return $this - */ - public function withWhereHas($relation, ?Closure $callback = null, $operator = '>=', $count = 1) - { - return $this->whereHas(Str::before($relation, ':'), $callback, $operator, $count) - ->with($callback ? [$relation => fn ($query) => $callback($query)] : $relation); - } - - /** - * Add a relationship count / exists condition to the query with where clauses and an "or". - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback - * @param string $operator - * @param int $count - * @return $this - */ - public function orWhereHas($relation, ?Closure $callback = null, $operator = '>=', $count = 1) - { - return $this->has($relation, $operator, $count, 'or', $callback); - } - - /** - * Add a relationship count / exists condition to the query with where clauses. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback - * @return $this - */ - public function whereDoesntHave($relation, ?Closure $callback = null) - { - return $this->doesntHave($relation, 'and', $callback); - } - - /** - * Add a relationship count / exists condition to the query with where clauses and an "or". - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback - * @return $this - */ - public function orWhereDoesntHave($relation, ?Closure $callback = null) - { - return $this->doesntHave($relation, 'or', $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param string $operator - * @param int $count - * @param string $boolean - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback - * @return $this - */ - public function hasMorph($relation, $types, $operator = '>=', $count = 1, $boolean = 'and', ?Closure $callback = null) - { - if (is_string($relation)) { - $relation = $this->getRelationWithoutConstraints($relation); - } - - $types = (array) $types; - - $checkMorphNull = $types === ['*'] - && (($operator === '<' && $count >= 1) - || ($operator === '<=' && $count >= 0) - || ($operator === '=' && $count === 0) - || ($operator === '!=' && $count >= 1)); - - if ($types === ['*']) { - $types = $this->model->newModelQuery()->distinct()->pluck($relation->getMorphType()) - ->filter() - ->map(fn ($item) => enum_value($item)) - ->all(); - } - - if (empty($types)) { - return $this->where(new Expression('0'), $operator, $count, $boolean); - } - - foreach ($types as &$type) { - $type = Relation::getMorphedModel($type) ?? $type; - } - - return $this->where(function ($query) use ($relation, $callback, $operator, $count, $types) { - foreach ($types as $type) { - $query->orWhere(function ($query) use ($relation, $callback, $operator, $count, $type) { - $belongsTo = $this->getBelongsToRelation($relation, $type); - - if ($callback) { - $callback = function ($query) use ($callback, $type) { - return $callback($query, $type); - }; - } - - $query->where($this->qualifyColumn($relation->getMorphType()), '=', (new $type)->getMorphClass()) - ->whereHas($belongsTo, $callback, $operator, $count); - }); - } - }, null, null, $boolean) - ->when($checkMorphNull, fn (self $query) => $query->orWhereMorphedTo($relation, null)); - } - - /** - * Get the BelongsTo relationship for a single polymorphic type. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * @template TDeclaringModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, TDeclaringModel> $relation - * @param class-string $type - * @return \Illuminate\Database\Eloquent\Relations\BelongsTo - */ - protected function getBelongsToRelation(MorphTo $relation, $type) - { - $belongsTo = Relation::noConstraints(function () use ($relation, $type) { - return $this->model->belongsTo( - $type, - $relation->getForeignKeyName(), - $relation->getOwnerKeyName() - ); - }); - - $belongsTo->getQuery()->mergeConstraintsFrom($relation->getQuery()); - - return $belongsTo; - } - - /** - * Add a polymorphic relationship count / exists condition to the query with an "or". - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation - * @param string|array $types - * @param string $operator - * @param int $count - * @return $this - */ - public function orHasMorph($relation, $types, $operator = '>=', $count = 1) - { - return $this->hasMorph($relation, $types, $operator, $count, 'or'); - } - - /** - * Add a polymorphic relationship count / exists condition to the query. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param string $boolean - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback - * @return $this - */ - public function doesntHaveMorph($relation, $types, $boolean = 'and', ?Closure $callback = null) - { - return $this->hasMorph($relation, $types, '<', 1, $boolean, $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with an "or". - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation - * @param string|array $types - * @return $this - */ - public function orDoesntHaveMorph($relation, $types) - { - return $this->doesntHaveMorph($relation, $types, 'or'); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback - * @param string $operator - * @param int $count - * @return $this - */ - public function whereHasMorph($relation, $types, ?Closure $callback = null, $operator = '>=', $count = 1) - { - return $this->hasMorph($relation, $types, $operator, $count, 'and', $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses and an "or". - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback - * @param string $operator - * @param int $count - * @return $this - */ - public function orWhereHasMorph($relation, $types, ?Closure $callback = null, $operator = '>=', $count = 1) - { - return $this->hasMorph($relation, $types, $operator, $count, 'or', $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback - * @return $this - */ - public function whereDoesntHaveMorph($relation, $types, ?Closure $callback = null) - { - return $this->doesntHaveMorph($relation, $types, 'and', $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses and an "or". - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback - * @return $this - */ - public function orWhereDoesntHaveMorph($relation, $types, ?Closure $callback = null) - { - return $this->doesntHaveMorph($relation, $types, 'or', $callback); - } - - /** - * Add a basic where clause to a relationship query. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function whereRelation($relation, $column, $operator = null, $value = null) - { - return $this->whereHas($relation, function ($query) use ($column, $operator, $value) { - if ($column instanceof Closure) { - $column($query); - } else { - $query->where($column, $operator, $value); - } - }); - } - - /** - * Add a basic where clause to a relationship query and eager-load the relationship with the same conditions. - * - * @param \Illuminate\Database\Eloquent\Relations\Relation<*, *, *>|string $relation - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function withWhereRelation($relation, $column, $operator = null, $value = null) - { - return $this->whereRelation($relation, $column, $operator, $value) - ->with([ - $relation => fn ($query) => $column instanceof Closure - ? $column($query) - : $query->where($column, $operator, $value), - ]); - } - - /** - * Add an "or where" clause to a relationship query. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhereRelation($relation, $column, $operator = null, $value = null) - { - return $this->orWhereHas($relation, function ($query) use ($column, $operator, $value) { - if ($column instanceof Closure) { - $column($query); - } else { - $query->where($column, $operator, $value); - } - }); - } - - /** - * Add a basic count / exists condition to a relationship query. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function whereDoesntHaveRelation($relation, $column, $operator = null, $value = null) - { - return $this->whereDoesntHave($relation, function ($query) use ($column, $operator, $value) { - if ($column instanceof Closure) { - $column($query); - } else { - $query->where($column, $operator, $value); - } - }); - } - - /** - * Add an "or where" clause to a relationship query. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhereDoesntHaveRelation($relation, $column, $operator = null, $value = null) - { - return $this->orWhereDoesntHave($relation, function ($query) use ($column, $operator, $value) { - if ($column instanceof Closure) { - $column($query); - } else { - $query->where($column, $operator, $value); - } - }); - } - - /** - * Add a polymorphic relationship condition to the query with a where clause. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function whereMorphRelation($relation, $types, $column, $operator = null, $value = null) - { - return $this->whereHasMorph($relation, $types, function ($query) use ($column, $operator, $value) { - $query->where($column, $operator, $value); - }); - } - - /** - * Add a polymorphic relationship condition to the query with an "or where" clause. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhereMorphRelation($relation, $types, $column, $operator = null, $value = null) - { - return $this->orWhereHasMorph($relation, $types, function ($query) use ($column, $operator, $value) { - $query->where($column, $operator, $value); - }); - } - - /** - * Add a polymorphic relationship condition to the query with a doesn't have clause. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function whereMorphDoesntHaveRelation($relation, $types, $column, $operator = null, $value = null) - { - return $this->whereDoesntHaveMorph($relation, $types, function ($query) use ($column, $operator, $value) { - $query->where($column, $operator, $value); - }); - } - - /** - * Add a polymorphic relationship condition to the query with an "or doesn't have" clause. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhereMorphDoesntHaveRelation($relation, $types, $column, $operator = null, $value = null) - { - return $this->orWhereDoesntHaveMorph($relation, $types, function ($query) use ($column, $operator, $value) { - $query->where($column, $operator, $value); - }); - } - - /** - * Add a morph-to relationship condition to the query. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation - * @param \Illuminate\Database\Eloquent\Model|iterable|string|null $model - * @return $this - */ - public function whereMorphedTo($relation, $model, $boolean = 'and') - { - if (is_string($relation)) { - $relation = $this->getRelationWithoutConstraints($relation); - } - - if (is_null($model)) { - return $this->whereNull($relation->qualifyColumn($relation->getMorphType()), $boolean); - } - - if (is_string($model)) { - $morphMap = Relation::morphMap(); - - if (! empty($morphMap) && in_array($model, $morphMap)) { - $model = array_search($model, $morphMap, true); - } - - return $this->where($relation->qualifyColumn($relation->getMorphType()), $model, null, $boolean); - } - - $models = BaseCollection::wrap($model); - - if ($models->isEmpty()) { - throw new InvalidArgumentException('Collection given to whereMorphedTo method may not be empty.'); - } - - return $this->where(function ($query) use ($relation, $models) { - $models->groupBy(fn ($model) => $model->getMorphClass())->each(function ($models) use ($query, $relation) { - $query->orWhere(function ($query) use ($relation, $models) { - $query->where($relation->qualifyColumn($relation->getMorphType()), $models->first()->getMorphClass()) - ->whereIn($relation->qualifyColumn($relation->getForeignKeyName()), $models->map->getKey()); - }); - }); - }, null, null, $boolean); - } - - /** - * Add a not morph-to relationship condition to the query. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation - * @param \Illuminate\Database\Eloquent\Model|iterable|string $model - * @return $this - */ - public function whereNotMorphedTo($relation, $model, $boolean = 'and') - { - if (is_string($relation)) { - $relation = $this->getRelationWithoutConstraints($relation); - } - - if (is_string($model)) { - $morphMap = Relation::morphMap(); - - if (! empty($morphMap) && in_array($model, $morphMap)) { - $model = array_search($model, $morphMap, true); - } - - return $this->whereNot($relation->qualifyColumn($relation->getMorphType()), '<=>', $model, $boolean); - } - - $models = BaseCollection::wrap($model); - - if ($models->isEmpty()) { - throw new InvalidArgumentException('Collection given to whereNotMorphedTo method may not be empty.'); - } - - return $this->whereNot(function ($query) use ($relation, $models) { - $models->groupBy(fn ($model) => $model->getMorphClass())->each(function ($models) use ($query, $relation) { - $query->orWhere(function ($query) use ($relation, $models) { - $query->where($relation->qualifyColumn($relation->getMorphType()), '<=>', $models->first()->getMorphClass()) - ->whereNotIn($relation->qualifyColumn($relation->getForeignKeyName()), $models->map->getKey()); - }); - }); - }, null, null, $boolean); - } - - /** - * Add a morph-to relationship condition to the query with an "or where" clause. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation - * @param \Illuminate\Database\Eloquent\Model|iterable|string|null $model - * @return $this - */ - public function orWhereMorphedTo($relation, $model) - { - return $this->whereMorphedTo($relation, $model, 'or'); - } - - /** - * Add a not morph-to relationship condition to the query with an "or where" clause. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo<*, *>|string $relation - * @param \Illuminate\Database\Eloquent\Model|iterable|string $model - * @return $this - */ - public function orWhereNotMorphedTo($relation, $model) - { - return $this->whereNotMorphedTo($relation, $model, 'or'); - } - - /** - * Add a "belongs to" relationship where clause to the query. - * - * @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection $related - * @param string|null $relationshipName - * @param string $boolean - * @return $this - * - * @throws \Illuminate\Database\Eloquent\RelationNotFoundException - */ - public function whereBelongsTo($related, $relationshipName = null, $boolean = 'and') - { - if (! $related instanceof EloquentCollection) { - $relatedCollection = $related->newCollection([$related]); - } else { - $relatedCollection = $related; - - $related = $relatedCollection->first(); - } - - if ($relatedCollection->isEmpty()) { - throw new InvalidArgumentException('Collection given to whereBelongsTo method may not be empty.'); - } - - if ($relationshipName === null) { - $relationshipName = Str::camel(class_basename($related)); - } - - try { - $relationship = $this->model->{$relationshipName}(); - } catch (BadMethodCallException) { - throw RelationNotFoundException::make($this->model, $relationshipName); - } - - if (! $relationship instanceof BelongsTo) { - throw RelationNotFoundException::make($this->model, $relationshipName, BelongsTo::class); - } - - $this->whereIn( - $relationship->getQualifiedForeignKeyName(), - $relatedCollection->pluck($relationship->getOwnerKeyName())->toArray(), - $boolean, - ); - - return $this; - } - - /** - * Add a "BelongsTo" relationship with an "or where" clause to the query. - * - * @param \Illuminate\Database\Eloquent\Model $related - * @param string|null $relationshipName - * @return $this - * - * @throws \RuntimeException - */ - public function orWhereBelongsTo($related, $relationshipName = null) - { - return $this->whereBelongsTo($related, $relationshipName, 'or'); - } - - /** - * Add subselect queries to include an aggregate value for a relationship. - * - * @param mixed $relations - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $function - * @return $this - */ - public function withAggregate($relations, $column, $function = null) - { - if (empty($relations)) { - return $this; - } - - if (is_null($this->query->columns)) { - $this->query->select([$this->query->from.'.*']); - } - - $relations = is_array($relations) ? $relations : [$relations]; - - foreach ($this->parseWithRelations($relations) as $name => $constraints) { - // First we will determine if the name has been aliased using an "as" clause on the name - // and if it has we will extract the actual relationship name and the desired name of - // the resulting column. This allows multiple aggregates on the same relationships. - $segments = explode(' ', $name); - - unset($alias); - - if (count($segments) === 3 && Str::lower($segments[1]) === 'as') { - [$name, $alias] = [$segments[0], $segments[2]]; - } - - $relation = $this->getRelationWithoutConstraints($name); - - if ($function) { - if ($this->getQuery()->getGrammar()->isExpression($column)) { - $aggregateColumn = $this->getQuery()->getGrammar()->getValue($column); - } else { - $hashedColumn = $this->getRelationHashedColumn($column, $relation); - - $aggregateColumn = $this->getQuery()->getGrammar()->wrap( - $column === '*' ? $column : $relation->getRelated()->qualifyColumn($hashedColumn) - ); - } - - $expression = $function === 'exists' ? $aggregateColumn : sprintf('%s(%s)', $function, $aggregateColumn); - } else { - $expression = $this->getQuery()->getGrammar()->getValue($column); - } - - // Here, we will grab the relationship sub-query and prepare to add it to the main query - // as a sub-select. First, we'll get the "has" query and use that to get the relation - // sub-query. We'll format this relationship name and append this column if needed. - $query = $relation->getRelationExistenceQuery( - $relation->getRelated()->newQuery(), $this, new Expression($expression) - )->setBindings([], 'select'); - - $query->callScope($constraints); - - $query = $query->mergeConstraintsFrom($relation->getQuery())->toBase(); - - // If the query contains certain elements like orderings / more than one column selected - // then we will remove those elements from the query so that it will execute properly - // when given to the database. Otherwise, we may receive SQL errors or poor syntax. - $query->orders = null; - $query->setBindings([], 'order'); - - if (count($query->columns) > 1) { - $query->columns = [$query->columns[0]]; - $query->bindings['select'] = []; - } - - // Finally, we will make the proper column alias to the query and run this sub-select on - // the query builder. Then, we will return the builder instance back to the developer - // for further constraint chaining that needs to take place on the query as needed. - $alias ??= Str::snake( - preg_replace('/[^[:alnum:][:space:]_]/u', '', "$name $function {$this->getQuery()->getGrammar()->getValue($column)}") - ); - - if ($function === 'exists') { - $this->selectRaw( - sprintf('exists(%s) as %s', $query->toSql(), $this->getQuery()->grammar->wrap($alias)), - $query->getBindings() - )->withCasts([$alias => 'bool']); - } else { - $this->selectSub( - $function ? $query : $query->limit(1), - $alias - ); - } - } - - return $this; - } - - /** - * Get the relation hashed column name for the given column and relation. - * - * @param string $column - * @param \Illuminate\Database\Eloquent\Relations\Relation<*, *, *> $relation - * @return string - */ - protected function getRelationHashedColumn($column, $relation) - { - if (str_contains($column, '.')) { - return $column; - } - - return $this->getQuery()->from === $relation->getQuery()->getQuery()->from - ? "{$relation->getRelationCountHash(false)}.$column" - : $column; - } - - /** - * Add subselect queries to count the relations. - * - * @param mixed $relations - * @return $this - */ - public function withCount($relations) - { - return $this->withAggregate(is_array($relations) ? $relations : func_get_args(), '*', 'count'); - } - - /** - * Add subselect queries to include the max of the relation's column. - * - * @param string|array $relation - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function withMax($relation, $column) - { - return $this->withAggregate($relation, $column, 'max'); - } - - /** - * Add subselect queries to include the min of the relation's column. - * - * @param string|array $relation - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function withMin($relation, $column) - { - return $this->withAggregate($relation, $column, 'min'); - } - - /** - * Add subselect queries to include the sum of the relation's column. - * - * @param string|array $relation - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function withSum($relation, $column) - { - return $this->withAggregate($relation, $column, 'sum'); - } - - /** - * Add subselect queries to include the average of the relation's column. - * - * @param string|array $relation - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function withAvg($relation, $column) - { - return $this->withAggregate($relation, $column, 'avg'); - } - - /** - * Add subselect queries to include the existence of related models. - * - * @param string|array $relation - * @return $this - */ - public function withExists($relation) - { - return $this->withAggregate($relation, '*', 'exists'); - } - - /** - * Add the "has" condition where clause to the query. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $hasQuery - * @param \Illuminate\Database\Eloquent\Relations\Relation<*, *, *> $relation - * @param string $operator - * @param int $count - * @param string $boolean - * @return $this - */ - protected function addHasWhere(Builder $hasQuery, Relation $relation, $operator, $count, $boolean) - { - $hasQuery->mergeConstraintsFrom($relation->getQuery()); - - return $this->canUseExistsForExistenceCheck($operator, $count) - ? $this->addWhereExistsQuery($hasQuery->toBase(), $boolean, $operator === '<' && $count === 1) - : $this->addWhereCountQuery($hasQuery->toBase(), $operator, $count, $boolean); - } - - /** - * Merge the where constraints from another query to the current query. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $from - * @return $this - */ - public function mergeConstraintsFrom(Builder $from) - { - $whereBindings = $from->getQuery()->getRawBindings()['where'] ?? []; - - $wheres = $from->getQuery()->from !== $this->getQuery()->from - ? $this->requalifyWhereTables( - $from->getQuery()->wheres, - $from->getQuery()->grammar->getValue($from->getQuery()->from), - $this->getModel()->getTable() - ) : $from->getQuery()->wheres; - - // Here we have some other query that we want to merge the where constraints from. We will - // copy over any where constraints on the query as well as remove any global scopes the - // query might have removed. Then we will return ourselves with the finished merging. - return $this->withoutGlobalScopes( - $from->removedScopes() - )->mergeWheres( - $wheres, $whereBindings - ); - } - - /** - * Updates the table name for any columns with a new qualified name. - * - * @param array $wheres - * @param string $from - * @param string $to - * @return array - */ - protected function requalifyWhereTables(array $wheres, string $from, string $to): array - { - return (new BaseCollection($wheres))->map(function ($where) use ($from, $to) { - return (new BaseCollection($where))->map(function ($value) use ($from, $to) { - return is_string($value) && str_starts_with($value, $from.'.') - ? $to.'.'.Str::afterLast($value, '.') - : $value; - }); - })->toArray(); - } - - /** - * Add a sub-query count clause to this query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $operator - * @param int $count - * @param string $boolean - * @return $this - */ - protected function addWhereCountQuery(QueryBuilder $query, $operator = '>=', $count = 1, $boolean = 'and') - { - $this->query->addBinding($query->getBindings(), 'where'); - - return $this->where( - new Expression('('.$query->toSql().')'), - $operator, - is_numeric($count) ? new Expression($count) : $count, - $boolean - ); - } - - /** - * Get the "has relation" base query instance. - * - * @param string $relation - * @return \Illuminate\Database\Eloquent\Relations\Relation<*, *, *> - */ - protected function getRelationWithoutConstraints($relation) - { - return Relation::noConstraints(function () use ($relation) { - return $this->getModel()->{$relation}(); - }); - } - - /** - * Check if we can run an "exists" query to optimize performance. - * - * @param string $operator - * @param int $count - * @return bool - */ - protected function canUseExistsForExistenceCheck($operator, $count) - { - return ($operator === '>=' || $operator === '<') && $count === 1; - } -} diff --git a/vendor/illuminate/database/Eloquent/Factories/BelongsToManyRelationship.php b/vendor/illuminate/database/Eloquent/Factories/BelongsToManyRelationship.php deleted file mode 100644 index 8e40261..0000000 --- a/vendor/illuminate/database/Eloquent/Factories/BelongsToManyRelationship.php +++ /dev/null @@ -1,76 +0,0 @@ -factory = $factory; - $this->pivot = $pivot; - $this->relationship = $relationship; - } - - /** - * Create the attached relationship for the given model. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return void - */ - public function createFor(Model $model) - { - Collection::wrap($this->factory instanceof Factory ? $this->factory->create([], $model) : $this->factory)->each(function ($attachable) use ($model) { - $model->{$this->relationship}()->attach( - $attachable, - is_callable($this->pivot) ? call_user_func($this->pivot, $model) : $this->pivot - ); - }); - } - - /** - * Specify the model instances to always use when creating relationships. - * - * @param \Illuminate\Support\Collection $recycle - * @return $this - */ - public function recycle($recycle) - { - if ($this->factory instanceof Factory) { - $this->factory = $this->factory->recycle($recycle); - } - - return $this; - } -} diff --git a/vendor/illuminate/database/Eloquent/Factories/BelongsToRelationship.php b/vendor/illuminate/database/Eloquent/Factories/BelongsToRelationship.php deleted file mode 100644 index b2fb1b2..0000000 --- a/vendor/illuminate/database/Eloquent/Factories/BelongsToRelationship.php +++ /dev/null @@ -1,97 +0,0 @@ -factory = $factory; - $this->relationship = $relationship; - } - - /** - * Get the parent model attributes and resolvers for the given child model. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return array - */ - public function attributesFor(Model $model) - { - $relationship = $model->{$this->relationship}(); - - return $relationship instanceof MorphTo ? [ - $relationship->getMorphType() => $this->factory instanceof Factory ? $this->factory->newModel()->getMorphClass() : $this->factory->getMorphClass(), - $relationship->getForeignKeyName() => $this->resolver($relationship->getOwnerKeyName()), - ] : [ - $relationship->getForeignKeyName() => $this->resolver($relationship->getOwnerKeyName()), - ]; - } - - /** - * Get the deferred resolver for this relationship's parent ID. - * - * @param string|null $key - * @return \Closure - */ - protected function resolver($key) - { - return function () use ($key) { - if (! $this->resolved) { - $instance = $this->factory instanceof Factory - ? ($this->factory->getRandomRecycledModel($this->factory->modelName()) ?? $this->factory->create()) - : $this->factory; - - return $this->resolved = $key ? $instance->{$key} : $instance->getKey(); - } - - return $this->resolved; - }; - } - - /** - * Specify the model instances to always use when creating relationships. - * - * @param \Illuminate\Support\Collection $recycle - * @return $this - */ - public function recycle($recycle) - { - if ($this->factory instanceof Factory) { - $this->factory = $this->factory->recycle($recycle); - } - - return $this; - } -} diff --git a/vendor/illuminate/database/Eloquent/Factories/CrossJoinSequence.php b/vendor/illuminate/database/Eloquent/Factories/CrossJoinSequence.php deleted file mode 100644 index 3270b30..0000000 --- a/vendor/illuminate/database/Eloquent/Factories/CrossJoinSequence.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - protected $model; - - /** - * The number of models that should be generated. - * - * @var int|null - */ - protected $count; - - /** - * The state transformations that will be applied to the model. - * - * @var \Illuminate\Support\Collection - */ - protected $states; - - /** - * The parent relationships that will be applied to the model. - * - * @var \Illuminate\Support\Collection - */ - protected $has; - - /** - * The child relationships that will be applied to the model. - * - * @var \Illuminate\Support\Collection - */ - protected $for; - - /** - * The model instances to always use when creating relationships. - * - * @var \Illuminate\Support\Collection - */ - protected $recycle; - - /** - * The "after making" callbacks that will be applied to the model. - * - * @var \Illuminate\Support\Collection - */ - protected $afterMaking; - - /** - * The "after creating" callbacks that will be applied to the model. - * - * @var \Illuminate\Support\Collection - */ - protected $afterCreating; - - /** - * Whether relationships should not be automatically created. - * - * @var bool - */ - protected $expandRelationships = true; - - /** - * The name of the database connection that will be used to create the models. - * - * @var string|null - */ - protected $connection; - - /** - * The current Faker instance. - * - * @var \Faker\Generator - */ - protected $faker; - - /** - * The default namespace where factories reside. - * - * @var string - */ - public static $namespace = 'Database\\Factories\\'; - - /** - * @deprecated use $modelNameResolvers - * - * @var callable(self): class-string - */ - protected static $modelNameResolver; - - /** - * The default model name resolvers. - * - * @var array> - */ - protected static $modelNameResolvers = []; - - /** - * The factory name resolver. - * - * @var callable - */ - protected static $factoryNameResolver; - - /** - * Create a new factory instance. - * - * @param int|null $count - * @param \Illuminate\Support\Collection|null $states - * @param \Illuminate\Support\Collection|null $has - * @param \Illuminate\Support\Collection|null $for - * @param \Illuminate\Support\Collection|null $afterMaking - * @param \Illuminate\Support\Collection|null $afterCreating - * @param string|null $connection - * @param \Illuminate\Support\Collection|null $recycle - * @param bool $expandRelationships - * @return void - */ - public function __construct( - $count = null, - ?Collection $states = null, - ?Collection $has = null, - ?Collection $for = null, - ?Collection $afterMaking = null, - ?Collection $afterCreating = null, - $connection = null, - ?Collection $recycle = null, - bool $expandRelationships = true - ) { - $this->count = $count; - $this->states = $states ?? new Collection; - $this->has = $has ?? new Collection; - $this->for = $for ?? new Collection; - $this->afterMaking = $afterMaking ?? new Collection; - $this->afterCreating = $afterCreating ?? new Collection; - $this->connection = $connection; - $this->recycle = $recycle ?? new Collection; - $this->faker = $this->withFaker(); - $this->expandRelationships = $expandRelationships; - } - - /** - * Define the model's default state. - * - * @return array - */ - abstract public function definition(); - - /** - * Get a new factory instance for the given attributes. - * - * @param (callable(array): array)|array $attributes - * @return static - */ - public static function new($attributes = []) - { - return (new static)->state($attributes)->configure(); - } - - /** - * Get a new factory instance for the given number of models. - * - * @param int $count - * @return static - */ - public static function times(int $count) - { - return static::new()->count($count); - } - - /** - * Configure the factory. - * - * @return static - */ - public function configure() - { - return $this; - } - - /** - * Get the raw attributes generated by the factory. - * - * @param (callable(array): array)|array $attributes - * @param \Illuminate\Database\Eloquent\Model|null $parent - * @return array - */ - public function raw($attributes = [], ?Model $parent = null) - { - if ($this->count === null) { - return $this->state($attributes)->getExpandedAttributes($parent); - } - - return array_map(function () use ($attributes, $parent) { - return $this->state($attributes)->getExpandedAttributes($parent); - }, range(1, $this->count)); - } - - /** - * Create a single model and persist it to the database. - * - * @param (callable(array): array)|array $attributes - * @return TModel - */ - public function createOne($attributes = []) - { - return $this->count(null)->create($attributes); - } - - /** - * Create a single model and persist it to the database without dispatching any model events. - * - * @param (callable(array): array)|array $attributes - * @return TModel - */ - public function createOneQuietly($attributes = []) - { - return $this->count(null)->createQuietly($attributes); - } - - /** - * Create a collection of models and persist them to the database. - * - * @param int|null|iterable> $records - * @return \Illuminate\Database\Eloquent\Collection - */ - public function createMany(int|iterable|null $records = null) - { - $records ??= ($this->count ?? 1); - - $this->count = null; - - if (is_numeric($records)) { - $records = array_fill(0, $records, []); - } - - return new EloquentCollection( - (new Collection($records))->map(function ($record) { - return $this->state($record)->create(); - }) - ); - } - - /** - * Create a collection of models and persist them to the database without dispatching any model events. - * - * @param int|null|iterable> $records - * @return \Illuminate\Database\Eloquent\Collection - */ - public function createManyQuietly(int|iterable|null $records = null) - { - return Model::withoutEvents(fn () => $this->createMany($records)); - } - - /** - * Create a collection of models and persist them to the database. - * - * @param (callable(array): array)|array $attributes - * @param \Illuminate\Database\Eloquent\Model|null $parent - * @return \Illuminate\Database\Eloquent\Collection|TModel - */ - public function create($attributes = [], ?Model $parent = null) - { - if (! empty($attributes)) { - return $this->state($attributes)->create([], $parent); - } - - $results = $this->make($attributes, $parent); - - if ($results instanceof Model) { - $this->store(new Collection([$results])); - - $this->callAfterCreating(new Collection([$results]), $parent); - } else { - $this->store($results); - - $this->callAfterCreating($results, $parent); - } - - return $results; - } - - /** - * Create a collection of models and persist them to the database without dispatching any model events. - * - * @param (callable(array): array)|array $attributes - * @param \Illuminate\Database\Eloquent\Model|null $parent - * @return \Illuminate\Database\Eloquent\Collection|TModel - */ - public function createQuietly($attributes = [], ?Model $parent = null) - { - return Model::withoutEvents(fn () => $this->create($attributes, $parent)); - } - - /** - * Create a callback that persists a model in the database when invoked. - * - * @param array $attributes - * @param \Illuminate\Database\Eloquent\Model|null $parent - * @return \Closure(): (\Illuminate\Database\Eloquent\Collection|TModel) - */ - public function lazy(array $attributes = [], ?Model $parent = null) - { - return fn () => $this->create($attributes, $parent); - } - - /** - * Set the connection name on the results and store them. - * - * @param \Illuminate\Support\Collection $results - * @return void - */ - protected function store(Collection $results) - { - $results->each(function ($model) { - if (! isset($this->connection)) { - $model->setConnection($model->newQueryWithoutScopes()->getConnection()->getName()); - } - - $model->save(); - - foreach ($model->getRelations() as $name => $items) { - if ($items instanceof Enumerable && $items->isEmpty()) { - $model->unsetRelation($name); - } - } - - $this->createChildren($model); - }); - } - - /** - * Create the children for the given model. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return void - */ - protected function createChildren(Model $model) - { - Model::unguarded(function () use ($model) { - $this->has->each(function ($has) use ($model) { - $has->recycle($this->recycle)->createFor($model); - }); - }); - } - - /** - * Make a single instance of the model. - * - * @param (callable(array): array)|array $attributes - * @return TModel - */ - public function makeOne($attributes = []) - { - return $this->count(null)->make($attributes); - } - - /** - * Create a collection of models. - * - * @param (callable(array): array)|array $attributes - * @param \Illuminate\Database\Eloquent\Model|null $parent - * @return \Illuminate\Database\Eloquent\Collection|TModel - */ - public function make($attributes = [], ?Model $parent = null) - { - if (! empty($attributes)) { - return $this->state($attributes)->make([], $parent); - } - - if ($this->count === null) { - return tap($this->makeInstance($parent), function ($instance) { - $this->callAfterMaking(new Collection([$instance])); - }); - } - - if ($this->count < 1) { - return $this->newModel()->newCollection(); - } - - $instances = $this->newModel()->newCollection(array_map(function () use ($parent) { - return $this->makeInstance($parent); - }, range(1, $this->count))); - - $this->callAfterMaking($instances); - - return $instances; - } - - /** - * Make an instance of the model with the given attributes. - * - * @param \Illuminate\Database\Eloquent\Model|null $parent - * @return \Illuminate\Database\Eloquent\Model - */ - protected function makeInstance(?Model $parent) - { - return Model::unguarded(function () use ($parent) { - return tap($this->newModel($this->getExpandedAttributes($parent)), function ($instance) { - if (isset($this->connection)) { - $instance->setConnection($this->connection); - } - }); - }); - } - - /** - * Get a raw attributes array for the model. - * - * @param \Illuminate\Database\Eloquent\Model|null $parent - * @return mixed - */ - protected function getExpandedAttributes(?Model $parent) - { - return $this->expandAttributes($this->getRawAttributes($parent)); - } - - /** - * Get the raw attributes for the model as an array. - * - * @param \Illuminate\Database\Eloquent\Model|null $parent - * @return array - */ - protected function getRawAttributes(?Model $parent) - { - return $this->states->pipe(function ($states) { - return $this->for->isEmpty() ? $states : new Collection(array_merge([function () { - return $this->parentResolvers(); - }], $states->all())); - })->reduce(function ($carry, $state) use ($parent) { - if ($state instanceof Closure) { - $state = $state->bindTo($this); - } - - return array_merge($carry, $state($carry, $parent)); - }, $this->definition()); - } - - /** - * Create the parent relationship resolvers (as deferred Closures). - * - * @return array - */ - protected function parentResolvers() - { - return $this->for - ->map(fn (BelongsToRelationship $for) => $for->recycle($this->recycle)->attributesFor($this->newModel())) - ->collapse() - ->all(); - } - - /** - * Expand all attributes to their underlying values. - * - * @param array $definition - * @return array - */ - protected function expandAttributes(array $definition) - { - return (new Collection($definition)) - ->map($evaluateRelations = function ($attribute) { - if (! $this->expandRelationships && $attribute instanceof self) { - $attribute = null; - } elseif ($attribute instanceof self) { - $attribute = $this->getRandomRecycledModel($attribute->modelName())?->getKey() - ?? $attribute->recycle($this->recycle)->create()->getKey(); - } elseif ($attribute instanceof Model) { - $attribute = $attribute->getKey(); - } - - return $attribute; - }) - ->map(function ($attribute, $key) use (&$definition, $evaluateRelations) { - if (is_callable($attribute) && ! is_string($attribute) && ! is_array($attribute)) { - $attribute = $attribute($definition); - } - - $attribute = $evaluateRelations($attribute); - - $definition[$key] = $attribute; - - return $attribute; - }) - ->all(); - } - - /** - * Add a new state transformation to the model definition. - * - * @param (callable(array, TModel|null): array)|array $state - * @return static - */ - public function state($state) - { - return $this->newInstance([ - 'states' => $this->states->concat([ - is_callable($state) ? $state : fn () => $state, - ]), - ]); - } - - /** - * Set a single model attribute. - * - * @param string|int $key - * @param mixed $value - * @return static - */ - public function set($key, $value) - { - return $this->state([$key => $value]); - } - - /** - * Add a new sequenced state transformation to the model definition. - * - * @param mixed ...$sequence - * @return static - */ - public function sequence(...$sequence) - { - return $this->state(new Sequence(...$sequence)); - } - - /** - * Add a new sequenced state transformation to the model definition and update the pending creation count to the size of the sequence. - * - * @param array ...$sequence - * @return static - */ - public function forEachSequence(...$sequence) - { - return $this->state(new Sequence(...$sequence))->count(count($sequence)); - } - - /** - * Add a new cross joined sequenced state transformation to the model definition. - * - * @param array ...$sequence - * @return static - */ - public function crossJoinSequence(...$sequence) - { - return $this->state(new CrossJoinSequence(...$sequence)); - } - - /** - * Define a child relationship for the model. - * - * @param \Illuminate\Database\Eloquent\Factories\Factory $factory - * @param string|null $relationship - * @return static - */ - public function has(self $factory, $relationship = null) - { - return $this->newInstance([ - 'has' => $this->has->concat([new Relationship( - $factory, $relationship ?? $this->guessRelationship($factory->modelName()) - )]), - ]); - } - - /** - * Attempt to guess the relationship name for a "has" relationship. - * - * @param string $related - * @return string - */ - protected function guessRelationship(string $related) - { - $guess = Str::camel(Str::plural(class_basename($related))); - - return method_exists($this->modelName(), $guess) ? $guess : Str::singular($guess); - } - - /** - * Define an attached relationship for the model. - * - * @param \Illuminate\Database\Eloquent\Factories\Factory|\Illuminate\Support\Collection|\Illuminate\Database\Eloquent\Model|array $factory - * @param (callable(): array)|array $pivot - * @param string|null $relationship - * @return static - */ - public function hasAttached($factory, $pivot = [], $relationship = null) - { - return $this->newInstance([ - 'has' => $this->has->concat([new BelongsToManyRelationship( - $factory, - $pivot, - $relationship ?? Str::camel(Str::plural(class_basename( - $factory instanceof Factory - ? $factory->modelName() - : Collection::wrap($factory)->first() - ))) - )]), - ]); - } - - /** - * Define a parent relationship for the model. - * - * @param \Illuminate\Database\Eloquent\Factories\Factory|\Illuminate\Database\Eloquent\Model $factory - * @param string|null $relationship - * @return static - */ - public function for($factory, $relationship = null) - { - return $this->newInstance(['for' => $this->for->concat([new BelongsToRelationship( - $factory, - $relationship ?? Str::camel(class_basename( - $factory instanceof Factory ? $factory->modelName() : $factory - )) - )])]); - } - - /** - * Provide model instances to use instead of any nested factory calls when creating relationships. - * - * @param \Illuminate\Database\Eloquent\Model|\Illuminate\Support\Collection|array $model - * @return static - */ - public function recycle($model) - { - // Group provided models by the type and merge them into existing recycle collection - return $this->newInstance([ - 'recycle' => $this->recycle - ->flatten() - ->merge( - Collection::wrap($model instanceof Model ? func_get_args() : $model) - ->flatten() - )->groupBy(fn ($model) => get_class($model)), - ]); - } - - /** - * Retrieve a random model of a given type from previously provided models to recycle. - * - * @template TClass of \Illuminate\Database\Eloquent\Model - * - * @param class-string $modelClassName - * @return TClass|null - */ - public function getRandomRecycledModel($modelClassName) - { - return $this->recycle->get($modelClassName)?->random(); - } - - /** - * Add a new "after making" callback to the model definition. - * - * @param \Closure(TModel): mixed $callback - * @return static - */ - public function afterMaking(Closure $callback) - { - return $this->newInstance(['afterMaking' => $this->afterMaking->concat([$callback])]); - } - - /** - * Add a new "after creating" callback to the model definition. - * - * @param \Closure(TModel, \Illuminate\Database\Eloquent\Model|null): mixed $callback - * @return static - */ - public function afterCreating(Closure $callback) - { - return $this->newInstance(['afterCreating' => $this->afterCreating->concat([$callback])]); - } - - /** - * Call the "after making" callbacks for the given model instances. - * - * @param \Illuminate\Support\Collection $instances - * @return void - */ - protected function callAfterMaking(Collection $instances) - { - $instances->each(function ($model) { - $this->afterMaking->each(function ($callback) use ($model) { - $callback($model); - }); - }); - } - - /** - * Call the "after creating" callbacks for the given model instances. - * - * @param \Illuminate\Support\Collection $instances - * @param \Illuminate\Database\Eloquent\Model|null $parent - * @return void - */ - protected function callAfterCreating(Collection $instances, ?Model $parent = null) - { - $instances->each(function ($model) use ($parent) { - $this->afterCreating->each(function ($callback) use ($model, $parent) { - $callback($model, $parent); - }); - }); - } - - /** - * Specify how many models should be generated. - * - * @param int|null $count - * @return static - */ - public function count(?int $count) - { - return $this->newInstance(['count' => $count]); - } - - /** - * Indicate that related parent models should not be created. - * - * @return static - */ - public function withoutParents() - { - return $this->newInstance(['expandRelationships' => false]); - } - - /** - * Get the name of the database connection that is used to generate models. - * - * @return string - */ - public function getConnectionName() - { - return $this->connection; - } - - /** - * Specify the database connection that should be used to generate models. - * - * @param string $connection - * @return static - */ - public function connection(string $connection) - { - return $this->newInstance(['connection' => $connection]); - } - - /** - * Create a new instance of the factory builder with the given mutated properties. - * - * @param array $arguments - * @return static - */ - protected function newInstance(array $arguments = []) - { - return new static(...array_values(array_merge([ - 'count' => $this->count, - 'states' => $this->states, - 'has' => $this->has, - 'for' => $this->for, - 'afterMaking' => $this->afterMaking, - 'afterCreating' => $this->afterCreating, - 'connection' => $this->connection, - 'recycle' => $this->recycle, - 'expandRelationships' => $this->expandRelationships, - ], $arguments))); - } - - /** - * Get a new model instance. - * - * @param array $attributes - * @return TModel - */ - public function newModel(array $attributes = []) - { - $model = $this->modelName(); - - return new $model($attributes); - } - - /** - * Get the name of the model that is generated by the factory. - * - * @return class-string - */ - public function modelName() - { - if ($this->model !== null) { - return $this->model; - } - - $resolver = static::$modelNameResolvers[static::class] ?? static::$modelNameResolvers[self::class] ?? static::$modelNameResolver ?? function (self $factory) { - $namespacedFactoryBasename = Str::replaceLast( - 'Factory', '', Str::replaceFirst(static::$namespace, '', $factory::class) - ); - - $factoryBasename = Str::replaceLast('Factory', '', class_basename($factory)); - - $appNamespace = static::appNamespace(); - - return class_exists($appNamespace.'Models\\'.$namespacedFactoryBasename) - ? $appNamespace.'Models\\'.$namespacedFactoryBasename - : $appNamespace.$factoryBasename; - }; - - return $resolver($this); - } - - /** - * Specify the callback that should be invoked to guess model names based on factory names. - * - * @param callable(self): class-string $callback - * @return void - */ - public static function guessModelNamesUsing(callable $callback) - { - static::$modelNameResolvers[static::class] = $callback; - } - - /** - * Specify the default namespace that contains the application's model factories. - * - * @param string $namespace - * @return void - */ - public static function useNamespace(string $namespace) - { - static::$namespace = $namespace; - } - - /** - * Get a new factory instance for the given model name. - * - * @template TClass of \Illuminate\Database\Eloquent\Model - * - * @param class-string $modelName - * @return \Illuminate\Database\Eloquent\Factories\Factory - */ - public static function factoryForModel(string $modelName) - { - $factory = static::resolveFactoryName($modelName); - - return $factory::new(); - } - - /** - * Specify the callback that should be invoked to guess factory names based on dynamic relationship names. - * - * @param callable(class-string<\Illuminate\Database\Eloquent\Model>): class-string<\Illuminate\Database\Eloquent\Factories\Factory> $callback - * @return void - */ - public static function guessFactoryNamesUsing(callable $callback) - { - static::$factoryNameResolver = $callback; - } - - /** - * Get a new Faker instance. - * - * @return \Faker\Generator - */ - protected function withFaker() - { - return Container::getInstance()->make(Generator::class); - } - - /** - * Get the factory name for the given model name. - * - * @template TClass of \Illuminate\Database\Eloquent\Model - * - * @param class-string $modelName - * @return class-string<\Illuminate\Database\Eloquent\Factories\Factory> - */ - public static function resolveFactoryName(string $modelName) - { - $resolver = static::$factoryNameResolver ?? function (string $modelName) { - $appNamespace = static::appNamespace(); - - $modelName = Str::startsWith($modelName, $appNamespace.'Models\\') - ? Str::after($modelName, $appNamespace.'Models\\') - : Str::after($modelName, $appNamespace); - - return static::$namespace.$modelName.'Factory'; - }; - - return $resolver($modelName); - } - - /** - * Get the application namespace for the application. - * - * @return string - */ - protected static function appNamespace() - { - try { - return Container::getInstance() - ->make(Application::class) - ->getNamespace(); - } catch (Throwable) { - return 'App\\'; - } - } - - /** - * Flush the factory's global state. - * - * @return void - */ - public static function flushState() - { - static::$modelNameResolver = null; - static::$modelNameResolvers = []; - static::$factoryNameResolver = null; - static::$namespace = 'Database\\Factories\\'; - } - - /** - * Proxy dynamic factory methods onto their proper methods. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - if (static::hasMacro($method)) { - return $this->macroCall($method, $parameters); - } - - if ($method === 'trashed' && in_array(SoftDeletes::class, class_uses_recursive($this->modelName()))) { - return $this->state([ - $this->newModel()->getDeletedAtColumn() => $parameters[0] ?? Carbon::now()->subDay(), - ]); - } - - if (! Str::startsWith($method, ['for', 'has'])) { - static::throwBadMethodCallException($method); - } - - $relationship = Str::camel(Str::substr($method, 3)); - - $relatedModel = get_class($this->newModel()->{$relationship}()->getRelated()); - - if (method_exists($relatedModel, 'newFactory')) { - $factory = $relatedModel::newFactory() ?? static::factoryForModel($relatedModel); - } else { - $factory = static::factoryForModel($relatedModel); - } - - if (str_starts_with($method, 'for')) { - return $this->for($factory->state($parameters[0] ?? []), $relationship); - } elseif (str_starts_with($method, 'has')) { - return $this->has( - $factory - ->count(is_numeric($parameters[0] ?? null) ? $parameters[0] : 1) - ->state((is_callable($parameters[0] ?? null) || is_array($parameters[0] ?? null)) ? $parameters[0] : ($parameters[1] ?? [])), - $relationship - ); - } - } -} diff --git a/vendor/illuminate/database/Eloquent/Factories/HasFactory.php b/vendor/illuminate/database/Eloquent/Factories/HasFactory.php deleted file mode 100644 index ca37657..0000000 --- a/vendor/illuminate/database/Eloquent/Factories/HasFactory.php +++ /dev/null @@ -1,62 +0,0 @@ -, static|null): array)|array|int|null $count - * @param (callable(array, static|null): array)|array $state - * @return TFactory - */ - public static function factory($count = null, $state = []) - { - $factory = static::newFactory() ?? Factory::factoryForModel(static::class); - - return $factory - ->count(is_numeric($count) ? $count : null) - ->state(is_callable($count) || is_array($count) ? $count : $state); - } - - /** - * Create a new factory instance for the model. - * - * @return TFactory|null - */ - protected static function newFactory() - { - if (isset(static::$factory)) { - return static::$factory::new(); - } - - return static::getUseFactoryAttribute() ?? null; - } - - /** - * Get the factory from the UseFactory class attribute. - * - * @return TFactory|null - */ - protected static function getUseFactoryAttribute() - { - $attributes = (new \ReflectionClass(static::class)) - ->getAttributes(UseFactory::class); - - if ($attributes !== []) { - $useFactory = $attributes[0]->newInstance(); - - $factory = new $useFactory->factoryClass; - - $factory->guessModelNamesUsing(fn () => static::class); - - return $factory; - } - } -} diff --git a/vendor/illuminate/database/Eloquent/Factories/Relationship.php b/vendor/illuminate/database/Eloquent/Factories/Relationship.php deleted file mode 100644 index 3eb62da..0000000 --- a/vendor/illuminate/database/Eloquent/Factories/Relationship.php +++ /dev/null @@ -1,75 +0,0 @@ -factory = $factory; - $this->relationship = $relationship; - } - - /** - * Create the child relationship for the given parent model. - * - * @param \Illuminate\Database\Eloquent\Model $parent - * @return void - */ - public function createFor(Model $parent) - { - $relationship = $parent->{$this->relationship}(); - - if ($relationship instanceof MorphOneOrMany) { - $this->factory->state([ - $relationship->getMorphType() => $relationship->getMorphClass(), - $relationship->getForeignKeyName() => $relationship->getParentKey(), - ])->create([], $parent); - } elseif ($relationship instanceof HasOneOrMany) { - $this->factory->state([ - $relationship->getForeignKeyName() => $relationship->getParentKey(), - ])->create([], $parent); - } elseif ($relationship instanceof BelongsToMany) { - $relationship->attach($this->factory->create([], $parent)); - } - } - - /** - * Specify the model instances to always use when creating relationships. - * - * @param \Illuminate\Support\Collection $recycle - * @return $this - */ - public function recycle($recycle) - { - $this->factory = $this->factory->recycle($recycle); - - return $this; - } -} diff --git a/vendor/illuminate/database/Eloquent/Factories/Sequence.php b/vendor/illuminate/database/Eloquent/Factories/Sequence.php deleted file mode 100644 index e523fb3..0000000 --- a/vendor/illuminate/database/Eloquent/Factories/Sequence.php +++ /dev/null @@ -1,63 +0,0 @@ -sequence = $sequence; - $this->count = count($sequence); - } - - /** - * Get the current count of the sequence items. - * - * @return int - */ - public function count(): int - { - return $this->count; - } - - /** - * Get the next value in the sequence. - * - * @return mixed - */ - public function __invoke() - { - return tap(value($this->sequence[$this->index % $this->count], $this), function () { - $this->index = $this->index + 1; - }); - } -} diff --git a/vendor/illuminate/database/Eloquent/HasBuilder.php b/vendor/illuminate/database/Eloquent/HasBuilder.php deleted file mode 100644 index 9431bb4..0000000 --- a/vendor/illuminate/database/Eloquent/HasBuilder.php +++ /dev/null @@ -1,124 +0,0 @@ -, class-string> - */ - protected static array $resolvedCollectionClasses = []; - - /** - * Create a new Eloquent Collection instance. - * - * @param array $models - * @return TCollection - */ - public function newCollection(array $models = []) - { - static::$resolvedCollectionClasses[static::class] ??= ($this->resolveCollectionFromAttribute() ?? static::$collectionClass); - - return new static::$resolvedCollectionClasses[static::class]($models); - } - - /** - * Resolve the collection class name from the CollectedBy attribute. - * - * @return class-string|null - */ - public function resolveCollectionFromAttribute() - { - $reflectionClass = new ReflectionClass(static::class); - - $attributes = $reflectionClass->getAttributes(CollectedBy::class); - - if (! isset($attributes[0]) || ! isset($attributes[0]->getArguments()[0])) { - return; - } - - return $attributes[0]->getArguments()[0]; - } -} diff --git a/vendor/illuminate/database/Eloquent/HigherOrderBuilderProxy.php b/vendor/illuminate/database/Eloquent/HigherOrderBuilderProxy.php deleted file mode 100644 index 1c49ba2..0000000 --- a/vendor/illuminate/database/Eloquent/HigherOrderBuilderProxy.php +++ /dev/null @@ -1,50 +0,0 @@ - - */ - protected $builder; - - /** - * The method being proxied. - * - * @var string - */ - protected $method; - - /** - * Create a new proxy instance. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $builder - * @param string $method - * @return void - */ - public function __construct(Builder $builder, $method) - { - $this->method = $method; - $this->builder = $builder; - } - - /** - * Proxy a scope call onto the query builder. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->builder->{$this->method}(function ($value) use ($method, $parameters) { - return $value->{$method}(...$parameters); - }); - } -} diff --git a/vendor/illuminate/database/Eloquent/InvalidCastException.php b/vendor/illuminate/database/Eloquent/InvalidCastException.php deleted file mode 100644 index e90e9a7..0000000 --- a/vendor/illuminate/database/Eloquent/InvalidCastException.php +++ /dev/null @@ -1,48 +0,0 @@ -model = $class; - $this->column = $column; - $this->castType = $castType; - } -} diff --git a/vendor/illuminate/database/Eloquent/JsonEncodingException.php b/vendor/illuminate/database/Eloquent/JsonEncodingException.php deleted file mode 100644 index f62abd4..0000000 --- a/vendor/illuminate/database/Eloquent/JsonEncodingException.php +++ /dev/null @@ -1,49 +0,0 @@ -getKey().'] to JSON: '.$message); - } - - /** - * Create a new JSON encoding exception for the resource. - * - * @param \Illuminate\Http\Resources\Json\JsonResource $resource - * @param string $message - * @return static - */ - public static function forResource($resource, $message) - { - $model = $resource->resource; - - return new static('Error encoding resource ['.get_class($resource).'] with model ['.get_class($model).'] with ID ['.$model->getKey().'] to JSON: '.$message); - } - - /** - * Create a new JSON encoding exception for an attribute. - * - * @param mixed $model - * @param mixed $key - * @param string $message - * @return static - */ - public static function forAttribute($model, $key, $message) - { - $class = get_class($model); - - return new static("Unable to encode attribute [{$key}] for model [{$class}] to JSON: {$message}."); - } -} diff --git a/vendor/illuminate/database/Eloquent/MassAssignmentException.php b/vendor/illuminate/database/Eloquent/MassAssignmentException.php deleted file mode 100644 index 7c81aae..0000000 --- a/vendor/illuminate/database/Eloquent/MassAssignmentException.php +++ /dev/null @@ -1,10 +0,0 @@ -prunable(), function ($query) use ($chunkSize) { - $query->when(! $query->getQuery()->limit, function ($query) use ($chunkSize) { - $query->limit($chunkSize); - }); - }); - - $total = 0; - - do { - $total += $count = in_array(SoftDeletes::class, class_uses_recursive(get_class($this))) - ? $query->forceDelete() - : $query->delete(); - - if ($count > 0) { - event(new ModelsPruned(static::class, $total)); - } - } while ($count > 0); - - return $total; - } - - /** - * Get the prunable model query. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public function prunable() - { - throw new LogicException('Please implement the prunable method on your model.'); - } -} diff --git a/vendor/illuminate/database/Eloquent/MissingAttributeException.php b/vendor/illuminate/database/Eloquent/MissingAttributeException.php deleted file mode 100644 index 87935c1..0000000 --- a/vendor/illuminate/database/Eloquent/MissingAttributeException.php +++ /dev/null @@ -1,23 +0,0 @@ -> */ - use HasCollection; - - /** - * The connection name for the model. - * - * @var string|null - */ - protected $connection; - - /** - * The table associated with the model. - * - * @var string|null - */ - protected $table; - - /** - * The primary key for the model. - * - * @var string - */ - protected $primaryKey = 'id'; - - /** - * The "type" of the primary key ID. - * - * @var string - */ - protected $keyType = 'int'; - - /** - * Indicates if the IDs are auto-incrementing. - * - * @var bool - */ - public $incrementing = true; - - /** - * The relations to eager load on every query. - * - * @var array - */ - protected $with = []; - - /** - * The relationship counts that should be eager loaded on every query. - * - * @var array - */ - protected $withCount = []; - - /** - * Indicates whether lazy loading will be prevented on this model. - * - * @var bool - */ - public $preventsLazyLoading = false; - - /** - * The number of models to return for pagination. - * - * @var int - */ - protected $perPage = 15; - - /** - * Indicates if the model exists. - * - * @var bool - */ - public $exists = false; - - /** - * Indicates if the model was inserted during the object's lifecycle. - * - * @var bool - */ - public $wasRecentlyCreated = false; - - /** - * Indicates that the object's string representation should be escaped when __toString is invoked. - * - * @var bool - */ - protected $escapeWhenCastingToString = false; - - /** - * The connection resolver instance. - * - * @var \Illuminate\Database\ConnectionResolverInterface - */ - protected static $resolver; - - /** - * The event dispatcher instance. - * - * @var \Illuminate\Contracts\Events\Dispatcher|null - */ - protected static $dispatcher; - - /** - * The array of booted models. - * - * @var array - */ - protected static $booted = []; - - /** - * The array of trait initializers that will be called on each new instance. - * - * @var array - */ - protected static $traitInitializers = []; - - /** - * The array of global scopes on the model. - * - * @var array - */ - protected static $globalScopes = []; - - /** - * The list of models classes that should not be affected with touch. - * - * @var array - */ - protected static $ignoreOnTouch = []; - - /** - * Indicates whether lazy loading should be restricted on all models. - * - * @var bool - */ - protected static $modelsShouldPreventLazyLoading = false; - - /** - * The callback that is responsible for handling lazy loading violations. - * - * @var callable|null - */ - protected static $lazyLoadingViolationCallback; - - /** - * Indicates if an exception should be thrown instead of silently discarding non-fillable attributes. - * - * @var bool - */ - protected static $modelsShouldPreventSilentlyDiscardingAttributes = false; - - /** - * The callback that is responsible for handling discarded attribute violations. - * - * @var callable|null - */ - protected static $discardedAttributeViolationCallback; - - /** - * Indicates if an exception should be thrown when trying to access a missing attribute on a retrieved model. - * - * @var bool - */ - protected static $modelsShouldPreventAccessingMissingAttributes = false; - - /** - * The callback that is responsible for handling missing attribute violations. - * - * @var callable|null - */ - protected static $missingAttributeViolationCallback; - - /** - * Indicates if broadcasting is currently enabled. - * - * @var bool - */ - protected static $isBroadcasting = true; - - /** - * The Eloquent query builder class to use for the model. - * - * @var class-string<\Illuminate\Database\Eloquent\Builder<*>> - */ - protected static string $builder = Builder::class; - - /** - * The Eloquent collection class to use for the model. - * - * @var class-string<\Illuminate\Database\Eloquent\Collection<*, *>> - */ - protected static string $collectionClass = Collection::class; - - /** - * The name of the "created at" column. - * - * @var string|null - */ - const CREATED_AT = 'created_at'; - - /** - * The name of the "updated at" column. - * - * @var string|null - */ - const UPDATED_AT = 'updated_at'; - - /** - * Create a new Eloquent model instance. - * - * @param array $attributes - * @return void - */ - public function __construct(array $attributes = []) - { - $this->bootIfNotBooted(); - - $this->initializeTraits(); - - $this->syncOriginal(); - - $this->fill($attributes); - } - - /** - * Check if the model needs to be booted and if so, do it. - * - * @return void - */ - protected function bootIfNotBooted() - { - if (! isset(static::$booted[static::class])) { - static::$booted[static::class] = true; - - $this->fireModelEvent('booting', false); - - static::booting(); - static::boot(); - static::booted(); - - $this->fireModelEvent('booted', false); - } - } - - /** - * Perform any actions required before the model boots. - * - * @return void - */ - protected static function booting() - { - // - } - - /** - * Bootstrap the model and its traits. - * - * @return void - */ - protected static function boot() - { - static::bootTraits(); - } - - /** - * Boot all of the bootable traits on the model. - * - * @return void - */ - protected static function bootTraits() - { - $class = static::class; - - $booted = []; - - static::$traitInitializers[$class] = []; - - foreach (class_uses_recursive($class) as $trait) { - $method = 'boot'.class_basename($trait); - - if (method_exists($class, $method) && ! in_array($method, $booted)) { - forward_static_call([$class, $method]); - - $booted[] = $method; - } - - if (method_exists($class, $method = 'initialize'.class_basename($trait))) { - static::$traitInitializers[$class][] = $method; - - static::$traitInitializers[$class] = array_unique( - static::$traitInitializers[$class] - ); - } - } - } - - /** - * Initialize any initializable traits on the model. - * - * @return void - */ - protected function initializeTraits() - { - foreach (static::$traitInitializers[static::class] as $method) { - $this->{$method}(); - } - } - - /** - * Perform any actions required after the model boots. - * - * @return void - */ - protected static function booted() - { - // - } - - /** - * Clear the list of booted models so they will be re-booted. - * - * @return void - */ - public static function clearBootedModels() - { - static::$booted = []; - - static::$globalScopes = []; - } - - /** - * Disables relationship model touching for the current class during given callback scope. - * - * @param callable $callback - * @return void - */ - public static function withoutTouching(callable $callback) - { - static::withoutTouchingOn([static::class], $callback); - } - - /** - * Disables relationship model touching for the given model classes during given callback scope. - * - * @param array $models - * @param callable $callback - * @return void - */ - public static function withoutTouchingOn(array $models, callable $callback) - { - static::$ignoreOnTouch = array_values(array_merge(static::$ignoreOnTouch, $models)); - - try { - $callback(); - } finally { - static::$ignoreOnTouch = array_values(array_diff(static::$ignoreOnTouch, $models)); - } - } - - /** - * Determine if the given model is ignoring touches. - * - * @param string|null $class - * @return bool - */ - public static function isIgnoringTouch($class = null) - { - $class = $class ?: static::class; - - if (! get_class_vars($class)['timestamps'] || ! $class::UPDATED_AT) { - return true; - } - - foreach (static::$ignoreOnTouch as $ignoredClass) { - if ($class === $ignoredClass || is_subclass_of($class, $ignoredClass)) { - return true; - } - } - - return false; - } - - /** - * Indicate that models should prevent lazy loading, silently discarding attributes, and accessing missing attributes. - * - * @param bool $shouldBeStrict - * @return void - */ - public static function shouldBeStrict(bool $shouldBeStrict = true) - { - static::preventLazyLoading($shouldBeStrict); - static::preventSilentlyDiscardingAttributes($shouldBeStrict); - static::preventAccessingMissingAttributes($shouldBeStrict); - } - - /** - * Prevent model relationships from being lazy loaded. - * - * @param bool $value - * @return void - */ - public static function preventLazyLoading($value = true) - { - static::$modelsShouldPreventLazyLoading = $value; - } - - /** - * Register a callback that is responsible for handling lazy loading violations. - * - * @param callable|null $callback - * @return void - */ - public static function handleLazyLoadingViolationUsing(?callable $callback) - { - static::$lazyLoadingViolationCallback = $callback; - } - - /** - * Prevent non-fillable attributes from being silently discarded. - * - * @param bool $value - * @return void - */ - public static function preventSilentlyDiscardingAttributes($value = true) - { - static::$modelsShouldPreventSilentlyDiscardingAttributes = $value; - } - - /** - * Register a callback that is responsible for handling discarded attribute violations. - * - * @param callable|null $callback - * @return void - */ - public static function handleDiscardedAttributeViolationUsing(?callable $callback) - { - static::$discardedAttributeViolationCallback = $callback; - } - - /** - * Prevent accessing missing attributes on retrieved models. - * - * @param bool $value - * @return void - */ - public static function preventAccessingMissingAttributes($value = true) - { - static::$modelsShouldPreventAccessingMissingAttributes = $value; - } - - /** - * Register a callback that is responsible for handling missing attribute violations. - * - * @param callable|null $callback - * @return void - */ - public static function handleMissingAttributeViolationUsing(?callable $callback) - { - static::$missingAttributeViolationCallback = $callback; - } - - /** - * Execute a callback without broadcasting any model events for all model types. - * - * @param callable $callback - * @return mixed - */ - public static function withoutBroadcasting(callable $callback) - { - $isBroadcasting = static::$isBroadcasting; - - static::$isBroadcasting = false; - - try { - return $callback(); - } finally { - static::$isBroadcasting = $isBroadcasting; - } - } - - /** - * Fill the model with an array of attributes. - * - * @param array $attributes - * @return $this - * - * @throws \Illuminate\Database\Eloquent\MassAssignmentException - */ - public function fill(array $attributes) - { - $totallyGuarded = $this->totallyGuarded(); - - $fillable = $this->fillableFromArray($attributes); - - foreach ($fillable as $key => $value) { - // The developers may choose to place some attributes in the "fillable" array - // which means only those attributes may be set through mass assignment to - // the model, and all others will just get ignored for security reasons. - if ($this->isFillable($key)) { - $this->setAttribute($key, $value); - } elseif ($totallyGuarded || static::preventsSilentlyDiscardingAttributes()) { - if (isset(static::$discardedAttributeViolationCallback)) { - call_user_func(static::$discardedAttributeViolationCallback, $this, [$key]); - } else { - throw new MassAssignmentException(sprintf( - 'Add [%s] to fillable property to allow mass assignment on [%s].', - $key, get_class($this) - )); - } - } - } - - if (count($attributes) !== count($fillable) && - static::preventsSilentlyDiscardingAttributes()) { - $keys = array_diff(array_keys($attributes), array_keys($fillable)); - - if (isset(static::$discardedAttributeViolationCallback)) { - call_user_func(static::$discardedAttributeViolationCallback, $this, $keys); - } else { - throw new MassAssignmentException(sprintf( - 'Add fillable property [%s] to allow mass assignment on [%s].', - implode(', ', $keys), - get_class($this) - )); - } - } - - return $this; - } - - /** - * Fill the model with an array of attributes. Force mass assignment. - * - * @param array $attributes - * @return $this - */ - public function forceFill(array $attributes) - { - return static::unguarded(fn () => $this->fill($attributes)); - } - - /** - * Qualify the given column name by the model's table. - * - * @param string $column - * @return string - */ - public function qualifyColumn($column) - { - if (str_contains($column, '.')) { - return $column; - } - - return $this->getTable().'.'.$column; - } - - /** - * Qualify the given columns with the model's table. - * - * @param array $columns - * @return array - */ - public function qualifyColumns($columns) - { - return (new BaseCollection($columns)) - ->map(fn ($column) => $this->qualifyColumn($column)) - ->all(); - } - - /** - * Create a new instance of the given model. - * - * @param array $attributes - * @param bool $exists - * @return static - */ - public function newInstance($attributes = [], $exists = false) - { - // This method just provides a convenient way for us to generate fresh model - // instances of this current model. It is particularly useful during the - // hydration of new objects via the Eloquent query builder instances. - $model = new static; - - $model->exists = $exists; - - $model->setConnection( - $this->getConnectionName() - ); - - $model->setTable($this->getTable()); - - $model->mergeCasts($this->casts); - - $model->fill((array) $attributes); - - return $model; - } - - /** - * Create a new model instance that is existing. - * - * @param array $attributes - * @param string|null $connection - * @return static - */ - public function newFromBuilder($attributes = [], $connection = null) - { - $model = $this->newInstance([], true); - - $model->setRawAttributes((array) $attributes, true); - - $model->setConnection($connection ?: $this->getConnectionName()); - - $model->fireModelEvent('retrieved', false); - - return $model; - } - - /** - * Begin querying the model on a given connection. - * - * @param string|null $connection - * @return \Illuminate\Database\Eloquent\Builder - */ - public static function on($connection = null) - { - // First we will just create a fresh instance of this model, and then we can set the - // connection on the model so that it is used for the queries we execute, as well - // as being set on every relation we retrieve without a custom connection name. - $instance = new static; - - $instance->setConnection($connection); - - return $instance->newQuery(); - } - - /** - * Begin querying the model on the write connection. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public static function onWriteConnection() - { - return static::query()->useWritePdo(); - } - - /** - * Get all of the models from the database. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Collection - */ - public static function all($columns = ['*']) - { - return static::query()->get( - is_array($columns) ? $columns : func_get_args() - ); - } - - /** - * Begin querying a model with eager loading. - * - * @param array|string $relations - * @return \Illuminate\Database\Eloquent\Builder - */ - public static function with($relations) - { - return static::query()->with( - is_string($relations) ? func_get_args() : $relations - ); - } - - /** - * Eager load relations on the model. - * - * @param array|string $relations - * @return $this - */ - public function load($relations) - { - $query = $this->newQueryWithoutRelationships()->with( - is_string($relations) ? func_get_args() : $relations - ); - - $query->eagerLoadRelations([$this]); - - return $this; - } - - /** - * Eager load relationships on the polymorphic relation of a model. - * - * @param string $relation - * @param array $relations - * @return $this - */ - public function loadMorph($relation, $relations) - { - if (! $this->{$relation}) { - return $this; - } - - $className = get_class($this->{$relation}); - - $this->{$relation}->load($relations[$className] ?? []); - - return $this; - } - - /** - * Eager load relations on the model if they are not already eager loaded. - * - * @param array|string $relations - * @return $this - */ - public function loadMissing($relations) - { - $relations = is_string($relations) ? func_get_args() : $relations; - - $this->newCollection([$this])->loadMissing($relations); - - return $this; - } - - /** - * Eager load relation's column aggregations on the model. - * - * @param array|string $relations - * @param string $column - * @param string|null $function - * @return $this - */ - public function loadAggregate($relations, $column, $function = null) - { - $this->newCollection([$this])->loadAggregate($relations, $column, $function); - - return $this; - } - - /** - * Eager load relation counts on the model. - * - * @param array|string $relations - * @return $this - */ - public function loadCount($relations) - { - $relations = is_string($relations) ? func_get_args() : $relations; - - return $this->loadAggregate($relations, '*', 'count'); - } - - /** - * Eager load relation max column values on the model. - * - * @param array|string $relations - * @param string $column - * @return $this - */ - public function loadMax($relations, $column) - { - return $this->loadAggregate($relations, $column, 'max'); - } - - /** - * Eager load relation min column values on the model. - * - * @param array|string $relations - * @param string $column - * @return $this - */ - public function loadMin($relations, $column) - { - return $this->loadAggregate($relations, $column, 'min'); - } - - /** - * Eager load relation's column summations on the model. - * - * @param array|string $relations - * @param string $column - * @return $this - */ - public function loadSum($relations, $column) - { - return $this->loadAggregate($relations, $column, 'sum'); - } - - /** - * Eager load relation average column values on the model. - * - * @param array|string $relations - * @param string $column - * @return $this - */ - public function loadAvg($relations, $column) - { - return $this->loadAggregate($relations, $column, 'avg'); - } - - /** - * Eager load related model existence values on the model. - * - * @param array|string $relations - * @return $this - */ - public function loadExists($relations) - { - return $this->loadAggregate($relations, '*', 'exists'); - } - - /** - * Eager load relationship column aggregation on the polymorphic relation of a model. - * - * @param string $relation - * @param array $relations - * @param string $column - * @param string|null $function - * @return $this - */ - public function loadMorphAggregate($relation, $relations, $column, $function = null) - { - if (! $this->{$relation}) { - return $this; - } - - $className = get_class($this->{$relation}); - - $this->{$relation}->loadAggregate($relations[$className] ?? [], $column, $function); - - return $this; - } - - /** - * Eager load relationship counts on the polymorphic relation of a model. - * - * @param string $relation - * @param array $relations - * @return $this - */ - public function loadMorphCount($relation, $relations) - { - return $this->loadMorphAggregate($relation, $relations, '*', 'count'); - } - - /** - * Eager load relationship max column values on the polymorphic relation of a model. - * - * @param string $relation - * @param array $relations - * @param string $column - * @return $this - */ - public function loadMorphMax($relation, $relations, $column) - { - return $this->loadMorphAggregate($relation, $relations, $column, 'max'); - } - - /** - * Eager load relationship min column values on the polymorphic relation of a model. - * - * @param string $relation - * @param array $relations - * @param string $column - * @return $this - */ - public function loadMorphMin($relation, $relations, $column) - { - return $this->loadMorphAggregate($relation, $relations, $column, 'min'); - } - - /** - * Eager load relationship column summations on the polymorphic relation of a model. - * - * @param string $relation - * @param array $relations - * @param string $column - * @return $this - */ - public function loadMorphSum($relation, $relations, $column) - { - return $this->loadMorphAggregate($relation, $relations, $column, 'sum'); - } - - /** - * Eager load relationship average column values on the polymorphic relation of a model. - * - * @param string $relation - * @param array $relations - * @param string $column - * @return $this - */ - public function loadMorphAvg($relation, $relations, $column) - { - return $this->loadMorphAggregate($relation, $relations, $column, 'avg'); - } - - /** - * Increment a column's value by a given amount. - * - * @param string $column - * @param float|int $amount - * @param array $extra - * @return int - */ - protected function increment($column, $amount = 1, array $extra = []) - { - return $this->incrementOrDecrement($column, $amount, $extra, 'increment'); - } - - /** - * Decrement a column's value by a given amount. - * - * @param string $column - * @param float|int $amount - * @param array $extra - * @return int - */ - protected function decrement($column, $amount = 1, array $extra = []) - { - return $this->incrementOrDecrement($column, $amount, $extra, 'decrement'); - } - - /** - * Run the increment or decrement method on the model. - * - * @param string $column - * @param float|int $amount - * @param array $extra - * @param string $method - * @return int - */ - protected function incrementOrDecrement($column, $amount, $extra, $method) - { - if (! $this->exists) { - return $this->newQueryWithoutRelationships()->{$method}($column, $amount, $extra); - } - - $this->{$column} = $this->isClassDeviable($column) - ? $this->deviateClassCastableAttribute($method, $column, $amount) - : $this->{$column} + ($method === 'increment' ? $amount : $amount * -1); - - $this->forceFill($extra); - - if ($this->fireModelEvent('updating') === false) { - return false; - } - - if ($this->isClassDeviable($column)) { - $amount = (clone $this)->setAttribute($column, $amount)->getAttributeFromArray($column); - } - - return tap($this->setKeysForSaveQuery($this->newQueryWithoutScopes())->{$method}($column, $amount, $extra), function () use ($column) { - $this->syncChanges(); - - $this->fireModelEvent('updated', false); - - $this->syncOriginalAttribute($column); - }); - } - - /** - * Update the model in the database. - * - * @param array $attributes - * @param array $options - * @return bool - */ - public function update(array $attributes = [], array $options = []) - { - if (! $this->exists) { - return false; - } - - return $this->fill($attributes)->save($options); - } - - /** - * Update the model in the database within a transaction. - * - * @param array $attributes - * @param array $options - * @return bool - * - * @throws \Throwable - */ - public function updateOrFail(array $attributes = [], array $options = []) - { - if (! $this->exists) { - return false; - } - - return $this->fill($attributes)->saveOrFail($options); - } - - /** - * Update the model in the database without raising any events. - * - * @param array $attributes - * @param array $options - * @return bool - */ - public function updateQuietly(array $attributes = [], array $options = []) - { - if (! $this->exists) { - return false; - } - - return $this->fill($attributes)->saveQuietly($options); - } - - /** - * Increment a column's value by a given amount without raising any events. - * - * @param string $column - * @param float|int $amount - * @param array $extra - * @return int - */ - protected function incrementQuietly($column, $amount = 1, array $extra = []) - { - return static::withoutEvents( - fn () => $this->incrementOrDecrement($column, $amount, $extra, 'increment') - ); - } - - /** - * Decrement a column's value by a given amount without raising any events. - * - * @param string $column - * @param float|int $amount - * @param array $extra - * @return int - */ - protected function decrementQuietly($column, $amount = 1, array $extra = []) - { - return static::withoutEvents( - fn () => $this->incrementOrDecrement($column, $amount, $extra, 'decrement') - ); - } - - /** - * Save the model and all of its relationships. - * - * @return bool - */ - public function push() - { - return $this->withoutRecursion(function () { - if (! $this->save()) { - return false; - } - - // To sync all of the relationships to the database, we will simply spin through - // the relationships and save each model via this "push" method, which allows - // us to recurse into all of these nested relations for the model instance. - foreach ($this->relations as $models) { - $models = $models instanceof Collection - ? $models->all() : [$models]; - - foreach (array_filter($models) as $model) { - if (! $model->push()) { - return false; - } - } - } - - return true; - }, true); - } - - /** - * Save the model and all of its relationships without raising any events to the parent model. - * - * @return bool - */ - public function pushQuietly() - { - return static::withoutEvents(fn () => $this->push()); - } - - /** - * Save the model to the database without raising any events. - * - * @param array $options - * @return bool - */ - public function saveQuietly(array $options = []) - { - return static::withoutEvents(fn () => $this->save($options)); - } - - /** - * Save the model to the database. - * - * @param array $options - * @return bool - */ - public function save(array $options = []) - { - $this->mergeAttributesFromCachedCasts(); - - $query = $this->newModelQuery(); - - // If the "saving" event returns false we'll bail out of the save and return - // false, indicating that the save failed. This provides a chance for any - // listeners to cancel save operations if validations fail or whatever. - if ($this->fireModelEvent('saving') === false) { - return false; - } - - // If the model already exists in the database we can just update our record - // that is already in this database using the current IDs in this "where" - // clause to only update this model. Otherwise, we'll just insert them. - if ($this->exists) { - $saved = $this->isDirty() ? - $this->performUpdate($query) : true; - } - - // If the model is brand new, we'll insert it into our database and set the - // ID attribute on the model to the value of the newly inserted row's ID - // which is typically an auto-increment value managed by the database. - else { - $saved = $this->performInsert($query); - - if (! $this->getConnectionName() && - $connection = $query->getConnection()) { - $this->setConnection($connection->getName()); - } - } - - // If the model is successfully saved, we need to do a few more things once - // that is done. We will call the "saved" method here to run any actions - // we need to happen after a model gets successfully saved right here. - if ($saved) { - $this->finishSave($options); - } - - return $saved; - } - - /** - * Save the model to the database within a transaction. - * - * @param array $options - * @return bool - * - * @throws \Throwable - */ - public function saveOrFail(array $options = []) - { - return $this->getConnection()->transaction(fn () => $this->save($options)); - } - - /** - * Perform any actions that are necessary after the model is saved. - * - * @param array $options - * @return void - */ - protected function finishSave(array $options) - { - $this->fireModelEvent('saved', false); - - if ($this->isDirty() && ($options['touch'] ?? true)) { - $this->touchOwners(); - } - - $this->syncOriginal(); - } - - /** - * Perform a model update operation. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @return bool - */ - protected function performUpdate(Builder $query) - { - // If the updating event returns false, we will cancel the update operation so - // developers can hook Validation systems into their models and cancel this - // operation if the model does not pass validation. Otherwise, we update. - if ($this->fireModelEvent('updating') === false) { - return false; - } - - // First we need to create a fresh query instance and touch the creation and - // update timestamp on the model which are maintained by us for developer - // convenience. Then we will just continue saving the model instances. - if ($this->usesTimestamps()) { - $this->updateTimestamps(); - } - - // Once we have run the update operation, we will fire the "updated" event for - // this model instance. This will allow developers to hook into these after - // models are updated, giving them a chance to do any special processing. - $dirty = $this->getDirtyForUpdate(); - - if (count($dirty) > 0) { - $this->setKeysForSaveQuery($query)->update($dirty); - - $this->syncChanges(); - - $this->fireModelEvent('updated', false); - } - - return true; - } - - /** - * Set the keys for a select query. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function setKeysForSelectQuery($query) - { - $query->where($this->getKeyName(), '=', $this->getKeyForSelectQuery()); - - return $query; - } - - /** - * Get the primary key value for a select query. - * - * @return mixed - */ - protected function getKeyForSelectQuery() - { - return $this->original[$this->getKeyName()] ?? $this->getKey(); - } - - /** - * Set the keys for a save update query. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function setKeysForSaveQuery($query) - { - $query->where($this->getKeyName(), '=', $this->getKeyForSaveQuery()); - - return $query; - } - - /** - * Get the primary key value for a save query. - * - * @return mixed - */ - protected function getKeyForSaveQuery() - { - return $this->original[$this->getKeyName()] ?? $this->getKey(); - } - - /** - * Perform a model insert operation. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @return bool - */ - protected function performInsert(Builder $query) - { - if ($this->usesUniqueIds()) { - $this->setUniqueIds(); - } - - if ($this->fireModelEvent('creating') === false) { - return false; - } - - // First we'll need to create a fresh query instance and touch the creation and - // update timestamps on this model, which are maintained by us for developer - // convenience. After, we will just continue saving these model instances. - if ($this->usesTimestamps()) { - $this->updateTimestamps(); - } - - // If the model has an incrementing key, we can use the "insertGetId" method on - // the query builder, which will give us back the final inserted ID for this - // table from the database. Not all tables have to be incrementing though. - $attributes = $this->getAttributesForInsert(); - - if ($this->getIncrementing()) { - $this->insertAndSetId($query, $attributes); - } - - // If the table isn't incrementing we'll simply insert these attributes as they - // are. These attribute arrays must contain an "id" column previously placed - // there by the developer as the manually determined key for these models. - else { - if (empty($attributes)) { - return true; - } - - $query->insert($attributes); - } - - // We will go ahead and set the exists property to true, so that it is set when - // the created event is fired, just in case the developer tries to update it - // during the event. This will allow them to do so and run an update here. - $this->exists = true; - - $this->wasRecentlyCreated = true; - - $this->fireModelEvent('created', false); - - return true; - } - - /** - * Insert the given attributes and set the ID on the model. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param array $attributes - * @return void - */ - protected function insertAndSetId(Builder $query, $attributes) - { - $id = $query->insertGetId($attributes, $keyName = $this->getKeyName()); - - $this->setAttribute($keyName, $id); - } - - /** - * Destroy the models for the given IDs. - * - * @param \Illuminate\Support\Collection|array|int|string $ids - * @return int - */ - public static function destroy($ids) - { - if ($ids instanceof EloquentCollection) { - $ids = $ids->modelKeys(); - } - - if ($ids instanceof BaseCollection) { - $ids = $ids->all(); - } - - $ids = is_array($ids) ? $ids : func_get_args(); - - if (count($ids) === 0) { - return 0; - } - - // We will actually pull the models from the database table and call delete on - // each of them individually so that their events get fired properly with a - // correct set of attributes in case the developers wants to check these. - $key = ($instance = new static)->getKeyName(); - - $count = 0; - - foreach ($instance->whereIn($key, $ids)->get() as $model) { - if ($model->delete()) { - $count++; - } - } - - return $count; - } - - /** - * Delete the model from the database. - * - * @return bool|null - * - * @throws \LogicException - */ - public function delete() - { - $this->mergeAttributesFromCachedCasts(); - - if (is_null($this->getKeyName())) { - throw new LogicException('No primary key defined on model.'); - } - - // If the model doesn't exist, there is nothing to delete so we'll just return - // immediately and not do anything else. Otherwise, we will continue with a - // deletion process on the model, firing the proper events, and so forth. - if (! $this->exists) { - return; - } - - if ($this->fireModelEvent('deleting') === false) { - return false; - } - - // Here, we'll touch the owning models, verifying these timestamps get updated - // for the models. This will allow any caching to get broken on the parents - // by the timestamp. Then we will go ahead and delete the model instance. - $this->touchOwners(); - - $this->performDeleteOnModel(); - - // Once the model has been deleted, we will fire off the deleted event so that - // the developers may hook into post-delete operations. We will then return - // a boolean true as the delete is presumably successful on the database. - $this->fireModelEvent('deleted', false); - - return true; - } - - /** - * Delete the model from the database without raising any events. - * - * @return bool - */ - public function deleteQuietly() - { - return static::withoutEvents(fn () => $this->delete()); - } - - /** - * Delete the model from the database within a transaction. - * - * @return bool|null - * - * @throws \Throwable - */ - public function deleteOrFail() - { - if (! $this->exists) { - return false; - } - - return $this->getConnection()->transaction(fn () => $this->delete()); - } - - /** - * Force a hard delete on a soft deleted model. - * - * This method protects developers from running forceDelete when the trait is missing. - * - * @return bool|null - */ - public function forceDelete() - { - return $this->delete(); - } - - /** - * Force a hard destroy on a soft deleted model. - * - * This method protects developers from running forceDestroy when the trait is missing. - * - * @param \Illuminate\Support\Collection|array|int|string $ids - * @return bool|null - */ - public static function forceDestroy($ids) - { - return static::destroy($ids); - } - - /** - * Perform the actual delete query on this model instance. - * - * @return void - */ - protected function performDeleteOnModel() - { - $this->setKeysForSaveQuery($this->newModelQuery())->delete(); - - $this->exists = false; - } - - /** - * Begin querying the model. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public static function query() - { - return (new static)->newQuery(); - } - - /** - * Get a new query builder for the model's table. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public function newQuery() - { - return $this->registerGlobalScopes($this->newQueryWithoutScopes()); - } - - /** - * Get a new query builder that doesn't have any global scopes or eager loading. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public function newModelQuery() - { - return $this->newEloquentBuilder( - $this->newBaseQueryBuilder() - )->setModel($this); - } - - /** - * Get a new query builder with no relationships loaded. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public function newQueryWithoutRelationships() - { - return $this->registerGlobalScopes($this->newModelQuery()); - } - - /** - * Register the global scopes for this builder instance. - * - * @param \Illuminate\Database\Eloquent\Builder $builder - * @return \Illuminate\Database\Eloquent\Builder - */ - public function registerGlobalScopes($builder) - { - foreach ($this->getGlobalScopes() as $identifier => $scope) { - $builder->withGlobalScope($identifier, $scope); - } - - return $builder; - } - - /** - * Get a new query builder that doesn't have any global scopes. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public function newQueryWithoutScopes() - { - return $this->newModelQuery() - ->with($this->with) - ->withCount($this->withCount); - } - - /** - * Get a new query instance without a given scope. - * - * @param \Illuminate\Database\Eloquent\Scope|string $scope - * @return \Illuminate\Database\Eloquent\Builder - */ - public function newQueryWithoutScope($scope) - { - return $this->newQuery()->withoutGlobalScope($scope); - } - - /** - * Get a new query to restore one or more models by their queueable IDs. - * - * @param array|int $ids - * @return \Illuminate\Database\Eloquent\Builder - */ - public function newQueryForRestoration($ids) - { - return $this->newQueryWithoutScopes()->whereKey($ids); - } - - /** - * Create a new Eloquent query builder for the model. - * - * @param \Illuminate\Database\Query\Builder $query - * @return \Illuminate\Database\Eloquent\Builder<*> - */ - public function newEloquentBuilder($query) - { - return new static::$builder($query); - } - - /** - * Get a new query builder instance for the connection. - * - * @return \Illuminate\Database\Query\Builder - */ - protected function newBaseQueryBuilder() - { - return $this->getConnection()->query(); - } - - /** - * Create a new pivot model instance. - * - * @param \Illuminate\Database\Eloquent\Model $parent - * @param array $attributes - * @param string $table - * @param bool $exists - * @param string|null $using - * @return \Illuminate\Database\Eloquent\Relations\Pivot - */ - public function newPivot(self $parent, array $attributes, $table, $exists, $using = null) - { - return $using ? $using::fromRawAttributes($parent, $attributes, $table, $exists) - : Pivot::fromAttributes($parent, $attributes, $table, $exists); - } - - /** - * Determine if the model has a given scope. - * - * @param string $scope - * @return bool - */ - public function hasNamedScope($scope) - { - return method_exists($this, 'scope'.ucfirst($scope)); - } - - /** - * Apply the given named scope if possible. - * - * @param string $scope - * @param array $parameters - * @return mixed - */ - public function callNamedScope($scope, array $parameters = []) - { - return $this->{'scope'.ucfirst($scope)}(...$parameters); - } - - /** - * Convert the model instance to an array. - * - * @return array - */ - public function toArray() - { - return $this->withoutRecursion( - fn () => array_merge($this->attributesToArray(), $this->relationsToArray()), - fn () => $this->attributesToArray(), - ); - } - - /** - * Convert the model instance to JSON. - * - * @param int $options - * @return string - * - * @throws \Illuminate\Database\Eloquent\JsonEncodingException - */ - public function toJson($options = 0) - { - try { - $json = json_encode($this->jsonSerialize(), $options | JSON_THROW_ON_ERROR); - } catch (JsonException $e) { - throw JsonEncodingException::forModel($this, $e->getMessage()); - } - - return $json; - } - - /** - * Convert the object into something JSON serializable. - * - * @return mixed - */ - public function jsonSerialize(): mixed - { - return $this->toArray(); - } - - /** - * Reload a fresh model instance from the database. - * - * @param array|string $with - * @return static|null - */ - public function fresh($with = []) - { - if (! $this->exists) { - return; - } - - return $this->setKeysForSelectQuery($this->newQueryWithoutScopes()) - ->useWritePdo() - ->with(is_string($with) ? func_get_args() : $with) - ->first(); - } - - /** - * Reload the current model instance with fresh attributes from the database. - * - * @return $this - */ - public function refresh() - { - if (! $this->exists) { - return $this; - } - - $this->setRawAttributes( - $this->setKeysForSelectQuery($this->newQueryWithoutScopes()) - ->useWritePdo() - ->firstOrFail() - ->attributes - ); - - $this->load((new BaseCollection($this->relations))->reject( - fn ($relation) => $relation instanceof Pivot - || (is_object($relation) && in_array(AsPivot::class, class_uses_recursive($relation), true)) - )->keys()->all()); - - $this->syncOriginal(); - - return $this; - } - - /** - * Clone the model into a new, non-existing instance. - * - * @param array|null $except - * @return static - */ - public function replicate(?array $except = null) - { - $defaults = array_values(array_filter([ - $this->getKeyName(), - $this->getCreatedAtColumn(), - $this->getUpdatedAtColumn(), - ...$this->uniqueIds(), - 'laravel_through_key', - ])); - - $attributes = Arr::except( - $this->getAttributes(), $except ? array_unique(array_merge($except, $defaults)) : $defaults - ); - - return tap(new static, function ($instance) use ($attributes) { - $instance->setRawAttributes($attributes); - - $instance->setRelations($this->relations); - - $instance->fireModelEvent('replicating', false); - }); - } - - /** - * Clone the model into a new, non-existing instance without raising any events. - * - * @param array|null $except - * @return static - */ - public function replicateQuietly(?array $except = null) - { - return static::withoutEvents(fn () => $this->replicate($except)); - } - - /** - * Determine if two models have the same ID and belong to the same table. - * - * @param \Illuminate\Database\Eloquent\Model|null $model - * @return bool - */ - public function is($model) - { - return ! is_null($model) && - $this->getKey() === $model->getKey() && - $this->getTable() === $model->getTable() && - $this->getConnectionName() === $model->getConnectionName(); - } - - /** - * Determine if two models are not the same. - * - * @param \Illuminate\Database\Eloquent\Model|null $model - * @return bool - */ - public function isNot($model) - { - return ! $this->is($model); - } - - /** - * Get the database connection for the model. - * - * @return \Illuminate\Database\Connection - */ - public function getConnection() - { - return static::resolveConnection($this->getConnectionName()); - } - - /** - * Get the current connection name for the model. - * - * @return string|null - */ - public function getConnectionName() - { - return $this->connection; - } - - /** - * Set the connection associated with the model. - * - * @param string|null $name - * @return $this - */ - public function setConnection($name) - { - $this->connection = $name; - - return $this; - } - - /** - * Resolve a connection instance. - * - * @param string|null $connection - * @return \Illuminate\Database\Connection - */ - public static function resolveConnection($connection = null) - { - return static::$resolver->connection($connection); - } - - /** - * Get the connection resolver instance. - * - * @return \Illuminate\Database\ConnectionResolverInterface|null - */ - public static function getConnectionResolver() - { - return static::$resolver; - } - - /** - * Set the connection resolver instance. - * - * @param \Illuminate\Database\ConnectionResolverInterface $resolver - * @return void - */ - public static function setConnectionResolver(Resolver $resolver) - { - static::$resolver = $resolver; - } - - /** - * Unset the connection resolver for models. - * - * @return void - */ - public static function unsetConnectionResolver() - { - static::$resolver = null; - } - - /** - * Get the table associated with the model. - * - * @return string - */ - public function getTable() - { - return $this->table ?? Str::snake(Str::pluralStudly(class_basename($this))); - } - - /** - * Set the table associated with the model. - * - * @param string $table - * @return $this - */ - public function setTable($table) - { - $this->table = $table; - - return $this; - } - - /** - * Get the primary key for the model. - * - * @return string - */ - public function getKeyName() - { - return $this->primaryKey; - } - - /** - * Set the primary key for the model. - * - * @param string $key - * @return $this - */ - public function setKeyName($key) - { - $this->primaryKey = $key; - - return $this; - } - - /** - * Get the table qualified key name. - * - * @return string - */ - public function getQualifiedKeyName() - { - return $this->qualifyColumn($this->getKeyName()); - } - - /** - * Get the auto-incrementing key type. - * - * @return string - */ - public function getKeyType() - { - return $this->keyType; - } - - /** - * Set the data type for the primary key. - * - * @param string $type - * @return $this - */ - public function setKeyType($type) - { - $this->keyType = $type; - - return $this; - } - - /** - * Get the value indicating whether the IDs are incrementing. - * - * @return bool - */ - public function getIncrementing() - { - return $this->incrementing; - } - - /** - * Set whether IDs are incrementing. - * - * @param bool $value - * @return $this - */ - public function setIncrementing($value) - { - $this->incrementing = $value; - - return $this; - } - - /** - * Get the value of the model's primary key. - * - * @return mixed - */ - public function getKey() - { - return $this->getAttribute($this->getKeyName()); - } - - /** - * Get the queueable identity for the entity. - * - * @return mixed - */ - public function getQueueableId() - { - return $this->getKey(); - } - - /** - * Get the queueable relationships for the entity. - * - * @return array - */ - public function getQueueableRelations() - { - return $this->withoutRecursion(function () { - $relations = []; - - foreach ($this->getRelations() as $key => $relation) { - if (! method_exists($this, $key)) { - continue; - } - - $relations[] = $key; - - if ($relation instanceof QueueableCollection) { - foreach ($relation->getQueueableRelations() as $collectionValue) { - $relations[] = $key.'.'.$collectionValue; - } - } - - if ($relation instanceof QueueableEntity) { - foreach ($relation->getQueueableRelations() as $entityValue) { - $relations[] = $key.'.'.$entityValue; - } - } - } - - return array_unique($relations); - }, []); - } - - /** - * Get the queueable connection for the entity. - * - * @return string|null - */ - public function getQueueableConnection() - { - return $this->getConnectionName(); - } - - /** - * Get the value of the model's route key. - * - * @return mixed - */ - public function getRouteKey() - { - return $this->getAttribute($this->getRouteKeyName()); - } - - /** - * Get the route key for the model. - * - * @return string - */ - public function getRouteKeyName() - { - return $this->getKeyName(); - } - - /** - * Retrieve the model for a bound value. - * - * @param mixed $value - * @param string|null $field - * @return \Illuminate\Database\Eloquent\Model|null - */ - public function resolveRouteBinding($value, $field = null) - { - return $this->resolveRouteBindingQuery($this, $value, $field)->first(); - } - - /** - * Retrieve the model for a bound value. - * - * @param mixed $value - * @param string|null $field - * @return \Illuminate\Database\Eloquent\Model|null - */ - public function resolveSoftDeletableRouteBinding($value, $field = null) - { - return $this->resolveRouteBindingQuery($this, $value, $field)->withTrashed()->first(); - } - - /** - * Retrieve the child model for a bound value. - * - * @param string $childType - * @param mixed $value - * @param string|null $field - * @return \Illuminate\Database\Eloquent\Model|null - */ - public function resolveChildRouteBinding($childType, $value, $field) - { - return $this->resolveChildRouteBindingQuery($childType, $value, $field)->first(); - } - - /** - * Retrieve the child model for a bound value. - * - * @param string $childType - * @param mixed $value - * @param string|null $field - * @return \Illuminate\Database\Eloquent\Model|null - */ - public function resolveSoftDeletableChildRouteBinding($childType, $value, $field) - { - return $this->resolveChildRouteBindingQuery($childType, $value, $field)->withTrashed()->first(); - } - - /** - * Retrieve the child model query for a bound value. - * - * @param string $childType - * @param mixed $value - * @param string|null $field - * @return \Illuminate\Database\Eloquent\Relations\Relation<\Illuminate\Database\Eloquent\Model, $this, *> - */ - protected function resolveChildRouteBindingQuery($childType, $value, $field) - { - $relationship = $this->{$this->childRouteBindingRelationshipName($childType)}(); - - $field = $field ?: $relationship->getRelated()->getRouteKeyName(); - - if ($relationship instanceof HasManyThrough || - $relationship instanceof BelongsToMany) { - $field = $relationship->getRelated()->qualifyColumn($field); - } - - return $relationship instanceof Model - ? $relationship->resolveRouteBindingQuery($relationship, $value, $field) - : $relationship->getRelated()->resolveRouteBindingQuery($relationship, $value, $field); - } - - /** - * Retrieve the child route model binding relationship name for the given child type. - * - * @param string $childType - * @return string - */ - protected function childRouteBindingRelationshipName($childType) - { - return Str::plural(Str::camel($childType)); - } - - /** - * Retrieve the model for a bound value. - * - * @param \Illuminate\Database\Eloquent\Model|\Illuminate\Contracts\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Relations\Relation $query - * @param mixed $value - * @param string|null $field - * @return \Illuminate\Contracts\Database\Eloquent\Builder - */ - public function resolveRouteBindingQuery($query, $value, $field = null) - { - return $query->where($field ?? $this->getRouteKeyName(), $value); - } - - /** - * Get the default foreign key name for the model. - * - * @return string - */ - public function getForeignKey() - { - return Str::snake(class_basename($this)).'_'.$this->getKeyName(); - } - - /** - * Get the number of models to return per page. - * - * @return int - */ - public function getPerPage() - { - return $this->perPage; - } - - /** - * Set the number of models to return per page. - * - * @param int $perPage - * @return $this - */ - public function setPerPage($perPage) - { - $this->perPage = $perPage; - - return $this; - } - - /** - * Determine if lazy loading is disabled. - * - * @return bool - */ - public static function preventsLazyLoading() - { - return static::$modelsShouldPreventLazyLoading; - } - - /** - * Determine if discarding guarded attribute fills is disabled. - * - * @return bool - */ - public static function preventsSilentlyDiscardingAttributes() - { - return static::$modelsShouldPreventSilentlyDiscardingAttributes; - } - - /** - * Determine if accessing missing attributes is disabled. - * - * @return bool - */ - public static function preventsAccessingMissingAttributes() - { - return static::$modelsShouldPreventAccessingMissingAttributes; - } - - /** - * Get the broadcast channel route definition that is associated with the given entity. - * - * @return string - */ - public function broadcastChannelRoute() - { - return str_replace('\\', '.', get_class($this)).'.{'.Str::camel(class_basename($this)).'}'; - } - - /** - * Get the broadcast channel name that is associated with the given entity. - * - * @return string - */ - public function broadcastChannel() - { - return str_replace('\\', '.', get_class($this)).'.'.$this->getKey(); - } - - /** - * Dynamically retrieve attributes on the model. - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - return $this->getAttribute($key); - } - - /** - * Dynamically set attributes on the model. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function __set($key, $value) - { - $this->setAttribute($key, $value); - } - - /** - * Determine if the given attribute exists. - * - * @param mixed $offset - * @return bool - */ - public function offsetExists($offset): bool - { - $shouldPrevent = static::$modelsShouldPreventAccessingMissingAttributes; - - static::$modelsShouldPreventAccessingMissingAttributes = false; - - $result = ! is_null($this->getAttribute($offset)); - - static::$modelsShouldPreventAccessingMissingAttributes = $shouldPrevent; - - return $result; - } - - /** - * Get the value for a given offset. - * - * @param mixed $offset - * @return mixed - */ - public function offsetGet($offset): mixed - { - return $this->getAttribute($offset); - } - - /** - * Set the value for a given offset. - * - * @param mixed $offset - * @param mixed $value - * @return void - */ - public function offsetSet($offset, $value): void - { - $this->setAttribute($offset, $value); - } - - /** - * Unset the value for a given offset. - * - * @param mixed $offset - * @return void - */ - public function offsetUnset($offset): void - { - unset($this->attributes[$offset], $this->relations[$offset], $this->attributeCastCache[$offset]); - } - - /** - * Determine if an attribute or relation exists on the model. - * - * @param string $key - * @return bool - */ - public function __isset($key) - { - return $this->offsetExists($key); - } - - /** - * Unset an attribute on the model. - * - * @param string $key - * @return void - */ - public function __unset($key) - { - $this->offsetUnset($key); - } - - /** - * Handle dynamic method calls into the model. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - if (in_array($method, ['increment', 'decrement', 'incrementQuietly', 'decrementQuietly'])) { - return $this->$method(...$parameters); - } - - if ($resolver = $this->relationResolver(static::class, $method)) { - return $resolver($this); - } - - if (Str::startsWith($method, 'through') && - method_exists($this, $relationMethod = (new SupportStringable($method))->after('through')->lcfirst()->toString())) { - return $this->through($relationMethod); - } - - return $this->forwardCallTo($this->newQuery(), $method, $parameters); - } - - /** - * Handle dynamic static method calls into the model. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public static function __callStatic($method, $parameters) - { - return (new static)->$method(...$parameters); - } - - /** - * Convert the model to its string representation. - * - * @return string - */ - public function __toString() - { - return $this->escapeWhenCastingToString - ? e($this->toJson()) - : $this->toJson(); - } - - /** - * Indicate that the object's string representation should be escaped when __toString is invoked. - * - * @param bool $escape - * @return $this - */ - public function escapeWhenCastingToString($escape = true) - { - $this->escapeWhenCastingToString = $escape; - - return $this; - } - - /** - * Prepare the object for serialization. - * - * @return array - */ - public function __sleep() - { - $this->mergeAttributesFromCachedCasts(); - - $this->classCastCache = []; - $this->attributeCastCache = []; - - return array_keys(get_object_vars($this)); - } - - /** - * When a model is being unserialized, check if it needs to be booted. - * - * @return void - */ - public function __wakeup() - { - $this->bootIfNotBooted(); - - $this->initializeTraits(); - } -} diff --git a/vendor/illuminate/database/Eloquent/ModelInspector.php b/vendor/illuminate/database/Eloquent/ModelInspector.php deleted file mode 100644 index 96afe44..0000000 --- a/vendor/illuminate/database/Eloquent/ModelInspector.php +++ /dev/null @@ -1,412 +0,0 @@ - - */ - protected $relationMethods = [ - 'hasMany', - 'hasManyThrough', - 'hasOneThrough', - 'belongsToMany', - 'hasOne', - 'belongsTo', - 'morphOne', - 'morphTo', - 'morphMany', - 'morphToMany', - 'morphedByMany', - ]; - - /** - * Create a new model inspector instance. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return void - */ - public function __construct(Application $app) - { - $this->app = $app; - } - - /** - * Extract model details for the given model. - * - * @param class-string<\Illuminate\Database\Eloquent\Model>|string $model - * @param string|null $connection - * @return array{"class": class-string<\Illuminate\Database\Eloquent\Model>, database: string, table: string, policy: class-string|null, attributes: \Illuminate\Support\Collection, relations: \Illuminate\Support\Collection, events: \Illuminate\Support\Collection, observers: \Illuminate\Support\Collection, collection: class-string<\Illuminate\Database\Eloquent\Collection<\Illuminate\Database\Eloquent\Model>>, builder: class-string<\Illuminate\Database\Eloquent\Builder<\Illuminate\Database\Eloquent\Model>>} - * - * @throws BindingResolutionException - */ - public function inspect($model, $connection = null) - { - $class = $this->qualifyModel($model); - - /** @var \Illuminate\Database\Eloquent\Model $model */ - $model = $this->app->make($class); - - if ($connection !== null) { - $model->setConnection($connection); - } - - return [ - 'class' => get_class($model), - 'database' => $model->getConnection()->getName(), - 'table' => $model->getConnection()->getTablePrefix().$model->getTable(), - 'policy' => $this->getPolicy($model), - 'attributes' => $this->getAttributes($model), - 'relations' => $this->getRelations($model), - 'events' => $this->getEvents($model), - 'observers' => $this->getObservers($model), - 'collection' => $this->getCollectedBy($model), - 'builder' => $this->getBuilder($model), - ]; - } - - /** - * Get the column attributes for the given model. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return \Illuminate\Support\Collection> - */ - protected function getAttributes($model) - { - $connection = $model->getConnection(); - $schema = $connection->getSchemaBuilder(); - $table = $model->getTable(); - $columns = $schema->getColumns($table); - $indexes = $schema->getIndexes($table); - - return (new BaseCollection($columns)) - ->map(fn ($column) => [ - 'name' => $column['name'], - 'type' => $column['type'], - 'increments' => $column['auto_increment'], - 'nullable' => $column['nullable'], - 'default' => $this->getColumnDefault($column, $model), - 'unique' => $this->columnIsUnique($column['name'], $indexes), - 'fillable' => $model->isFillable($column['name']), - 'hidden' => $this->attributeIsHidden($column['name'], $model), - 'appended' => null, - 'cast' => $this->getCastType($column['name'], $model), - ]) - ->merge($this->getVirtualAttributes($model, $columns)); - } - - /** - * Get the virtual (non-column) attributes for the given model. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @param array $columns - * @return \Illuminate\Support\Collection - */ - protected function getVirtualAttributes($model, $columns) - { - $class = new ReflectionClass($model); - - return (new BaseCollection($class->getMethods())) - ->reject( - fn (ReflectionMethod $method) => $method->isStatic() - || $method->isAbstract() - || $method->getDeclaringClass()->getName() === Model::class - ) - ->mapWithKeys(function (ReflectionMethod $method) use ($model) { - if (preg_match('/^get(.+)Attribute$/', $method->getName(), $matches) === 1) { - return [Str::snake($matches[1]) => 'accessor']; - } elseif ($model->hasAttributeMutator($method->getName())) { - return [Str::snake($method->getName()) => 'attribute']; - } else { - return []; - } - }) - ->reject(fn ($cast, $name) => (new BaseCollection($columns))->contains('name', $name)) - ->map(fn ($cast, $name) => [ - 'name' => $name, - 'type' => null, - 'increments' => false, - 'nullable' => null, - 'default' => null, - 'unique' => null, - 'fillable' => $model->isFillable($name), - 'hidden' => $this->attributeIsHidden($name, $model), - 'appended' => $model->hasAppended($name), - 'cast' => $cast, - ]) - ->values(); - } - - /** - * Get the relations from the given model. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return \Illuminate\Support\Collection - */ - protected function getRelations($model) - { - return (new BaseCollection(get_class_methods($model))) - ->map(fn ($method) => new ReflectionMethod($model, $method)) - ->reject( - fn (ReflectionMethod $method) => $method->isStatic() - || $method->isAbstract() - || $method->getDeclaringClass()->getName() === Model::class - || $method->getNumberOfParameters() > 0 - ) - ->filter(function (ReflectionMethod $method) { - if ($method->getReturnType() instanceof ReflectionNamedType - && is_subclass_of($method->getReturnType()->getName(), Relation::class)) { - return true; - } - - $file = new SplFileObject($method->getFileName()); - $file->seek($method->getStartLine() - 1); - $code = ''; - while ($file->key() < $method->getEndLine()) { - $code .= trim($file->current()); - $file->next(); - } - - return (new BaseCollection($this->relationMethods)) - ->contains(fn ($relationMethod) => str_contains($code, '$this->'.$relationMethod.'(')); - }) - ->map(function (ReflectionMethod $method) use ($model) { - $relation = $method->invoke($model); - - if (! $relation instanceof Relation) { - return null; - } - - return [ - 'name' => $method->getName(), - 'type' => Str::afterLast(get_class($relation), '\\'), - 'related' => get_class($relation->getRelated()), - ]; - }) - ->filter() - ->values(); - } - - /** - * Get the first policy associated with this model. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return string|null - */ - protected function getPolicy($model) - { - $policy = Gate::getPolicyFor($model::class); - - return $policy ? $policy::class : null; - } - - /** - * Get the events that the model dispatches. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return \Illuminate\Support\Collection - */ - protected function getEvents($model) - { - return (new BaseCollection($model->dispatchesEvents())) - ->map(fn (string $class, string $event) => [ - 'event' => $event, - 'class' => $class, - ])->values(); - } - - /** - * Get the observers watching this model. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return \Illuminate\Support\Collection - * - * @throws BindingResolutionException - */ - protected function getObservers($model) - { - $listeners = $this->app->make('events')->getRawListeners(); - - // Get the Eloquent observers for this model... - $listeners = array_filter($listeners, function ($v, $key) use ($model) { - return Str::startsWith($key, 'eloquent.') && Str::endsWith($key, $model::class); - }, ARRAY_FILTER_USE_BOTH); - - // Format listeners Eloquent verb => Observer methods... - $extractVerb = function ($key) { - preg_match('/eloquent.([a-zA-Z]+)\: /', $key, $matches); - - return $matches[1] ?? '?'; - }; - - $formatted = []; - - foreach ($listeners as $key => $observerMethods) { - $formatted[] = [ - 'event' => $extractVerb($key), - 'observer' => array_map(fn ($obs) => is_string($obs) ? $obs : 'Closure', $observerMethods), - ]; - } - - return new BaseCollection($formatted); - } - - /** - * Get the collection class being used by the model. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return class-string<\Illuminate\Database\Eloquent\Collection> - */ - protected function getCollectedBy($model) - { - return $model->newCollection()::class; - } - - /** - * Get the builder class being used by the model. - * - * @template TModel of \Illuminate\Database\Eloquent\Model - * - * @param TModel $model - * @return class-string<\Illuminate\Database\Eloquent\Builder> - */ - protected function getBuilder($model) - { - return $model->newQuery()::class; - } - - /** - * Qualify the given model class base name. - * - * @param string $model - * @return class-string<\Illuminate\Database\Eloquent\Model> - * - * @see \Illuminate\Console\GeneratorCommand - */ - protected function qualifyModel(string $model) - { - if (str_contains($model, '\\') && class_exists($model)) { - return $model; - } - - $model = ltrim($model, '\\/'); - - $model = str_replace('/', '\\', $model); - - $rootNamespace = $this->app->getNamespace(); - - if (Str::startsWith($model, $rootNamespace)) { - return $model; - } - - return is_dir(app_path('Models')) - ? $rootNamespace.'Models\\'.$model - : $rootNamespace.$model; - } - - /** - * Get the cast type for the given column. - * - * @param string $column - * @param \Illuminate\Database\Eloquent\Model $model - * @return string|null - */ - protected function getCastType($column, $model) - { - if ($model->hasGetMutator($column) || $model->hasSetMutator($column)) { - return 'accessor'; - } - - if ($model->hasAttributeMutator($column)) { - return 'attribute'; - } - - return $this->getCastsWithDates($model)->get($column) ?? null; - } - - /** - * Get the model casts, including any date casts. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return \Illuminate\Support\Collection - */ - protected function getCastsWithDates($model) - { - return (new BaseCollection($model->getDates())) - ->filter() - ->flip() - ->map(fn () => 'datetime') - ->merge($model->getCasts()); - } - - /** - * Determine if the given attribute is hidden. - * - * @param string $attribute - * @param \Illuminate\Database\Eloquent\Model $model - * @return bool - */ - protected function attributeIsHidden($attribute, $model) - { - if (count($model->getHidden()) > 0) { - return in_array($attribute, $model->getHidden()); - } - - if (count($model->getVisible()) > 0) { - return ! in_array($attribute, $model->getVisible()); - } - - return false; - } - - /** - * Get the default value for the given column. - * - * @param array $column - * @param \Illuminate\Database\Eloquent\Model $model - * @return mixed|null - */ - protected function getColumnDefault($column, $model) - { - $attributeDefault = $model->getAttributes()[$column['name']] ?? null; - - return enum_value($attributeDefault) ?? $column['default']; - } - - /** - * Determine if the given attribute is unique. - * - * @param string $column - * @param array $indexes - * @return bool - */ - protected function columnIsUnique($column, $indexes) - { - return (new BaseCollection($indexes))->contains( - fn ($index) => count($index['columns']) === 1 && $index['columns'][0] === $column && $index['unique'] - ); - } -} diff --git a/vendor/illuminate/database/Eloquent/ModelNotFoundException.php b/vendor/illuminate/database/Eloquent/ModelNotFoundException.php deleted file mode 100644 index 79ae8a3..0000000 --- a/vendor/illuminate/database/Eloquent/ModelNotFoundException.php +++ /dev/null @@ -1,69 +0,0 @@ - - */ - protected $model; - - /** - * The affected model IDs. - * - * @var array - */ - protected $ids; - - /** - * Set the affected Eloquent model and instance ids. - * - * @param class-string $model - * @param array|int|string $ids - * @return $this - */ - public function setModel($model, $ids = []) - { - $this->model = $model; - $this->ids = Arr::wrap($ids); - - $this->message = "No query results for model [{$model}]"; - - if (count($this->ids) > 0) { - $this->message .= ' '.implode(', ', $this->ids); - } else { - $this->message .= '.'; - } - - return $this; - } - - /** - * Get the affected Eloquent model. - * - * @return class-string - */ - public function getModel() - { - return $this->model; - } - - /** - * Get the affected Eloquent model IDs. - * - * @return array - */ - public function getIds() - { - return $this->ids; - } -} diff --git a/vendor/illuminate/database/Eloquent/PendingHasThroughRelationship.php b/vendor/illuminate/database/Eloquent/PendingHasThroughRelationship.php deleted file mode 100644 index ec79b38..0000000 --- a/vendor/illuminate/database/Eloquent/PendingHasThroughRelationship.php +++ /dev/null @@ -1,117 +0,0 @@ - - */ -class PendingHasThroughRelationship -{ - /** - * The root model that the relationship exists on. - * - * @var TDeclaringModel - */ - protected $rootModel; - - /** - * The local relationship. - * - * @var TLocalRelationship - */ - protected $localRelationship; - - /** - * Create a pending has-many-through or has-one-through relationship. - * - * @param TDeclaringModel $rootModel - * @param TLocalRelationship $localRelationship - */ - public function __construct($rootModel, $localRelationship) - { - $this->rootModel = $rootModel; - - $this->localRelationship = $localRelationship; - } - - /** - * Define the distant relationship that this model has. - * - * @template TRelatedModel of \Illuminate\Database\Eloquent\Model - * - * @param string|(callable(TIntermediateModel): (\Illuminate\Database\Eloquent\Relations\HasOne|\Illuminate\Database\Eloquent\Relations\HasMany|\Illuminate\Database\Eloquent\Relations\MorphOneOrMany)) $callback - * @return ( - * $callback is string - * ? \Illuminate\Database\Eloquent\Relations\HasManyThrough<\Illuminate\Database\Eloquent\Model, TIntermediateModel, TDeclaringModel>|\Illuminate\Database\Eloquent\Relations\HasOneThrough<\Illuminate\Database\Eloquent\Model, TIntermediateModel, TDeclaringModel> - * : ( - * TLocalRelationship is \Illuminate\Database\Eloquent\Relations\HasMany - * ? \Illuminate\Database\Eloquent\Relations\HasManyThrough - * : ( - * $callback is callable(TIntermediateModel): \Illuminate\Database\Eloquent\Relations\HasMany - * ? \Illuminate\Database\Eloquent\Relations\HasManyThrough - * : \Illuminate\Database\Eloquent\Relations\HasOneThrough - * ) - * ) - * ) - */ - public function has($callback) - { - if (is_string($callback)) { - $callback = fn () => $this->localRelationship->getRelated()->{$callback}(); - } - - $distantRelation = $callback($this->localRelationship->getRelated()); - - if ($distantRelation instanceof HasMany || $this->localRelationship instanceof HasMany) { - $returnedRelation = $this->rootModel->hasManyThrough( - $distantRelation->getRelated()::class, - $this->localRelationship->getRelated()::class, - $this->localRelationship->getForeignKeyName(), - $distantRelation->getForeignKeyName(), - $this->localRelationship->getLocalKeyName(), - $distantRelation->getLocalKeyName(), - ); - } else { - $returnedRelation = $this->rootModel->hasOneThrough( - $distantRelation->getRelated()::class, - $this->localRelationship->getRelated()::class, - $this->localRelationship->getForeignKeyName(), - $distantRelation->getForeignKeyName(), - $this->localRelationship->getLocalKeyName(), - $distantRelation->getLocalKeyName(), - ); - } - - if ($this->localRelationship instanceof MorphOneOrMany) { - $returnedRelation->where($this->localRelationship->getQualifiedMorphType(), $this->localRelationship->getMorphClass()); - } - - return $returnedRelation; - } - - /** - * Handle dynamic method calls into the model. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - if (Str::startsWith($method, 'has')) { - return $this->has((new Stringable($method))->after('has')->lcfirst()->toString()); - } - - throw new BadMethodCallException(sprintf( - 'Call to undefined method %s::%s()', static::class, $method - )); - } -} diff --git a/vendor/illuminate/database/Eloquent/Prunable.php b/vendor/illuminate/database/Eloquent/Prunable.php deleted file mode 100644 index 7377691..0000000 --- a/vendor/illuminate/database/Eloquent/Prunable.php +++ /dev/null @@ -1,67 +0,0 @@ -prunable() - ->when(in_array(SoftDeletes::class, class_uses_recursive(static::class)), function ($query) { - $query->withTrashed(); - })->chunkById($chunkSize, function ($models) use (&$total) { - $models->each->prune(); - - $total += $models->count(); - - event(new ModelsPruned(static::class, $total)); - }); - - return $total; - } - - /** - * Get the prunable model query. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public function prunable() - { - throw new LogicException('Please implement the prunable method on your model.'); - } - - /** - * Prune the model in the database. - * - * @return bool|null - */ - public function prune() - { - $this->pruning(); - - return in_array(SoftDeletes::class, class_uses_recursive(static::class)) - ? $this->forceDelete() - : $this->delete(); - } - - /** - * Prepare the model for pruning. - * - * @return void - */ - protected function pruning() - { - // - } -} diff --git a/vendor/illuminate/database/Eloquent/QueueEntityResolver.php b/vendor/illuminate/database/Eloquent/QueueEntityResolver.php deleted file mode 100644 index 22fccf2..0000000 --- a/vendor/illuminate/database/Eloquent/QueueEntityResolver.php +++ /dev/null @@ -1,29 +0,0 @@ -find($id); - - if ($instance) { - return $instance; - } - - throw new EntityNotFoundException($type, $id); - } -} diff --git a/vendor/illuminate/database/Eloquent/RelationNotFoundException.php b/vendor/illuminate/database/Eloquent/RelationNotFoundException.php deleted file mode 100644 index 73257bb..0000000 --- a/vendor/illuminate/database/Eloquent/RelationNotFoundException.php +++ /dev/null @@ -1,46 +0,0 @@ -model = $class; - $instance->relation = $relation; - - return $instance; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/BelongsTo.php b/vendor/illuminate/database/Eloquent/Relations/BelongsTo.php deleted file mode 100644 index d38d512..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/BelongsTo.php +++ /dev/null @@ -1,383 +0,0 @@ - - */ -class BelongsTo extends Relation -{ - use ComparesRelatedModels, - InteractsWithDictionary, - SupportsDefaultModels; - - /** - * The child model instance of the relation. - * - * @var TDeclaringModel - */ - protected $child; - - /** - * The foreign key of the parent model. - * - * @var string - */ - protected $foreignKey; - - /** - * The associated key on the parent model. - * - * @var string - */ - protected $ownerKey; - - /** - * The name of the relationship. - * - * @var string - */ - protected $relationName; - - /** - * Create a new belongs to relationship instance. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $child - * @param string $foreignKey - * @param string $ownerKey - * @param string $relationName - * @return void - */ - public function __construct(Builder $query, Model $child, $foreignKey, $ownerKey, $relationName) - { - $this->ownerKey = $ownerKey; - $this->relationName = $relationName; - $this->foreignKey = $foreignKey; - - // In the underlying base relationship class, this variable is referred to as - // the "parent" since most relationships are not inversed. But, since this - // one is we will create a "child" variable for much better readability. - $this->child = $child; - - parent::__construct($query, $child); - } - - /** @inheritDoc */ - public function getResults() - { - if (is_null($this->getForeignKeyFrom($this->child))) { - return $this->getDefaultFor($this->parent); - } - - return $this->query->first() ?: $this->getDefaultFor($this->parent); - } - - /** - * Set the base constraints on the relation query. - * - * @return void - */ - public function addConstraints() - { - if (static::$constraints) { - // For belongs to relationships, which are essentially the inverse of has one - // or has many relationships, we need to actually query on the primary key - // of the related models matching on the foreign key that's on a parent. - $key = $this->getQualifiedOwnerKeyName(); - - $this->query->where($key, '=', $this->getForeignKeyFrom($this->child)); - } - } - - /** @inheritDoc */ - public function addEagerConstraints(array $models) - { - // We'll grab the primary key name of the related models since it could be set to - // a non-standard name and not "id". We will then construct the constraint for - // our eagerly loading query so it returns the proper models from execution. - $key = $this->getQualifiedOwnerKeyName(); - - $whereIn = $this->whereInMethod($this->related, $this->ownerKey); - - $this->whereInEager($whereIn, $key, $this->getEagerModelKeys($models)); - } - - /** - * Gather the keys from an array of related models. - * - * @param array $models - * @return array - */ - protected function getEagerModelKeys(array $models) - { - $keys = []; - - // First we need to gather all of the keys from the parent models so we know what - // to query for via the eager loading query. We will add them to an array then - // execute a "where in" statement to gather up all of those related records. - foreach ($models as $model) { - if (! is_null($value = $this->getForeignKeyFrom($model))) { - $keys[] = $value; - } - } - - sort($keys); - - return array_values(array_unique($keys)); - } - - /** @inheritDoc */ - public function initRelation(array $models, $relation) - { - foreach ($models as $model) { - $model->setRelation($relation, $this->getDefaultFor($model)); - } - - return $models; - } - - /** @inheritDoc */ - public function match(array $models, EloquentCollection $results, $relation) - { - // First we will get to build a dictionary of the child models by their primary - // key of the relationship, then we can easily match the children back onto - // the parents using that dictionary and the primary key of the children. - $dictionary = []; - - foreach ($results as $result) { - $attribute = $this->getDictionaryKey($this->getRelatedKeyFrom($result)); - - $dictionary[$attribute] = $result; - } - - // Once we have the dictionary constructed, we can loop through all the parents - // and match back onto their children using these keys of the dictionary and - // the primary key of the children to map them onto the correct instances. - foreach ($models as $model) { - $attribute = $this->getDictionaryKey($this->getForeignKeyFrom($model)); - - if (isset($dictionary[$attribute])) { - $model->setRelation($relation, $dictionary[$attribute]); - } - } - - return $models; - } - - /** - * Associate the model instance to the given parent. - * - * @param TRelatedModel|int|string|null $model - * @return TDeclaringModel - */ - public function associate($model) - { - $ownerKey = $model instanceof Model ? $model->getAttribute($this->ownerKey) : $model; - - $this->child->setAttribute($this->foreignKey, $ownerKey); - - if ($model instanceof Model) { - $this->child->setRelation($this->relationName, $model); - } else { - $this->child->unsetRelation($this->relationName); - } - - return $this->child; - } - - /** - * Dissociate previously associated model from the given parent. - * - * @return TDeclaringModel - */ - public function dissociate() - { - $this->child->setAttribute($this->foreignKey, null); - - return $this->child->setRelation($this->relationName, null); - } - - /** - * Alias of "dissociate" method. - * - * @return TDeclaringModel - */ - public function disassociate() - { - return $this->dissociate(); - } - - /** - * Touch all of the related models for the relationship. - * - * @return void - */ - public function touch() - { - if (! is_null($this->getParentKey())) { - parent::touch(); - } - } - - /** @inheritDoc */ - public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $columns = ['*']) - { - if ($parentQuery->getQuery()->from == $query->getQuery()->from) { - return $this->getRelationExistenceQueryForSelfRelation($query, $parentQuery, $columns); - } - - return $query->select($columns)->whereColumn( - $this->getQualifiedForeignKeyName(), '=', $query->qualifyColumn($this->ownerKey) - ); - } - - /** - * Add the constraints for a relationship query on the same table. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param \Illuminate\Database\Eloquent\Builder $parentQuery - * @param array|mixed $columns - * @return \Illuminate\Database\Eloquent\Builder - */ - public function getRelationExistenceQueryForSelfRelation(Builder $query, Builder $parentQuery, $columns = ['*']) - { - $query->select($columns)->from( - $query->getModel()->getTable().' as '.$hash = $this->getRelationCountHash() - ); - - $query->getModel()->setTable($hash); - - return $query->whereColumn( - $hash.'.'.$this->ownerKey, '=', $this->getQualifiedForeignKeyName() - ); - } - - /** - * Determine if the related model has an auto-incrementing ID. - * - * @return bool - */ - protected function relationHasIncrementingId() - { - return $this->related->getIncrementing() && - in_array($this->related->getKeyType(), ['int', 'integer']); - } - - /** - * Make a new related instance for the given model. - * - * @param TDeclaringModel $parent - * @return TRelatedModel - */ - protected function newRelatedInstanceFor(Model $parent) - { - return $this->related->newInstance(); - } - - /** - * Get the child of the relationship. - * - * @return TDeclaringModel - */ - public function getChild() - { - return $this->child; - } - - /** - * Get the foreign key of the relationship. - * - * @return string - */ - public function getForeignKeyName() - { - return $this->foreignKey; - } - - /** - * Get the fully qualified foreign key of the relationship. - * - * @return string - */ - public function getQualifiedForeignKeyName() - { - return $this->child->qualifyColumn($this->foreignKey); - } - - /** - * Get the key value of the child's foreign key. - * - * @return mixed - */ - public function getParentKey() - { - return $this->getForeignKeyFrom($this->child); - } - - /** - * Get the associated key of the relationship. - * - * @return string - */ - public function getOwnerKeyName() - { - return $this->ownerKey; - } - - /** - * Get the fully qualified associated key of the relationship. - * - * @return string - */ - public function getQualifiedOwnerKeyName() - { - return $this->related->qualifyColumn($this->ownerKey); - } - - /** - * Get the value of the model's foreign key. - * - * @param TRelatedModel $model - * @return int|string - */ - protected function getRelatedKeyFrom(Model $model) - { - return $model->{$this->ownerKey}; - } - - /** - * Get the value of the model's foreign key. - * - * @param TDeclaringModel $model - * @return mixed - */ - protected function getForeignKeyFrom(Model $model) - { - $foreignKey = $model->{$this->foreignKey}; - - return enum_value($foreignKey); - } - - /** - * Get the name of the relationship. - * - * @return string - */ - public function getRelationName() - { - return $this->relationName; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/BelongsToMany.php b/vendor/illuminate/database/Eloquent/Relations/BelongsToMany.php deleted file mode 100644 index 7019cf4..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/BelongsToMany.php +++ /dev/null @@ -1,1657 +0,0 @@ -> - */ -class BelongsToMany extends Relation -{ - use InteractsWithDictionary, InteractsWithPivotTable; - - /** - * The intermediate table for the relation. - * - * @var string - */ - protected $table; - - /** - * The foreign key of the parent model. - * - * @var string - */ - protected $foreignPivotKey; - - /** - * The associated key of the relation. - * - * @var string - */ - protected $relatedPivotKey; - - /** - * The key name of the parent model. - * - * @var string - */ - protected $parentKey; - - /** - * The key name of the related model. - * - * @var string - */ - protected $relatedKey; - - /** - * The "name" of the relationship. - * - * @var string - */ - protected $relationName; - - /** - * The pivot table columns to retrieve. - * - * @var array - */ - protected $pivotColumns = []; - - /** - * Any pivot table restrictions for where clauses. - * - * @var array - */ - protected $pivotWheres = []; - - /** - * Any pivot table restrictions for whereIn clauses. - * - * @var array - */ - protected $pivotWhereIns = []; - - /** - * Any pivot table restrictions for whereNull clauses. - * - * @var array - */ - protected $pivotWhereNulls = []; - - /** - * The default values for the pivot columns. - * - * @var array - */ - protected $pivotValues = []; - - /** - * Indicates if timestamps are available on the pivot table. - * - * @var bool - */ - public $withTimestamps = false; - - /** - * The custom pivot table column for the created_at timestamp. - * - * @var string|null - */ - protected $pivotCreatedAt; - - /** - * The custom pivot table column for the updated_at timestamp. - * - * @var string|null - */ - protected $pivotUpdatedAt; - - /** - * The class name of the custom pivot model to use for the relationship. - * - * @var string - */ - protected $using; - - /** - * The name of the accessor to use for the "pivot" relationship. - * - * @var string - */ - protected $accessor = 'pivot'; - - /** - * Create a new belongs to many relationship instance. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string|class-string $table - * @param string $foreignPivotKey - * @param string $relatedPivotKey - * @param string $parentKey - * @param string $relatedKey - * @param string|null $relationName - * @return void - */ - public function __construct( - Builder $query, - Model $parent, - $table, - $foreignPivotKey, - $relatedPivotKey, - $parentKey, - $relatedKey, - $relationName = null, - ) { - $this->parentKey = $parentKey; - $this->relatedKey = $relatedKey; - $this->relationName = $relationName; - $this->relatedPivotKey = $relatedPivotKey; - $this->foreignPivotKey = $foreignPivotKey; - $this->table = $this->resolveTableName($table); - - parent::__construct($query, $parent); - } - - /** - * Attempt to resolve the intermediate table name from the given string. - * - * @param string $table - * @return string - */ - protected function resolveTableName($table) - { - if (! str_contains($table, '\\') || ! class_exists($table)) { - return $table; - } - - $model = new $table; - - if (! $model instanceof Model) { - return $table; - } - - if (in_array(AsPivot::class, class_uses_recursive($model))) { - $this->using($table); - } - - return $model->getTable(); - } - - /** - * Set the base constraints on the relation query. - * - * @return void - */ - public function addConstraints() - { - $this->performJoin(); - - if (static::$constraints) { - $this->addWhereConstraints(); - } - } - - /** - * Set the join clause for the relation query. - * - * @param \Illuminate\Database\Eloquent\Builder|null $query - * @return $this - */ - protected function performJoin($query = null) - { - $query = $query ?: $this->query; - - // We need to join to the intermediate table on the related model's primary - // key column with the intermediate table's foreign key for the related - // model instance. Then we can set the "where" for the parent models. - $query->join( - $this->table, - $this->getQualifiedRelatedKeyName(), - '=', - $this->getQualifiedRelatedPivotKeyName() - ); - - return $this; - } - - /** - * Set the where clause for the relation query. - * - * @return $this - */ - protected function addWhereConstraints() - { - $this->query->where( - $this->getQualifiedForeignPivotKeyName(), '=', $this->parent->{$this->parentKey} - ); - - return $this; - } - - /** @inheritDoc */ - public function addEagerConstraints(array $models) - { - $whereIn = $this->whereInMethod($this->parent, $this->parentKey); - - $this->whereInEager( - $whereIn, - $this->getQualifiedForeignPivotKeyName(), - $this->getKeys($models, $this->parentKey) - ); - } - - /** @inheritDoc */ - public function initRelation(array $models, $relation) - { - foreach ($models as $model) { - $model->setRelation($relation, $this->related->newCollection()); - } - - return $models; - } - - /** @inheritDoc */ - public function match(array $models, EloquentCollection $results, $relation) - { - $dictionary = $this->buildDictionary($results); - - // Once we have an array dictionary of child objects we can easily match the - // children back to their parent using the dictionary and the keys on the - // parent models. Then we should return these hydrated models back out. - foreach ($models as $model) { - $key = $this->getDictionaryKey($model->{$this->parentKey}); - - if (isset($dictionary[$key])) { - $model->setRelation( - $relation, $this->related->newCollection($dictionary[$key]) - ); - } - } - - return $models; - } - - /** - * Build model dictionary keyed by the relation's foreign key. - * - * @param \Illuminate\Database\Eloquent\Collection $results - * @return array> - */ - protected function buildDictionary(EloquentCollection $results) - { - // First we'll build a dictionary of child models keyed by the foreign key - // of the relation so that we will easily and quickly match them to the - // parents without having a possibly slow inner loop for every model. - $dictionary = []; - - foreach ($results as $result) { - $value = $this->getDictionaryKey($result->{$this->accessor}->{$this->foreignPivotKey}); - - $dictionary[$value][] = $result; - } - - return $dictionary; - } - - /** - * Get the class being used for pivot models. - * - * @return string - */ - public function getPivotClass() - { - return $this->using ?? Pivot::class; - } - - /** - * Specify the custom pivot model to use for the relationship. - * - * @param string $class - * @return $this - */ - public function using($class) - { - $this->using = $class; - - return $this; - } - - /** - * Specify the custom pivot accessor to use for the relationship. - * - * @param string $accessor - * @return $this - */ - public function as($accessor) - { - $this->accessor = $accessor; - - return $this; - } - - /** - * Set a where clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return $this - */ - public function wherePivot($column, $operator = null, $value = null, $boolean = 'and') - { - $this->pivotWheres[] = func_get_args(); - - return $this->where($this->qualifyPivotColumn($column), $operator, $value, $boolean); - } - - /** - * Set a "where between" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param array $values - * @param string $boolean - * @param bool $not - * @return $this - */ - public function wherePivotBetween($column, array $values, $boolean = 'and', $not = false) - { - return $this->whereBetween($this->qualifyPivotColumn($column), $values, $boolean, $not); - } - - /** - * Set a "or where between" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param array $values - * @return $this - */ - public function orWherePivotBetween($column, array $values) - { - return $this->wherePivotBetween($column, $values, 'or'); - } - - /** - * Set a "where pivot not between" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param array $values - * @param string $boolean - * @return $this - */ - public function wherePivotNotBetween($column, array $values, $boolean = 'and') - { - return $this->wherePivotBetween($column, $values, $boolean, true); - } - - /** - * Set a "or where not between" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param array $values - * @return $this - */ - public function orWherePivotNotBetween($column, array $values) - { - return $this->wherePivotBetween($column, $values, 'or', true); - } - - /** - * Set a "where in" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $values - * @param string $boolean - * @param bool $not - * @return $this - */ - public function wherePivotIn($column, $values, $boolean = 'and', $not = false) - { - $this->pivotWhereIns[] = func_get_args(); - - return $this->whereIn($this->qualifyPivotColumn($column), $values, $boolean, $not); - } - - /** - * Set an "or where" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWherePivot($column, $operator = null, $value = null) - { - return $this->wherePivot($column, $operator, $value, 'or'); - } - - /** - * Set a where clause for a pivot table column. - * - * In addition, new pivot records will receive this value. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression|array $column - * @param mixed $value - * @return $this - * - * @throws \InvalidArgumentException - */ - public function withPivotValue($column, $value = null) - { - if (is_array($column)) { - foreach ($column as $name => $value) { - $this->withPivotValue($name, $value); - } - - return $this; - } - - if (is_null($value)) { - throw new InvalidArgumentException('The provided value may not be null.'); - } - - $this->pivotValues[] = compact('column', 'value'); - - return $this->wherePivot($column, '=', $value); - } - - /** - * Set an "or where in" clause for a pivot table column. - * - * @param string $column - * @param mixed $values - * @return $this - */ - public function orWherePivotIn($column, $values) - { - return $this->wherePivotIn($column, $values, 'or'); - } - - /** - * Set a "where not in" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $values - * @param string $boolean - * @return $this - */ - public function wherePivotNotIn($column, $values, $boolean = 'and') - { - return $this->wherePivotIn($column, $values, $boolean, true); - } - - /** - * Set an "or where not in" clause for a pivot table column. - * - * @param string $column - * @param mixed $values - * @return $this - */ - public function orWherePivotNotIn($column, $values) - { - return $this->wherePivotNotIn($column, $values, 'or'); - } - - /** - * Set a "where null" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param string $boolean - * @param bool $not - * @return $this - */ - public function wherePivotNull($column, $boolean = 'and', $not = false) - { - $this->pivotWhereNulls[] = func_get_args(); - - return $this->whereNull($this->qualifyPivotColumn($column), $boolean, $not); - } - - /** - * Set a "where not null" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param string $boolean - * @return $this - */ - public function wherePivotNotNull($column, $boolean = 'and') - { - return $this->wherePivotNull($column, $boolean, true); - } - - /** - * Set a "or where null" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param bool $not - * @return $this - */ - public function orWherePivotNull($column, $not = false) - { - return $this->wherePivotNull($column, 'or', $not); - } - - /** - * Set a "or where not null" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return $this - */ - public function orWherePivotNotNull($column) - { - return $this->orWherePivotNull($column, true); - } - - /** - * Add an "order by" clause for a pivot table column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param string $direction - * @return $this - */ - public function orderByPivot($column, $direction = 'asc') - { - return $this->orderBy($this->qualifyPivotColumn($column), $direction); - } - - /** - * Find a related model by its primary key or return a new instance of the related model. - * - * @param mixed $id - * @param array $columns - * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TRelatedModel) - */ - public function findOrNew($id, $columns = ['*']) - { - if (is_null($instance = $this->find($id, $columns))) { - $instance = $this->related->newInstance(); - } - - return $instance; - } - - /** - * Get the first related model record matching the attributes or instantiate it. - * - * @param array $attributes - * @param array $values - * @return TRelatedModel - */ - public function firstOrNew(array $attributes = [], array $values = []) - { - if (is_null($instance = $this->related->where($attributes)->first())) { - $instance = $this->related->newInstance(array_merge($attributes, $values)); - } - - return $instance; - } - - /** - * Get the first record matching the attributes. If the record is not found, create it. - * - * @param array $attributes - * @param array $values - * @param array $joining - * @param bool $touch - * @return TRelatedModel - */ - public function firstOrCreate(array $attributes = [], array $values = [], array $joining = [], $touch = true) - { - if (is_null($instance = (clone $this)->where($attributes)->first())) { - if (is_null($instance = $this->related->where($attributes)->first())) { - $instance = $this->createOrFirst($attributes, $values, $joining, $touch); - } else { - try { - $this->getQuery()->withSavepointIfNeeded(fn () => $this->attach($instance, $joining, $touch)); - } catch (UniqueConstraintViolationException) { - // Nothing to do, the model was already attached... - } - } - } - - return $instance; - } - - /** - * Attempt to create the record. If a unique constraint violation occurs, attempt to find the matching record. - * - * @param array $attributes - * @param array $values - * @param array $joining - * @param bool $touch - * @return TRelatedModel - */ - public function createOrFirst(array $attributes = [], array $values = [], array $joining = [], $touch = true) - { - try { - return $this->getQuery()->withSavePointIfNeeded(fn () => $this->create(array_merge($attributes, $values), $joining, $touch)); - } catch (UniqueConstraintViolationException $e) { - // ... - } - - try { - return tap($this->related->where($attributes)->first() ?? throw $e, function ($instance) use ($joining, $touch) { - $this->getQuery()->withSavepointIfNeeded(fn () => $this->attach($instance, $joining, $touch)); - }); - } catch (UniqueConstraintViolationException $e) { - return (clone $this)->useWritePdo()->where($attributes)->first() ?? throw $e; - } - } - - /** - * Create or update a related record matching the attributes, and fill it with values. - * - * @param array $attributes - * @param array $values - * @param array $joining - * @param bool $touch - * @return TRelatedModel - */ - public function updateOrCreate(array $attributes, array $values = [], array $joining = [], $touch = true) - { - return tap($this->firstOrCreate($attributes, $values, $joining, $touch), function ($instance) use ($values) { - if (! $instance->wasRecentlyCreated) { - $instance->fill($values); - - $instance->save(['touch' => false]); - } - }); - } - - /** - * Find a related model by its primary key. - * - * @param mixed $id - * @param array $columns - * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TRelatedModel|null) - */ - public function find($id, $columns = ['*']) - { - if (! $id instanceof Model && (is_array($id) || $id instanceof Arrayable)) { - return $this->findMany($id, $columns); - } - - return $this->where( - $this->getRelated()->getQualifiedKeyName(), '=', $this->parseId($id) - )->first($columns); - } - - /** - * Find a sole related model by its primary key. - * - * @param mixed $id - * @param array $columns - * @return TRelatedModel - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - * @throws \Illuminate\Database\MultipleRecordsFoundException - */ - public function findSole($id, $columns = ['*']) - { - return $this->where( - $this->getRelated()->getQualifiedKeyName(), '=', $this->parseId($id) - )->sole($columns); - } - - /** - * Find multiple related models by their primary keys. - * - * @param \Illuminate\Contracts\Support\Arrayable|array $ids - * @param array $columns - * @return \Illuminate\Database\Eloquent\Collection - */ - public function findMany($ids, $columns = ['*']) - { - $ids = $ids instanceof Arrayable ? $ids->toArray() : $ids; - - if (empty($ids)) { - return $this->getRelated()->newCollection(); - } - - return $this->whereKey( - $this->parseIds($ids) - )->get($columns); - } - - /** - * Find a related model by its primary key or throw an exception. - * - * @param mixed $id - * @param array $columns - * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TRelatedModel) - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function findOrFail($id, $columns = ['*']) - { - $result = $this->find($id, $columns); - - $id = $id instanceof Arrayable ? $id->toArray() : $id; - - if (is_array($id)) { - if (count($result) === count(array_unique($id))) { - return $result; - } - } elseif (! is_null($result)) { - return $result; - } - - throw (new ModelNotFoundException)->setModel(get_class($this->related), $id); - } - - /** - * Find a related model by its primary key or call a callback. - * - * @template TValue - * - * @param mixed $id - * @param (\Closure(): TValue)|list|string $columns - * @param (\Closure(): TValue)|null $callback - * @return ( - * $id is (\Illuminate\Contracts\Support\Arrayable|array) - * ? \Illuminate\Database\Eloquent\Collection|TValue - * : TRelatedModel|TValue - * ) - */ - public function findOr($id, $columns = ['*'], ?Closure $callback = null) - { - if ($columns instanceof Closure) { - $callback = $columns; - - $columns = ['*']; - } - - $result = $this->find($id, $columns); - - $id = $id instanceof Arrayable ? $id->toArray() : $id; - - if (is_array($id)) { - if (count($result) === count(array_unique($id))) { - return $result; - } - } elseif (! is_null($result)) { - return $result; - } - - return $callback(); - } - - /** - * Add a basic where clause to the query, and return the first result. - * - * @param \Closure|string|array $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return TRelatedModel|null - */ - public function firstWhere($column, $operator = null, $value = null, $boolean = 'and') - { - return $this->where($column, $operator, $value, $boolean)->first(); - } - - /** - * Execute the query and get the first result. - * - * @param array $columns - * @return TRelatedModel|null - */ - public function first($columns = ['*']) - { - $results = $this->take(1)->get($columns); - - return count($results) > 0 ? $results->first() : null; - } - - /** - * Execute the query and get the first result or throw an exception. - * - * @param array $columns - * @return TRelatedModel - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function firstOrFail($columns = ['*']) - { - if (! is_null($model = $this->first($columns))) { - return $model; - } - - throw (new ModelNotFoundException)->setModel(get_class($this->related)); - } - - /** - * Execute the query and get the first result or call a callback. - * - * @template TValue - * - * @param (\Closure(): TValue)|list $columns - * @param (\Closure(): TValue)|null $callback - * @return TRelatedModel|TValue - */ - public function firstOr($columns = ['*'], ?Closure $callback = null) - { - if ($columns instanceof Closure) { - $callback = $columns; - - $columns = ['*']; - } - - if (! is_null($model = $this->first($columns))) { - return $model; - } - - return $callback(); - } - - /** @inheritDoc */ - public function getResults() - { - return ! is_null($this->parent->{$this->parentKey}) - ? $this->get() - : $this->related->newCollection(); - } - - /** @inheritDoc */ - public function get($columns = ['*']) - { - // First we'll add the proper select columns onto the query so it is run with - // the proper columns. Then, we will get the results and hydrate our pivot - // models with the result of those columns as a separate model relation. - $builder = $this->query->applyScopes(); - - $columns = $builder->getQuery()->columns ? [] : $columns; - - $models = $builder->addSelect( - $this->shouldSelect($columns) - )->getModels(); - - $this->hydratePivotRelation($models); - - // If we actually found models we will also eager load any relationships that - // have been specified as needing to be eager loaded. This will solve the - // n + 1 query problem for the developer and also increase performance. - if (count($models) > 0) { - $models = $builder->eagerLoadRelations($models); - } - - return $this->query->applyAfterQueryCallbacks( - $this->related->newCollection($models) - ); - } - - /** - * Get the select columns for the relation query. - * - * @param array $columns - * @return array - */ - protected function shouldSelect(array $columns = ['*']) - { - if ($columns == ['*']) { - $columns = [$this->related->qualifyColumn('*')]; - } - - return array_merge($columns, $this->aliasedPivotColumns()); - } - - /** - * Get the pivot columns for the relation. - * - * "pivot_" is prefixed at each column for easy removal later. - * - * @return array - */ - protected function aliasedPivotColumns() - { - $defaults = [$this->foreignPivotKey, $this->relatedPivotKey]; - - return (new BaseCollection(array_merge($defaults, $this->pivotColumns)))->map(function ($column) { - return $this->qualifyPivotColumn($column).' as pivot_'.$column; - })->unique()->all(); - } - - /** - * Get a paginator for the "select" statement. - * - * @param int|null $perPage - * @param array $columns - * @param string $pageName - * @param int|null $page - * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator - */ - public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) - { - $this->query->addSelect($this->shouldSelect($columns)); - - return tap($this->query->paginate($perPage, $columns, $pageName, $page), function ($paginator) { - $this->hydratePivotRelation($paginator->items()); - }); - } - - /** - * Paginate the given query into a simple paginator. - * - * @param int|null $perPage - * @param array $columns - * @param string $pageName - * @param int|null $page - * @return \Illuminate\Contracts\Pagination\Paginator - */ - public function simplePaginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) - { - $this->query->addSelect($this->shouldSelect($columns)); - - return tap($this->query->simplePaginate($perPage, $columns, $pageName, $page), function ($paginator) { - $this->hydratePivotRelation($paginator->items()); - }); - } - - /** - * Paginate the given query into a cursor paginator. - * - * @param int|null $perPage - * @param array $columns - * @param string $cursorName - * @param string|null $cursor - * @return \Illuminate\Contracts\Pagination\CursorPaginator - */ - public function cursorPaginate($perPage = null, $columns = ['*'], $cursorName = 'cursor', $cursor = null) - { - $this->query->addSelect($this->shouldSelect($columns)); - - return tap($this->query->cursorPaginate($perPage, $columns, $cursorName, $cursor), function ($paginator) { - $this->hydratePivotRelation($paginator->items()); - }); - } - - /** - * Chunk the results of the query. - * - * @param int $count - * @param callable $callback - * @return bool - */ - public function chunk($count, callable $callback) - { - return $this->prepareQueryBuilder()->chunk($count, function ($results, $page) use ($callback) { - $this->hydratePivotRelation($results->all()); - - return $callback($results, $page); - }); - } - - /** - * Chunk the results of a query by comparing numeric IDs. - * - * @param int $count - * @param callable $callback - * @param string|null $column - * @param string|null $alias - * @return bool - */ - public function chunkById($count, callable $callback, $column = null, $alias = null) - { - return $this->orderedChunkById($count, $callback, $column, $alias); - } - - /** - * Chunk the results of a query by comparing IDs in descending order. - * - * @param int $count - * @param callable $callback - * @param string|null $column - * @param string|null $alias - * @return bool - */ - public function chunkByIdDesc($count, callable $callback, $column = null, $alias = null) - { - return $this->orderedChunkById($count, $callback, $column, $alias, descending: true); - } - - /** - * Execute a callback over each item while chunking by ID. - * - * @param callable $callback - * @param int $count - * @param string|null $column - * @param string|null $alias - * @return bool - */ - public function eachById(callable $callback, $count = 1000, $column = null, $alias = null) - { - return $this->chunkById($count, function ($results, $page) use ($callback, $count) { - foreach ($results as $key => $value) { - if ($callback($value, (($page - 1) * $count) + $key) === false) { - return false; - } - } - }, $column, $alias); - } - - /** - * Chunk the results of a query by comparing IDs in a given order. - * - * @param int $count - * @param callable $callback - * @param string|null $column - * @param string|null $alias - * @param bool $descending - * @return bool - */ - public function orderedChunkById($count, callable $callback, $column = null, $alias = null, $descending = false) - { - $column ??= $this->getRelated()->qualifyColumn( - $this->getRelatedKeyName() - ); - - $alias ??= $this->getRelatedKeyName(); - - return $this->prepareQueryBuilder()->orderedChunkById($count, function ($results, $page) use ($callback) { - $this->hydratePivotRelation($results->all()); - - return $callback($results, $page); - }, $column, $alias, $descending); - } - - /** - * Execute a callback over each item while chunking. - * - * @param callable $callback - * @param int $count - * @return bool - */ - public function each(callable $callback, $count = 1000) - { - return $this->chunk($count, function ($results) use ($callback) { - foreach ($results as $key => $value) { - if ($callback($value, $key) === false) { - return false; - } - } - }); - } - - /** - * Query lazily, by chunks of the given size. - * - * @param int $chunkSize - * @return \Illuminate\Support\LazyCollection - */ - public function lazy($chunkSize = 1000) - { - return $this->prepareQueryBuilder()->lazy($chunkSize)->map(function ($model) { - $this->hydratePivotRelation([$model]); - - return $model; - }); - } - - /** - * Query lazily, by chunking the results of a query by comparing IDs. - * - * @param int $chunkSize - * @param string|null $column - * @param string|null $alias - * @return \Illuminate\Support\LazyCollection - */ - public function lazyById($chunkSize = 1000, $column = null, $alias = null) - { - $column ??= $this->getRelated()->qualifyColumn( - $this->getRelatedKeyName() - ); - - $alias ??= $this->getRelatedKeyName(); - - return $this->prepareQueryBuilder()->lazyById($chunkSize, $column, $alias)->map(function ($model) { - $this->hydratePivotRelation([$model]); - - return $model; - }); - } - - /** - * Query lazily, by chunking the results of a query by comparing IDs in descending order. - * - * @param int $chunkSize - * @param string|null $column - * @param string|null $alias - * @return \Illuminate\Support\LazyCollection - */ - public function lazyByIdDesc($chunkSize = 1000, $column = null, $alias = null) - { - $column ??= $this->getRelated()->qualifyColumn( - $this->getRelatedKeyName() - ); - - $alias ??= $this->getRelatedKeyName(); - - return $this->prepareQueryBuilder()->lazyByIdDesc($chunkSize, $column, $alias)->map(function ($model) { - $this->hydratePivotRelation([$model]); - - return $model; - }); - } - - /** - * Get a lazy collection for the given query. - * - * @return \Illuminate\Support\LazyCollection - */ - public function cursor() - { - return $this->prepareQueryBuilder()->cursor()->map(function ($model) { - $this->hydratePivotRelation([$model]); - - return $model; - }); - } - - /** - * Prepare the query builder for query execution. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function prepareQueryBuilder() - { - return $this->query->addSelect($this->shouldSelect()); - } - - /** - * Hydrate the pivot table relationship on the models. - * - * @param array $models - * @return void - */ - protected function hydratePivotRelation(array $models) - { - // To hydrate the pivot relationship, we will just gather the pivot attributes - // and create a new Pivot model, which is basically a dynamic model that we - // will set the attributes, table, and connections on it so it will work. - foreach ($models as $model) { - $model->setRelation($this->accessor, $this->newExistingPivot( - $this->migratePivotAttributes($model) - )); - } - } - - /** - * Get the pivot attributes from a model. - * - * @param TRelatedModel $model - * @return array - */ - protected function migratePivotAttributes(Model $model) - { - $values = []; - - foreach ($model->getAttributes() as $key => $value) { - // To get the pivots attributes we will just take any of the attributes which - // begin with "pivot_" and add those to this arrays, as well as unsetting - // them from the parent's models since they exist in a different table. - if (str_starts_with($key, 'pivot_')) { - $values[substr($key, 6)] = $value; - - unset($model->$key); - } - } - - return $values; - } - - /** - * If we're touching the parent model, touch. - * - * @return void - */ - public function touchIfTouching() - { - if ($this->touchingParent()) { - $this->getParent()->touch(); - } - - if ($this->getParent()->touches($this->relationName)) { - $this->touch(); - } - } - - /** - * Determine if we should touch the parent on sync. - * - * @return bool - */ - protected function touchingParent() - { - return $this->getRelated()->touches($this->guessInverseRelation()); - } - - /** - * Attempt to guess the name of the inverse of the relation. - * - * @return string - */ - protected function guessInverseRelation() - { - return Str::camel(Str::pluralStudly(class_basename($this->getParent()))); - } - - /** - * Touch all of the related models for the relationship. - * - * E.g.: Touch all roles associated with this user. - * - * @return void - */ - public function touch() - { - if ($this->related->isIgnoringTouch()) { - return; - } - - $columns = [ - $this->related->getUpdatedAtColumn() => $this->related->freshTimestampString(), - ]; - - // If we actually have IDs for the relation, we will run the query to update all - // the related model's timestamps, to make sure these all reflect the changes - // to the parent models. This will help us keep any caching synced up here. - if (count($ids = $this->allRelatedIds()) > 0) { - $this->getRelated()->newQueryWithoutRelationships()->whereKey($ids)->update($columns); - } - } - - /** - * Get all of the IDs for the related models. - * - * @return \Illuminate\Support\Collection - */ - public function allRelatedIds() - { - return $this->newPivotQuery()->pluck($this->relatedPivotKey); - } - - /** - * Save a new model and attach it to the parent model. - * - * @param TRelatedModel $model - * @param array $pivotAttributes - * @param bool $touch - * @return TRelatedModel - */ - public function save(Model $model, array $pivotAttributes = [], $touch = true) - { - $model->save(['touch' => false]); - - $this->attach($model, $pivotAttributes, $touch); - - return $model; - } - - /** - * Save a new model without raising any events and attach it to the parent model. - * - * @param TRelatedModel $model - * @param array $pivotAttributes - * @param bool $touch - * @return TRelatedModel - */ - public function saveQuietly(Model $model, array $pivotAttributes = [], $touch = true) - { - return Model::withoutEvents(function () use ($model, $pivotAttributes, $touch) { - return $this->save($model, $pivotAttributes, $touch); - }); - } - - /** - * Save an array of new models and attach them to the parent model. - * - * @template TContainer of \Illuminate\Support\Collection|array - * - * @param TContainer $models - * @param array $pivotAttributes - * @return TContainer - */ - public function saveMany($models, array $pivotAttributes = []) - { - foreach ($models as $key => $model) { - $this->save($model, (array) ($pivotAttributes[$key] ?? []), false); - } - - $this->touchIfTouching(); - - return $models; - } - - /** - * Save an array of new models without raising any events and attach them to the parent model. - * - * @template TContainer of \Illuminate\Support\Collection|array - * - * @param TContainer $models - * @param array $pivotAttributes - * @return TContainer - */ - public function saveManyQuietly($models, array $pivotAttributes = []) - { - return Model::withoutEvents(function () use ($models, $pivotAttributes) { - return $this->saveMany($models, $pivotAttributes); - }); - } - - /** - * Create a new instance of the related model. - * - * @param array $attributes - * @param array $joining - * @param bool $touch - * @return TRelatedModel - */ - public function create(array $attributes = [], array $joining = [], $touch = true) - { - $attributes = array_merge($this->getQuery()->pendingAttributes, $attributes); - - $instance = $this->related->newInstance($attributes); - - // Once we save the related model, we need to attach it to the base model via - // through intermediate table so we'll use the existing "attach" method to - // accomplish this which will insert the record and any more attributes. - $instance->save(['touch' => false]); - - $this->attach($instance, $joining, $touch); - - return $instance; - } - - /** - * Create an array of new instances of the related models. - * - * @param iterable $records - * @param array $joinings - * @return array - */ - public function createMany(iterable $records, array $joinings = []) - { - $instances = []; - - foreach ($records as $key => $record) { - $instances[] = $this->create($record, (array) ($joinings[$key] ?? []), false); - } - - $this->touchIfTouching(); - - return $instances; - } - - /** @inheritDoc */ - public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $columns = ['*']) - { - if ($parentQuery->getQuery()->from == $query->getQuery()->from) { - return $this->getRelationExistenceQueryForSelfJoin($query, $parentQuery, $columns); - } - - $this->performJoin($query); - - return parent::getRelationExistenceQuery($query, $parentQuery, $columns); - } - - /** - * Add the constraints for a relationship query on the same table. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param \Illuminate\Database\Eloquent\Builder $parentQuery - * @param array|mixed $columns - * @return \Illuminate\Database\Eloquent\Builder - */ - public function getRelationExistenceQueryForSelfJoin(Builder $query, Builder $parentQuery, $columns = ['*']) - { - $query->select($columns); - - $query->from($this->related->getTable().' as '.$hash = $this->getRelationCountHash()); - - $this->related->setTable($hash); - - $this->performJoin($query); - - return parent::getRelationExistenceQuery($query, $parentQuery, $columns); - } - - /** - * Alias to set the "limit" value of the query. - * - * @param int $value - * @return $this - */ - public function take($value) - { - return $this->limit($value); - } - - /** - * Set the "limit" value of the query. - * - * @param int $value - * @return $this - */ - public function limit($value) - { - if ($this->parent->exists) { - $this->query->limit($value); - } else { - $column = $this->getExistenceCompareKey(); - - $grammar = $this->query->getQuery()->getGrammar(); - - if ($grammar instanceof MySqlGrammar && $grammar->useLegacyGroupLimit($this->query->getQuery())) { - $column = 'pivot_'.last(explode('.', $column)); - } - - $this->query->groupLimit($value, $column); - } - - return $this; - } - - /** - * Get the key for comparing against the parent key in "has" query. - * - * @return string - */ - public function getExistenceCompareKey() - { - return $this->getQualifiedForeignPivotKeyName(); - } - - /** - * Specify that the pivot table has creation and update timestamps. - * - * @param mixed $createdAt - * @param mixed $updatedAt - * @return $this - */ - public function withTimestamps($createdAt = null, $updatedAt = null) - { - $this->withTimestamps = true; - - $this->pivotCreatedAt = $createdAt; - $this->pivotUpdatedAt = $updatedAt; - - return $this->withPivot($this->createdAt(), $this->updatedAt()); - } - - /** - * Get the name of the "created at" column. - * - * @return string - */ - public function createdAt() - { - return $this->pivotCreatedAt ?? $this->parent->getCreatedAtColumn() ?? Model::CREATED_AT; - } - - /** - * Get the name of the "updated at" column. - * - * @return string - */ - public function updatedAt() - { - return $this->pivotUpdatedAt ?? $this->parent->getUpdatedAtColumn() ?? Model::UPDATED_AT; - } - - /** - * Get the foreign key for the relation. - * - * @return string - */ - public function getForeignPivotKeyName() - { - return $this->foreignPivotKey; - } - - /** - * Get the fully qualified foreign key for the relation. - * - * @return string - */ - public function getQualifiedForeignPivotKeyName() - { - return $this->qualifyPivotColumn($this->foreignPivotKey); - } - - /** - * Get the "related key" for the relation. - * - * @return string - */ - public function getRelatedPivotKeyName() - { - return $this->relatedPivotKey; - } - - /** - * Get the fully qualified "related key" for the relation. - * - * @return string - */ - public function getQualifiedRelatedPivotKeyName() - { - return $this->qualifyPivotColumn($this->relatedPivotKey); - } - - /** - * Get the parent key for the relationship. - * - * @return string - */ - public function getParentKeyName() - { - return $this->parentKey; - } - - /** - * Get the fully qualified parent key name for the relation. - * - * @return string - */ - public function getQualifiedParentKeyName() - { - return $this->parent->qualifyColumn($this->parentKey); - } - - /** - * Get the related key for the relationship. - * - * @return string - */ - public function getRelatedKeyName() - { - return $this->relatedKey; - } - - /** - * Get the fully qualified related key name for the relation. - * - * @return string - */ - public function getQualifiedRelatedKeyName() - { - return $this->related->qualifyColumn($this->relatedKey); - } - - /** - * Get the intermediate table for the relationship. - * - * @return string - */ - public function getTable() - { - return $this->table; - } - - /** - * Get the relationship name for the relationship. - * - * @return string - */ - public function getRelationName() - { - return $this->relationName; - } - - /** - * Get the name of the pivot accessor for this relationship. - * - * @return string - */ - public function getPivotAccessor() - { - return $this->accessor; - } - - /** - * Get the pivot columns for this relationship. - * - * @return array - */ - public function getPivotColumns() - { - return $this->pivotColumns; - } - - /** - * Qualify the given column name by the pivot table. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return string|\Illuminate\Contracts\Database\Query\Expression - */ - public function qualifyPivotColumn($column) - { - if ($this->query->getQuery()->getGrammar()->isExpression($column)) { - return $column; - } - - return str_contains($column, '.') - ? $column - : $this->table.'.'.$column; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/Concerns/AsPivot.php b/vendor/illuminate/database/Eloquent/Relations/Concerns/AsPivot.php deleted file mode 100644 index afd328a..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/Concerns/AsPivot.php +++ /dev/null @@ -1,354 +0,0 @@ -timestamps = $instance->hasTimestampAttributes($attributes); - - // The pivot model is a "dynamic" model since we will set the tables dynamically - // for the instance. This allows it work for any intermediate tables for the - // many to many relationship that are defined by this developer's classes. - $instance->setConnection($parent->getConnectionName()) - ->setTable($table) - ->forceFill($attributes) - ->syncOriginal(); - - // We store off the parent instance so we will access the timestamp column names - // for the model, since the pivot model timestamps aren't easily configurable - // from the developer's point of view. We can use the parents to get these. - $instance->pivotParent = $parent; - - $instance->exists = $exists; - - return $instance; - } - - /** - * Create a new pivot model from raw values returned from a query. - * - * @param \Illuminate\Database\Eloquent\Model $parent - * @param array $attributes - * @param string $table - * @param bool $exists - * @return static - */ - public static function fromRawAttributes(Model $parent, $attributes, $table, $exists = false) - { - $instance = static::fromAttributes($parent, [], $table, $exists); - - $instance->timestamps = $instance->hasTimestampAttributes($attributes); - - $instance->setRawAttributes( - array_merge($instance->getRawOriginal(), $attributes), $exists - ); - - return $instance; - } - - /** - * Set the keys for a select query. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function setKeysForSelectQuery($query) - { - if (isset($this->attributes[$this->getKeyName()])) { - return parent::setKeysForSelectQuery($query); - } - - $query->where($this->foreignKey, $this->getOriginal( - $this->foreignKey, $this->getAttribute($this->foreignKey) - )); - - return $query->where($this->relatedKey, $this->getOriginal( - $this->relatedKey, $this->getAttribute($this->relatedKey) - )); - } - - /** - * Set the keys for a save update query. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function setKeysForSaveQuery($query) - { - return $this->setKeysForSelectQuery($query); - } - - /** - * Delete the pivot model record from the database. - * - * @return int - */ - public function delete() - { - if (isset($this->attributes[$this->getKeyName()])) { - return (int) parent::delete(); - } - - if ($this->fireModelEvent('deleting') === false) { - return 0; - } - - $this->touchOwners(); - - return tap($this->getDeleteQuery()->delete(), function () { - $this->exists = false; - - $this->fireModelEvent('deleted', false); - }); - } - - /** - * Get the query builder for a delete operation on the pivot. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function getDeleteQuery() - { - return $this->newQueryWithoutRelationships()->where([ - $this->foreignKey => $this->getOriginal($this->foreignKey, $this->getAttribute($this->foreignKey)), - $this->relatedKey => $this->getOriginal($this->relatedKey, $this->getAttribute($this->relatedKey)), - ]); - } - - /** - * Get the table associated with the model. - * - * @return string - */ - public function getTable() - { - if (! isset($this->table)) { - $this->setTable(str_replace( - '\\', '', Str::snake(Str::singular(class_basename($this))) - )); - } - - return $this->table; - } - - /** - * Get the foreign key column name. - * - * @return string - */ - public function getForeignKey() - { - return $this->foreignKey; - } - - /** - * Get the "related key" column name. - * - * @return string - */ - public function getRelatedKey() - { - return $this->relatedKey; - } - - /** - * Get the "related key" column name. - * - * @return string - */ - public function getOtherKey() - { - return $this->getRelatedKey(); - } - - /** - * Set the key names for the pivot model instance. - * - * @param string $foreignKey - * @param string $relatedKey - * @return $this - */ - public function setPivotKeys($foreignKey, $relatedKey) - { - $this->foreignKey = $foreignKey; - - $this->relatedKey = $relatedKey; - - return $this; - } - - /** - * Set the related model of the relationship. - * - * @param \Illuminate\Database\Eloquent\Model|null $related - * @return $this - */ - public function setRelatedModel(?Model $related = null) - { - $this->pivotRelated = $related; - - return $this; - } - - /** - * Determine if the pivot model or given attributes has timestamp attributes. - * - * @param array|null $attributes - * @return bool - */ - public function hasTimestampAttributes($attributes = null) - { - return array_key_exists($this->getCreatedAtColumn(), $attributes ?? $this->attributes); - } - - /** - * Get the name of the "created at" column. - * - * @return string - */ - public function getCreatedAtColumn() - { - return $this->pivotParent - ? $this->pivotParent->getCreatedAtColumn() - : parent::getCreatedAtColumn(); - } - - /** - * Get the name of the "updated at" column. - * - * @return string - */ - public function getUpdatedAtColumn() - { - return $this->pivotParent - ? $this->pivotParent->getUpdatedAtColumn() - : parent::getUpdatedAtColumn(); - } - - /** - * Get the queueable identity for the entity. - * - * @return mixed - */ - public function getQueueableId() - { - if (isset($this->attributes[$this->getKeyName()])) { - return $this->getKey(); - } - - return sprintf( - '%s:%s:%s:%s', - $this->foreignKey, $this->getAttribute($this->foreignKey), - $this->relatedKey, $this->getAttribute($this->relatedKey) - ); - } - - /** - * Get a new query to restore one or more models by their queueable IDs. - * - * @param int[]|string[]|string $ids - * @return \Illuminate\Database\Eloquent\Builder - */ - public function newQueryForRestoration($ids) - { - if (is_array($ids)) { - return $this->newQueryForCollectionRestoration($ids); - } - - if (! str_contains($ids, ':')) { - return parent::newQueryForRestoration($ids); - } - - $segments = explode(':', $ids); - - return $this->newQueryWithoutScopes() - ->where($segments[0], $segments[1]) - ->where($segments[2], $segments[3]); - } - - /** - * Get a new query to restore multiple models by their queueable IDs. - * - * @param int[]|string[] $ids - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function newQueryForCollectionRestoration(array $ids) - { - $ids = array_values($ids); - - if (! str_contains($ids[0], ':')) { - return parent::newQueryForRestoration($ids); - } - - $query = $this->newQueryWithoutScopes(); - - foreach ($ids as $id) { - $segments = explode(':', $id); - - $query->orWhere(function ($query) use ($segments) { - return $query->where($segments[0], $segments[1]) - ->where($segments[2], $segments[3]); - }); - } - - return $query; - } - - /** - * Unset all the loaded relations for the instance. - * - * @return $this - */ - public function unsetRelations() - { - $this->pivotParent = null; - $this->pivotRelated = null; - $this->relations = []; - - return $this; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/Concerns/CanBeOneOfMany.php b/vendor/illuminate/database/Eloquent/Relations/Concerns/CanBeOneOfMany.php deleted file mode 100644 index 800999f..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/Concerns/CanBeOneOfMany.php +++ /dev/null @@ -1,332 +0,0 @@ -|null - */ - protected $oneOfManySubQuery; - - /** - * Add constraints for inner join subselect for one of many relationships. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $query - * @param string|null $column - * @param string|null $aggregate - * @return void - */ - abstract public function addOneOfManySubQueryConstraints(Builder $query, $column = null, $aggregate = null); - - /** - * Get the columns the determine the relationship groups. - * - * @return array|string - */ - abstract public function getOneOfManySubQuerySelectColumns(); - - /** - * Add join query constraints for one of many relationships. - * - * @param \Illuminate\Database\Query\JoinClause $join - * @return void - */ - abstract public function addOneOfManyJoinSubQueryConstraints(JoinClause $join); - - /** - * Indicate that the relation is a single result of a larger one-to-many relationship. - * - * @param string|array|null $column - * @param string|\Closure|null $aggregate - * @param string|null $relation - * @return $this - * - * @throws \InvalidArgumentException - */ - public function ofMany($column = 'id', $aggregate = 'MAX', $relation = null) - { - $this->isOneOfMany = true; - - $this->relationName = $relation ?: $this->getDefaultOneOfManyJoinAlias( - $this->guessRelationship() - ); - - $keyName = $this->query->getModel()->getKeyName(); - - $columns = is_string($columns = $column) ? [ - $column => $aggregate, - $keyName => $aggregate, - ] : $column; - - if (! array_key_exists($keyName, $columns)) { - $columns[$keyName] = 'MAX'; - } - - if ($aggregate instanceof Closure) { - $closure = $aggregate; - } - - foreach ($columns as $column => $aggregate) { - if (! in_array(strtolower($aggregate), ['min', 'max'])) { - throw new InvalidArgumentException("Invalid aggregate [{$aggregate}] used within ofMany relation. Available aggregates: MIN, MAX"); - } - - $subQuery = $this->newOneOfManySubQuery( - $this->getOneOfManySubQuerySelectColumns(), - array_merge([$column], $previous['columns'] ?? []), - $aggregate, - ); - - if (isset($previous)) { - $this->addOneOfManyJoinSubQuery( - $subQuery, - $previous['subQuery'], - $previous['columns'], - ); - } - - if (isset($closure)) { - $closure($subQuery); - } - - if (! isset($previous)) { - $this->oneOfManySubQuery = $subQuery; - } - - if (array_key_last($columns) == $column) { - $this->addOneOfManyJoinSubQuery( - $this->query, - $subQuery, - array_merge([$column], $previous['columns'] ?? []), - ); - } - - $previous = [ - 'subQuery' => $subQuery, - 'columns' => array_merge([$column], $previous['columns'] ?? []), - ]; - } - - $this->addConstraints(); - - $columns = $this->query->getQuery()->columns; - - if (is_null($columns) || $columns === ['*']) { - $this->select([$this->qualifyColumn('*')]); - } - - return $this; - } - - /** - * Indicate that the relation is the latest single result of a larger one-to-many relationship. - * - * @param string|array|null $column - * @param string|null $relation - * @return $this - */ - public function latestOfMany($column = 'id', $relation = null) - { - return $this->ofMany(Collection::wrap($column)->mapWithKeys(function ($column) { - return [$column => 'MAX']; - })->all(), 'MAX', $relation); - } - - /** - * Indicate that the relation is the oldest single result of a larger one-to-many relationship. - * - * @param string|array|null $column - * @param string|null $relation - * @return $this - */ - public function oldestOfMany($column = 'id', $relation = null) - { - return $this->ofMany(Collection::wrap($column)->mapWithKeys(function ($column) { - return [$column => 'MIN']; - })->all(), 'MIN', $relation); - } - - /** - * Get the default alias for the one of many inner join clause. - * - * @param string $relation - * @return string - */ - protected function getDefaultOneOfManyJoinAlias($relation) - { - return $relation == $this->query->getModel()->getTable() - ? $relation.'_of_many' - : $relation; - } - - /** - * Get a new query for the related model, grouping the query by the given column, often the foreign key of the relationship. - * - * @param string|array $groupBy - * @param array|null $columns - * @param string|null $aggregate - * @return \Illuminate\Database\Eloquent\Builder<*> - */ - protected function newOneOfManySubQuery($groupBy, $columns = null, $aggregate = null) - { - $subQuery = $this->query->getModel() - ->newQuery() - ->withoutGlobalScopes($this->removedScopes()); - - foreach (Arr::wrap($groupBy) as $group) { - $subQuery->groupBy($this->qualifyRelatedColumn($group)); - } - - if (! is_null($columns)) { - foreach ($columns as $key => $column) { - $aggregatedColumn = $subQuery->getQuery()->grammar->wrap($subQuery->qualifyColumn($column)); - - if ($key === 0) { - $aggregatedColumn = "{$aggregate}({$aggregatedColumn})"; - } else { - $aggregatedColumn = "min({$aggregatedColumn})"; - } - - $subQuery->selectRaw($aggregatedColumn.' as '.$subQuery->getQuery()->grammar->wrap($column.'_aggregate')); - } - } - - $this->addOneOfManySubQueryConstraints($subQuery, column: null, aggregate: $aggregate); - - return $subQuery; - } - - /** - * Add the join subquery to the given query on the given column and the relationship's foreign key. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $parent - * @param \Illuminate\Database\Eloquent\Builder<*> $subQuery - * @param array $on - * @return void - */ - protected function addOneOfManyJoinSubQuery(Builder $parent, Builder $subQuery, $on) - { - $parent->beforeQuery(function ($parent) use ($subQuery, $on) { - $subQuery->applyBeforeQueryCallbacks(); - - $parent->joinSub($subQuery, $this->relationName, function ($join) use ($on) { - foreach ($on as $onColumn) { - $join->on($this->qualifySubSelectColumn($onColumn.'_aggregate'), '=', $this->qualifyRelatedColumn($onColumn)); - } - - $this->addOneOfManyJoinSubQueryConstraints($join); - }); - }); - } - - /** - * Merge the relationship query joins to the given query builder. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $query - * @return void - */ - protected function mergeOneOfManyJoinsTo(Builder $query) - { - $query->getQuery()->beforeQueryCallbacks = $this->query->getQuery()->beforeQueryCallbacks; - - $query->applyBeforeQueryCallbacks(); - } - - /** - * Get the query builder that will contain the relationship constraints. - * - * @return \Illuminate\Database\Eloquent\Builder<*> - */ - protected function getRelationQuery() - { - return $this->isOneOfMany() - ? $this->oneOfManySubQuery - : $this->query; - } - - /** - * Get the one of many inner join subselect builder instance. - * - * @return \Illuminate\Database\Eloquent\Builder<*>|void - */ - public function getOneOfManySubQuery() - { - return $this->oneOfManySubQuery; - } - - /** - * Get the qualified column name for the one-of-many relationship using the subselect join query's alias. - * - * @param string $column - * @return string - */ - public function qualifySubSelectColumn($column) - { - return $this->getRelationName().'.'.last(explode('.', $column)); - } - - /** - * Qualify related column using the related table name if it is not already qualified. - * - * @param string $column - * @return string - */ - protected function qualifyRelatedColumn($column) - { - return $this->query->getModel()->qualifyColumn($column); - } - - /** - * Guess the "hasOne" relationship's name via backtrace. - * - * @return string - */ - protected function guessRelationship() - { - return debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]['function']; - } - - /** - * Determine whether the relationship is a one-of-many relationship. - * - * @return bool - */ - public function isOneOfMany() - { - return $this->isOneOfMany; - } - - /** - * Get the name of the relationship. - * - * @return string - */ - public function getRelationName() - { - return $this->relationName; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/Concerns/ComparesRelatedModels.php b/vendor/illuminate/database/Eloquent/Relations/Concerns/ComparesRelatedModels.php deleted file mode 100644 index 3dccf13..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/Concerns/ComparesRelatedModels.php +++ /dev/null @@ -1,77 +0,0 @@ -compareKeys($this->getParentKey(), $this->getRelatedKeyFrom($model)) && - $this->related->getTable() === $model->getTable() && - $this->related->getConnectionName() === $model->getConnectionName(); - - if ($match && $this instanceof SupportsPartialRelations && $this->isOneOfMany()) { - return $this->query - ->whereKey($model->getKey()) - ->exists(); - } - - return $match; - } - - /** - * Determine if the model is not the related instance of the relationship. - * - * @param \Illuminate\Database\Eloquent\Model|null $model - * @return bool - */ - public function isNot($model) - { - return ! $this->is($model); - } - - /** - * Get the value of the parent model's key. - * - * @return mixed - */ - abstract public function getParentKey(); - - /** - * Get the value of the model's related key. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return mixed - */ - abstract protected function getRelatedKeyFrom(Model $model); - - /** - * Compare the parent key with the related key. - * - * @param mixed $parentKey - * @param mixed $relatedKey - * @return bool - */ - protected function compareKeys($parentKey, $relatedKey) - { - if (empty($parentKey) || empty($relatedKey)) { - return false; - } - - if (is_int($parentKey) || is_int($relatedKey)) { - return (int) $parentKey === (int) $relatedKey; - } - - return $parentKey === $relatedKey; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/Concerns/InteractsWithDictionary.php b/vendor/illuminate/database/Eloquent/Relations/Concerns/InteractsWithDictionary.php deleted file mode 100644 index d94432e..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/Concerns/InteractsWithDictionary.php +++ /dev/null @@ -1,36 +0,0 @@ -__toString(); - } - - if ($attribute instanceof UnitEnum) { - return enum_value($attribute); - } - - throw new InvalidArgumentException('Model attribute value is an object but does not have a __toString method.'); - } - - return $attribute; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php b/vendor/illuminate/database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php deleted file mode 100644 index f09de94..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php +++ /dev/null @@ -1,694 +0,0 @@ - [], 'detached' => [], - ]; - - $records = $this->formatRecordsList($this->parseIds($ids)); - - // Next, we will determine which IDs should get removed from the join table by - // checking which of the given ID/records is in the list of current records - // and removing all of those rows from this "intermediate" joining table. - $detach = array_values(array_intersect( - $this->newPivotQuery()->pluck($this->relatedPivotKey)->all(), - array_keys($records) - )); - - if (count($detach) > 0) { - $this->detach($detach, false); - - $changes['detached'] = $this->castKeys($detach); - } - - // Finally, for all of the records which were not "detached", we'll attach the - // records into the intermediate table. Then, we will add those attaches to - // this change list and get ready to return these results to the callers. - $attach = array_diff_key($records, array_flip($detach)); - - if (count($attach) > 0) { - $this->attach($attach, [], false); - - $changes['attached'] = array_keys($attach); - } - - // Once we have finished attaching or detaching the records, we will see if we - // have done any attaching or detaching, and if we have we will touch these - // relationships if they are configured to touch on any database updates. - if ($touch && (count($changes['attached']) || - count($changes['detached']))) { - $this->touchIfTouching(); - } - - return $changes; - } - - /** - * Sync the intermediate tables with a list of IDs without detaching. - * - * @param \Illuminate\Support\Collection|\Illuminate\Database\Eloquent\Model|array $ids - * @return array{attached: array, detached: array, updated: array} - */ - public function syncWithoutDetaching($ids) - { - return $this->sync($ids, false); - } - - /** - * Sync the intermediate tables with a list of IDs or collection of models. - * - * @param \Illuminate\Support\Collection|\Illuminate\Database\Eloquent\Model|array $ids - * @param bool $detaching - * @return array{attached: array, detached: array, updated: array} - */ - public function sync($ids, $detaching = true) - { - $changes = [ - 'attached' => [], 'detached' => [], 'updated' => [], - ]; - - // First we need to attach any of the associated models that are not currently - // in this joining table. We'll spin through the given IDs, checking to see - // if they exist in the array of current ones, and if not we will insert. - $current = $this->getCurrentlyAttachedPivots() - ->pluck($this->relatedPivotKey)->all(); - - $records = $this->formatRecordsList($this->parseIds($ids)); - - // Next, we will take the differences of the currents and given IDs and detach - // all of the entities that exist in the "current" array but are not in the - // array of the new IDs given to the method which will complete the sync. - if ($detaching) { - $detach = array_diff($current, array_keys($records)); - - if (count($detach) > 0) { - $this->detach($detach, false); - - $changes['detached'] = $this->castKeys($detach); - } - } - - // Now we are finally ready to attach the new records. Note that we'll disable - // touching until after the entire operation is complete so we don't fire a - // ton of touch operations until we are totally done syncing the records. - $changes = array_merge( - $changes, $this->attachNew($records, $current, false) - ); - - // Once we have finished attaching or detaching the records, we will see if we - // have done any attaching or detaching, and if we have we will touch these - // relationships if they are configured to touch on any database updates. - if (count($changes['attached']) || - count($changes['updated']) || - count($changes['detached'])) { - $this->touchIfTouching(); - } - - return $changes; - } - - /** - * Sync the intermediate tables with a list of IDs or collection of models with the given pivot values. - * - * @param \Illuminate\Support\Collection|\Illuminate\Database\Eloquent\Model|array $ids - * @param array $values - * @param bool $detaching - * @return array{attached: array, detached: array, updated: array} - */ - public function syncWithPivotValues($ids, array $values, bool $detaching = true) - { - return $this->sync((new BaseCollection($this->parseIds($ids)))->mapWithKeys(function ($id) use ($values) { - return [$id => $values]; - }), $detaching); - } - - /** - * Format the sync / toggle record list so that it is keyed by ID. - * - * @param array $records - * @return array - */ - protected function formatRecordsList(array $records) - { - return (new BaseCollection($records))->mapWithKeys(function ($attributes, $id) { - if (! is_array($attributes)) { - [$id, $attributes] = [$attributes, []]; - } - - if ($id instanceof BackedEnum) { - $id = $id->value; - } - - return [$id => $attributes]; - })->all(); - } - - /** - * Attach all of the records that aren't in the given current records. - * - * @param array $records - * @param array $current - * @param bool $touch - * @return array - */ - protected function attachNew(array $records, array $current, $touch = true) - { - $changes = ['attached' => [], 'updated' => []]; - - foreach ($records as $id => $attributes) { - // If the ID is not in the list of existing pivot IDs, we will insert a new pivot - // record, otherwise, we will just update this existing record on this joining - // table, so that the developers will easily update these records pain free. - if (! in_array($id, $current)) { - $this->attach($id, $attributes, $touch); - - $changes['attached'][] = $this->castKey($id); - } - - // Now we'll try to update an existing pivot record with the attributes that were - // given to the method. If the model is actually updated we will add it to the - // list of updated pivot records so we return them back out to the consumer. - elseif (count($attributes) > 0 && - $this->updateExistingPivot($id, $attributes, $touch)) { - $changes['updated'][] = $this->castKey($id); - } - } - - return $changes; - } - - /** - * Update an existing pivot record on the table. - * - * @param mixed $id - * @param array $attributes - * @param bool $touch - * @return int - */ - public function updateExistingPivot($id, array $attributes, $touch = true) - { - if ($this->using && - empty($this->pivotWheres) && - empty($this->pivotWhereIns) && - empty($this->pivotWhereNulls)) { - return $this->updateExistingPivotUsingCustomClass($id, $attributes, $touch); - } - - if ($this->hasPivotColumn($this->updatedAt())) { - $attributes = $this->addTimestampsToAttachment($attributes, true); - } - - $updated = $this->newPivotStatementForId($this->parseId($id))->update( - $this->castAttributes($attributes) - ); - - if ($touch) { - $this->touchIfTouching(); - } - - return $updated; - } - - /** - * Update an existing pivot record on the table via a custom class. - * - * @param mixed $id - * @param array $attributes - * @param bool $touch - * @return int - */ - protected function updateExistingPivotUsingCustomClass($id, array $attributes, $touch) - { - $pivot = $this->getCurrentlyAttachedPivots() - ->where($this->foreignPivotKey, $this->parent->{$this->parentKey}) - ->where($this->relatedPivotKey, $this->parseId($id)) - ->first(); - - $updated = $pivot ? $pivot->fill($attributes)->isDirty() : false; - - if ($updated) { - $pivot->save(); - } - - if ($touch) { - $this->touchIfTouching(); - } - - return (int) $updated; - } - - /** - * Attach a model to the parent. - * - * @param mixed $id - * @param array $attributes - * @param bool $touch - * @return void - */ - public function attach($id, array $attributes = [], $touch = true) - { - if ($this->using) { - $this->attachUsingCustomClass($id, $attributes); - } else { - // Here we will insert the attachment records into the pivot table. Once we have - // inserted the records, we will touch the relationships if necessary and the - // function will return. We can parse the IDs before inserting the records. - $this->newPivotStatement()->insert($this->formatAttachRecords( - $this->parseIds($id), $attributes - )); - } - - if ($touch) { - $this->touchIfTouching(); - } - } - - /** - * Attach a model to the parent using a custom class. - * - * @param mixed $id - * @param array $attributes - * @return void - */ - protected function attachUsingCustomClass($id, array $attributes) - { - $records = $this->formatAttachRecords( - $this->parseIds($id), $attributes - ); - - foreach ($records as $record) { - $this->newPivot($record, false)->save(); - } - } - - /** - * Create an array of records to insert into the pivot table. - * - * @param array $ids - * @param array $attributes - * @return array - */ - protected function formatAttachRecords($ids, array $attributes) - { - $records = []; - - $hasTimestamps = ($this->hasPivotColumn($this->createdAt()) || - $this->hasPivotColumn($this->updatedAt())); - - // To create the attachment records, we will simply spin through the IDs given - // and create a new record to insert for each ID. Each ID may actually be a - // key in the array, with extra attributes to be placed in other columns. - foreach ($ids as $key => $value) { - $records[] = $this->formatAttachRecord( - $key, $value, $attributes, $hasTimestamps - ); - } - - return $records; - } - - /** - * Create a full attachment record payload. - * - * @param int $key - * @param mixed $value - * @param array $attributes - * @param bool $hasTimestamps - * @return array - */ - protected function formatAttachRecord($key, $value, $attributes, $hasTimestamps) - { - [$id, $attributes] = $this->extractAttachIdAndAttributes($key, $value, $attributes); - - return array_merge( - $this->baseAttachRecord($id, $hasTimestamps), $this->castAttributes($attributes) - ); - } - - /** - * Get the attach record ID and extra attributes. - * - * @param mixed $key - * @param mixed $value - * @param array $attributes - * @return array - */ - protected function extractAttachIdAndAttributes($key, $value, array $attributes) - { - return is_array($value) - ? [$key, array_merge($value, $attributes)] - : [$value, $attributes]; - } - - /** - * Create a new pivot attachment record. - * - * @param int $id - * @param bool $timed - * @return array - */ - protected function baseAttachRecord($id, $timed) - { - $record[$this->relatedPivotKey] = $id; - - $record[$this->foreignPivotKey] = $this->parent->{$this->parentKey}; - - // If the record needs to have creation and update timestamps, we will make - // them by calling the parent model's "freshTimestamp" method which will - // provide us with a fresh timestamp in this model's preferred format. - if ($timed) { - $record = $this->addTimestampsToAttachment($record); - } - - foreach ($this->pivotValues as $value) { - $record[$value['column']] = $value['value']; - } - - return $record; - } - - /** - * Set the creation and update timestamps on an attach record. - * - * @param array $record - * @param bool $exists - * @return array - */ - protected function addTimestampsToAttachment(array $record, $exists = false) - { - $fresh = $this->parent->freshTimestamp(); - - if ($this->using) { - $pivotModel = new $this->using; - - $fresh = $pivotModel->fromDateTime($fresh); - } - - if (! $exists && $this->hasPivotColumn($this->createdAt())) { - $record[$this->createdAt()] = $fresh; - } - - if ($this->hasPivotColumn($this->updatedAt())) { - $record[$this->updatedAt()] = $fresh; - } - - return $record; - } - - /** - * Determine whether the given column is defined as a pivot column. - * - * @param string $column - * @return bool - */ - public function hasPivotColumn($column) - { - return in_array($column, $this->pivotColumns); - } - - /** - * Detach models from the relationship. - * - * @param mixed $ids - * @param bool $touch - * @return int - */ - public function detach($ids = null, $touch = true) - { - if ($this->using && - ! empty($ids) && - empty($this->pivotWheres) && - empty($this->pivotWhereIns) && - empty($this->pivotWhereNulls)) { - $results = $this->detachUsingCustomClass($ids); - } else { - $query = $this->newPivotQuery(); - - // If associated IDs were passed to the method we will only delete those - // associations, otherwise all of the association ties will be broken. - // We'll return the numbers of affected rows when we do the deletes. - if (! is_null($ids)) { - $ids = $this->parseIds($ids); - - if (empty($ids)) { - return 0; - } - - $query->whereIn($this->getQualifiedRelatedPivotKeyName(), (array) $ids); - } - - // Once we have all of the conditions set on the statement, we are ready - // to run the delete on the pivot table. Then, if the touch parameter - // is true, we will go ahead and touch all related models to sync. - $results = $query->delete(); - } - - if ($touch) { - $this->touchIfTouching(); - } - - return $results; - } - - /** - * Detach models from the relationship using a custom class. - * - * @param mixed $ids - * @return int - */ - protected function detachUsingCustomClass($ids) - { - $results = 0; - - foreach ($this->parseIds($ids) as $id) { - $results += $this->newPivot([ - $this->foreignPivotKey => $this->parent->{$this->parentKey}, - $this->relatedPivotKey => $id, - ], true)->delete(); - } - - return $results; - } - - /** - * Get the pivot models that are currently attached. - * - * @return \Illuminate\Support\Collection - */ - protected function getCurrentlyAttachedPivots() - { - return $this->newPivotQuery()->get()->map(function ($record) { - $class = $this->using ?: Pivot::class; - - $pivot = $class::fromRawAttributes($this->parent, (array) $record, $this->getTable(), true); - - return $pivot - ->setPivotKeys($this->foreignPivotKey, $this->relatedPivotKey) - ->setRelatedModel($this->related); - }); - } - - /** - * Create a new pivot model instance. - * - * @param array $attributes - * @param bool $exists - * @return \Illuminate\Database\Eloquent\Relations\Pivot - */ - public function newPivot(array $attributes = [], $exists = false) - { - $attributes = array_merge(array_column($this->pivotValues, 'value', 'column'), $attributes); - - $pivot = $this->related->newPivot( - $this->parent, $attributes, $this->table, $exists, $this->using - ); - - return $pivot - ->setPivotKeys($this->foreignPivotKey, $this->relatedPivotKey) - ->setRelatedModel($this->related); - } - - /** - * Create a new existing pivot model instance. - * - * @param array $attributes - * @return \Illuminate\Database\Eloquent\Relations\Pivot - */ - public function newExistingPivot(array $attributes = []) - { - return $this->newPivot($attributes, true); - } - - /** - * Get a new plain query builder for the pivot table. - * - * @return \Illuminate\Database\Query\Builder - */ - public function newPivotStatement() - { - return $this->query->getQuery()->newQuery()->from($this->table); - } - - /** - * Get a new pivot statement for a given "other" ID. - * - * @param mixed $id - * @return \Illuminate\Database\Query\Builder - */ - public function newPivotStatementForId($id) - { - return $this->newPivotQuery()->whereIn($this->relatedPivotKey, $this->parseIds($id)); - } - - /** - * Create a new query builder for the pivot table. - * - * @return \Illuminate\Database\Query\Builder - */ - public function newPivotQuery() - { - $query = $this->newPivotStatement(); - - foreach ($this->pivotWheres as $arguments) { - $query->where(...$arguments); - } - - foreach ($this->pivotWhereIns as $arguments) { - $query->whereIn(...$arguments); - } - - foreach ($this->pivotWhereNulls as $arguments) { - $query->whereNull(...$arguments); - } - - return $query->where($this->getQualifiedForeignPivotKeyName(), $this->parent->{$this->parentKey}); - } - - /** - * Set the columns on the pivot table to retrieve. - * - * @param array|mixed $columns - * @return $this - */ - public function withPivot($columns) - { - $this->pivotColumns = array_merge( - $this->pivotColumns, is_array($columns) ? $columns : func_get_args() - ); - - return $this; - } - - /** - * Get all of the IDs from the given mixed value. - * - * @param mixed $value - * @return array - */ - protected function parseIds($value) - { - if ($value instanceof Model) { - return [$value->{$this->relatedKey}]; - } - - if ($value instanceof EloquentCollection) { - return $value->pluck($this->relatedKey)->all(); - } - - if ($value instanceof BaseCollection || is_array($value)) { - return (new BaseCollection($value)) - ->map(fn ($item) => $item instanceof Model ? $item->{$this->relatedKey} : $item) - ->all(); - } - - return (array) $value; - } - - /** - * Get the ID from the given mixed value. - * - * @param mixed $value - * @return mixed - */ - protected function parseId($value) - { - return $value instanceof Model ? $value->{$this->relatedKey} : $value; - } - - /** - * Cast the given keys to integers if they are numeric and string otherwise. - * - * @param array $keys - * @return array - */ - protected function castKeys(array $keys) - { - return array_map(function ($v) { - return $this->castKey($v); - }, $keys); - } - - /** - * Cast the given key to convert to primary key type. - * - * @param mixed $key - * @return mixed - */ - protected function castKey($key) - { - return $this->getTypeSwapValue( - $this->related->getKeyType(), - $key - ); - } - - /** - * Cast the given pivot attributes. - * - * @param array $attributes - * @return array - */ - protected function castAttributes($attributes) - { - return $this->using - ? $this->newPivot()->fill($attributes)->getAttributes() - : $attributes; - } - - /** - * Converts a given value to a given type value. - * - * @param string $type - * @param mixed $value - * @return mixed - */ - protected function getTypeSwapValue($type, $value) - { - return match (strtolower($type)) { - 'int', 'integer' => (int) $value, - 'real', 'float', 'double' => (float) $value, - 'string' => (string) $value, - default => $value, - }; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/Concerns/SupportsDefaultModels.php b/vendor/illuminate/database/Eloquent/Relations/Concerns/SupportsDefaultModels.php deleted file mode 100644 index 74e758f..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/Concerns/SupportsDefaultModels.php +++ /dev/null @@ -1,63 +0,0 @@ -withDefault = $callback; - - return $this; - } - - /** - * Get the default value for this relation. - * - * @param \Illuminate\Database\Eloquent\Model $parent - * @return \Illuminate\Database\Eloquent\Model|null - */ - protected function getDefaultFor(Model $parent) - { - if (! $this->withDefault) { - return; - } - - $instance = $this->newRelatedInstanceFor($parent); - - if (is_callable($this->withDefault)) { - return call_user_func($this->withDefault, $instance, $parent) ?: $instance; - } - - if (is_array($this->withDefault)) { - $instance->forceFill($this->withDefault); - } - - return $instance; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/Concerns/SupportsInverseRelations.php b/vendor/illuminate/database/Eloquent/Relations/Concerns/SupportsInverseRelations.php deleted file mode 100644 index c7140d0..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/Concerns/SupportsInverseRelations.php +++ /dev/null @@ -1,157 +0,0 @@ -chaperone($relation); - } - - /** - * Instruct Eloquent to link the related models back to the parent after the relationship query has run. - * - * @param string|null $relation - * @return $this - */ - public function chaperone(?string $relation = null) - { - $relation ??= $this->guessInverseRelation(); - - if (! $relation || ! $this->getModel()->isRelation($relation)) { - throw RelationNotFoundException::make($this->getModel(), $relation ?: 'null'); - } - - if ($this->inverseRelationship === null && $relation) { - $this->query->afterQuery(function ($result) { - return $this->inverseRelationship - ? $this->applyInverseRelationToCollection($result, $this->getParent()) - : $result; - }); - } - - $this->inverseRelationship = $relation; - - return $this; - } - - /** - * Guess the name of the inverse relationship. - * - * @return string|null - */ - protected function guessInverseRelation(): ?string - { - return Arr::first( - $this->getPossibleInverseRelations(), - fn ($relation) => $relation && $this->getModel()->isRelation($relation) - ); - } - - /** - * Get the possible inverse relations for the parent model. - * - * @return array - */ - protected function getPossibleInverseRelations(): array - { - return array_filter(array_unique([ - Str::camel(Str::beforeLast($this->getForeignKeyName(), $this->getParent()->getKeyName())), - Str::camel(Str::beforeLast($this->getParent()->getForeignKey(), $this->getParent()->getKeyName())), - Str::camel(class_basename($this->getParent())), - 'owner', - get_class($this->getParent()) === get_class($this->getModel()) ? 'parent' : null, - ])); - } - - /** - * Set the inverse relation on all models in a collection. - * - * @param \Illuminate\Database\Eloquent\Collection $models - * @param \Illuminate\Database\Eloquent\Model|null $parent - * @return \Illuminate\Database\Eloquent\Collection - */ - protected function applyInverseRelationToCollection($models, ?Model $parent = null) - { - $parent ??= $this->getParent(); - - foreach ($models as $model) { - $model instanceof Model && $this->applyInverseRelationToModel($model, $parent); - } - - return $models; - } - - /** - * Set the inverse relation on a model. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @param \Illuminate\Database\Eloquent\Model|null $parent - * @return \Illuminate\Database\Eloquent\Model - */ - protected function applyInverseRelationToModel(Model $model, ?Model $parent = null) - { - if ($inverse = $this->getInverseRelationship()) { - $parent ??= $this->getParent(); - - $model->setRelation($inverse, $parent); - } - - return $model; - } - - /** - * Get the name of the inverse relationship. - * - * @return string|null - */ - public function getInverseRelationship() - { - return $this->inverseRelationship; - } - - /** - * Remove the chaperone / inverse relationship for this query. - * - * Alias of "withoutChaperone". - * - * @return $this - */ - public function withoutInverse() - { - return $this->withoutChaperone(); - } - - /** - * Remove the chaperone / inverse relationship for this query. - * - * @return $this - */ - public function withoutChaperone() - { - $this->inverseRelationship = null; - - return $this; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/HasMany.php b/vendor/illuminate/database/Eloquent/Relations/HasMany.php deleted file mode 100644 index 15b66f5..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/HasMany.php +++ /dev/null @@ -1,60 +0,0 @@ -> - */ -class HasMany extends HasOneOrMany -{ - /** - * Convert the relationship to a "has one" relationship. - * - * @return \Illuminate\Database\Eloquent\Relations\HasOne - */ - public function one() - { - return HasOne::noConstraints(fn () => tap( - new HasOne( - $this->getQuery(), - $this->parent, - $this->foreignKey, - $this->localKey - ), - function ($hasOne) { - if ($inverse = $this->getInverseRelationship()) { - $hasOne->inverse($inverse); - } - } - )); - } - - /** @inheritDoc */ - public function getResults() - { - return ! is_null($this->getParentKey()) - ? $this->query->get() - : $this->related->newCollection(); - } - - /** @inheritDoc */ - public function initRelation(array $models, $relation) - { - foreach ($models as $model) { - $model->setRelation($relation, $this->related->newCollection()); - } - - return $models; - } - - /** @inheritDoc */ - public function match(array $models, EloquentCollection $results, $relation) - { - return $this->matchMany($models, $results, $relation); - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/HasManyThrough.php b/vendor/illuminate/database/Eloquent/Relations/HasManyThrough.php deleted file mode 100644 index 37e8410..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/HasManyThrough.php +++ /dev/null @@ -1,74 +0,0 @@ -> - */ -class HasManyThrough extends HasOneOrManyThrough -{ - use InteractsWithDictionary; - - /** - * Convert the relationship to a "has one through" relationship. - * - * @return \Illuminate\Database\Eloquent\Relations\HasOneThrough - */ - public function one() - { - return HasOneThrough::noConstraints(fn () => new HasOneThrough( - tap($this->getQuery(), fn (Builder $query) => $query->getQuery()->joins = []), - $this->farParent, - $this->throughParent, - $this->getFirstKeyName(), - $this->secondKey, - $this->getLocalKeyName(), - $this->getSecondLocalKeyName(), - )); - } - - /** @inheritDoc */ - public function initRelation(array $models, $relation) - { - foreach ($models as $model) { - $model->setRelation($relation, $this->related->newCollection()); - } - - return $models; - } - - /** @inheritDoc */ - public function match(array $models, EloquentCollection $results, $relation) - { - $dictionary = $this->buildDictionary($results); - - // Once we have the dictionary we can simply spin through the parent models to - // link them up with their children using the keyed dictionary to make the - // matching very convenient and easy work. Then we'll just return them. - foreach ($models as $model) { - if (isset($dictionary[$key = $this->getDictionaryKey($model->getAttribute($this->localKey))])) { - $model->setRelation( - $relation, $this->related->newCollection($dictionary[$key]) - ); - } - } - - return $models; - } - - /** @inheritDoc */ - public function getResults() - { - return ! is_null($this->farParent->{$this->localKey}) - ? $this->get() - : $this->related->newCollection(); - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/HasOne.php b/vendor/illuminate/database/Eloquent/Relations/HasOne.php deleted file mode 100644 index 911d4e2..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/HasOne.php +++ /dev/null @@ -1,118 +0,0 @@ - - */ -class HasOne extends HasOneOrMany implements SupportsPartialRelations -{ - use ComparesRelatedModels, CanBeOneOfMany, SupportsDefaultModels; - - /** @inheritDoc */ - public function getResults() - { - if (is_null($this->getParentKey())) { - return $this->getDefaultFor($this->parent); - } - - return $this->query->first() ?: $this->getDefaultFor($this->parent); - } - - /** @inheritDoc */ - public function initRelation(array $models, $relation) - { - foreach ($models as $model) { - $model->setRelation($relation, $this->getDefaultFor($model)); - } - - return $models; - } - - /** @inheritDoc */ - public function match(array $models, EloquentCollection $results, $relation) - { - return $this->matchOne($models, $results, $relation); - } - - /** @inheritDoc */ - public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $columns = ['*']) - { - if ($this->isOneOfMany()) { - $this->mergeOneOfManyJoinsTo($query); - } - - return parent::getRelationExistenceQuery($query, $parentQuery, $columns); - } - - /** - * Add constraints for inner join subselect for one of many relationships. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param string|null $column - * @param string|null $aggregate - * @return void - */ - public function addOneOfManySubQueryConstraints(Builder $query, $column = null, $aggregate = null) - { - $query->addSelect($this->foreignKey); - } - - /** - * Get the columns that should be selected by the one of many subquery. - * - * @return array|string - */ - public function getOneOfManySubQuerySelectColumns() - { - return $this->foreignKey; - } - - /** - * Add join query constraints for one of many relationships. - * - * @param \Illuminate\Database\Query\JoinClause $join - * @return void - */ - public function addOneOfManyJoinSubQueryConstraints(JoinClause $join) - { - $join->on($this->qualifySubSelectColumn($this->foreignKey), '=', $this->qualifyRelatedColumn($this->foreignKey)); - } - - /** - * Make a new related instance for the given model. - * - * @param TDeclaringModel $parent - * @return TRelatedModel - */ - public function newRelatedInstanceFor(Model $parent) - { - return tap($this->related->newInstance(), function ($instance) use ($parent) { - $instance->setAttribute($this->getForeignKeyName(), $parent->{$this->localKey}); - $this->applyInverseRelationToModel($instance, $parent); - }); - } - - /** - * Get the value of the model's foreign key. - * - * @param TRelatedModel $model - * @return int|string - */ - protected function getRelatedKeyFrom(Model $model) - { - return $model->getAttribute($this->getForeignKeyName()); - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/HasOneOrMany.php b/vendor/illuminate/database/Eloquent/Relations/HasOneOrMany.php deleted file mode 100644 index 3d8426c..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/HasOneOrMany.php +++ /dev/null @@ -1,579 +0,0 @@ - - */ -abstract class HasOneOrMany extends Relation -{ - use InteractsWithDictionary, SupportsInverseRelations; - - /** - * The foreign key of the parent model. - * - * @var string - */ - protected $foreignKey; - - /** - * The local key of the parent model. - * - * @var string - */ - protected $localKey; - - /** - * Create a new has one or many relationship instance. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string $foreignKey - * @param string $localKey - * @return void - */ - public function __construct(Builder $query, Model $parent, $foreignKey, $localKey) - { - $this->localKey = $localKey; - $this->foreignKey = $foreignKey; - - parent::__construct($query, $parent); - } - - /** - * Create and return an un-saved instance of the related model. - * - * @param array $attributes - * @return TRelatedModel - */ - public function make(array $attributes = []) - { - return tap($this->related->newInstance($attributes), function ($instance) { - $this->setForeignAttributesForCreate($instance); - $this->applyInverseRelationToModel($instance); - }); - } - - /** - * Create and return an un-saved instance of the related models. - * - * @param iterable $records - * @return \Illuminate\Database\Eloquent\Collection - */ - public function makeMany($records) - { - $instances = $this->related->newCollection(); - - foreach ($records as $record) { - $instances->push($this->make($record)); - } - - return $instances; - } - - /** - * Set the base constraints on the relation query. - * - * @return void - */ - public function addConstraints() - { - if (static::$constraints) { - $query = $this->getRelationQuery(); - - $query->where($this->foreignKey, '=', $this->getParentKey()); - - $query->whereNotNull($this->foreignKey); - } - } - - /** @inheritDoc */ - public function addEagerConstraints(array $models) - { - $whereIn = $this->whereInMethod($this->parent, $this->localKey); - - $this->whereInEager( - $whereIn, - $this->foreignKey, - $this->getKeys($models, $this->localKey), - $this->getRelationQuery() - ); - } - - /** - * Match the eagerly loaded results to their single parents. - * - * @param array $models - * @param \Illuminate\Database\Eloquent\Collection $results - * @param string $relation - * @return array - */ - public function matchOne(array $models, EloquentCollection $results, $relation) - { - return $this->matchOneOrMany($models, $results, $relation, 'one'); - } - - /** - * Match the eagerly loaded results to their many parents. - * - * @param array $models - * @param \Illuminate\Database\Eloquent\Collection $results - * @param string $relation - * @return array - */ - public function matchMany(array $models, EloquentCollection $results, $relation) - { - return $this->matchOneOrMany($models, $results, $relation, 'many'); - } - - /** - * Match the eagerly loaded results to their many parents. - * - * @param array $models - * @param \Illuminate\Database\Eloquent\Collection $results - * @param string $relation - * @param string $type - * @return array - */ - protected function matchOneOrMany(array $models, EloquentCollection $results, $relation, $type) - { - $dictionary = $this->buildDictionary($results); - - // Once we have the dictionary we can simply spin through the parent models to - // link them up with their children using the keyed dictionary to make the - // matching very convenient and easy work. Then we'll just return them. - foreach ($models as $model) { - if (isset($dictionary[$key = $this->getDictionaryKey($model->getAttribute($this->localKey))])) { - $related = $this->getRelationValue($dictionary, $key, $type); - $model->setRelation($relation, $related); - - // Apply the inverse relation if we have one... - $type === 'one' - ? $this->applyInverseRelationToModel($related, $model) - : $this->applyInverseRelationToCollection($related, $model); - } - } - - return $models; - } - - /** - * Get the value of a relationship by one or many type. - * - * @param array $dictionary - * @param string $key - * @param string $type - * @return mixed - */ - protected function getRelationValue(array $dictionary, $key, $type) - { - $value = $dictionary[$key]; - - return $type === 'one' ? reset($value) : $this->related->newCollection($value); - } - - /** - * Build model dictionary keyed by the relation's foreign key. - * - * @param \Illuminate\Database\Eloquent\Collection $results - * @return array> - */ - protected function buildDictionary(EloquentCollection $results) - { - $foreign = $this->getForeignKeyName(); - - return $results->mapToDictionary(function ($result) use ($foreign) { - return [$this->getDictionaryKey($result->{$foreign}) => $result]; - })->all(); - } - - /** - * Find a model by its primary key or return a new instance of the related model. - * - * @param mixed $id - * @param array $columns - * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TRelatedModel) - */ - public function findOrNew($id, $columns = ['*']) - { - if (is_null($instance = $this->find($id, $columns))) { - $instance = $this->related->newInstance(); - - $this->setForeignAttributesForCreate($instance); - } - - return $instance; - } - - /** - * Get the first related model record matching the attributes or instantiate it. - * - * @param array $attributes - * @param array $values - * @return TRelatedModel - */ - public function firstOrNew(array $attributes = [], array $values = []) - { - if (is_null($instance = $this->where($attributes)->first())) { - $instance = $this->related->newInstance(array_merge($attributes, $values)); - - $this->setForeignAttributesForCreate($instance); - } - - return $instance; - } - - /** - * Get the first record matching the attributes. If the record is not found, create it. - * - * @param array $attributes - * @param array $values - * @return TRelatedModel - */ - public function firstOrCreate(array $attributes = [], array $values = []) - { - if (is_null($instance = (clone $this)->where($attributes)->first())) { - $instance = $this->createOrFirst($attributes, $values); - } - - return $instance; - } - - /** - * Attempt to create the record. If a unique constraint violation occurs, attempt to find the matching record. - * - * @param array $attributes - * @param array $values - * @return TRelatedModel - */ - public function createOrFirst(array $attributes = [], array $values = []) - { - try { - return $this->getQuery()->withSavepointIfNeeded(fn () => $this->create(array_merge($attributes, $values))); - } catch (UniqueConstraintViolationException $e) { - return $this->useWritePdo()->where($attributes)->first() ?? throw $e; - } - } - - /** - * Create or update a related record matching the attributes, and fill it with values. - * - * @param array $attributes - * @param array $values - * @return TRelatedModel - */ - public function updateOrCreate(array $attributes, array $values = []) - { - return tap($this->firstOrCreate($attributes, $values), function ($instance) use ($values) { - if (! $instance->wasRecentlyCreated) { - $instance->fill($values)->save(); - } - }); - } - - /** - * Insert new records or update the existing ones. - * - * @param array $values - * @param array|string $uniqueBy - * @param array|null $update - * @return int - */ - public function upsert(array $values, $uniqueBy, $update = null) - { - if (! empty($values) && ! is_array(reset($values))) { - $values = [$values]; - } - - foreach ($values as $key => $value) { - $values[$key][$this->getForeignKeyName()] = $this->getParentKey(); - } - - return $this->getQuery()->upsert($values, $uniqueBy, $update); - } - - /** - * Attach a model instance to the parent model. - * - * @param TRelatedModel $model - * @return TRelatedModel|false - */ - public function save(Model $model) - { - $this->setForeignAttributesForCreate($model); - - return $model->save() ? $model : false; - } - - /** - * Attach a model instance without raising any events to the parent model. - * - * @param TRelatedModel $model - * @return TRelatedModel|false - */ - public function saveQuietly(Model $model) - { - return Model::withoutEvents(function () use ($model) { - return $this->save($model); - }); - } - - /** - * Attach a collection of models to the parent instance. - * - * @param iterable $models - * @return iterable - */ - public function saveMany($models) - { - foreach ($models as $model) { - $this->save($model); - } - - return $models; - } - - /** - * Attach a collection of models to the parent instance without raising any events to the parent model. - * - * @param iterable $models - * @return iterable - */ - public function saveManyQuietly($models) - { - return Model::withoutEvents(function () use ($models) { - return $this->saveMany($models); - }); - } - - /** - * Create a new instance of the related model. - * - * @param array $attributes - * @return TRelatedModel - */ - public function create(array $attributes = []) - { - return tap($this->related->newInstance($attributes), function ($instance) { - $this->setForeignAttributesForCreate($instance); - - $instance->save(); - - $this->applyInverseRelationToModel($instance); - }); - } - - /** - * Create a new instance of the related model without raising any events to the parent model. - * - * @param array $attributes - * @return TRelatedModel - */ - public function createQuietly(array $attributes = []) - { - return Model::withoutEvents(fn () => $this->create($attributes)); - } - - /** - * Create a new instance of the related model. Allow mass-assignment. - * - * @param array $attributes - * @return TRelatedModel - */ - public function forceCreate(array $attributes = []) - { - $attributes[$this->getForeignKeyName()] = $this->getParentKey(); - - return $this->applyInverseRelationToModel($this->related->forceCreate($attributes)); - } - - /** - * Create a new instance of the related model with mass assignment without raising model events. - * - * @param array $attributes - * @return TRelatedModel - */ - public function forceCreateQuietly(array $attributes = []) - { - return Model::withoutEvents(fn () => $this->forceCreate($attributes)); - } - - /** - * Create a Collection of new instances of the related model. - * - * @param iterable $records - * @return \Illuminate\Database\Eloquent\Collection - */ - public function createMany(iterable $records) - { - $instances = $this->related->newCollection(); - - foreach ($records as $record) { - $instances->push($this->create($record)); - } - - return $instances; - } - - /** - * Create a Collection of new instances of the related model without raising any events to the parent model. - * - * @param iterable $records - * @return \Illuminate\Database\Eloquent\Collection - */ - public function createManyQuietly(iterable $records) - { - return Model::withoutEvents(fn () => $this->createMany($records)); - } - - /** - * Set the foreign ID for creating a related model. - * - * @param TRelatedModel $model - * @return void - */ - protected function setForeignAttributesForCreate(Model $model) - { - $model->setAttribute($this->getForeignKeyName(), $this->getParentKey()); - - foreach ($this->getQuery()->pendingAttributes as $key => $value) { - $attributes ??= $model->getAttributes(); - - if (! array_key_exists($key, $attributes)) { - $model->setAttribute($key, $value); - } - } - - $this->applyInverseRelationToModel($model); - } - - /** @inheritDoc */ - public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $columns = ['*']) - { - if ($query->getQuery()->from == $parentQuery->getQuery()->from) { - return $this->getRelationExistenceQueryForSelfRelation($query, $parentQuery, $columns); - } - - return parent::getRelationExistenceQuery($query, $parentQuery, $columns); - } - - /** - * Add the constraints for a relationship query on the same table. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param \Illuminate\Database\Eloquent\Builder $parentQuery - * @param array|mixed $columns - * @return \Illuminate\Database\Eloquent\Builder - */ - public function getRelationExistenceQueryForSelfRelation(Builder $query, Builder $parentQuery, $columns = ['*']) - { - $query->from($query->getModel()->getTable().' as '.$hash = $this->getRelationCountHash()); - - $query->getModel()->setTable($hash); - - return $query->select($columns)->whereColumn( - $this->getQualifiedParentKeyName(), '=', $hash.'.'.$this->getForeignKeyName() - ); - } - - /** - * Alias to set the "limit" value of the query. - * - * @param int $value - * @return $this - */ - public function take($value) - { - return $this->limit($value); - } - - /** - * Set the "limit" value of the query. - * - * @param int $value - * @return $this - */ - public function limit($value) - { - if ($this->parent->exists) { - $this->query->limit($value); - } else { - $this->query->groupLimit($value, $this->getExistenceCompareKey()); - } - - return $this; - } - - /** - * Get the key for comparing against the parent key in "has" query. - * - * @return string - */ - public function getExistenceCompareKey() - { - return $this->getQualifiedForeignKeyName(); - } - - /** - * Get the key value of the parent's local key. - * - * @return mixed - */ - public function getParentKey() - { - return $this->parent->getAttribute($this->localKey); - } - - /** - * Get the fully qualified parent key name. - * - * @return string - */ - public function getQualifiedParentKeyName() - { - return $this->parent->qualifyColumn($this->localKey); - } - - /** - * Get the plain foreign key. - * - * @return string - */ - public function getForeignKeyName() - { - $segments = explode('.', $this->getQualifiedForeignKeyName()); - - return end($segments); - } - - /** - * Get the foreign key for the relationship. - * - * @return string - */ - public function getQualifiedForeignKeyName() - { - return $this->foreignKey; - } - - /** - * Get the local key for the relationship. - * - * @return string - */ - public function getLocalKeyName() - { - return $this->localKey; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/HasOneOrManyThrough.php b/vendor/illuminate/database/Eloquent/Relations/HasOneOrManyThrough.php deleted file mode 100644 index 6e74acf..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/HasOneOrManyThrough.php +++ /dev/null @@ -1,862 +0,0 @@ - - */ -abstract class HasOneOrManyThrough extends Relation -{ - use InteractsWithDictionary; - - /** - * The "through" parent model instance. - * - * @var TIntermediateModel - */ - protected $throughParent; - - /** - * The far parent model instance. - * - * @var TDeclaringModel - */ - protected $farParent; - - /** - * The near key on the relationship. - * - * @var string - */ - protected $firstKey; - - /** - * The far key on the relationship. - * - * @var string - */ - protected $secondKey; - - /** - * The local key on the relationship. - * - * @var string - */ - protected $localKey; - - /** - * The local key on the intermediary model. - * - * @var string - */ - protected $secondLocalKey; - - /** - * Create a new has many through relationship instance. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $farParent - * @param TIntermediateModel $throughParent - * @param string $firstKey - * @param string $secondKey - * @param string $localKey - * @param string $secondLocalKey - * @return void - */ - public function __construct(Builder $query, Model $farParent, Model $throughParent, $firstKey, $secondKey, $localKey, $secondLocalKey) - { - $this->localKey = $localKey; - $this->firstKey = $firstKey; - $this->secondKey = $secondKey; - $this->farParent = $farParent; - $this->throughParent = $throughParent; - $this->secondLocalKey = $secondLocalKey; - - parent::__construct($query, $throughParent); - } - - /** - * Set the base constraints on the relation query. - * - * @return void - */ - public function addConstraints() - { - $localValue = $this->farParent[$this->localKey]; - - $this->performJoin(); - - if (static::$constraints) { - $this->query->where($this->getQualifiedFirstKeyName(), '=', $localValue); - } - } - - /** - * Set the join clause on the query. - * - * @param \Illuminate\Database\Eloquent\Builder|null $query - * @return void - */ - protected function performJoin(?Builder $query = null) - { - $query = $query ?: $this->query; - - $farKey = $this->getQualifiedFarKeyName(); - - $query->join($this->throughParent->getTable(), $this->getQualifiedParentKeyName(), '=', $farKey); - - if ($this->throughParentSoftDeletes()) { - $query->withGlobalScope('SoftDeletableHasManyThrough', function ($query) { - $query->whereNull($this->throughParent->getQualifiedDeletedAtColumn()); - }); - } - } - - /** - * Get the fully qualified parent key name. - * - * @return string - */ - public function getQualifiedParentKeyName() - { - return $this->parent->qualifyColumn($this->secondLocalKey); - } - - /** - * Determine whether "through" parent of the relation uses Soft Deletes. - * - * @return bool - */ - public function throughParentSoftDeletes() - { - return in_array(SoftDeletes::class, class_uses_recursive($this->throughParent)); - } - - /** - * Indicate that trashed "through" parents should be included in the query. - * - * @return $this - */ - public function withTrashedParents() - { - $this->query->withoutGlobalScope('SoftDeletableHasManyThrough'); - - return $this; - } - - /** @inheritDoc */ - public function addEagerConstraints(array $models) - { - $whereIn = $this->whereInMethod($this->farParent, $this->localKey); - - $this->whereInEager( - $whereIn, - $this->getQualifiedFirstKeyName(), - $this->getKeys($models, $this->localKey) - ); - } - - /** - * Build model dictionary keyed by the relation's foreign key. - * - * @param \Illuminate\Database\Eloquent\Collection $results - * @return array> - */ - protected function buildDictionary(EloquentCollection $results) - { - $dictionary = []; - - // First we will create a dictionary of models keyed by the foreign key of the - // relationship as this will allow us to quickly access all of the related - // models without having to do nested looping which will be quite slow. - foreach ($results as $result) { - $dictionary[$result->laravel_through_key][] = $result; - } - - return $dictionary; - } - - /** - * Get the first related model record matching the attributes or instantiate it. - * - * @param array $attributes - * @param array $values - * @return TRelatedModel - */ - public function firstOrNew(array $attributes = [], array $values = []) - { - if (! is_null($instance = $this->where($attributes)->first())) { - return $instance; - } - - return $this->related->newInstance(array_merge($attributes, $values)); - } - - /** - * Get the first record matching the attributes. If the record is not found, create it. - * - * @param array $attributes - * @param array $values - * @return TRelatedModel - */ - public function firstOrCreate(array $attributes = [], array $values = []) - { - if (! is_null($instance = (clone $this)->where($attributes)->first())) { - return $instance; - } - - return $this->createOrFirst(array_merge($attributes, $values)); - } - - /** - * Attempt to create the record. If a unique constraint violation occurs, attempt to find the matching record. - * - * @param array $attributes - * @param array $values - * @return TRelatedModel - */ - public function createOrFirst(array $attributes = [], array $values = []) - { - try { - return $this->getQuery()->withSavepointIfNeeded(fn () => $this->create(array_merge($attributes, $values))); - } catch (UniqueConstraintViolationException $exception) { - return $this->where($attributes)->first() ?? throw $exception; - } - } - - /** - * Create or update a related record matching the attributes, and fill it with values. - * - * @param array $attributes - * @param array $values - * @return TRelatedModel - */ - public function updateOrCreate(array $attributes, array $values = []) - { - return tap($this->firstOrCreate($attributes, $values), function ($instance) use ($values) { - if (! $instance->wasRecentlyCreated) { - $instance->fill($values)->save(); - } - }); - } - - /** - * Add a basic where clause to the query, and return the first result. - * - * @param \Closure|string|array $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return TRelatedModel|null - */ - public function firstWhere($column, $operator = null, $value = null, $boolean = 'and') - { - return $this->where($column, $operator, $value, $boolean)->first(); - } - - /** - * Execute the query and get the first related model. - * - * @param array $columns - * @return TRelatedModel|null - */ - public function first($columns = ['*']) - { - $results = $this->take(1)->get($columns); - - return count($results) > 0 ? $results->first() : null; - } - - /** - * Execute the query and get the first result or throw an exception. - * - * @param array $columns - * @return TRelatedModel - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function firstOrFail($columns = ['*']) - { - if (! is_null($model = $this->first($columns))) { - return $model; - } - - throw (new ModelNotFoundException)->setModel(get_class($this->related)); - } - - /** - * Execute the query and get the first result or call a callback. - * - * @template TValue - * - * @param (\Closure(): TValue)|list $columns - * @param (\Closure(): TValue)|null $callback - * @return TRelatedModel|TValue - */ - public function firstOr($columns = ['*'], ?Closure $callback = null) - { - if ($columns instanceof Closure) { - $callback = $columns; - - $columns = ['*']; - } - - if (! is_null($model = $this->first($columns))) { - return $model; - } - - return $callback(); - } - - /** - * Find a related model by its primary key. - * - * @param mixed $id - * @param array $columns - * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TRelatedModel|null) - */ - public function find($id, $columns = ['*']) - { - if (is_array($id) || $id instanceof Arrayable) { - return $this->findMany($id, $columns); - } - - return $this->where( - $this->getRelated()->getQualifiedKeyName(), '=', $id - )->first($columns); - } - - /** - * Find a sole related model by its primary key. - * - * @param mixed $id - * @param array $columns - * @return TRelatedModel - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - * @throws \Illuminate\Database\MultipleRecordsFoundException - */ - public function findSole($id, $columns = ['*']) - { - return $this->where( - $this->getRelated()->getQualifiedKeyName(), '=', $id - )->sole($columns); - } - - /** - * Find multiple related models by their primary keys. - * - * @param \Illuminate\Contracts\Support\Arrayable|array $ids - * @param array $columns - * @return \Illuminate\Database\Eloquent\Collection - */ - public function findMany($ids, $columns = ['*']) - { - $ids = $ids instanceof Arrayable ? $ids->toArray() : $ids; - - if (empty($ids)) { - return $this->getRelated()->newCollection(); - } - - return $this->whereIn( - $this->getRelated()->getQualifiedKeyName(), $ids - )->get($columns); - } - - /** - * Find a related model by its primary key or throw an exception. - * - * @param mixed $id - * @param array $columns - * @return ($id is (\Illuminate\Contracts\Support\Arrayable|array) ? \Illuminate\Database\Eloquent\Collection : TRelatedModel) - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function findOrFail($id, $columns = ['*']) - { - $result = $this->find($id, $columns); - - $id = $id instanceof Arrayable ? $id->toArray() : $id; - - if (is_array($id)) { - if (count($result) === count(array_unique($id))) { - return $result; - } - } elseif (! is_null($result)) { - return $result; - } - - throw (new ModelNotFoundException)->setModel(get_class($this->related), $id); - } - - /** - * Find a related model by its primary key or call a callback. - * - * @template TValue - * - * @param mixed $id - * @param (\Closure(): TValue)|list|string $columns - * @param (\Closure(): TValue)|null $callback - * @return ( - * $id is (\Illuminate\Contracts\Support\Arrayable|array) - * ? \Illuminate\Database\Eloquent\Collection|TValue - * : TRelatedModel|TValue - * ) - */ - public function findOr($id, $columns = ['*'], ?Closure $callback = null) - { - if ($columns instanceof Closure) { - $callback = $columns; - - $columns = ['*']; - } - - $result = $this->find($id, $columns); - - $id = $id instanceof Arrayable ? $id->toArray() : $id; - - if (is_array($id)) { - if (count($result) === count(array_unique($id))) { - return $result; - } - } elseif (! is_null($result)) { - return $result; - } - - return $callback(); - } - - /** @inheritDoc */ - public function get($columns = ['*']) - { - $builder = $this->prepareQueryBuilder($columns); - - $models = $builder->getModels(); - - // If we actually found models we will also eager load any relationships that - // have been specified as needing to be eager loaded. This will solve the - // n + 1 query problem for the developer and also increase performance. - if (count($models) > 0) { - $models = $builder->eagerLoadRelations($models); - } - - return $this->query->applyAfterQueryCallbacks( - $this->related->newCollection($models) - ); - } - - /** - * Get a paginator for the "select" statement. - * - * @param int|null $perPage - * @param array $columns - * @param string $pageName - * @param int $page - * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator - */ - public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) - { - $this->query->addSelect($this->shouldSelect($columns)); - - return $this->query->paginate($perPage, $columns, $pageName, $page); - } - - /** - * Paginate the given query into a simple paginator. - * - * @param int|null $perPage - * @param array $columns - * @param string $pageName - * @param int|null $page - * @return \Illuminate\Contracts\Pagination\Paginator - */ - public function simplePaginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) - { - $this->query->addSelect($this->shouldSelect($columns)); - - return $this->query->simplePaginate($perPage, $columns, $pageName, $page); - } - - /** - * Paginate the given query into a cursor paginator. - * - * @param int|null $perPage - * @param array $columns - * @param string $cursorName - * @param string|null $cursor - * @return \Illuminate\Contracts\Pagination\CursorPaginator - */ - public function cursorPaginate($perPage = null, $columns = ['*'], $cursorName = 'cursor', $cursor = null) - { - $this->query->addSelect($this->shouldSelect($columns)); - - return $this->query->cursorPaginate($perPage, $columns, $cursorName, $cursor); - } - - /** - * Set the select clause for the relation query. - * - * @param array $columns - * @return array - */ - protected function shouldSelect(array $columns = ['*']) - { - if ($columns == ['*']) { - $columns = [$this->related->qualifyColumn('*')]; - } - - return array_merge($columns, [$this->getQualifiedFirstKeyName().' as laravel_through_key']); - } - - /** - * Chunk the results of the query. - * - * @param int $count - * @param callable $callback - * @return bool - */ - public function chunk($count, callable $callback) - { - return $this->prepareQueryBuilder()->chunk($count, $callback); - } - - /** - * Chunk the results of a query by comparing numeric IDs. - * - * @param int $count - * @param callable $callback - * @param string|null $column - * @param string|null $alias - * @return bool - */ - public function chunkById($count, callable $callback, $column = null, $alias = null) - { - $column ??= $this->getRelated()->getQualifiedKeyName(); - - $alias ??= $this->getRelated()->getKeyName(); - - return $this->prepareQueryBuilder()->chunkById($count, $callback, $column, $alias); - } - - /** - * Chunk the results of a query by comparing IDs in descending order. - * - * @param int $count - * @param callable $callback - * @param string|null $column - * @param string|null $alias - * @return bool - */ - public function chunkByIdDesc($count, callable $callback, $column = null, $alias = null) - { - $column ??= $this->getRelated()->getQualifiedKeyName(); - - $alias ??= $this->getRelated()->getKeyName(); - - return $this->prepareQueryBuilder()->chunkByIdDesc($count, $callback, $column, $alias); - } - - /** - * Execute a callback over each item while chunking by ID. - * - * @param callable $callback - * @param int $count - * @param string|null $column - * @param string|null $alias - * @return bool - */ - public function eachById(callable $callback, $count = 1000, $column = null, $alias = null) - { - $column = $column ?? $this->getRelated()->getQualifiedKeyName(); - - $alias = $alias ?? $this->getRelated()->getKeyName(); - - return $this->prepareQueryBuilder()->eachById($callback, $count, $column, $alias); - } - - /** - * Get a generator for the given query. - * - * @return \Illuminate\Support\LazyCollection - */ - public function cursor() - { - return $this->prepareQueryBuilder()->cursor(); - } - - /** - * Execute a callback over each item while chunking. - * - * @param callable $callback - * @param int $count - * @return bool - */ - public function each(callable $callback, $count = 1000) - { - return $this->chunk($count, function ($results) use ($callback) { - foreach ($results as $key => $value) { - if ($callback($value, $key) === false) { - return false; - } - } - }); - } - - /** - * Query lazily, by chunks of the given size. - * - * @param int $chunkSize - * @return \Illuminate\Support\LazyCollection - */ - public function lazy($chunkSize = 1000) - { - return $this->prepareQueryBuilder()->lazy($chunkSize); - } - - /** - * Query lazily, by chunking the results of a query by comparing IDs. - * - * @param int $chunkSize - * @param string|null $column - * @param string|null $alias - * @return \Illuminate\Support\LazyCollection - */ - public function lazyById($chunkSize = 1000, $column = null, $alias = null) - { - $column ??= $this->getRelated()->getQualifiedKeyName(); - - $alias ??= $this->getRelated()->getKeyName(); - - return $this->prepareQueryBuilder()->lazyById($chunkSize, $column, $alias); - } - - /** - * Query lazily, by chunking the results of a query by comparing IDs in descending order. - * - * @param int $chunkSize - * @param string|null $column - * @param string|null $alias - * @return \Illuminate\Support\LazyCollection - */ - public function lazyByIdDesc($chunkSize = 1000, $column = null, $alias = null) - { - $column ??= $this->getRelated()->getQualifiedKeyName(); - - $alias ??= $this->getRelated()->getKeyName(); - - return $this->prepareQueryBuilder()->lazyByIdDesc($chunkSize, $column, $alias); - } - - /** - * Prepare the query builder for query execution. - * - * @param array $columns - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function prepareQueryBuilder($columns = ['*']) - { - $builder = $this->query->applyScopes(); - - return $builder->addSelect( - $this->shouldSelect($builder->getQuery()->columns ? [] : $columns) - ); - } - - /** @inheritDoc */ - public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $columns = ['*']) - { - if ($parentQuery->getQuery()->from === $query->getQuery()->from) { - return $this->getRelationExistenceQueryForSelfRelation($query, $parentQuery, $columns); - } - - if ($parentQuery->getQuery()->from === $this->throughParent->getTable()) { - return $this->getRelationExistenceQueryForThroughSelfRelation($query, $parentQuery, $columns); - } - - $this->performJoin($query); - - return $query->select($columns)->whereColumn( - $this->getQualifiedLocalKeyName(), '=', $this->getQualifiedFirstKeyName() - ); - } - - /** - * Add the constraints for a relationship query on the same table. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param \Illuminate\Database\Eloquent\Builder $parentQuery - * @param array|mixed $columns - * @return \Illuminate\Database\Eloquent\Builder - */ - public function getRelationExistenceQueryForSelfRelation(Builder $query, Builder $parentQuery, $columns = ['*']) - { - $query->from($query->getModel()->getTable().' as '.$hash = $this->getRelationCountHash()); - - $query->join($this->throughParent->getTable(), $this->getQualifiedParentKeyName(), '=', $hash.'.'.$this->secondKey); - - if ($this->throughParentSoftDeletes()) { - $query->whereNull($this->throughParent->getQualifiedDeletedAtColumn()); - } - - $query->getModel()->setTable($hash); - - return $query->select($columns)->whereColumn( - $parentQuery->getQuery()->from.'.'.$this->localKey, '=', $this->getQualifiedFirstKeyName() - ); - } - - /** - * Add the constraints for a relationship query on the same table as the through parent. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param \Illuminate\Database\Eloquent\Builder $parentQuery - * @param array|mixed $columns - * @return \Illuminate\Database\Eloquent\Builder - */ - public function getRelationExistenceQueryForThroughSelfRelation(Builder $query, Builder $parentQuery, $columns = ['*']) - { - $table = $this->throughParent->getTable().' as '.$hash = $this->getRelationCountHash(); - - $query->join($table, $hash.'.'.$this->secondLocalKey, '=', $this->getQualifiedFarKeyName()); - - if ($this->throughParentSoftDeletes()) { - $query->whereNull($hash.'.'.$this->throughParent->getDeletedAtColumn()); - } - - return $query->select($columns)->whereColumn( - $parentQuery->getQuery()->from.'.'.$this->localKey, '=', $hash.'.'.$this->firstKey - ); - } - - /** - * Alias to set the "limit" value of the query. - * - * @param int $value - * @return $this - */ - public function take($value) - { - return $this->limit($value); - } - - /** - * Set the "limit" value of the query. - * - * @param int $value - * @return $this - */ - public function limit($value) - { - if ($this->farParent->exists) { - $this->query->limit($value); - } else { - $column = $this->getQualifiedFirstKeyName(); - - $grammar = $this->query->getQuery()->getGrammar(); - - if ($grammar instanceof MySqlGrammar && $grammar->useLegacyGroupLimit($this->query->getQuery())) { - $column = 'laravel_through_key'; - } - - $this->query->groupLimit($value, $column); - } - - return $this; - } - - /** - * Get the qualified foreign key on the related model. - * - * @return string - */ - public function getQualifiedFarKeyName() - { - return $this->getQualifiedForeignKeyName(); - } - - /** - * Get the foreign key on the "through" model. - * - * @return string - */ - public function getFirstKeyName() - { - return $this->firstKey; - } - - /** - * Get the qualified foreign key on the "through" model. - * - * @return string - */ - public function getQualifiedFirstKeyName() - { - return $this->throughParent->qualifyColumn($this->firstKey); - } - - /** - * Get the foreign key on the related model. - * - * @return string - */ - public function getForeignKeyName() - { - return $this->secondKey; - } - - /** - * Get the qualified foreign key on the related model. - * - * @return string - */ - public function getQualifiedForeignKeyName() - { - return $this->related->qualifyColumn($this->secondKey); - } - - /** - * Get the local key on the far parent model. - * - * @return string - */ - public function getLocalKeyName() - { - return $this->localKey; - } - - /** - * Get the qualified local key on the far parent model. - * - * @return string - */ - public function getQualifiedLocalKeyName() - { - return $this->farParent->qualifyColumn($this->localKey); - } - - /** - * Get the local key on the intermediary model. - * - * @return string - */ - public function getSecondLocalKeyName() - { - return $this->secondLocalKey; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/HasOneThrough.php b/vendor/illuminate/database/Eloquent/Relations/HasOneThrough.php deleted file mode 100644 index 21de2e3..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/HasOneThrough.php +++ /dev/null @@ -1,67 +0,0 @@ - - */ -class HasOneThrough extends HasOneOrManyThrough -{ - use InteractsWithDictionary, SupportsDefaultModels; - - /** @inheritDoc */ - public function getResults() - { - return $this->first() ?: $this->getDefaultFor($this->farParent); - } - - /** @inheritDoc */ - public function initRelation(array $models, $relation) - { - foreach ($models as $model) { - $model->setRelation($relation, $this->getDefaultFor($model)); - } - - return $models; - } - - /** @inheritDoc */ - public function match(array $models, EloquentCollection $results, $relation) - { - $dictionary = $this->buildDictionary($results); - - // Once we have the dictionary we can simply spin through the parent models to - // link them up with their children using the keyed dictionary to make the - // matching very convenient and easy work. Then we'll just return them. - foreach ($models as $model) { - if (isset($dictionary[$key = $this->getDictionaryKey($model->getAttribute($this->localKey))])) { - $value = $dictionary[$key]; - $model->setRelation( - $relation, reset($value) - ); - } - } - - return $models; - } - - /** - * Make a new related instance for the given model. - * - * @param TDeclaringModel $parent - * @return TRelatedModel - */ - public function newRelatedInstanceFor(Model $parent) - { - return $this->related->newInstance(); - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/MorphMany.php b/vendor/illuminate/database/Eloquent/Relations/MorphMany.php deleted file mode 100644 index 86fab64..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/MorphMany.php +++ /dev/null @@ -1,69 +0,0 @@ -> - */ -class MorphMany extends MorphOneOrMany -{ - /** - * Convert the relationship to a "morph one" relationship. - * - * @return \Illuminate\Database\Eloquent\Relations\MorphOne - */ - public function one() - { - return MorphOne::noConstraints(fn () => tap( - new MorphOne( - $this->getQuery(), - $this->getParent(), - $this->morphType, - $this->foreignKey, - $this->localKey - ), - function ($morphOne) { - if ($inverse = $this->getInverseRelationship()) { - $morphOne->inverse($inverse); - } - } - )); - } - - /** @inheritDoc */ - public function getResults() - { - return ! is_null($this->getParentKey()) - ? $this->query->get() - : $this->related->newCollection(); - } - - /** @inheritDoc */ - public function initRelation(array $models, $relation) - { - foreach ($models as $model) { - $model->setRelation($relation, $this->related->newCollection()); - } - - return $models; - } - - /** @inheritDoc */ - public function match(array $models, EloquentCollection $results, $relation) - { - return $this->matchMany($models, $results, $relation); - } - - /** @inheritDoc */ - public function forceCreate(array $attributes = []) - { - $attributes[$this->getMorphType()] = $this->morphClass; - - return parent::forceCreate($attributes); - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/MorphOne.php b/vendor/illuminate/database/Eloquent/Relations/MorphOne.php deleted file mode 100644 index fa3632e..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/MorphOne.php +++ /dev/null @@ -1,122 +0,0 @@ - - */ -class MorphOne extends MorphOneOrMany implements SupportsPartialRelations -{ - use CanBeOneOfMany, ComparesRelatedModels, SupportsDefaultModels; - - /** @inheritDoc */ - public function getResults() - { - if (is_null($this->getParentKey())) { - return $this->getDefaultFor($this->parent); - } - - return $this->query->first() ?: $this->getDefaultFor($this->parent); - } - - /** @inheritDoc */ - public function initRelation(array $models, $relation) - { - foreach ($models as $model) { - $model->setRelation($relation, $this->getDefaultFor($model)); - } - - return $models; - } - - /** @inheritDoc */ - public function match(array $models, EloquentCollection $results, $relation) - { - return $this->matchOne($models, $results, $relation); - } - - /** @inheritDoc */ - public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $columns = ['*']) - { - if ($this->isOneOfMany()) { - $this->mergeOneOfManyJoinsTo($query); - } - - return parent::getRelationExistenceQuery($query, $parentQuery, $columns); - } - - /** - * Add constraints for inner join subselect for one of many relationships. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param string|null $column - * @param string|null $aggregate - * @return void - */ - public function addOneOfManySubQueryConstraints(Builder $query, $column = null, $aggregate = null) - { - $query->addSelect($this->foreignKey, $this->morphType); - } - - /** - * Get the columns that should be selected by the one of many subquery. - * - * @return array|string - */ - public function getOneOfManySubQuerySelectColumns() - { - return [$this->foreignKey, $this->morphType]; - } - - /** - * Add join query constraints for one of many relationships. - * - * @param \Illuminate\Database\Query\JoinClause $join - * @return void - */ - public function addOneOfManyJoinSubQueryConstraints(JoinClause $join) - { - $join - ->on($this->qualifySubSelectColumn($this->morphType), '=', $this->qualifyRelatedColumn($this->morphType)) - ->on($this->qualifySubSelectColumn($this->foreignKey), '=', $this->qualifyRelatedColumn($this->foreignKey)); - } - - /** - * Make a new related instance for the given model. - * - * @param TDeclaringModel $parent - * @return TRelatedModel - */ - public function newRelatedInstanceFor(Model $parent) - { - return tap($this->related->newInstance(), function ($instance) use ($parent) { - $instance->setAttribute($this->getForeignKeyName(), $parent->{$this->localKey}) - ->setAttribute($this->getMorphType(), $this->morphClass); - - $this->applyInverseRelationToModel($instance, $parent); - }); - } - - /** - * Get the value of the model's foreign key. - * - * @param TRelatedModel $model - * @return int|string - */ - protected function getRelatedKeyFrom(Model $model) - { - return $model->getAttribute($this->getForeignKeyName()); - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/MorphOneOrMany.php b/vendor/illuminate/database/Eloquent/Relations/MorphOneOrMany.php deleted file mode 100644 index 1e879c1..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/MorphOneOrMany.php +++ /dev/null @@ -1,181 +0,0 @@ - - */ -abstract class MorphOneOrMany extends HasOneOrMany -{ - /** - * The foreign key type for the relationship. - * - * @var string - */ - protected $morphType; - - /** - * The class name of the parent model. - * - * @var string - */ - protected $morphClass; - - /** - * Create a new morph one or many relationship instance. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string $type - * @param string $id - * @param string $localKey - * @return void - */ - public function __construct(Builder $query, Model $parent, $type, $id, $localKey) - { - $this->morphType = $type; - - $this->morphClass = $parent->getMorphClass(); - - parent::__construct($query, $parent, $id, $localKey); - } - - /** - * Set the base constraints on the relation query. - * - * @return void - */ - public function addConstraints() - { - if (static::$constraints) { - $this->getRelationQuery()->where($this->morphType, $this->morphClass); - - parent::addConstraints(); - } - } - - /** @inheritDoc */ - public function addEagerConstraints(array $models) - { - parent::addEagerConstraints($models); - - $this->getRelationQuery()->where($this->morphType, $this->morphClass); - } - - /** - * Create a new instance of the related model. Allow mass-assignment. - * - * @param array $attributes - * @return TRelatedModel - */ - public function forceCreate(array $attributes = []) - { - $attributes[$this->getForeignKeyName()] = $this->getParentKey(); - $attributes[$this->getMorphType()] = $this->morphClass; - - return $this->applyInverseRelationToModel($this->related->forceCreate($attributes)); - } - - /** - * Set the foreign ID and type for creating a related model. - * - * @param TRelatedModel $model - * @return void - */ - protected function setForeignAttributesForCreate(Model $model) - { - $model->{$this->getForeignKeyName()} = $this->getParentKey(); - - $model->{$this->getMorphType()} = $this->morphClass; - - foreach ($this->getQuery()->pendingAttributes as $key => $value) { - $attributes ??= $model->getAttributes(); - - if (! array_key_exists($key, $attributes)) { - $model->setAttribute($key, $value); - } - } - - $this->applyInverseRelationToModel($model); - } - - /** - * Insert new records or update the existing ones. - * - * @param array $values - * @param array|string $uniqueBy - * @param array|null $update - * @return int - */ - public function upsert(array $values, $uniqueBy, $update = null) - { - if (! empty($values) && ! is_array(reset($values))) { - $values = [$values]; - } - - foreach ($values as $key => $value) { - $values[$key][$this->getMorphType()] = $this->getMorphClass(); - } - - return parent::upsert($values, $uniqueBy, $update); - } - - /** @inheritDoc */ - public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $columns = ['*']) - { - return parent::getRelationExistenceQuery($query, $parentQuery, $columns)->where( - $query->qualifyColumn($this->getMorphType()), $this->morphClass - ); - } - - /** - * Get the foreign key "type" name. - * - * @return string - */ - public function getQualifiedMorphType() - { - return $this->morphType; - } - - /** - * Get the plain morph type name without the table. - * - * @return string - */ - public function getMorphType() - { - return last(explode('.', $this->morphType)); - } - - /** - * Get the class name of the parent model. - * - * @return string - */ - public function getMorphClass() - { - return $this->morphClass; - } - - /** - * Get the possible inverse relations for the parent model. - * - * @return array - */ - protected function getPossibleInverseRelations(): array - { - return array_unique([ - Str::beforeLast($this->getMorphType(), '_type'), - ...parent::getPossibleInverseRelations(), - ]); - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/MorphPivot.php b/vendor/illuminate/database/Eloquent/Relations/MorphPivot.php deleted file mode 100644 index 566e198..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/MorphPivot.php +++ /dev/null @@ -1,184 +0,0 @@ - $query - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function setKeysForSaveQuery($query) - { - $query->where($this->morphType, $this->morphClass); - - return parent::setKeysForSaveQuery($query); - } - - /** - * Set the keys for a select query. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function setKeysForSelectQuery($query) - { - $query->where($this->morphType, $this->morphClass); - - return parent::setKeysForSelectQuery($query); - } - - /** - * Delete the pivot model record from the database. - * - * @return int - */ - public function delete() - { - if (isset($this->attributes[$this->getKeyName()])) { - return (int) parent::delete(); - } - - if ($this->fireModelEvent('deleting') === false) { - return 0; - } - - $query = $this->getDeleteQuery(); - - $query->where($this->morphType, $this->morphClass); - - return tap($query->delete(), function () { - $this->exists = false; - - $this->fireModelEvent('deleted', false); - }); - } - - /** - * Get the morph type for the pivot. - * - * @return string - */ - public function getMorphType() - { - return $this->morphType; - } - - /** - * Set the morph type for the pivot. - * - * @param string $morphType - * @return $this - */ - public function setMorphType($morphType) - { - $this->morphType = $morphType; - - return $this; - } - - /** - * Set the morph class for the pivot. - * - * @param string $morphClass - * @return \Illuminate\Database\Eloquent\Relations\MorphPivot - */ - public function setMorphClass($morphClass) - { - $this->morphClass = $morphClass; - - return $this; - } - - /** - * Get the queueable identity for the entity. - * - * @return mixed - */ - public function getQueueableId() - { - if (isset($this->attributes[$this->getKeyName()])) { - return $this->getKey(); - } - - return sprintf( - '%s:%s:%s:%s:%s:%s', - $this->foreignKey, $this->getAttribute($this->foreignKey), - $this->relatedKey, $this->getAttribute($this->relatedKey), - $this->morphType, $this->morphClass - ); - } - - /** - * Get a new query to restore one or more models by their queueable IDs. - * - * @param array|int $ids - * @return \Illuminate\Database\Eloquent\Builder - */ - public function newQueryForRestoration($ids) - { - if (is_array($ids)) { - return $this->newQueryForCollectionRestoration($ids); - } - - if (! str_contains($ids, ':')) { - return parent::newQueryForRestoration($ids); - } - - $segments = explode(':', $ids); - - return $this->newQueryWithoutScopes() - ->where($segments[0], $segments[1]) - ->where($segments[2], $segments[3]) - ->where($segments[4], $segments[5]); - } - - /** - * Get a new query to restore multiple models by their queueable IDs. - * - * @param array $ids - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function newQueryForCollectionRestoration(array $ids) - { - $ids = array_values($ids); - - if (! str_contains($ids[0], ':')) { - return parent::newQueryForRestoration($ids); - } - - $query = $this->newQueryWithoutScopes(); - - foreach ($ids as $id) { - $segments = explode(':', $id); - - $query->orWhere(function ($query) use ($segments) { - return $query->where($segments[0], $segments[1]) - ->where($segments[2], $segments[3]) - ->where($segments[4], $segments[5]); - }); - } - - return $query; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/MorphTo.php b/vendor/illuminate/database/Eloquent/Relations/MorphTo.php deleted file mode 100644 index cc42984..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/MorphTo.php +++ /dev/null @@ -1,456 +0,0 @@ - - */ -class MorphTo extends BelongsTo -{ - use InteractsWithDictionary; - - /** - * The type of the polymorphic relation. - * - * @var string - */ - protected $morphType; - - /** - * The associated key on the parent model. - * - * @var string|null - */ - protected $ownerKey; - - /** - * The models whose relations are being eager loaded. - * - * @var \Illuminate\Database\Eloquent\Collection - */ - protected $models; - - /** - * All of the models keyed by ID. - * - * @var array - */ - protected $dictionary = []; - - /** - * A buffer of dynamic calls to query macros. - * - * @var array - */ - protected $macroBuffer = []; - - /** - * A map of relations to load for each individual morph type. - * - * @var array - */ - protected $morphableEagerLoads = []; - - /** - * A map of relationship counts to load for each individual morph type. - * - * @var array - */ - protected $morphableEagerLoadCounts = []; - - /** - * A map of constraints to apply for each individual morph type. - * - * @var array - */ - protected $morphableConstraints = []; - - /** - * Create a new morph to relationship instance. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string $foreignKey - * @param string|null $ownerKey - * @param string $type - * @param string $relation - * @return void - */ - public function __construct(Builder $query, Model $parent, $foreignKey, $ownerKey, $type, $relation) - { - $this->morphType = $type; - - parent::__construct($query, $parent, $foreignKey, $ownerKey, $relation); - } - - /** @inheritDoc */ - #[\Override] - public function addEagerConstraints(array $models) - { - $this->buildDictionary($this->models = new EloquentCollection($models)); - } - - /** - * Build a dictionary with the models. - * - * @param \Illuminate\Database\Eloquent\Collection $models - * @return void - */ - protected function buildDictionary(EloquentCollection $models) - { - foreach ($models as $model) { - if ($model->{$this->morphType}) { - $morphTypeKey = $this->getDictionaryKey($model->{$this->morphType}); - $foreignKeyKey = $this->getDictionaryKey($model->{$this->foreignKey}); - - $this->dictionary[$morphTypeKey][$foreignKeyKey][] = $model; - } - } - } - - /** - * Get the results of the relationship. - * - * Called via eager load method of Eloquent query builder. - * - * @return \Illuminate\Database\Eloquent\Collection - */ - public function getEager() - { - foreach (array_keys($this->dictionary) as $type) { - $this->matchToMorphParents($type, $this->getResultsByType($type)); - } - - return $this->models; - } - - /** - * Get all of the relation results for a type. - * - * @param string $type - * @return \Illuminate\Database\Eloquent\Collection - */ - protected function getResultsByType($type) - { - $instance = $this->createModelByType($type); - - $ownerKey = $this->ownerKey ?? $instance->getKeyName(); - - $query = $this->replayMacros($instance->newQuery()) - ->mergeConstraintsFrom($this->getQuery()) - ->with(array_merge( - $this->getQuery()->getEagerLoads(), - (array) ($this->morphableEagerLoads[get_class($instance)] ?? []) - )) - ->withCount( - (array) ($this->morphableEagerLoadCounts[get_class($instance)] ?? []) - ); - - if ($callback = ($this->morphableConstraints[get_class($instance)] ?? null)) { - $callback($query); - } - - $whereIn = $this->whereInMethod($instance, $ownerKey); - - return $query->{$whereIn}( - $instance->qualifyColumn($ownerKey), $this->gatherKeysByType($type, $instance->getKeyType()) - )->get(); - } - - /** - * Gather all of the foreign keys for a given type. - * - * @param string $type - * @param string $keyType - * @return array - */ - protected function gatherKeysByType($type, $keyType) - { - return $keyType !== 'string' - ? array_keys($this->dictionary[$type]) - : array_map(function ($modelId) { - return (string) $modelId; - }, array_filter(array_keys($this->dictionary[$type]))); - } - - /** - * Create a new model instance by type. - * - * @param string $type - * @return TRelatedModel - */ - public function createModelByType($type) - { - $class = Model::getActualClassNameForMorph($type); - - return tap(new $class, function ($instance) { - if (! $instance->getConnectionName()) { - $instance->setConnection($this->getConnection()->getName()); - } - }); - } - - /** @inheritDoc */ - #[\Override] - public function match(array $models, EloquentCollection $results, $relation) - { - return $models; - } - - /** - * Match the results for a given type to their parents. - * - * @param string $type - * @param \Illuminate\Database\Eloquent\Collection $results - * @return void - */ - protected function matchToMorphParents($type, EloquentCollection $results) - { - foreach ($results as $result) { - $ownerKey = ! is_null($this->ownerKey) ? $this->getDictionaryKey($result->{$this->ownerKey}) : $result->getKey(); - - if (isset($this->dictionary[$type][$ownerKey])) { - foreach ($this->dictionary[$type][$ownerKey] as $model) { - $model->setRelation($this->relationName, $result); - } - } - } - } - - /** - * Associate the model instance to the given parent. - * - * @param TRelatedModel|null $model - * @return TDeclaringModel - */ - #[\Override] - public function associate($model) - { - if ($model instanceof Model) { - $foreignKey = $this->ownerKey && $model->{$this->ownerKey} - ? $this->ownerKey - : $model->getKeyName(); - } - - $this->parent->setAttribute( - $this->foreignKey, $model instanceof Model ? $model->{$foreignKey} : null - ); - - $this->parent->setAttribute( - $this->morphType, $model instanceof Model ? $model->getMorphClass() : null - ); - - return $this->parent->setRelation($this->relationName, $model); - } - - /** - * Dissociate previously associated model from the given parent. - * - * @return TDeclaringModel - */ - #[\Override] - public function dissociate() - { - $this->parent->setAttribute($this->foreignKey, null); - - $this->parent->setAttribute($this->morphType, null); - - return $this->parent->setRelation($this->relationName, null); - } - - /** @inheritDoc */ - #[\Override] - public function touch() - { - if (! is_null($this->getParentKey())) { - parent::touch(); - } - } - - /** @inheritDoc */ - #[\Override] - protected function newRelatedInstanceFor(Model $parent) - { - return $parent->{$this->getRelationName()}()->getRelated()->newInstance(); - } - - /** - * Get the foreign key "type" name. - * - * @return string - */ - public function getMorphType() - { - return $this->morphType; - } - - /** - * Get the dictionary used by the relationship. - * - * @return array - */ - public function getDictionary() - { - return $this->dictionary; - } - - /** - * Specify which relations to load for a given morph type. - * - * @param array $with - * @return $this - */ - public function morphWith(array $with) - { - $this->morphableEagerLoads = array_merge( - $this->morphableEagerLoads, $with - ); - - return $this; - } - - /** - * Specify which relationship counts to load for a given morph type. - * - * @param array $withCount - * @return $this - */ - public function morphWithCount(array $withCount) - { - $this->morphableEagerLoadCounts = array_merge( - $this->morphableEagerLoadCounts, $withCount - ); - - return $this; - } - - /** - * Specify constraints on the query for a given morph type. - * - * @param array $callbacks - * @return $this - */ - public function constrain(array $callbacks) - { - $this->morphableConstraints = array_merge( - $this->morphableConstraints, $callbacks - ); - - return $this; - } - - /** - * Indicate that soft deleted models should be included in the results. - * - * @return $this - */ - public function withTrashed() - { - $callback = fn ($query) => $query->hasMacro('withTrashed') ? $query->withTrashed() : $query; - - $this->macroBuffer[] = [ - 'method' => 'when', - 'parameters' => [true, $callback], - ]; - - return $this->when(true, $callback); - } - - /** - * Indicate that soft deleted models should not be included in the results. - * - * @return $this - */ - public function withoutTrashed() - { - $callback = fn ($query) => $query->hasMacro('withoutTrashed') ? $query->withoutTrashed() : $query; - - $this->macroBuffer[] = [ - 'method' => 'when', - 'parameters' => [true, $callback], - ]; - - return $this->when(true, $callback); - } - - /** - * Indicate that only soft deleted models should be included in the results. - * - * @return $this - */ - public function onlyTrashed() - { - $callback = fn ($query) => $query->hasMacro('onlyTrashed') ? $query->onlyTrashed() : $query; - - $this->macroBuffer[] = [ - 'method' => 'when', - 'parameters' => [true, $callback], - ]; - - return $this->when(true, $callback); - } - - /** - * Replay stored macro calls on the actual related instance. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function replayMacros(Builder $query) - { - foreach ($this->macroBuffer as $macro) { - $query->{$macro['method']}(...$macro['parameters']); - } - - return $query; - } - - /** @inheritDoc */ - #[\Override] - public function getQualifiedOwnerKeyName() - { - if (is_null($this->ownerKey)) { - return ''; - } - - return parent::getQualifiedOwnerKeyName(); - } - - /** - * Handle dynamic method calls to the relationship. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - try { - $result = parent::__call($method, $parameters); - - if (in_array($method, ['select', 'selectRaw', 'selectSub', 'addSelect', 'withoutGlobalScopes'])) { - $this->macroBuffer[] = compact('method', 'parameters'); - } - - return $result; - } - - // If we tried to call a method that does not exist on the parent Builder instance, - // we'll assume that we want to call a query macro (e.g. withTrashed) that only - // exists on related models. We will just store the call and replay it later. - catch (BadMethodCallException) { - $this->macroBuffer[] = compact('method', 'parameters'); - - return $this; - } - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/MorphToMany.php b/vendor/illuminate/database/Eloquent/Relations/MorphToMany.php deleted file mode 100644 index 157202b..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/MorphToMany.php +++ /dev/null @@ -1,226 +0,0 @@ - - */ -class MorphToMany extends BelongsToMany -{ - /** - * The type of the polymorphic relation. - * - * @var string - */ - protected $morphType; - - /** - * The class name of the morph type constraint. - * - * @var string - */ - protected $morphClass; - - /** - * Indicates if we are connecting the inverse of the relation. - * - * This primarily affects the morphClass constraint. - * - * @var bool - */ - protected $inverse; - - /** - * Create a new morph to many relationship instance. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @param string $name - * @param string $table - * @param string $foreignPivotKey - * @param string $relatedPivotKey - * @param string $parentKey - * @param string $relatedKey - * @param string|null $relationName - * @param bool $inverse - * @return void - */ - public function __construct( - Builder $query, - Model $parent, - $name, - $table, - $foreignPivotKey, - $relatedPivotKey, - $parentKey, - $relatedKey, - $relationName = null, - $inverse = false, - ) { - $this->inverse = $inverse; - $this->morphType = $name.'_type'; - $this->morphClass = $inverse ? $query->getModel()->getMorphClass() : $parent->getMorphClass(); - - parent::__construct( - $query, $parent, $table, $foreignPivotKey, - $relatedPivotKey, $parentKey, $relatedKey, $relationName - ); - } - - /** - * Set the where clause for the relation query. - * - * @return $this - */ - protected function addWhereConstraints() - { - parent::addWhereConstraints(); - - $this->query->where($this->qualifyPivotColumn($this->morphType), $this->morphClass); - - return $this; - } - - /** @inheritDoc */ - public function addEagerConstraints(array $models) - { - parent::addEagerConstraints($models); - - $this->query->where($this->qualifyPivotColumn($this->morphType), $this->morphClass); - } - - /** - * Create a new pivot attachment record. - * - * @param int $id - * @param bool $timed - * @return array - */ - protected function baseAttachRecord($id, $timed) - { - return Arr::add( - parent::baseAttachRecord($id, $timed), $this->morphType, $this->morphClass - ); - } - - /** @inheritDoc */ - public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $columns = ['*']) - { - return parent::getRelationExistenceQuery($query, $parentQuery, $columns)->where( - $this->qualifyPivotColumn($this->morphType), $this->morphClass - ); - } - - /** - * Get the pivot models that are currently attached. - * - * @return \Illuminate\Support\Collection - */ - protected function getCurrentlyAttachedPivots() - { - return parent::getCurrentlyAttachedPivots()->map(function ($record) { - return $record instanceof MorphPivot - ? $record->setMorphType($this->morphType) - ->setMorphClass($this->morphClass) - : $record; - }); - } - - /** - * Create a new query builder for the pivot table. - * - * @return \Illuminate\Database\Query\Builder - */ - public function newPivotQuery() - { - return parent::newPivotQuery()->where($this->morphType, $this->morphClass); - } - - /** - * Create a new pivot model instance. - * - * @param array $attributes - * @param bool $exists - * @return \Illuminate\Database\Eloquent\Relations\Pivot - */ - public function newPivot(array $attributes = [], $exists = false) - { - $using = $this->using; - - $attributes = array_merge([$this->morphType => $this->morphClass], $attributes); - - $pivot = $using ? $using::fromRawAttributes($this->parent, $attributes, $this->table, $exists) - : MorphPivot::fromAttributes($this->parent, $attributes, $this->table, $exists); - - $pivot->setPivotKeys($this->foreignPivotKey, $this->relatedPivotKey) - ->setRelatedModel($this->related) - ->setMorphType($this->morphType) - ->setMorphClass($this->morphClass); - - return $pivot; - } - - /** - * Get the pivot columns for the relation. - * - * "pivot_" is prefixed at each column for easy removal later. - * - * @return array - */ - protected function aliasedPivotColumns() - { - $defaults = [$this->foreignPivotKey, $this->relatedPivotKey, $this->morphType]; - - return (new Collection(array_merge($defaults, $this->pivotColumns)))->map(function ($column) { - return $this->qualifyPivotColumn($column).' as pivot_'.$column; - })->unique()->all(); - } - - /** - * Get the foreign key "type" name. - * - * @return string - */ - public function getMorphType() - { - return $this->morphType; - } - - /** - * Get the fully qualified morph type for the relation. - * - * @return string - */ - public function getQualifiedMorphTypeName() - { - return $this->qualifyPivotColumn($this->morphType); - } - - /** - * Get the class name of the parent model. - * - * @return string - */ - public function getMorphClass() - { - return $this->morphClass; - } - - /** - * Get the indicator for a reverse relationship. - * - * @return bool - */ - public function getInverse() - { - return $this->inverse; - } -} diff --git a/vendor/illuminate/database/Eloquent/Relations/Pivot.php b/vendor/illuminate/database/Eloquent/Relations/Pivot.php deleted file mode 100644 index 6e1d3f2..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/Pivot.php +++ /dev/null @@ -1,25 +0,0 @@ -|bool - */ - protected $guarded = []; -} diff --git a/vendor/illuminate/database/Eloquent/Relations/Relation.php b/vendor/illuminate/database/Eloquent/Relations/Relation.php deleted file mode 100644 index e9e431a..0000000 --- a/vendor/illuminate/database/Eloquent/Relations/Relation.php +++ /dev/null @@ -1,550 +0,0 @@ - - */ -abstract class Relation implements BuilderContract -{ - use ForwardsCalls, Macroable { - Macroable::__call as macroCall; - } - - /** - * The Eloquent query builder instance. - * - * @var \Illuminate\Database\Eloquent\Builder - */ - protected $query; - - /** - * The parent model instance. - * - * @var TDeclaringModel - */ - protected $parent; - - /** - * The related model instance. - * - * @var TRelatedModel - */ - protected $related; - - /** - * Indicates whether the eagerly loaded relation should implicitly return an empty collection. - * - * @var bool - */ - protected $eagerKeysWereEmpty = false; - - /** - * Indicates if the relation is adding constraints. - * - * @var bool - */ - protected static $constraints = true; - - /** - * An array to map morph names to their class names in the database. - * - * @var array> - */ - public static $morphMap = []; - - /** - * Prevents morph relationships without a morph map. - * - * @var bool - */ - protected static $requireMorphMap = false; - - /** - * The count of self joins. - * - * @var int - */ - protected static $selfJoinCount = 0; - - /** - * Create a new relation instance. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param TDeclaringModel $parent - * @return void - */ - public function __construct(Builder $query, Model $parent) - { - $this->query = $query; - $this->parent = $parent; - $this->related = $query->getModel(); - - $this->addConstraints(); - } - - /** - * Run a callback with constraints disabled on the relation. - * - * @template TReturn of mixed - * - * @param Closure(): TReturn $callback - * @return TReturn - */ - public static function noConstraints(Closure $callback) - { - $previous = static::$constraints; - - static::$constraints = false; - - // When resetting the relation where clause, we want to shift the first element - // off of the bindings, leaving only the constraints that the developers put - // as "extra" on the relationships, and not original relation constraints. - try { - return $callback(); - } finally { - static::$constraints = $previous; - } - } - - /** - * Set the base constraints on the relation query. - * - * @return void - */ - abstract public function addConstraints(); - - /** - * Set the constraints for an eager load of the relation. - * - * @param array $models - * @return void - */ - abstract public function addEagerConstraints(array $models); - - /** - * Initialize the relation on a set of models. - * - * @param array $models - * @param string $relation - * @return array - */ - abstract public function initRelation(array $models, $relation); - - /** - * Match the eagerly loaded results to their parents. - * - * @param array $models - * @param \Illuminate\Database\Eloquent\Collection $results - * @param string $relation - * @return array - */ - abstract public function match(array $models, EloquentCollection $results, $relation); - - /** - * Get the results of the relationship. - * - * @return TResult - */ - abstract public function getResults(); - - /** - * Get the relationship for eager loading. - * - * @return \Illuminate\Database\Eloquent\Collection - */ - public function getEager() - { - return $this->eagerKeysWereEmpty - ? $this->query->getModel()->newCollection() - : $this->get(); - } - - /** - * Execute the query and get the first result if it's the sole matching record. - * - * @param array|string $columns - * @return TRelatedModel - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - * @throws \Illuminate\Database\MultipleRecordsFoundException - */ - public function sole($columns = ['*']) - { - $result = $this->take(2)->get($columns); - - $count = $result->count(); - - if ($count === 0) { - throw (new ModelNotFoundException)->setModel(get_class($this->related)); - } - - if ($count > 1) { - throw new MultipleRecordsFoundException($count); - } - - return $result->first(); - } - - /** - * Execute the query as a "select" statement. - * - * @param array $columns - * @return \Illuminate\Database\Eloquent\Collection - */ - public function get($columns = ['*']) - { - return $this->query->get($columns); - } - - /** - * Touch all of the related models for the relationship. - * - * @return void - */ - public function touch() - { - $model = $this->getRelated(); - - if (! $model::isIgnoringTouch()) { - $this->rawUpdate([ - $model->getUpdatedAtColumn() => $model->freshTimestampString(), - ]); - } - } - - /** - * Run a raw update against the base query. - * - * @param array $attributes - * @return int - */ - public function rawUpdate(array $attributes = []) - { - return $this->query->withoutGlobalScopes()->update($attributes); - } - - /** - * Add the constraints for a relationship count query. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param \Illuminate\Database\Eloquent\Builder $parentQuery - * @return \Illuminate\Database\Eloquent\Builder - */ - public function getRelationExistenceCountQuery(Builder $query, Builder $parentQuery) - { - return $this->getRelationExistenceQuery( - $query, $parentQuery, new Expression('count(*)') - )->setBindings([], 'select'); - } - - /** - * Add the constraints for an internal relationship existence query. - * - * Essentially, these queries compare on column names like whereColumn. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param \Illuminate\Database\Eloquent\Builder $parentQuery - * @param array|mixed $columns - * @return \Illuminate\Database\Eloquent\Builder - */ - public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $columns = ['*']) - { - return $query->select($columns)->whereColumn( - $this->getQualifiedParentKeyName(), '=', $this->getExistenceCompareKey() - ); - } - - /** - * Get a relationship join table hash. - * - * @param bool $incrementJoinCount - * @return string - */ - public function getRelationCountHash($incrementJoinCount = true) - { - return 'laravel_reserved_'.($incrementJoinCount ? static::$selfJoinCount++ : static::$selfJoinCount); - } - - /** - * Get all of the primary keys for an array of models. - * - * @param array $models - * @param string|null $key - * @return array - */ - protected function getKeys(array $models, $key = null) - { - return (new BaseCollection($models))->map(function ($value) use ($key) { - return $key ? $value->getAttribute($key) : $value->getKey(); - })->values()->unique(null, true)->sort()->all(); - } - - /** - * Get the query builder that will contain the relationship constraints. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function getRelationQuery() - { - return $this->query; - } - - /** - * Get the underlying query for the relation. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public function getQuery() - { - return $this->query; - } - - /** - * Get the base query builder driving the Eloquent builder. - * - * @return \Illuminate\Database\Query\Builder - */ - public function getBaseQuery() - { - return $this->query->getQuery(); - } - - /** - * Get a base query builder instance. - * - * @return \Illuminate\Database\Query\Builder - */ - public function toBase() - { - return $this->query->toBase(); - } - - /** - * Get the parent model of the relation. - * - * @return TDeclaringModel - */ - public function getParent() - { - return $this->parent; - } - - /** - * Get the fully qualified parent key name. - * - * @return string - */ - public function getQualifiedParentKeyName() - { - return $this->parent->getQualifiedKeyName(); - } - - /** - * Get the related model of the relation. - * - * @return TRelatedModel - */ - public function getRelated() - { - return $this->related; - } - - /** - * Get the name of the "created at" column. - * - * @return string - */ - public function createdAt() - { - return $this->parent->getCreatedAtColumn(); - } - - /** - * Get the name of the "updated at" column. - * - * @return string - */ - public function updatedAt() - { - return $this->parent->getUpdatedAtColumn(); - } - - /** - * Get the name of the related model's "updated at" column. - * - * @return string - */ - public function relatedUpdatedAt() - { - return $this->related->getUpdatedAtColumn(); - } - - /** - * Add a whereIn eager constraint for the given set of model keys to be loaded. - * - * @param string $whereIn - * @param string $key - * @param array $modelKeys - * @param \Illuminate\Database\Eloquent\Builder|null $query - * @return void - */ - protected function whereInEager(string $whereIn, string $key, array $modelKeys, ?Builder $query = null) - { - ($query ?? $this->query)->{$whereIn}($key, $modelKeys); - - if ($modelKeys === []) { - $this->eagerKeysWereEmpty = true; - } - } - - /** - * Get the name of the "where in" method for eager loading. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @param string $key - * @return string - */ - protected function whereInMethod(Model $model, $key) - { - return $model->getKeyName() === last(explode('.', $key)) - && in_array($model->getKeyType(), ['int', 'integer']) - ? 'whereIntegerInRaw' - : 'whereIn'; - } - - /** - * Prevent polymorphic relationships from being used without model mappings. - * - * @param bool $requireMorphMap - * @return void - */ - public static function requireMorphMap($requireMorphMap = true) - { - static::$requireMorphMap = $requireMorphMap; - } - - /** - * Determine if polymorphic relationships require explicit model mapping. - * - * @return bool - */ - public static function requiresMorphMap() - { - return static::$requireMorphMap; - } - - /** - * Define the morph map for polymorphic relations and require all morphed models to be explicitly mapped. - * - * @param array> $map - * @param bool $merge - * @return array - */ - public static function enforceMorphMap(array $map, $merge = true) - { - static::requireMorphMap(); - - return static::morphMap($map, $merge); - } - - /** - * Set or get the morph map for polymorphic relations. - * - * @param array>|null $map - * @param bool $merge - * @return array> - */ - public static function morphMap(?array $map = null, $merge = true) - { - $map = static::buildMorphMapFromModels($map); - - if (is_array($map)) { - static::$morphMap = $merge && static::$morphMap - ? $map + static::$morphMap : $map; - } - - return static::$morphMap; - } - - /** - * Builds a table-keyed array from model class names. - * - * @param list>|null $models - * @return array>|null - */ - protected static function buildMorphMapFromModels(?array $models = null) - { - if (is_null($models) || ! array_is_list($models)) { - return $models; - } - - return array_combine(array_map(function ($model) { - return (new $model)->getTable(); - }, $models), $models); - } - - /** - * Get the model associated with a custom polymorphic type. - * - * @param string $alias - * @return class-string<\Illuminate\Database\Eloquent\Model>|null - */ - public static function getMorphedModel($alias) - { - return static::$morphMap[$alias] ?? null; - } - - /** - * Get the alias associated with a custom polymorphic class. - * - * @param class-string<\Illuminate\Database\Eloquent\Model> $className - * @return int|string - */ - public static function getMorphAlias(string $className) - { - return array_search($className, static::$morphMap, strict: true) ?: $className; - } - - /** - * Handle dynamic method calls to the relationship. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - if (static::hasMacro($method)) { - return $this->macroCall($method, $parameters); - } - - return $this->forwardDecoratedCallTo($this->query, $method, $parameters); - } - - /** - * Force a clone of the underlying query builder when cloning. - * - * @return void - */ - public function __clone() - { - $this->query = clone $this->query; - } -} diff --git a/vendor/illuminate/database/Eloquent/Scope.php b/vendor/illuminate/database/Eloquent/Scope.php deleted file mode 100644 index 63cba6a..0000000 --- a/vendor/illuminate/database/Eloquent/Scope.php +++ /dev/null @@ -1,15 +0,0 @@ - withTrashed(bool $withTrashed = true) - * @method static \Illuminate\Database\Eloquent\Builder onlyTrashed() - * @method static \Illuminate\Database\Eloquent\Builder withoutTrashed() - * @method static static restoreOrCreate(array $attributes = [], array $values = []) - * @method static static createOrRestore(array $attributes = [], array $values = []) - */ -trait SoftDeletes -{ - /** - * Indicates if the model is currently force deleting. - * - * @var bool - */ - protected $forceDeleting = false; - - /** - * Boot the soft deleting trait for a model. - * - * @return void - */ - public static function bootSoftDeletes() - { - static::addGlobalScope(new SoftDeletingScope); - } - - /** - * Initialize the soft deleting trait for an instance. - * - * @return void - */ - public function initializeSoftDeletes() - { - if (! isset($this->casts[$this->getDeletedAtColumn()])) { - $this->casts[$this->getDeletedAtColumn()] = 'datetime'; - } - } - - /** - * Force a hard delete on a soft deleted model. - * - * @return bool|null - */ - public function forceDelete() - { - if ($this->fireModelEvent('forceDeleting') === false) { - return false; - } - - $this->forceDeleting = true; - - return tap($this->delete(), function ($deleted) { - $this->forceDeleting = false; - - if ($deleted) { - $this->fireModelEvent('forceDeleted', false); - } - }); - } - - /** - * Force a hard delete on a soft deleted model without raising any events. - * - * @return bool|null - */ - public function forceDeleteQuietly() - { - return static::withoutEvents(fn () => $this->forceDelete()); - } - - /** - * Destroy the models for the given IDs. - * - * @param \Illuminate\Support\Collection|array|int|string $ids - * @return int - */ - public static function forceDestroy($ids) - { - if ($ids instanceof EloquentCollection) { - $ids = $ids->modelKeys(); - } - - if ($ids instanceof BaseCollection) { - $ids = $ids->all(); - } - - $ids = is_array($ids) ? $ids : func_get_args(); - - if (count($ids) === 0) { - return 0; - } - - // We will actually pull the models from the database table and call delete on - // each of them individually so that their events get fired properly with a - // correct set of attributes in case the developers wants to check these. - $key = ($instance = new static)->getKeyName(); - - $count = 0; - - foreach ($instance->withTrashed()->whereIn($key, $ids)->get() as $model) { - if ($model->forceDelete()) { - $count++; - } - } - - return $count; - } - - /** - * Perform the actual delete query on this model instance. - * - * @return mixed - */ - protected function performDeleteOnModel() - { - if ($this->forceDeleting) { - return tap($this->setKeysForSaveQuery($this->newModelQuery())->forceDelete(), function () { - $this->exists = false; - }); - } - - return $this->runSoftDelete(); - } - - /** - * Perform the actual delete query on this model instance. - * - * @return void - */ - protected function runSoftDelete() - { - $query = $this->setKeysForSaveQuery($this->newModelQuery()); - - $time = $this->freshTimestamp(); - - $columns = [$this->getDeletedAtColumn() => $this->fromDateTime($time)]; - - $this->{$this->getDeletedAtColumn()} = $time; - - if ($this->usesTimestamps() && ! is_null($this->getUpdatedAtColumn())) { - $this->{$this->getUpdatedAtColumn()} = $time; - - $columns[$this->getUpdatedAtColumn()] = $this->fromDateTime($time); - } - - $query->update($columns); - - $this->syncOriginalAttributes(array_keys($columns)); - - $this->fireModelEvent('trashed', false); - } - - /** - * Restore a soft-deleted model instance. - * - * @return bool - */ - public function restore() - { - // If the restoring event does not return false, we will proceed with this - // restore operation. Otherwise, we bail out so the developer will stop - // the restore totally. We will clear the deleted timestamp and save. - if ($this->fireModelEvent('restoring') === false) { - return false; - } - - $this->{$this->getDeletedAtColumn()} = null; - - // Once we have saved the model, we will fire the "restored" event so this - // developer will do anything they need to after a restore operation is - // totally finished. Then we will return the result of the save call. - $this->exists = true; - - $result = $this->save(); - - $this->fireModelEvent('restored', false); - - return $result; - } - - /** - * Restore a soft-deleted model instance without raising any events. - * - * @return bool - */ - public function restoreQuietly() - { - return static::withoutEvents(fn () => $this->restore()); - } - - /** - * Determine if the model instance has been soft-deleted. - * - * @return bool - */ - public function trashed() - { - return ! is_null($this->{$this->getDeletedAtColumn()}); - } - - /** - * Register a "softDeleted" model event callback with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|class-string $callback - * @return void - */ - public static function softDeleted($callback) - { - static::registerModelEvent('trashed', $callback); - } - - /** - * Register a "restoring" model event callback with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|class-string $callback - * @return void - */ - public static function restoring($callback) - { - static::registerModelEvent('restoring', $callback); - } - - /** - * Register a "restored" model event callback with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|class-string $callback - * @return void - */ - public static function restored($callback) - { - static::registerModelEvent('restored', $callback); - } - - /** - * Register a "forceDeleting" model event callback with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|class-string $callback - * @return void - */ - public static function forceDeleting($callback) - { - static::registerModelEvent('forceDeleting', $callback); - } - - /** - * Register a "forceDeleted" model event callback with the dispatcher. - * - * @param \Illuminate\Events\QueuedClosure|callable|class-string $callback - * @return void - */ - public static function forceDeleted($callback) - { - static::registerModelEvent('forceDeleted', $callback); - } - - /** - * Determine if the model is currently force deleting. - * - * @return bool - */ - public function isForceDeleting() - { - return $this->forceDeleting; - } - - /** - * Get the name of the "deleted at" column. - * - * @return string - */ - public function getDeletedAtColumn() - { - return defined(static::class.'::DELETED_AT') ? static::DELETED_AT : 'deleted_at'; - } - - /** - * Get the fully qualified "deleted at" column. - * - * @return string - */ - public function getQualifiedDeletedAtColumn() - { - return $this->qualifyColumn($this->getDeletedAtColumn()); - } -} diff --git a/vendor/illuminate/database/Eloquent/SoftDeletingScope.php b/vendor/illuminate/database/Eloquent/SoftDeletingScope.php deleted file mode 100644 index d1ef0d2..0000000 --- a/vendor/illuminate/database/Eloquent/SoftDeletingScope.php +++ /dev/null @@ -1,167 +0,0 @@ - $builder - * @param TModel $model - * @return void - */ - public function apply(Builder $builder, Model $model) - { - $builder->whereNull($model->getQualifiedDeletedAtColumn()); - } - - /** - * Extend the query builder with the needed functions. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $builder - * @return void - */ - public function extend(Builder $builder) - { - foreach ($this->extensions as $extension) { - $this->{"add{$extension}"}($builder); - } - - $builder->onDelete(function (Builder $builder) { - $column = $this->getDeletedAtColumn($builder); - - return $builder->update([ - $column => $builder->getModel()->freshTimestampString(), - ]); - }); - } - - /** - * Get the "deleted at" column for the builder. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $builder - * @return string - */ - protected function getDeletedAtColumn(Builder $builder) - { - if (count((array) $builder->getQuery()->joins) > 0) { - return $builder->getModel()->getQualifiedDeletedAtColumn(); - } - - return $builder->getModel()->getDeletedAtColumn(); - } - - /** - * Add the restore extension to the builder. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $builder - * @return void - */ - protected function addRestore(Builder $builder) - { - $builder->macro('restore', function (Builder $builder) { - $builder->withTrashed(); - - return $builder->update([$builder->getModel()->getDeletedAtColumn() => null]); - }); - } - - /** - * Add the restore-or-create extension to the builder. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $builder - * @return void - */ - protected function addRestoreOrCreate(Builder $builder) - { - $builder->macro('restoreOrCreate', function (Builder $builder, array $attributes = [], array $values = []) { - $builder->withTrashed(); - - return tap($builder->firstOrCreate($attributes, $values), function ($instance) { - $instance->restore(); - }); - }); - } - - /** - * Add the create-or-restore extension to the builder. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $builder - * @return void - */ - protected function addCreateOrRestore(Builder $builder) - { - $builder->macro('createOrRestore', function (Builder $builder, array $attributes = [], array $values = []) { - $builder->withTrashed(); - - return tap($builder->createOrFirst($attributes, $values), function ($instance) { - $instance->restore(); - }); - }); - } - - /** - * Add the with-trashed extension to the builder. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $builder - * @return void - */ - protected function addWithTrashed(Builder $builder) - { - $builder->macro('withTrashed', function (Builder $builder, $withTrashed = true) { - if (! $withTrashed) { - return $builder->withoutTrashed(); - } - - return $builder->withoutGlobalScope($this); - }); - } - - /** - * Add the without-trashed extension to the builder. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $builder - * @return void - */ - protected function addWithoutTrashed(Builder $builder) - { - $builder->macro('withoutTrashed', function (Builder $builder) { - $model = $builder->getModel(); - - $builder->withoutGlobalScope($this)->whereNull( - $model->getQualifiedDeletedAtColumn() - ); - - return $builder; - }); - } - - /** - * Add the only-trashed extension to the builder. - * - * @param \Illuminate\Database\Eloquent\Builder<*> $builder - * @return void - */ - protected function addOnlyTrashed(Builder $builder) - { - $builder->macro('onlyTrashed', function (Builder $builder) { - $model = $builder->getModel(); - - $builder->withoutGlobalScope($this)->whereNotNull( - $model->getQualifiedDeletedAtColumn() - ); - - return $builder; - }); - } -} diff --git a/vendor/illuminate/database/Events/ConnectionEstablished.php b/vendor/illuminate/database/Events/ConnectionEstablished.php deleted file mode 100644 index 22a45b8..0000000 --- a/vendor/illuminate/database/Events/ConnectionEstablished.php +++ /dev/null @@ -1,8 +0,0 @@ -connection = $connection; - $this->connectionName = $connection->getName(); - } -} diff --git a/vendor/illuminate/database/Events/DatabaseBusy.php b/vendor/illuminate/database/Events/DatabaseBusy.php deleted file mode 100644 index 8e903a9..0000000 --- a/vendor/illuminate/database/Events/DatabaseBusy.php +++ /dev/null @@ -1,32 +0,0 @@ -connectionName = $connectionName; - $this->connections = $connections; - } -} diff --git a/vendor/illuminate/database/Events/DatabaseRefreshed.php b/vendor/illuminate/database/Events/DatabaseRefreshed.php deleted file mode 100644 index 0610269..0000000 --- a/vendor/illuminate/database/Events/DatabaseRefreshed.php +++ /dev/null @@ -1,22 +0,0 @@ -method = $method; - $this->migration = $migration; - } -} diff --git a/vendor/illuminate/database/Events/MigrationStarted.php b/vendor/illuminate/database/Events/MigrationStarted.php deleted file mode 100644 index 3f206b4..0000000 --- a/vendor/illuminate/database/Events/MigrationStarted.php +++ /dev/null @@ -1,8 +0,0 @@ - - */ - public $options; - - /** - * Create a new event instance. - * - * @param string $method - * @param array $options - * @return void - */ - public function __construct($method, array $options = []) - { - $this->method = $method; - $this->options = $options; - } -} diff --git a/vendor/illuminate/database/Events/MigrationsPruned.php b/vendor/illuminate/database/Events/MigrationsPruned.php deleted file mode 100644 index 86b48e9..0000000 --- a/vendor/illuminate/database/Events/MigrationsPruned.php +++ /dev/null @@ -1,43 +0,0 @@ -connection = $connection; - $this->connectionName = $connection->getName(); - $this->path = $path; - } -} diff --git a/vendor/illuminate/database/Events/MigrationsStarted.php b/vendor/illuminate/database/Events/MigrationsStarted.php deleted file mode 100644 index 5283b49..0000000 --- a/vendor/illuminate/database/Events/MigrationsStarted.php +++ /dev/null @@ -1,8 +0,0 @@ - - */ - public $models; - - /** - * Create a new event instance. - * - * @param array $models - * @return void - */ - public function __construct($models) - { - $this->models = $models; - } -} diff --git a/vendor/illuminate/database/Events/ModelPruningStarting.php b/vendor/illuminate/database/Events/ModelPruningStarting.php deleted file mode 100644 index e6cc4d8..0000000 --- a/vendor/illuminate/database/Events/ModelPruningStarting.php +++ /dev/null @@ -1,24 +0,0 @@ - - */ - public $models; - - /** - * Create a new event instance. - * - * @param array $models - * @return void - */ - public function __construct($models) - { - $this->models = $models; - } -} diff --git a/vendor/illuminate/database/Events/ModelsPruned.php b/vendor/illuminate/database/Events/ModelsPruned.php deleted file mode 100644 index ca8bee9..0000000 --- a/vendor/illuminate/database/Events/ModelsPruned.php +++ /dev/null @@ -1,33 +0,0 @@ -model = $model; - $this->count = $count; - } -} diff --git a/vendor/illuminate/database/Events/NoPendingMigrations.php b/vendor/illuminate/database/Events/NoPendingMigrations.php deleted file mode 100644 index 2a1cb34..0000000 --- a/vendor/illuminate/database/Events/NoPendingMigrations.php +++ /dev/null @@ -1,26 +0,0 @@ -method = $method; - } -} diff --git a/vendor/illuminate/database/Events/QueryExecuted.php b/vendor/illuminate/database/Events/QueryExecuted.php deleted file mode 100644 index 644d947..0000000 --- a/vendor/illuminate/database/Events/QueryExecuted.php +++ /dev/null @@ -1,72 +0,0 @@ -sql = $sql; - $this->time = $time; - $this->bindings = $bindings; - $this->connection = $connection; - $this->connectionName = $connection->getName(); - } - - /** - * Get the raw SQL representation of the query with embedded bindings. - * - * @return string - */ - public function toRawSql() - { - return $this->connection - ->query() - ->getGrammar() - ->substituteBindingsIntoRawSql($this->sql, $this->connection->prepareBindings($this->bindings)); - } -} diff --git a/vendor/illuminate/database/Events/SchemaDumped.php b/vendor/illuminate/database/Events/SchemaDumped.php deleted file mode 100644 index 1cbbfff..0000000 --- a/vendor/illuminate/database/Events/SchemaDumped.php +++ /dev/null @@ -1,41 +0,0 @@ -connection = $connection; - $this->connectionName = $connection->getName(); - $this->path = $path; - } -} diff --git a/vendor/illuminate/database/Events/SchemaLoaded.php b/vendor/illuminate/database/Events/SchemaLoaded.php deleted file mode 100644 index 061a079..0000000 --- a/vendor/illuminate/database/Events/SchemaLoaded.php +++ /dev/null @@ -1,41 +0,0 @@ -connection = $connection; - $this->connectionName = $connection->getName(); - $this->path = $path; - } -} diff --git a/vendor/illuminate/database/Events/StatementPrepared.php b/vendor/illuminate/database/Events/StatementPrepared.php deleted file mode 100644 index 2f60323..0000000 --- a/vendor/illuminate/database/Events/StatementPrepared.php +++ /dev/null @@ -1,33 +0,0 @@ -statement = $statement; - $this->connection = $connection; - } -} diff --git a/vendor/illuminate/database/Events/TransactionBeginning.php b/vendor/illuminate/database/Events/TransactionBeginning.php deleted file mode 100644 index 3287b5c..0000000 --- a/vendor/illuminate/database/Events/TransactionBeginning.php +++ /dev/null @@ -1,8 +0,0 @@ -isExpression($table)) { - return $this->getValue($table); - } - - // If the table being wrapped has an alias we'll need to separate the pieces - // so we can prefix the table and then wrap each of the segments on their - // own and then join these both back together using the "as" connector. - if (stripos($table, ' as ') !== false) { - return $this->wrapAliasedTable($table); - } - - // If the table being wrapped has a custom schema name specified, we need to - // prefix the last segment as the table name then wrap each segment alone - // and eventually join them both back together using the dot connector. - if (str_contains($table, '.')) { - $table = substr_replace($table, '.'.$this->tablePrefix, strrpos($table, '.'), 1); - - return (new Collection(explode('.', $table))) - ->map($this->wrapValue(...)) - ->implode('.'); - } - - return $this->wrapValue($this->tablePrefix.$table); - } - - /** - * Wrap a value in keyword identifiers. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $value - * @return string - */ - public function wrap($value) - { - if ($this->isExpression($value)) { - return $this->getValue($value); - } - - // If the value being wrapped has a column alias we will need to separate out - // the pieces so we can wrap each of the segments of the expression on its - // own, and then join these both back together using the "as" connector. - if (stripos($value, ' as ') !== false) { - return $this->wrapAliasedValue($value); - } - - // If the given value is a JSON selector we will wrap it differently than a - // traditional value. We will need to split this path and wrap each part - // wrapped, etc. Otherwise, we will simply wrap the value as a string. - if ($this->isJsonSelector($value)) { - return $this->wrapJsonSelector($value); - } - - return $this->wrapSegments(explode('.', $value)); - } - - /** - * Wrap a value that has an alias. - * - * @param string $value - * @return string - */ - protected function wrapAliasedValue($value) - { - $segments = preg_split('/\s+as\s+/i', $value); - - return $this->wrap($segments[0]).' as '.$this->wrapValue($segments[1]); - } - - /** - * Wrap a table that has an alias. - * - * @param string $value - * @return string - */ - protected function wrapAliasedTable($value) - { - $segments = preg_split('/\s+as\s+/i', $value); - - return $this->wrapTable($segments[0]).' as '.$this->wrapValue($this->tablePrefix.$segments[1]); - } - - /** - * Wrap the given value segments. - * - * @param array $segments - * @return string - */ - protected function wrapSegments($segments) - { - return (new Collection($segments))->map(function ($segment, $key) use ($segments) { - return $key == 0 && count($segments) > 1 - ? $this->wrapTable($segment) - : $this->wrapValue($segment); - })->implode('.'); - } - - /** - * Wrap a single string in keyword identifiers. - * - * @param string $value - * @return string - */ - protected function wrapValue($value) - { - if ($value !== '*') { - return '"'.str_replace('"', '""', $value).'"'; - } - - return $value; - } - - /** - * Wrap the given JSON selector. - * - * @param string $value - * @return string - * - * @throws \RuntimeException - */ - protected function wrapJsonSelector($value) - { - throw new RuntimeException('This database engine does not support JSON operations.'); - } - - /** - * Determine if the given string is a JSON selector. - * - * @param string $value - * @return bool - */ - protected function isJsonSelector($value) - { - return str_contains($value, '->'); - } - - /** - * Convert an array of column names into a delimited string. - * - * @param array $columns - * @return string - */ - public function columnize(array $columns) - { - return implode(', ', array_map([$this, 'wrap'], $columns)); - } - - /** - * Create query parameter place-holders for an array. - * - * @param array $values - * @return string - */ - public function parameterize(array $values) - { - return implode(', ', array_map([$this, 'parameter'], $values)); - } - - /** - * Get the appropriate query parameter place-holder for a value. - * - * @param mixed $value - * @return string - */ - public function parameter($value) - { - return $this->isExpression($value) ? $this->getValue($value) : '?'; - } - - /** - * Quote the given string literal. - * - * @param string|array $value - * @return string - */ - public function quoteString($value) - { - if (is_array($value)) { - return implode(', ', array_map([$this, __FUNCTION__], $value)); - } - - return "'$value'"; - } - - /** - * Escapes a value for safe SQL embedding. - * - * @param string|float|int|bool|null $value - * @param bool $binary - * @return string - */ - public function escape($value, $binary = false) - { - if (is_null($this->connection)) { - throw new RuntimeException("The database driver's grammar implementation does not support escaping values."); - } - - return $this->connection->escape($value, $binary); - } - - /** - * Determine if the given value is a raw expression. - * - * @param mixed $value - * @return bool - */ - public function isExpression($value) - { - return $value instanceof Expression; - } - - /** - * Transforms expressions to their scalar types. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string|int|float $expression - * @return string|int|float - */ - public function getValue($expression) - { - if ($this->isExpression($expression)) { - return $this->getValue($expression->getValue($this)); - } - - return $expression; - } - - /** - * Get the format for database stored dates. - * - * @return string - */ - public function getDateFormat() - { - return 'Y-m-d H:i:s'; - } - - /** - * Get the grammar's table prefix. - * - * @return string - */ - public function getTablePrefix() - { - return $this->tablePrefix; - } - - /** - * Set the grammar's table prefix. - * - * @param string $prefix - * @return $this - */ - public function setTablePrefix($prefix) - { - $this->tablePrefix = $prefix; - - return $this; - } - - /** - * Set the grammar's database connection. - * - * @param \Illuminate\Database\Connection $connection - * @return $this - */ - public function setConnection($connection) - { - $this->connection = $connection; - - return $this; - } -} diff --git a/vendor/illuminate/database/LICENSE.md b/vendor/illuminate/database/LICENSE.md deleted file mode 100644 index 79810c8..0000000 --- a/vendor/illuminate/database/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Taylor Otwell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/illuminate/database/LazyLoadingViolationException.php b/vendor/illuminate/database/LazyLoadingViolationException.php deleted file mode 100644 index 36d8fec..0000000 --- a/vendor/illuminate/database/LazyLoadingViolationException.php +++ /dev/null @@ -1,39 +0,0 @@ -model = $class; - $this->relation = $relation; - } -} diff --git a/vendor/illuminate/database/LostConnectionException.php b/vendor/illuminate/database/LostConnectionException.php deleted file mode 100644 index c8e57e3..0000000 --- a/vendor/illuminate/database/LostConnectionException.php +++ /dev/null @@ -1,10 +0,0 @@ -setConnection($this); - - return $this->withTablePrefix($grammar); - } - - /** - * Get a schema builder instance for the connection. - * - * @return \Illuminate\Database\Schema\MariaDbBuilder - */ - public function getSchemaBuilder() - { - if (is_null($this->schemaGrammar)) { - $this->useDefaultSchemaGrammar(); - } - - return new MariaDbBuilder($this); - } - - /** - * Get the default schema grammar instance. - * - * @return \Illuminate\Database\Schema\Grammars\MariaDbGrammar - */ - protected function getDefaultSchemaGrammar() - { - ($grammar = new SchemaGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); - } - - /** - * Get the schema state for the connection. - * - * @param \Illuminate\Filesystem\Filesystem|null $files - * @param callable|null $processFactory - * @return \Illuminate\Database\Schema\MariaDbSchemaState - */ - public function getSchemaState(?Filesystem $files = null, ?callable $processFactory = null) - { - return new MariaDbSchemaState($this, $files, $processFactory); - } - - /** - * Get the default post processor instance. - * - * @return \Illuminate\Database\Query\Processors\MariaDbProcessor - */ - protected function getDefaultPostProcessor() - { - return new MariaDbProcessor; - } -} diff --git a/vendor/illuminate/database/MigrationServiceProvider.php b/vendor/illuminate/database/MigrationServiceProvider.php deleted file mode 100644 index cab266b..0000000 --- a/vendor/illuminate/database/MigrationServiceProvider.php +++ /dev/null @@ -1,226 +0,0 @@ - MigrateCommand::class, - 'MigrateFresh' => FreshCommand::class, - 'MigrateInstall' => InstallCommand::class, - 'MigrateRefresh' => RefreshCommand::class, - 'MigrateReset' => ResetCommand::class, - 'MigrateRollback' => RollbackCommand::class, - 'MigrateStatus' => StatusCommand::class, - 'MigrateMake' => MigrateMakeCommand::class, - ]; - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - $this->registerRepository(); - - $this->registerMigrator(); - - $this->registerCreator(); - - $this->registerCommands($this->commands); - } - - /** - * Register the migration repository service. - * - * @return void - */ - protected function registerRepository() - { - $this->app->singleton('migration.repository', function ($app) { - $migrations = $app['config']['database.migrations']; - - $table = is_array($migrations) ? ($migrations['table'] ?? null) : $migrations; - - return new DatabaseMigrationRepository($app['db'], $table); - }); - } - - /** - * Register the migrator service. - * - * @return void - */ - protected function registerMigrator() - { - // The migrator is responsible for actually running and rollback the migration - // files in the application. We'll pass in our database connection resolver - // so the migrator can resolve any of these connections when it needs to. - $this->app->singleton('migrator', function ($app) { - $repository = $app['migration.repository']; - - return new Migrator($repository, $app['db'], $app['files'], $app['events']); - }); - } - - /** - * Register the migration creator. - * - * @return void - */ - protected function registerCreator() - { - $this->app->singleton('migration.creator', function ($app) { - return new MigrationCreator($app['files'], $app->basePath('stubs')); - }); - } - - /** - * Register the given commands. - * - * @param array $commands - * @return void - */ - protected function registerCommands(array $commands) - { - foreach (array_keys($commands) as $command) { - $this->{"register{$command}Command"}(); - } - - $this->commands(array_values($commands)); - } - - /** - * Register the command. - * - * @return void - */ - protected function registerMigrateCommand() - { - $this->app->singleton(MigrateCommand::class, function ($app) { - return new MigrateCommand($app['migrator'], $app[Dispatcher::class]); - }); - } - - /** - * Register the command. - * - * @return void - */ - protected function registerMigrateFreshCommand() - { - $this->app->singleton(FreshCommand::class, function ($app) { - return new FreshCommand($app['migrator']); - }); - } - - /** - * Register the command. - * - * @return void - */ - protected function registerMigrateInstallCommand() - { - $this->app->singleton(InstallCommand::class, function ($app) { - return new InstallCommand($app['migration.repository']); - }); - } - - /** - * Register the command. - * - * @return void - */ - protected function registerMigrateMakeCommand() - { - $this->app->singleton(MigrateMakeCommand::class, function ($app) { - // Once we have the migration creator registered, we will create the command - // and inject the creator. The creator is responsible for the actual file - // creation of the migrations, and may be extended by these developers. - $creator = $app['migration.creator']; - - $composer = $app['composer']; - - return new MigrateMakeCommand($creator, $composer); - }); - } - - /** - * Register the command. - * - * @return void - */ - protected function registerMigrateRefreshCommand() - { - $this->app->singleton(RefreshCommand::class); - } - - /** - * Register the command. - * - * @return void - */ - protected function registerMigrateResetCommand() - { - $this->app->singleton(ResetCommand::class, function ($app) { - return new ResetCommand($app['migrator']); - }); - } - - /** - * Register the command. - * - * @return void - */ - protected function registerMigrateRollbackCommand() - { - $this->app->singleton(RollbackCommand::class, function ($app) { - return new RollbackCommand($app['migrator']); - }); - } - - /** - * Register the command. - * - * @return void - */ - protected function registerMigrateStatusCommand() - { - $this->app->singleton(StatusCommand::class, function ($app) { - return new StatusCommand($app['migrator']); - }); - } - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() - { - return array_merge([ - 'migrator', 'migration.repository', 'migration.creator', - ], array_values($this->commands)); - } -} diff --git a/vendor/illuminate/database/Migrations/DatabaseMigrationRepository.php b/vendor/illuminate/database/Migrations/DatabaseMigrationRepository.php deleted file mode 100644 index c5d5252..0000000 --- a/vendor/illuminate/database/Migrations/DatabaseMigrationRepository.php +++ /dev/null @@ -1,239 +0,0 @@ -table = $table; - $this->resolver = $resolver; - } - - /** - * Get the completed migrations. - * - * @return array - */ - public function getRan() - { - return $this->table() - ->orderBy('batch', 'asc') - ->orderBy('migration', 'asc') - ->pluck('migration')->all(); - } - - /** - * Get the list of migrations. - * - * @param int $steps - * @return array - */ - public function getMigrations($steps) - { - $query = $this->table()->where('batch', '>=', '1'); - - return $query->orderBy('batch', 'desc') - ->orderBy('migration', 'desc') - ->take($steps)->get()->all(); - } - - /** - * Get the list of the migrations by batch number. - * - * @param int $batch - * @return array - */ - public function getMigrationsByBatch($batch) - { - return $this->table() - ->where('batch', $batch) - ->orderBy('migration', 'desc') - ->get() - ->all(); - } - - /** - * Get the last migration batch. - * - * @return array - */ - public function getLast() - { - $query = $this->table()->where('batch', $this->getLastBatchNumber()); - - return $query->orderBy('migration', 'desc')->get()->all(); - } - - /** - * Get the completed migrations with their batch numbers. - * - * @return array - */ - public function getMigrationBatches() - { - return $this->table() - ->orderBy('batch', 'asc') - ->orderBy('migration', 'asc') - ->pluck('batch', 'migration')->all(); - } - - /** - * Log that a migration was run. - * - * @param string $file - * @param int $batch - * @return void - */ - public function log($file, $batch) - { - $record = ['migration' => $file, 'batch' => $batch]; - - $this->table()->insert($record); - } - - /** - * Remove a migration from the log. - * - * @param object $migration - * @return void - */ - public function delete($migration) - { - $this->table()->where('migration', $migration->migration)->delete(); - } - - /** - * Get the next migration batch number. - * - * @return int - */ - public function getNextBatchNumber() - { - return $this->getLastBatchNumber() + 1; - } - - /** - * Get the last migration batch number. - * - * @return int - */ - public function getLastBatchNumber() - { - return $this->table()->max('batch'); - } - - /** - * Create the migration repository data store. - * - * @return void - */ - public function createRepository() - { - $schema = $this->getConnection()->getSchemaBuilder(); - - $schema->create($this->table, function ($table) { - // The migrations table is responsible for keeping track of which of the - // migrations have actually run for the application. We'll create the - // table to hold the migration file's path as well as the batch ID. - $table->increments('id'); - $table->string('migration'); - $table->integer('batch'); - }); - } - - /** - * Determine if the migration repository exists. - * - * @return bool - */ - public function repositoryExists() - { - $schema = $this->getConnection()->getSchemaBuilder(); - - return $schema->hasTable($this->table); - } - - /** - * Delete the migration repository data store. - * - * @return void - */ - public function deleteRepository() - { - $schema = $this->getConnection()->getSchemaBuilder(); - - $schema->drop($this->table); - } - - /** - * Get a query builder for the migration table. - * - * @return \Illuminate\Database\Query\Builder - */ - protected function table() - { - return $this->getConnection()->table($this->table)->useWritePdo(); - } - - /** - * Get the connection resolver instance. - * - * @return \Illuminate\Database\ConnectionResolverInterface - */ - public function getConnectionResolver() - { - return $this->resolver; - } - - /** - * Resolve the database connection instance. - * - * @return \Illuminate\Database\Connection - */ - public function getConnection() - { - return $this->resolver->connection($this->connection); - } - - /** - * Set the information source to gather data. - * - * @param string $name - * @return void - */ - public function setSource($name) - { - $this->connection = $name; - } -} diff --git a/vendor/illuminate/database/Migrations/Migration.php b/vendor/illuminate/database/Migrations/Migration.php deleted file mode 100644 index a58f784..0000000 --- a/vendor/illuminate/database/Migrations/Migration.php +++ /dev/null @@ -1,30 +0,0 @@ -connection; - } -} diff --git a/vendor/illuminate/database/Migrations/MigrationCreator.php b/vendor/illuminate/database/Migrations/MigrationCreator.php deleted file mode 100644 index d8f1ce9..0000000 --- a/vendor/illuminate/database/Migrations/MigrationCreator.php +++ /dev/null @@ -1,231 +0,0 @@ -files = $files; - $this->customStubPath = $customStubPath; - } - - /** - * Create a new migration at the given path. - * - * @param string $name - * @param string $path - * @param string|null $table - * @param bool $create - * @return string - * - * @throws \Exception - */ - public function create($name, $path, $table = null, $create = false) - { - $this->ensureMigrationDoesntAlreadyExist($name, $path); - - // First we will get the stub file for the migration, which serves as a type - // of template for the migration. Once we have those we will populate the - // various place-holders, save the file, and run the post create event. - $stub = $this->getStub($table, $create); - - $path = $this->getPath($name, $path); - - $this->files->ensureDirectoryExists(dirname($path)); - - $this->files->put( - $path, $this->populateStub($stub, $table) - ); - - // Next, we will fire any hooks that are supposed to fire after a migration is - // created. Once that is done we'll be ready to return the full path to the - // migration file so it can be used however it's needed by the developer. - $this->firePostCreateHooks($table, $path); - - return $path; - } - - /** - * Ensure that a migration with the given name doesn't already exist. - * - * @param string $name - * @param string $migrationPath - * @return void - * - * @throws \InvalidArgumentException - */ - protected function ensureMigrationDoesntAlreadyExist($name, $migrationPath = null) - { - if (! empty($migrationPath)) { - $migrationFiles = $this->files->glob($migrationPath.'/*.php'); - - foreach ($migrationFiles as $migrationFile) { - $this->files->requireOnce($migrationFile); - } - } - - if (class_exists($className = $this->getClassName($name))) { - throw new InvalidArgumentException("A {$className} class already exists."); - } - } - - /** - * Get the migration stub file. - * - * @param string|null $table - * @param bool $create - * @return string - */ - protected function getStub($table, $create) - { - if (is_null($table)) { - $stub = $this->files->exists($customPath = $this->customStubPath.'/migration.stub') - ? $customPath - : $this->stubPath().'/migration.stub'; - } elseif ($create) { - $stub = $this->files->exists($customPath = $this->customStubPath.'/migration.create.stub') - ? $customPath - : $this->stubPath().'/migration.create.stub'; - } else { - $stub = $this->files->exists($customPath = $this->customStubPath.'/migration.update.stub') - ? $customPath - : $this->stubPath().'/migration.update.stub'; - } - - return $this->files->get($stub); - } - - /** - * Populate the place-holders in the migration stub. - * - * @param string $stub - * @param string|null $table - * @return string - */ - protected function populateStub($stub, $table) - { - // Here we will replace the table place-holders with the table specified by - // the developer, which is useful for quickly creating a tables creation - // or update migration from the console instead of typing it manually. - if (! is_null($table)) { - $stub = str_replace( - ['DummyTable', '{{ table }}', '{{table}}'], - $table, $stub - ); - } - - return $stub; - } - - /** - * Get the class name of a migration name. - * - * @param string $name - * @return string - */ - protected function getClassName($name) - { - return Str::studly($name); - } - - /** - * Get the full path to the migration. - * - * @param string $name - * @param string $path - * @return string - */ - protected function getPath($name, $path) - { - return $path.'/'.$this->getDatePrefix().'_'.$name.'.php'; - } - - /** - * Fire the registered post create hooks. - * - * @param string|null $table - * @param string $path - * @return void - */ - protected function firePostCreateHooks($table, $path) - { - foreach ($this->postCreate as $callback) { - $callback($table, $path); - } - } - - /** - * Register a post migration create hook. - * - * @param \Closure $callback - * @return void - */ - public function afterCreate(Closure $callback) - { - $this->postCreate[] = $callback; - } - - /** - * Get the date prefix for the migration. - * - * @return string - */ - protected function getDatePrefix() - { - return date('Y_m_d_His'); - } - - /** - * Get the path to the stubs. - * - * @return string - */ - public function stubPath() - { - return __DIR__.'/stubs'; - } - - /** - * Get the filesystem instance. - * - * @return \Illuminate\Filesystem\Filesystem - */ - public function getFilesystem() - { - return $this->files; - } -} diff --git a/vendor/illuminate/database/Migrations/MigrationRepositoryInterface.php b/vendor/illuminate/database/Migrations/MigrationRepositoryInterface.php deleted file mode 100644 index a3ba965..0000000 --- a/vendor/illuminate/database/Migrations/MigrationRepositoryInterface.php +++ /dev/null @@ -1,96 +0,0 @@ - - */ - protected static $requiredPathCache = []; - - /** - * The output interface implementation. - * - * @var \Symfony\Component\Console\Output\OutputInterface - */ - protected $output; - - /** - * The pending migrations to skip. - * - * @var list - */ - protected static $withoutMigrations = []; - - /** - * Create a new migrator instance. - * - * @param \Illuminate\Database\Migrations\MigrationRepositoryInterface $repository - * @param \Illuminate\Database\ConnectionResolverInterface $resolver - * @param \Illuminate\Filesystem\Filesystem $files - * @param \Illuminate\Contracts\Events\Dispatcher|null $dispatcher - * @return void - */ - public function __construct( - MigrationRepositoryInterface $repository, - Resolver $resolver, - Filesystem $files, - ?Dispatcher $dispatcher = null, - ) { - $this->files = $files; - $this->events = $dispatcher; - $this->resolver = $resolver; - $this->repository = $repository; - } - - /** - * Run the pending migrations at a given path. - * - * @param string[]|string $paths - * @param array $options - * @return string[] - */ - public function run($paths = [], array $options = []) - { - // Once we grab all of the migration files for the path, we will compare them - // against the migrations that have already been run for this package then - // run each of the outstanding migrations against a database connection. - $files = $this->getMigrationFiles($paths); - - $this->requireFiles($migrations = $this->pendingMigrations( - $files, $this->repository->getRan() - )); - - // Once we have all these migrations that are outstanding we are ready to run - // we will go ahead and run them "up". This will execute each migration as - // an operation against a database. Then we'll return this list of them. - $this->runPending($migrations, $options); - - return $migrations; - } - - /** - * Get the migration files that have not yet run. - * - * @param string[] $files - * @param string[] $ran - * @return string[] - */ - protected function pendingMigrations($files, $ran) - { - $migrationsToSkip = $this->migrationsToSkip(); - - return (new Collection($files)) - ->reject(fn ($file) => in_array($migrationName = $this->getMigrationName($file), $ran) || - in_array($migrationName, $migrationsToSkip) - ) - ->values() - ->all(); - } - - /** - * Get list of pending migrations to skip. - * - * @return list - */ - protected function migrationsToSkip() - { - return (new Collection(self::$withoutMigrations)) - ->map($this->getMigrationName(...)) - ->all(); - } - - /** - * Run an array of migrations. - * - * @param string[] $migrations - * @param array $options - * @return void - */ - public function runPending(array $migrations, array $options = []) - { - // First we will just make sure that there are any migrations to run. If there - // aren't, we will just make a note of it to the developer so they're aware - // that all of the migrations have been run against this database system. - if (count($migrations) === 0) { - $this->fireMigrationEvent(new NoPendingMigrations('up')); - - $this->write(Info::class, 'Nothing to migrate'); - - return; - } - - // Next, we will get the next batch number for the migrations so we can insert - // correct batch number in the database migrations repository when we store - // each migration's execution. We will also extract a few of the options. - $batch = $this->repository->getNextBatchNumber(); - - $pretend = $options['pretend'] ?? false; - - $step = $options['step'] ?? false; - - $this->fireMigrationEvent(new MigrationsStarted('up', $options)); - - $this->write(Info::class, 'Running migrations.'); - - // Once we have the array of migrations, we will spin through them and run the - // migrations "up" so the changes are made to the databases. We'll then log - // that the migration was run so we don't repeat it next time we execute. - foreach ($migrations as $file) { - $this->runUp($file, $batch, $pretend); - - if ($step) { - $batch++; - } - } - - $this->fireMigrationEvent(new MigrationsEnded('up', $options)); - - $this->output?->writeln(''); - } - - /** - * Run "up" a migration instance. - * - * @param string $file - * @param int $batch - * @param bool $pretend - * @return void - */ - protected function runUp($file, $batch, $pretend) - { - // First we will resolve a "real" instance of the migration class from this - // migration file name. Once we have the instances we can run the actual - // command such as "up" or "down", or we can just simulate the action. - $migration = $this->resolvePath($file); - - $name = $this->getMigrationName($file); - - if ($pretend) { - return $this->pretendToRun($migration, 'up'); - } - - $this->write(Task::class, $name, fn () => $this->runMigration($migration, 'up')); - - // Once we have run a migrations class, we will log that it was run in this - // repository so that we don't try to run it next time we do a migration - // in the application. A migration repository keeps the migrate order. - $this->repository->log($name, $batch); - } - - /** - * Rollback the last migration operation. - * - * @param string[]|string $paths - * @param array $options - * @return string[] - */ - public function rollback($paths = [], array $options = []) - { - // We want to pull in the last batch of migrations that ran on the previous - // migration operation. We'll then reverse those migrations and run each - // of them "down" to reverse the last migration "operation" which ran. - $migrations = $this->getMigrationsForRollback($options); - - if (count($migrations) === 0) { - $this->fireMigrationEvent(new NoPendingMigrations('down')); - - $this->write(Info::class, 'Nothing to rollback.'); - - return []; - } - - return tap($this->rollbackMigrations($migrations, $paths, $options), function () { - $this->output?->writeln(''); - }); - } - - /** - * Get the migrations for a rollback operation. - * - * @param array $options - * @return array - */ - protected function getMigrationsForRollback(array $options) - { - if (($steps = $options['step'] ?? 0) > 0) { - return $this->repository->getMigrations($steps); - } - - if (($batch = $options['batch'] ?? 0) > 0) { - return $this->repository->getMigrationsByBatch($batch); - } - - return $this->repository->getLast(); - } - - /** - * Rollback the given migrations. - * - * @param array $migrations - * @param string[]|string $paths - * @param array $options - * @return string[] - */ - protected function rollbackMigrations(array $migrations, $paths, array $options) - { - $rolledBack = []; - - $this->requireFiles($files = $this->getMigrationFiles($paths)); - - $this->fireMigrationEvent(new MigrationsStarted('down', $options)); - - $this->write(Info::class, 'Rolling back migrations.'); - - // Next we will run through all of the migrations and call the "down" method - // which will reverse each migration in order. This getLast method on the - // repository already returns these migration's names in reverse order. - foreach ($migrations as $migration) { - $migration = (object) $migration; - - if (! $file = Arr::get($files, $migration->migration)) { - $this->write(TwoColumnDetail::class, $migration->migration, 'Migration not found'); - - continue; - } - - $rolledBack[] = $file; - - $this->runDown( - $file, $migration, - $options['pretend'] ?? false - ); - } - - $this->fireMigrationEvent(new MigrationsEnded('down', $options)); - - return $rolledBack; - } - - /** - * Rolls all of the currently applied migrations back. - * - * @param string[]|string $paths - * @param bool $pretend - * @return array - */ - public function reset($paths = [], $pretend = false) - { - // Next, we will reverse the migration list so we can run them back in the - // correct order for resetting this database. This will allow us to get - // the database back into its "empty" state ready for the migrations. - $migrations = array_reverse($this->repository->getRan()); - - if (count($migrations) === 0) { - $this->write(Info::class, 'Nothing to rollback.'); - - return []; - } - - return tap($this->resetMigrations($migrations, Arr::wrap($paths), $pretend), function () { - $this->output?->writeln(''); - }); - } - - /** - * Reset the given migrations. - * - * @param string[] $migrations - * @param string[] $paths - * @param bool $pretend - * @return array - */ - protected function resetMigrations(array $migrations, array $paths, $pretend = false) - { - // Since the getRan method that retrieves the migration name just gives us the - // migration name, we will format the names into objects with the name as a - // property on the objects so that we can pass it to the rollback method. - $migrations = (new Collection($migrations))->map(fn ($m) => (object) ['migration' => $m])->all(); - - return $this->rollbackMigrations( - $migrations, $paths, compact('pretend') - ); - } - - /** - * Run "down" a migration instance. - * - * @param string $file - * @param object $migration - * @param bool $pretend - * @return void - */ - protected function runDown($file, $migration, $pretend) - { - // First we will get the file name of the migration so we can resolve out an - // instance of the migration. Once we get an instance we can either run a - // pretend execution of the migration or we can run the real migration. - $instance = $this->resolvePath($file); - - $name = $this->getMigrationName($file); - - if ($pretend) { - return $this->pretendToRun($instance, 'down'); - } - - $this->write(Task::class, $name, fn () => $this->runMigration($instance, 'down')); - - // Once we have successfully run the migration "down" we will remove it from - // the migration repository so it will be considered to have not been run - // by the application then will be able to fire by any later operation. - $this->repository->delete($migration); - } - - /** - * Run a migration inside a transaction if the database supports it. - * - * @param object $migration - * @param string $method - * @return void - */ - protected function runMigration($migration, $method) - { - $connection = $this->resolveConnection( - $migration->getConnection() - ); - - $callback = function () use ($connection, $migration, $method) { - if (method_exists($migration, $method)) { - $this->fireMigrationEvent(new MigrationStarted($migration, $method)); - - $this->runMethod($connection, $migration, $method); - - $this->fireMigrationEvent(new MigrationEnded($migration, $method)); - } - }; - - $this->getSchemaGrammar($connection)->supportsSchemaTransactions() - && $migration->withinTransaction - ? $connection->transaction($callback) - : $callback(); - } - - /** - * Pretend to run the migrations. - * - * @param object $migration - * @param string $method - * @return void - */ - protected function pretendToRun($migration, $method) - { - $name = get_class($migration); - - $reflectionClass = new ReflectionClass($migration); - - if ($reflectionClass->isAnonymous()) { - $name = $this->getMigrationName($reflectionClass->getFileName()); - } - - $this->write(TwoColumnDetail::class, $name); - - $this->write( - BulletList::class, - (new Collection($this->getQueries($migration, $method)))->map(fn ($query) => $query['query']) - ); - } - - /** - * Get all of the queries that would be run for a migration. - * - * @param object $migration - * @param string $method - * @return array - */ - protected function getQueries($migration, $method) - { - // Now that we have the connections we can resolve it and pretend to run the - // queries against the database returning the array of raw SQL statements - // that would get fired against the database system for this migration. - $db = $this->resolveConnection( - $migration->getConnection() - ); - - return $db->pretend(function () use ($db, $migration, $method) { - if (method_exists($migration, $method)) { - $this->runMethod($db, $migration, $method); - } - }); - } - - /** - * Run a migration method on the given connection. - * - * @param \Illuminate\Database\Connection $connection - * @param object $migration - * @param string $method - * @return void - */ - protected function runMethod($connection, $migration, $method) - { - $previousConnection = $this->resolver->getDefaultConnection(); - - try { - $this->resolver->setDefaultConnection($connection->getName()); - - $migration->{$method}(); - } finally { - $this->resolver->setDefaultConnection($previousConnection); - } - } - - /** - * Resolve a migration instance from a file. - * - * @param string $file - * @return object - */ - public function resolve($file) - { - $class = $this->getMigrationClass($file); - - return new $class; - } - - /** - * Resolve a migration instance from a migration path. - * - * @param string $path - * @return object - */ - protected function resolvePath(string $path) - { - $class = $this->getMigrationClass($this->getMigrationName($path)); - - if (class_exists($class) && realpath($path) == (new ReflectionClass($class))->getFileName()) { - return new $class; - } - - $migration = static::$requiredPathCache[$path] ??= $this->files->getRequire($path); - - if (is_object($migration)) { - return method_exists($migration, '__construct') - ? $this->files->getRequire($path) - : clone $migration; - } - - return new $class; - } - - /** - * Generate a migration class name based on the migration file name. - * - * @param string $migrationName - * @return string - */ - protected function getMigrationClass(string $migrationName): string - { - return Str::studly(implode('_', array_slice(explode('_', $migrationName), 4))); - } - - /** - * Get all of the migration files in a given path. - * - * @param string|array $paths - * @return array - */ - public function getMigrationFiles($paths) - { - return (new Collection($paths)) - ->flatMap(fn ($path) => str_ends_with($path, '.php') ? [$path] : $this->files->glob($path.'/*_*.php')) - ->filter() - ->values() - ->keyBy(fn ($file) => $this->getMigrationName($file)) - ->sortBy(fn ($file, $key) => $key) - ->all(); - } - - /** - * Require in all the migration files in a given path. - * - * @param string[] $files - * @return void - */ - public function requireFiles(array $files) - { - foreach ($files as $file) { - $this->files->requireOnce($file); - } - } - - /** - * Get the name of the migration. - * - * @param string $path - * @return string - */ - public function getMigrationName($path) - { - return str_replace('.php', '', basename($path)); - } - - /** - * Register a custom migration path. - * - * @param string $path - * @return void - */ - public function path($path) - { - $this->paths = array_unique(array_merge($this->paths, [$path])); - } - - /** - * Get all of the custom migration paths. - * - * @return string[] - */ - public function paths() - { - return $this->paths; - } - - /** - * Set the pending migrations to skip. - * - * @param list $migrations - * @return void - */ - public static function withoutMigrations(array $migrations) - { - static::$withoutMigrations = $migrations; - } - - /** - * Get the default connection name. - * - * @return string - */ - public function getConnection() - { - return $this->connection; - } - - /** - * Execute the given callback using the given connection as the default connection. - * - * @param string $name - * @param callable $callback - * @return mixed - */ - public function usingConnection($name, callable $callback) - { - $previousConnection = $this->resolver->getDefaultConnection(); - - $this->setConnection($name); - - return tap($callback(), fn () => $this->setConnection($previousConnection)); - } - - /** - * Set the default connection name. - * - * @param string $name - * @return void - */ - public function setConnection($name) - { - if (! is_null($name)) { - $this->resolver->setDefaultConnection($name); - } - - $this->repository->setSource($name); - - $this->connection = $name; - } - - /** - * Resolve the database connection instance. - * - * @param string $connection - * @return \Illuminate\Database\Connection - */ - public function resolveConnection($connection) - { - if (static::$connectionResolverCallback) { - return call_user_func( - static::$connectionResolverCallback, - $this->resolver, - $connection ?: $this->connection - ); - } else { - return $this->resolver->connection($connection ?: $this->connection); - } - } - - /** - * Set a connection resolver callback. - * - * @param \Closure $callback - * @return void - */ - public static function resolveConnectionsUsing(Closure $callback) - { - static::$connectionResolverCallback = $callback; - } - - /** - * Get the schema grammar out of a migration connection. - * - * @param \Illuminate\Database\Connection $connection - * @return \Illuminate\Database\Schema\Grammars\Grammar - */ - protected function getSchemaGrammar($connection) - { - if (is_null($grammar = $connection->getSchemaGrammar())) { - $connection->useDefaultSchemaGrammar(); - - $grammar = $connection->getSchemaGrammar(); - } - - return $grammar; - } - - /** - * Get the migration repository instance. - * - * @return \Illuminate\Database\Migrations\MigrationRepositoryInterface - */ - public function getRepository() - { - return $this->repository; - } - - /** - * Determine if the migration repository exists. - * - * @return bool - */ - public function repositoryExists() - { - return $this->repository->repositoryExists(); - } - - /** - * Determine if any migrations have been run. - * - * @return bool - */ - public function hasRunAnyMigrations() - { - return $this->repositoryExists() && count($this->repository->getRan()) > 0; - } - - /** - * Delete the migration repository data store. - * - * @return void - */ - public function deleteRepository() - { - $this->repository->deleteRepository(); - } - - /** - * Get the file system instance. - * - * @return \Illuminate\Filesystem\Filesystem - */ - public function getFilesystem() - { - return $this->files; - } - - /** - * Set the output implementation that should be used by the console. - * - * @param \Symfony\Component\Console\Output\OutputInterface $output - * @return $this - */ - public function setOutput(OutputInterface $output) - { - $this->output = $output; - - return $this; - } - - /** - * Write to the console's output. - * - * @param string $component - * @param array|string ...$arguments - * @return void - */ - protected function write($component, ...$arguments) - { - if ($this->output && class_exists($component)) { - (new $component($this->output))->render(...$arguments); - } else { - foreach ($arguments as $argument) { - if (is_callable($argument)) { - $argument(); - } - } - } - } - - /** - * Fire the given event for the migration. - * - * @param \Illuminate\Contracts\Database\Events\MigrationEvent $event - * @return void - */ - public function fireMigrationEvent($event) - { - $this->events?->dispatch($event); - } -} diff --git a/vendor/illuminate/database/Migrations/stubs/migration.create.stub b/vendor/illuminate/database/Migrations/stubs/migration.create.stub deleted file mode 100644 index 168c622..0000000 --- a/vendor/illuminate/database/Migrations/stubs/migration.create.stub +++ /dev/null @@ -1,27 +0,0 @@ -id(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('{{ table }}'); - } -}; diff --git a/vendor/illuminate/database/Migrations/stubs/migration.stub b/vendor/illuminate/database/Migrations/stubs/migration.stub deleted file mode 100644 index 88fa2f3..0000000 --- a/vendor/illuminate/database/Migrations/stubs/migration.stub +++ /dev/null @@ -1,24 +0,0 @@ -count = $count; - - parent::__construct("$count records were found.", $code, $previous); - } - - /** - * Get the number of records found. - * - * @return int - */ - public function getCount() - { - return $this->count; - } -} diff --git a/vendor/illuminate/database/MySqlConnection.php b/vendor/illuminate/database/MySqlConnection.php deleted file mode 100644 index abc1edb..0000000 --- a/vendor/illuminate/database/MySqlConnection.php +++ /dev/null @@ -1,176 +0,0 @@ -isMaria() ? 'MariaDB' : 'MySQL'; - } - - /** - * Run an insert statement against the database. - * - * @param string $query - * @param array $bindings - * @param string|null $sequence - * @return bool - */ - public function insert($query, $bindings = [], $sequence = null) - { - return $this->run($query, $bindings, function ($query, $bindings) use ($sequence) { - if ($this->pretending()) { - return true; - } - - $statement = $this->getPdo()->prepare($query); - - $this->bindValues($statement, $this->prepareBindings($bindings)); - - $this->recordsHaveBeenModified(); - - $result = $statement->execute(); - - $this->lastInsertId = $this->getPdo()->lastInsertId($sequence); - - return $result; - }); - } - - /** - * Escape a binary value for safe SQL embedding. - * - * @param string $value - * @return string - */ - protected function escapeBinary($value) - { - $hex = bin2hex($value); - - return "x'{$hex}'"; - } - - /** - * Determine if the given database exception was caused by a unique constraint violation. - * - * @param \Exception $exception - * @return bool - */ - protected function isUniqueConstraintError(Exception $exception) - { - return boolval(preg_match('#Integrity constraint violation: 1062#i', $exception->getMessage())); - } - - /** - * Get the connection's last insert ID. - * - * @return string|int|null - */ - public function getLastInsertId() - { - return $this->lastInsertId; - } - - /** - * Determine if the connected database is a MariaDB database. - * - * @return bool - */ - public function isMaria() - { - return str_contains($this->getPdo()->getAttribute(PDO::ATTR_SERVER_VERSION), 'MariaDB'); - } - - /** - * Get the server version for the connection. - * - * @return string - */ - public function getServerVersion(): string - { - return str_contains($version = parent::getServerVersion(), 'MariaDB') - ? Str::between($version, '5.5.5-', '-MariaDB') - : $version; - } - - /** - * Get the default query grammar instance. - * - * @return \Illuminate\Database\Query\Grammars\MySqlGrammar - */ - protected function getDefaultQueryGrammar() - { - ($grammar = new QueryGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); - } - - /** - * Get a schema builder instance for the connection. - * - * @return \Illuminate\Database\Schema\MySqlBuilder - */ - public function getSchemaBuilder() - { - if (is_null($this->schemaGrammar)) { - $this->useDefaultSchemaGrammar(); - } - - return new MySqlBuilder($this); - } - - /** - * Get the default schema grammar instance. - * - * @return \Illuminate\Database\Schema\Grammars\MySqlGrammar - */ - protected function getDefaultSchemaGrammar() - { - ($grammar = new SchemaGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); - } - - /** - * Get the schema state for the connection. - * - * @param \Illuminate\Filesystem\Filesystem|null $files - * @param callable|null $processFactory - * @return \Illuminate\Database\Schema\MySqlSchemaState - */ - public function getSchemaState(?Filesystem $files = null, ?callable $processFactory = null) - { - return new MySqlSchemaState($this, $files, $processFactory); - } - - /** - * Get the default post processor instance. - * - * @return \Illuminate\Database\Query\Processors\MySqlProcessor - */ - protected function getDefaultPostProcessor() - { - return new MySqlProcessor; - } -} diff --git a/vendor/illuminate/database/PostgresConnection.php b/vendor/illuminate/database/PostgresConnection.php deleted file mode 100644 index 06fa2e1..0000000 --- a/vendor/illuminate/database/PostgresConnection.php +++ /dev/null @@ -1,117 +0,0 @@ -getCode(); - } - - /** - * Get the default query grammar instance. - * - * @return \Illuminate\Database\Query\Grammars\PostgresGrammar - */ - protected function getDefaultQueryGrammar() - { - ($grammar = new QueryGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); - } - - /** - * Get a schema builder instance for the connection. - * - * @return \Illuminate\Database\Schema\PostgresBuilder - */ - public function getSchemaBuilder() - { - if (is_null($this->schemaGrammar)) { - $this->useDefaultSchemaGrammar(); - } - - return new PostgresBuilder($this); - } - - /** - * Get the default schema grammar instance. - * - * @return \Illuminate\Database\Schema\Grammars\PostgresGrammar - */ - protected function getDefaultSchemaGrammar() - { - ($grammar = new SchemaGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); - } - - /** - * Get the schema state for the connection. - * - * @param \Illuminate\Filesystem\Filesystem|null $files - * @param callable|null $processFactory - * @return \Illuminate\Database\Schema\PostgresSchemaState - */ - public function getSchemaState(?Filesystem $files = null, ?callable $processFactory = null) - { - return new PostgresSchemaState($this, $files, $processFactory); - } - - /** - * Get the default post processor instance. - * - * @return \Illuminate\Database\Query\Processors\PostgresProcessor - */ - protected function getDefaultPostProcessor() - { - return new PostgresProcessor; - } -} diff --git a/vendor/illuminate/database/Query/Builder.php b/vendor/illuminate/database/Query/Builder.php deleted file mode 100644 index 538994f..0000000 --- a/vendor/illuminate/database/Query/Builder.php +++ /dev/null @@ -1,4394 +0,0 @@ - */ - use BuildsWhereDateClauses, BuildsQueries, ExplainsQueries, ForwardsCalls, Macroable { - __call as macroCall; - } - - /** - * The database connection instance. - * - * @var \Illuminate\Database\ConnectionInterface - */ - public $connection; - - /** - * The database query grammar instance. - * - * @var \Illuminate\Database\Query\Grammars\Grammar - */ - public $grammar; - - /** - * The database query post processor instance. - * - * @var \Illuminate\Database\Query\Processors\Processor - */ - public $processor; - - /** - * The current query value bindings. - * - * @var array - */ - public $bindings = [ - 'select' => [], - 'from' => [], - 'join' => [], - 'where' => [], - 'groupBy' => [], - 'having' => [], - 'order' => [], - 'union' => [], - 'unionOrder' => [], - ]; - - /** - * An aggregate function and column to be run. - * - * @var array|null - */ - public $aggregate; - - /** - * The columns that should be returned. - * - * @var array|null - */ - public $columns; - - /** - * Indicates if the query returns distinct results. - * - * Occasionally contains the columns that should be distinct. - * - * @var bool|array - */ - public $distinct = false; - - /** - * The table which the query is targeting. - * - * @var \Illuminate\Database\Query\Expression|string - */ - public $from; - - /** - * The index hint for the query. - * - * @var \Illuminate\Database\Query\IndexHint|null - */ - public $indexHint; - - /** - * The table joins for the query. - * - * @var array|null - */ - public $joins; - - /** - * The where constraints for the query. - * - * @var array - */ - public $wheres = []; - - /** - * The groupings for the query. - * - * @var array|null - */ - public $groups; - - /** - * The having constraints for the query. - * - * @var array|null - */ - public $havings; - - /** - * The orderings for the query. - * - * @var array|null - */ - public $orders; - - /** - * The maximum number of records to return. - * - * @var int|null - */ - public $limit; - - /** - * The maximum number of records to return per group. - * - * @var array|null - */ - public $groupLimit; - - /** - * The number of records to skip. - * - * @var int|null - */ - public $offset; - - /** - * The query union statements. - * - * @var array|null - */ - public $unions; - - /** - * The maximum number of union records to return. - * - * @var int|null - */ - public $unionLimit; - - /** - * The number of union records to skip. - * - * @var int|null - */ - public $unionOffset; - - /** - * The orderings for the union query. - * - * @var array|null - */ - public $unionOrders; - - /** - * Indicates whether row locking is being used. - * - * @var string|bool|null - */ - public $lock; - - /** - * The callbacks that should be invoked before the query is executed. - * - * @var array - */ - public $beforeQueryCallbacks = []; - - /** - * The callbacks that should be invoked after retrieving data from the database. - * - * @var array - */ - protected $afterQueryCallbacks = []; - - /** - * All of the available clause operators. - * - * @var string[] - */ - public $operators = [ - '=', '<', '>', '<=', '>=', '<>', '!=', '<=>', - 'like', 'like binary', 'not like', 'ilike', - '&', '|', '^', '<<', '>>', '&~', 'is', 'is not', - 'rlike', 'not rlike', 'regexp', 'not regexp', - '~', '~*', '!~', '!~*', 'similar to', - 'not similar to', 'not ilike', '~~*', '!~~*', - ]; - - /** - * All of the available bitwise operators. - * - * @var string[] - */ - public $bitwiseOperators = [ - '&', '|', '^', '<<', '>>', '&~', - ]; - - /** - * Whether to use write pdo for the select. - * - * @var bool - */ - public $useWritePdo = false; - - /** - * Create a new query builder instance. - * - * @return void - */ - public function __construct( - ConnectionInterface $connection, - ?Grammar $grammar = null, - ?Processor $processor = null, - ) { - $this->connection = $connection; - $this->grammar = $grammar ?: $connection->getQueryGrammar(); - $this->processor = $processor ?: $connection->getPostProcessor(); - } - - /** - * Set the columns to be selected. - * - * @param array|mixed $columns - * @return $this - */ - public function select($columns = ['*']) - { - $this->columns = []; - $this->bindings['select'] = []; - - $columns = is_array($columns) ? $columns : func_get_args(); - - foreach ($columns as $as => $column) { - if (is_string($as) && $this->isQueryable($column)) { - $this->selectSub($column, $as); - } else { - $this->columns[] = $column; - } - } - - return $this; - } - - /** - * Add a subselect expression to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query - * @param string $as - * @return $this - * - * @throws \InvalidArgumentException - */ - public function selectSub($query, $as) - { - [$query, $bindings] = $this->createSub($query); - - return $this->selectRaw( - '('.$query.') as '.$this->grammar->wrap($as), $bindings - ); - } - - /** - * Add a new "raw" select expression to the query. - * - * @param string $expression - * @return $this - */ - public function selectRaw($expression, array $bindings = []) - { - $this->addSelect(new Expression($expression)); - - if ($bindings) { - $this->addBinding($bindings, 'select'); - } - - return $this; - } - - /** - * Makes "from" fetch from a subquery. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query - * @param string $as - * @return $this - * - * @throws \InvalidArgumentException - */ - public function fromSub($query, $as) - { - [$query, $bindings] = $this->createSub($query); - - return $this->fromRaw('('.$query.') as '.$this->grammar->wrapTable($as), $bindings); - } - - /** - * Add a raw from clause to the query. - * - * @param string $expression - * @param mixed $bindings - * @return $this - */ - public function fromRaw($expression, $bindings = []) - { - $this->from = new Expression($expression); - - $this->addBinding($bindings, 'from'); - - return $this; - } - - /** - * Creates a subquery and parse it. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query - * @return array - */ - protected function createSub($query) - { - // If the given query is a Closure, we will execute it while passing in a new - // query instance to the Closure. This will give the developer a chance to - // format and work with the query before we cast it to a raw SQL string. - if ($query instanceof Closure) { - $callback = $query; - - $callback($query = $this->forSubQuery()); - } - - return $this->parseSub($query); - } - - /** - * Parse the subquery into SQL and bindings. - * - * @param mixed $query - * @return array - * - * @throws \InvalidArgumentException - */ - protected function parseSub($query) - { - if ($query instanceof self || $query instanceof EloquentBuilder || $query instanceof Relation) { - $query = $this->prependDatabaseNameIfCrossDatabaseQuery($query); - - return [$query->toSql(), $query->getBindings()]; - } elseif (is_string($query)) { - return [$query, []]; - } else { - throw new InvalidArgumentException( - 'A subquery must be a query builder instance, a Closure, or a string.' - ); - } - } - - /** - * Prepend the database name if the given query is on another database. - * - * @param mixed $query - * @return mixed - */ - protected function prependDatabaseNameIfCrossDatabaseQuery($query) - { - if ($query->getConnection()->getDatabaseName() !== - $this->getConnection()->getDatabaseName()) { - $databaseName = $query->getConnection()->getDatabaseName(); - - if (! str_starts_with($query->from, $databaseName) && ! str_contains($query->from, '.')) { - $query->from($databaseName.'.'.$query->from); - } - } - - return $query; - } - - /** - * Add a new select column to the query. - * - * @param array|mixed $column - * @return $this - */ - public function addSelect($column) - { - $columns = is_array($column) ? $column : func_get_args(); - - foreach ($columns as $as => $column) { - if (is_string($as) && $this->isQueryable($column)) { - if (is_null($this->columns)) { - $this->select($this->from.'.*'); - } - - $this->selectSub($column, $as); - } else { - if (is_array($this->columns) && in_array($column, $this->columns, true)) { - continue; - } - - $this->columns[] = $column; - } - } - - return $this; - } - - /** - * Force the query to only return distinct results. - * - * @return $this - */ - public function distinct() - { - $columns = func_get_args(); - - if (count($columns) > 0) { - $this->distinct = is_array($columns[0]) || is_bool($columns[0]) ? $columns[0] : $columns; - } else { - $this->distinct = true; - } - - return $this; - } - - /** - * Set the table which the query is targeting. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|\Illuminate\Contracts\Database\Query\Expression|string $table - * @param string|null $as - * @return $this - */ - public function from($table, $as = null) - { - if ($this->isQueryable($table)) { - return $this->fromSub($table, $as); - } - - $this->from = $as ? "{$table} as {$as}" : $table; - - return $this; - } - - /** - * Add an index hint to suggest a query index. - * - * @param string $index - * @return $this - */ - public function useIndex($index) - { - $this->indexHint = new IndexHint('hint', $index); - - return $this; - } - - /** - * Add an index hint to force a query index. - * - * @param string $index - * @return $this - */ - public function forceIndex($index) - { - $this->indexHint = new IndexHint('force', $index); - - return $this; - } - - /** - * Add an index hint to ignore a query index. - * - * @param string $index - * @return $this - */ - public function ignoreIndex($index) - { - $this->indexHint = new IndexHint('ignore', $index); - - return $this; - } - - /** - * Add a join clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @param string $type - * @param bool $where - * @return $this - */ - public function join($table, $first, $operator = null, $second = null, $type = 'inner', $where = false) - { - $join = $this->newJoinClause($this, $type, $table); - - // If the first "column" of the join is really a Closure instance the developer - // is trying to build a join with a complex "on" clause containing more than - // one condition, so we'll add the join and call a Closure with the query. - if ($first instanceof Closure) { - $first($join); - - $this->joins[] = $join; - - $this->addBinding($join->getBindings(), 'join'); - } - - // If the column is simply a string, we can assume the join simply has a basic - // "on" clause with a single condition. So we will just build the join with - // this simple join clauses attached to it. There is not a join callback. - else { - $method = $where ? 'where' : 'on'; - - $this->joins[] = $join->$method($first, $operator, $second); - - $this->addBinding($join->getBindings(), 'join'); - } - - return $this; - } - - /** - * Add a "join where" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first - * @param string $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string $second - * @param string $type - * @return $this - */ - public function joinWhere($table, $first, $operator, $second, $type = 'inner') - { - return $this->join($table, $first, $operator, $second, $type, true); - } - - /** - * Add a subquery join clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query - * @param string $as - * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @param string $type - * @param bool $where - * @return $this - * - * @throws \InvalidArgumentException - */ - public function joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false) - { - [$query, $bindings] = $this->createSub($query); - - $expression = '('.$query.') as '.$this->grammar->wrapTable($as); - - $this->addBinding($bindings, 'join'); - - return $this->join(new Expression($expression), $first, $operator, $second, $type, $where); - } - - /** - * Add a lateral join clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query - * @return $this - */ - public function joinLateral($query, string $as, string $type = 'inner') - { - [$query, $bindings] = $this->createSub($query); - - $expression = '('.$query.') as '.$this->grammar->wrapTable($as); - - $this->addBinding($bindings, 'join'); - - $this->joins[] = $this->newJoinLateralClause($this, $type, new Expression($expression)); - - return $this; - } - - /** - * Add a lateral left join to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query - * @return $this - */ - public function leftJoinLateral($query, string $as) - { - return $this->joinLateral($query, $as, 'left'); - } - - /** - * Add a left join to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return $this - */ - public function leftJoin($table, $first, $operator = null, $second = null) - { - return $this->join($table, $first, $operator, $second, 'left'); - } - - /** - * Add a "join where" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first - * @param string $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return $this - */ - public function leftJoinWhere($table, $first, $operator, $second) - { - return $this->joinWhere($table, $first, $operator, $second, 'left'); - } - - /** - * Add a subquery left join to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query - * @param string $as - * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return $this - */ - public function leftJoinSub($query, $as, $first, $operator = null, $second = null) - { - return $this->joinSub($query, $as, $first, $operator, $second, 'left'); - } - - /** - * Add a right join to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return $this - */ - public function rightJoin($table, $first, $operator = null, $second = null) - { - return $this->join($table, $first, $operator, $second, 'right'); - } - - /** - * Add a "right join where" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first - * @param string $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string $second - * @return $this - */ - public function rightJoinWhere($table, $first, $operator, $second) - { - return $this->joinWhere($table, $first, $operator, $second, 'right'); - } - - /** - * Add a subquery right join to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query - * @param string $as - * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return $this - */ - public function rightJoinSub($query, $as, $first, $operator = null, $second = null) - { - return $this->joinSub($query, $as, $first, $operator, $second, 'right'); - } - - /** - * Add a "cross join" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string|null $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return $this - */ - public function crossJoin($table, $first = null, $operator = null, $second = null) - { - if ($first) { - return $this->join($table, $first, $operator, $second, 'cross'); - } - - $this->joins[] = $this->newJoinClause($this, 'cross', $table); - - return $this; - } - - /** - * Add a subquery cross join to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query - * @param string $as - * @return $this - */ - public function crossJoinSub($query, $as) - { - [$query, $bindings] = $this->createSub($query); - - $expression = '('.$query.') as '.$this->grammar->wrapTable($as); - - $this->addBinding($bindings, 'join'); - - $this->joins[] = $this->newJoinClause($this, 'cross', new Expression($expression)); - - return $this; - } - - /** - * Get a new join clause. - * - * @param string $type - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @return \Illuminate\Database\Query\JoinClause - */ - protected function newJoinClause(self $parentQuery, $type, $table) - { - return new JoinClause($parentQuery, $type, $table); - } - - /** - * Get a new join lateral clause. - * - * @param string $type - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @return \Illuminate\Database\Query\JoinLateralClause - */ - protected function newJoinLateralClause(self $parentQuery, $type, $table) - { - return new JoinLateralClause($parentQuery, $type, $table); - } - - /** - * Merge an array of where clauses and bindings. - * - * @param array $wheres - * @param array $bindings - * @return $this - */ - public function mergeWheres($wheres, $bindings) - { - $this->wheres = array_merge($this->wheres, (array) $wheres); - - $this->bindings['where'] = array_values( - array_merge($this->bindings['where'], (array) $bindings) - ); - - return $this; - } - - /** - * Add a basic where clause to the query. - * - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return $this - */ - public function where($column, $operator = null, $value = null, $boolean = 'and') - { - if ($column instanceof ConditionExpression) { - $type = 'Expression'; - - $this->wheres[] = compact('type', 'column', 'boolean'); - - return $this; - } - - // If the column is an array, we will assume it is an array of key-value pairs - // and can add them each as a where clause. We will maintain the boolean we - // received when the method was called and pass it into the nested where. - if (is_array($column)) { - return $this->addArrayOfWheres($column, $boolean); - } - - // Here we will make some assumptions about the operator. If only 2 values are - // passed to the method, we will assume that the operator is an equals sign - // and keep going. Otherwise, we'll require the operator to be passed in. - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - // If the column is actually a Closure instance, we will assume the developer - // wants to begin a nested where statement which is wrapped in parentheses. - // We will add that Closure to the query and return back out immediately. - if ($column instanceof Closure && is_null($operator)) { - return $this->whereNested($column, $boolean); - } - - // If the column is a Closure instance and there is an operator value, we will - // assume the developer wants to run a subquery and then compare the result - // of that subquery with the given value that was provided to the method. - if ($this->isQueryable($column) && ! is_null($operator)) { - [$sub, $bindings] = $this->createSub($column); - - return $this->addBinding($bindings, 'where') - ->where(new Expression('('.$sub.')'), $operator, $value, $boolean); - } - - // If the given operator is not found in the list of valid operators we will - // assume that the developer is just short-cutting the '=' operators and - // we will set the operators to '=' and set the values appropriately. - if ($this->invalidOperator($operator)) { - [$value, $operator] = [$operator, '=']; - } - - // If the value is a Closure, it means the developer is performing an entire - // sub-select within the query and we will need to compile the sub-select - // within the where clause to get the appropriate query record results. - if ($this->isQueryable($value)) { - return $this->whereSub($column, $operator, $value, $boolean); - } - - // If the value is "null", we will just assume the developer wants to add a - // where null clause to the query. So, we will allow a short-cut here to - // that method for convenience so the developer doesn't have to check. - if (is_null($value)) { - return $this->whereNull($column, $boolean, $operator !== '='); - } - - $type = 'Basic'; - - $columnString = ($column instanceof ExpressionContract) - ? $this->grammar->getValue($column) - : $column; - - // If the column is making a JSON reference we'll check to see if the value - // is a boolean. If it is, we'll add the raw boolean string as an actual - // value to the query to ensure this is properly handled by the query. - if (str_contains($columnString, '->') && is_bool($value)) { - $value = new Expression($value ? 'true' : 'false'); - - if (is_string($column)) { - $type = 'JsonBoolean'; - } - } - - if ($this->isBitwiseOperator($operator)) { - $type = 'Bitwise'; - } - - // Now that we are working with just a simple query we can put the elements - // in our array and add the query binding to our array of bindings that - // will be bound to each SQL statements when it is finally executed. - $this->wheres[] = compact( - 'type', 'column', 'operator', 'value', 'boolean' - ); - - if (! $value instanceof ExpressionContract) { - $this->addBinding($this->flattenValue($value), 'where'); - } - - return $this; - } - - /** - * Add an array of where clauses to the query. - * - * @param array $column - * @param string $boolean - * @param string $method - * @return $this - */ - protected function addArrayOfWheres($column, $boolean, $method = 'where') - { - return $this->whereNested(function ($query) use ($column, $method, $boolean) { - foreach ($column as $key => $value) { - if (is_numeric($key) && is_array($value)) { - $query->{$method}(...array_values($value), boolean: $boolean); - } else { - $query->{$method}($key, '=', $value, $boolean); - } - } - }, $boolean); - } - - /** - * Prepare the value and operator for a where clause. - * - * @param string $value - * @param string $operator - * @param bool $useDefault - * @return array - * - * @throws \InvalidArgumentException - */ - public function prepareValueAndOperator($value, $operator, $useDefault = false) - { - if ($useDefault) { - return [$operator, '=']; - } elseif ($this->invalidOperatorAndValue($operator, $value)) { - throw new InvalidArgumentException('Illegal operator and value combination.'); - } - - return [$value, $operator]; - } - - /** - * Determine if the given operator and value combination is legal. - * - * Prevents using Null values with invalid operators. - * - * @param string $operator - * @param mixed $value - * @return bool - */ - protected function invalidOperatorAndValue($operator, $value) - { - return is_null($value) && in_array($operator, $this->operators) && - ! in_array($operator, ['=', '<>', '!=']); - } - - /** - * Determine if the given operator is supported. - * - * @param string $operator - * @return bool - */ - protected function invalidOperator($operator) - { - return ! is_string($operator) || (! in_array(strtolower($operator), $this->operators, true) && - ! in_array(strtolower($operator), $this->grammar->getOperators(), true)); - } - - /** - * Determine if the operator is a bitwise operator. - * - * @param string $operator - * @return bool - */ - protected function isBitwiseOperator($operator) - { - return in_array(strtolower($operator), $this->bitwiseOperators, true) || - in_array(strtolower($operator), $this->grammar->getBitwiseOperators(), true); - } - - /** - * Add an "or where" clause to the query. - * - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhere($column, $operator = null, $value = null) - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - return $this->where($column, $operator, $value, 'or'); - } - - /** - * Add a basic "where not" clause to the query. - * - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return $this - */ - public function whereNot($column, $operator = null, $value = null, $boolean = 'and') - { - if (is_array($column)) { - return $this->whereNested(function ($query) use ($column, $operator, $value, $boolean) { - $query->where($column, $operator, $value, $boolean); - }, $boolean.' not'); - } - - return $this->where($column, $operator, $value, $boolean.' not'); - } - - /** - * Add an "or where not" clause to the query. - * - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhereNot($column, $operator = null, $value = null) - { - return $this->whereNot($column, $operator, $value, 'or'); - } - - /** - * Add a "where" clause comparing two columns to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string|array $first - * @param string|null $operator - * @param string|null $second - * @param string|null $boolean - * @return $this - */ - public function whereColumn($first, $operator = null, $second = null, $boolean = 'and') - { - // If the column is an array, we will assume it is an array of key-value pairs - // and can add them each as a where clause. We will maintain the boolean we - // received when the method was called and pass it into the nested where. - if (is_array($first)) { - return $this->addArrayOfWheres($first, $boolean, 'whereColumn'); - } - - // If the given operator is not found in the list of valid operators we will - // assume that the developer is just short-cutting the '=' operators and - // we will set the operators to '=' and set the values appropriately. - if ($this->invalidOperator($operator)) { - [$second, $operator] = [$operator, '=']; - } - - // Finally, we will add this where clause into this array of clauses that we - // are building for the query. All of them will be compiled via a grammar - // once the query is about to be executed and run against the database. - $type = 'Column'; - - $this->wheres[] = compact( - 'type', 'first', 'operator', 'second', 'boolean' - ); - - return $this; - } - - /** - * Add an "or where" clause comparing two columns to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string|array $first - * @param string|null $operator - * @param string|null $second - * @return $this - */ - public function orWhereColumn($first, $operator = null, $second = null) - { - return $this->whereColumn($first, $operator, $second, 'or'); - } - - /** - * Add a raw where clause to the query. - * - * @param string $sql - * @param mixed $bindings - * @param string $boolean - * @return $this - */ - public function whereRaw($sql, $bindings = [], $boolean = 'and') - { - $this->wheres[] = ['type' => 'raw', 'sql' => $sql, 'boolean' => $boolean]; - - $this->addBinding((array) $bindings, 'where'); - - return $this; - } - - /** - * Add a raw or where clause to the query. - * - * @param string $sql - * @param mixed $bindings - * @return $this - */ - public function orWhereRaw($sql, $bindings = []) - { - return $this->whereRaw($sql, $bindings, 'or'); - } - - /** - * Add a "where like" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $value - * @param bool $caseSensitive - * @param string $boolean - * @param bool $not - * @return $this - */ - public function whereLike($column, $value, $caseSensitive = false, $boolean = 'and', $not = false) - { - $type = 'Like'; - - $this->wheres[] = compact('type', 'column', 'value', 'caseSensitive', 'boolean', 'not'); - - if (method_exists($this->grammar, 'prepareWhereLikeBinding')) { - $value = $this->grammar->prepareWhereLikeBinding($value, $caseSensitive); - } - - $this->addBinding($value); - - return $this; - } - - /** - * Add an "or where like" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $value - * @param bool $caseSensitive - * @return $this - */ - public function orWhereLike($column, $value, $caseSensitive = false) - { - return $this->whereLike($column, $value, $caseSensitive, 'or', false); - } - - /** - * Add a "where not like" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $value - * @param bool $caseSensitive - * @param string $boolean - * @return $this - */ - public function whereNotLike($column, $value, $caseSensitive = false, $boolean = 'and') - { - return $this->whereLike($column, $value, $caseSensitive, $boolean, true); - } - - /** - * Add an "or where not like" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $value - * @param bool $caseSensitive - * @return $this - */ - public function orWhereNotLike($column, $value, $caseSensitive = false) - { - return $this->whereNotLike($column, $value, $caseSensitive, 'or'); - } - - /** - * Add a "where in" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param mixed $values - * @param string $boolean - * @param bool $not - * @return $this - */ - public function whereIn($column, $values, $boolean = 'and', $not = false) - { - $type = $not ? 'NotIn' : 'In'; - - // If the value is a query builder instance we will assume the developer wants to - // look for any values that exist within this given query. So, we will add the - // query accordingly so that this query is properly executed when it is run. - if ($this->isQueryable($values)) { - [$query, $bindings] = $this->createSub($values); - - $values = [new Expression($query)]; - - $this->addBinding($bindings, 'where'); - } - - // Next, if the value is Arrayable we need to cast it to its raw array form so we - // have the underlying array value instead of an Arrayable object which is not - // able to be added as a binding, etc. We will then add to the wheres array. - if ($values instanceof Arrayable) { - $values = $values->toArray(); - } - - $this->wheres[] = compact('type', 'column', 'values', 'boolean'); - - if (count($values) !== count(Arr::flatten($values, 1))) { - throw new InvalidArgumentException('Nested arrays may not be passed to whereIn method.'); - } - - // Finally, we'll add a binding for each value unless that value is an expression - // in which case we will just skip over it since it will be the query as a raw - // string and not as a parameterized place-holder to be replaced by the PDO. - $this->addBinding($this->cleanBindings($values), 'where'); - - return $this; - } - - /** - * Add an "or where in" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param mixed $values - * @return $this - */ - public function orWhereIn($column, $values) - { - return $this->whereIn($column, $values, 'or'); - } - - /** - * Add a "where not in" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param mixed $values - * @param string $boolean - * @return $this - */ - public function whereNotIn($column, $values, $boolean = 'and') - { - return $this->whereIn($column, $values, $boolean, true); - } - - /** - * Add an "or where not in" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param mixed $values - * @return $this - */ - public function orWhereNotIn($column, $values) - { - return $this->whereNotIn($column, $values, 'or'); - } - - /** - * Add a "where in raw" clause for integer values to the query. - * - * @param string $column - * @param \Illuminate\Contracts\Support\Arrayable|array $values - * @param string $boolean - * @param bool $not - * @return $this - */ - public function whereIntegerInRaw($column, $values, $boolean = 'and', $not = false) - { - $type = $not ? 'NotInRaw' : 'InRaw'; - - if ($values instanceof Arrayable) { - $values = $values->toArray(); - } - - $values = Arr::flatten($values); - - foreach ($values as &$value) { - $value = (int) ($value instanceof BackedEnum ? $value->value : $value); - } - - $this->wheres[] = compact('type', 'column', 'values', 'boolean'); - - return $this; - } - - /** - * Add an "or where in raw" clause for integer values to the query. - * - * @param string $column - * @param \Illuminate\Contracts\Support\Arrayable|array $values - * @return $this - */ - public function orWhereIntegerInRaw($column, $values) - { - return $this->whereIntegerInRaw($column, $values, 'or'); - } - - /** - * Add a "where not in raw" clause for integer values to the query. - * - * @param string $column - * @param \Illuminate\Contracts\Support\Arrayable|array $values - * @param string $boolean - * @return $this - */ - public function whereIntegerNotInRaw($column, $values, $boolean = 'and') - { - return $this->whereIntegerInRaw($column, $values, $boolean, true); - } - - /** - * Add an "or where not in raw" clause for integer values to the query. - * - * @param string $column - * @param \Illuminate\Contracts\Support\Arrayable|array $values - * @return $this - */ - public function orWhereIntegerNotInRaw($column, $values) - { - return $this->whereIntegerNotInRaw($column, $values, 'or'); - } - - /** - * Add a "where null" clause to the query. - * - * @param string|array|\Illuminate\Contracts\Database\Query\Expression $columns - * @param string $boolean - * @param bool $not - * @return $this - */ - public function whereNull($columns, $boolean = 'and', $not = false) - { - $type = $not ? 'NotNull' : 'Null'; - - foreach (Arr::wrap($columns) as $column) { - $this->wheres[] = compact('type', 'column', 'boolean'); - } - - return $this; - } - - /** - * Add an "or where null" clause to the query. - * - * @param string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @return $this - */ - public function orWhereNull($column) - { - return $this->whereNull($column, 'or'); - } - - /** - * Add a "where not null" clause to the query. - * - * @param string|array|\Illuminate\Contracts\Database\Query\Expression $columns - * @param string $boolean - * @return $this - */ - public function whereNotNull($columns, $boolean = 'and') - { - return $this->whereNull($columns, $boolean, true); - } - - /** - * Add a where between statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $boolean - * @param bool $not - * @return $this - */ - public function whereBetween($column, iterable $values, $boolean = 'and', $not = false) - { - $type = 'between'; - - if ($values instanceof CarbonPeriod) { - $values = [$values->getStartDate(), $values->getEndDate()]; - } - - $this->wheres[] = compact('type', 'column', 'values', 'boolean', 'not'); - - $this->addBinding(array_slice($this->cleanBindings(Arr::flatten($values)), 0, 2), 'where'); - - return $this; - } - - /** - * Add a where between statement using columns to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $boolean - * @param bool $not - * @return $this - */ - public function whereBetweenColumns($column, array $values, $boolean = 'and', $not = false) - { - $type = 'betweenColumns'; - - $this->wheres[] = compact('type', 'column', 'values', 'boolean', 'not'); - - return $this; - } - - /** - * Add an or where between statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function orWhereBetween($column, iterable $values) - { - return $this->whereBetween($column, $values, 'or'); - } - - /** - * Add an or where between statement using columns to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function orWhereBetweenColumns($column, array $values) - { - return $this->whereBetweenColumns($column, $values, 'or'); - } - - /** - * Add a where not between statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $boolean - * @return $this - */ - public function whereNotBetween($column, iterable $values, $boolean = 'and') - { - return $this->whereBetween($column, $values, $boolean, true); - } - - /** - * Add a where not between statement using columns to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $boolean - * @return $this - */ - public function whereNotBetweenColumns($column, array $values, $boolean = 'and') - { - return $this->whereBetweenColumns($column, $values, $boolean, true); - } - - /** - * Add an or where not between statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function orWhereNotBetween($column, iterable $values) - { - return $this->whereNotBetween($column, $values, 'or'); - } - - /** - * Add an or where not between statement using columns to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function orWhereNotBetweenColumns($column, array $values) - { - return $this->whereNotBetweenColumns($column, $values, 'or'); - } - - /** - * Add an "or where not null" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function orWhereNotNull($column) - { - return $this->whereNotNull($column, 'or'); - } - - /** - * Add a "where date" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \DateTimeInterface|string|null $operator - * @param \DateTimeInterface|string|null $value - * @param string $boolean - * @return $this - */ - public function whereDate($column, $operator, $value = null, $boolean = 'and') - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - // If the given operator is not found in the list of valid operators we will - // assume that the developer is just short-cutting the '=' operators and - // we will set the operators to '=' and set the values appropriately. - if ($this->invalidOperator($operator)) { - [$value, $operator] = [$operator, '=']; - } - - $value = $this->flattenValue($value); - - if ($value instanceof DateTimeInterface) { - $value = $value->format('Y-m-d'); - } - - return $this->addDateBasedWhere('Date', $column, $operator, $value, $boolean); - } - - /** - * Add an "or where date" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \DateTimeInterface|string|null $operator - * @param \DateTimeInterface|string|null $value - * @return $this - */ - public function orWhereDate($column, $operator, $value = null) - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - return $this->whereDate($column, $operator, $value, 'or'); - } - - /** - * Add a "where time" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \DateTimeInterface|string|null $operator - * @param \DateTimeInterface|string|null $value - * @param string $boolean - * @return $this - */ - public function whereTime($column, $operator, $value = null, $boolean = 'and') - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - // If the given operator is not found in the list of valid operators we will - // assume that the developer is just short-cutting the '=' operators and - // we will set the operators to '=' and set the values appropriately. - if ($this->invalidOperator($operator)) { - [$value, $operator] = [$operator, '=']; - } - - $value = $this->flattenValue($value); - - if ($value instanceof DateTimeInterface) { - $value = $value->format('H:i:s'); - } - - return $this->addDateBasedWhere('Time', $column, $operator, $value, $boolean); - } - - /** - * Add an "or where time" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \DateTimeInterface|string|null $operator - * @param \DateTimeInterface|string|null $value - * @return $this - */ - public function orWhereTime($column, $operator, $value = null) - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - return $this->whereTime($column, $operator, $value, 'or'); - } - - /** - * Add a "where day" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \DateTimeInterface|string|int|null $operator - * @param \DateTimeInterface|string|int|null $value - * @param string $boolean - * @return $this - */ - public function whereDay($column, $operator, $value = null, $boolean = 'and') - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - // If the given operator is not found in the list of valid operators we will - // assume that the developer is just short-cutting the '=' operators and - // we will set the operators to '=' and set the values appropriately. - if ($this->invalidOperator($operator)) { - [$value, $operator] = [$operator, '=']; - } - - $value = $this->flattenValue($value); - - if ($value instanceof DateTimeInterface) { - $value = $value->format('d'); - } - - if (! $value instanceof ExpressionContract) { - $value = sprintf('%02d', $value); - } - - return $this->addDateBasedWhere('Day', $column, $operator, $value, $boolean); - } - - /** - * Add an "or where day" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \DateTimeInterface|string|int|null $operator - * @param \DateTimeInterface|string|int|null $value - * @return $this - */ - public function orWhereDay($column, $operator, $value = null) - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - return $this->whereDay($column, $operator, $value, 'or'); - } - - /** - * Add a "where month" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \DateTimeInterface|string|int|null $operator - * @param \DateTimeInterface|string|int|null $value - * @param string $boolean - * @return $this - */ - public function whereMonth($column, $operator, $value = null, $boolean = 'and') - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - // If the given operator is not found in the list of valid operators we will - // assume that the developer is just short-cutting the '=' operators and - // we will set the operators to '=' and set the values appropriately. - if ($this->invalidOperator($operator)) { - [$value, $operator] = [$operator, '=']; - } - - $value = $this->flattenValue($value); - - if ($value instanceof DateTimeInterface) { - $value = $value->format('m'); - } - - if (! $value instanceof ExpressionContract) { - $value = sprintf('%02d', $value); - } - - return $this->addDateBasedWhere('Month', $column, $operator, $value, $boolean); - } - - /** - * Add an "or where month" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \DateTimeInterface|string|int|null $operator - * @param \DateTimeInterface|string|int|null $value - * @return $this - */ - public function orWhereMonth($column, $operator, $value = null) - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - return $this->whereMonth($column, $operator, $value, 'or'); - } - - /** - * Add a "where year" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \DateTimeInterface|string|int|null $operator - * @param \DateTimeInterface|string|int|null $value - * @param string $boolean - * @return $this - */ - public function whereYear($column, $operator, $value = null, $boolean = 'and') - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - // If the given operator is not found in the list of valid operators we will - // assume that the developer is just short-cutting the '=' operators and - // we will set the operators to '=' and set the values appropriately. - if ($this->invalidOperator($operator)) { - [$value, $operator] = [$operator, '=']; - } - - $value = $this->flattenValue($value); - - if ($value instanceof DateTimeInterface) { - $value = $value->format('Y'); - } - - return $this->addDateBasedWhere('Year', $column, $operator, $value, $boolean); - } - - /** - * Add an "or where year" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \DateTimeInterface|string|int|null $operator - * @param \DateTimeInterface|string|int|null $value - * @return $this - */ - public function orWhereYear($column, $operator, $value = null) - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - return $this->whereYear($column, $operator, $value, 'or'); - } - - /** - * Add a date based (year, month, day, time) statement to the query. - * - * @param string $type - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param mixed $value - * @param string $boolean - * @return $this - */ - protected function addDateBasedWhere($type, $column, $operator, $value, $boolean = 'and') - { - $this->wheres[] = compact('column', 'type', 'boolean', 'operator', 'value'); - - if (! $value instanceof ExpressionContract) { - $this->addBinding($value, 'where'); - } - - return $this; - } - - /** - * Add a nested where statement to the query. - * - * @param string $boolean - * @return $this - */ - public function whereNested(Closure $callback, $boolean = 'and') - { - $callback($query = $this->forNestedWhere()); - - return $this->addNestedWhereQuery($query, $boolean); - } - - /** - * Create a new query instance for nested where condition. - * - * @return \Illuminate\Database\Query\Builder - */ - public function forNestedWhere() - { - return $this->newQuery()->from($this->from); - } - - /** - * Add another query builder as a nested where to the query builder. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $boolean - * @return $this - */ - public function addNestedWhereQuery($query, $boolean = 'and') - { - if (count($query->wheres)) { - $type = 'Nested'; - - $this->wheres[] = compact('type', 'query', 'boolean'); - - $this->addBinding($query->getRawBindings()['where'], 'where'); - } - - return $this; - } - - /** - * Add a full sub-select to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $callback - * @param string $boolean - * @return $this - */ - protected function whereSub($column, $operator, $callback, $boolean) - { - $type = 'Sub'; - - if ($callback instanceof Closure) { - // Once we have the query instance we can simply execute it so it can add all - // of the sub-select's conditions to itself, and then we can cache it off - // in the array of where clauses for the "main" parent query instance. - $callback($query = $this->forSubQuery()); - } else { - $query = $callback instanceof EloquentBuilder ? $callback->toBase() : $callback; - } - - $this->wheres[] = compact( - 'type', 'column', 'operator', 'query', 'boolean' - ); - - $this->addBinding($query->getBindings(), 'where'); - - return $this; - } - - /** - * Add an exists clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $callback - * @param string $boolean - * @param bool $not - * @return $this - */ - public function whereExists($callback, $boolean = 'and', $not = false) - { - if ($callback instanceof Closure) { - $query = $this->forSubQuery(); - - // Similar to the sub-select clause, we will create a new query instance so - // the developer may cleanly specify the entire exists query and we will - // compile the whole thing in the grammar and insert it into the SQL. - $callback($query); - } else { - $query = $callback instanceof EloquentBuilder ? $callback->toBase() : $callback; - } - - return $this->addWhereExistsQuery($query, $boolean, $not); - } - - /** - * Add an or exists clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $callback - * @param bool $not - * @return $this - */ - public function orWhereExists($callback, $not = false) - { - return $this->whereExists($callback, 'or', $not); - } - - /** - * Add a where not exists clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $callback - * @param string $boolean - * @return $this - */ - public function whereNotExists($callback, $boolean = 'and') - { - return $this->whereExists($callback, $boolean, true); - } - - /** - * Add a where not exists clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $callback - * @return $this - */ - public function orWhereNotExists($callback) - { - return $this->orWhereExists($callback, true); - } - - /** - * Add an exists clause to the query. - * - * @param string $boolean - * @param bool $not - * @return $this - */ - public function addWhereExistsQuery(self $query, $boolean = 'and', $not = false) - { - $type = $not ? 'NotExists' : 'Exists'; - - $this->wheres[] = compact('type', 'query', 'boolean'); - - $this->addBinding($query->getBindings(), 'where'); - - return $this; - } - - /** - * Adds a where condition using row values. - * - * @param array $columns - * @param string $operator - * @param array $values - * @param string $boolean - * @return $this - * - * @throws \InvalidArgumentException - */ - public function whereRowValues($columns, $operator, $values, $boolean = 'and') - { - if (count($columns) !== count($values)) { - throw new InvalidArgumentException('The number of columns must match the number of values'); - } - - $type = 'RowValues'; - - $this->wheres[] = compact('type', 'columns', 'operator', 'values', 'boolean'); - - $this->addBinding($this->cleanBindings($values)); - - return $this; - } - - /** - * Adds an or where condition using row values. - * - * @param array $columns - * @param string $operator - * @param array $values - * @return $this - */ - public function orWhereRowValues($columns, $operator, $values) - { - return $this->whereRowValues($columns, $operator, $values, 'or'); - } - - /** - * Add a "where JSON contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @param string $boolean - * @param bool $not - * @return $this - */ - public function whereJsonContains($column, $value, $boolean = 'and', $not = false) - { - $type = 'JsonContains'; - - $this->wheres[] = compact('type', 'column', 'value', 'boolean', 'not'); - - if (! $value instanceof ExpressionContract) { - $this->addBinding($this->grammar->prepareBindingForJsonContains($value)); - } - - return $this; - } - - /** - * Add an "or where JSON contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @return $this - */ - public function orWhereJsonContains($column, $value) - { - return $this->whereJsonContains($column, $value, 'or'); - } - - /** - * Add a "where JSON not contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @param string $boolean - * @return $this - */ - public function whereJsonDoesntContain($column, $value, $boolean = 'and') - { - return $this->whereJsonContains($column, $value, $boolean, true); - } - - /** - * Add an "or where JSON not contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @return $this - */ - public function orWhereJsonDoesntContain($column, $value) - { - return $this->whereJsonDoesntContain($column, $value, 'or'); - } - - /** - * Add a "where JSON overlaps" clause to the query. - * - * @param string $column - * @param mixed $value - * @param string $boolean - * @param bool $not - * @return $this - */ - public function whereJsonOverlaps($column, $value, $boolean = 'and', $not = false) - { - $type = 'JsonOverlaps'; - - $this->wheres[] = compact('type', 'column', 'value', 'boolean', 'not'); - - if (! $value instanceof ExpressionContract) { - $this->addBinding($this->grammar->prepareBindingForJsonContains($value)); - } - - return $this; - } - - /** - * Add an "or where JSON overlaps" clause to the query. - * - * @param string $column - * @param mixed $value - * @return $this - */ - public function orWhereJsonOverlaps($column, $value) - { - return $this->whereJsonOverlaps($column, $value, 'or'); - } - - /** - * Add a "where JSON not overlap" clause to the query. - * - * @param string $column - * @param mixed $value - * @param string $boolean - * @return $this - */ - public function whereJsonDoesntOverlap($column, $value, $boolean = 'and') - { - return $this->whereJsonOverlaps($column, $value, $boolean, true); - } - - /** - * Add an "or where JSON not overlap" clause to the query. - * - * @param string $column - * @param mixed $value - * @return $this - */ - public function orWhereJsonDoesntOverlap($column, $value) - { - return $this->whereJsonDoesntOverlap($column, $value, 'or'); - } - - /** - * Add a clause that determines if a JSON path exists to the query. - * - * @param string $column - * @param string $boolean - * @param bool $not - * @return $this - */ - public function whereJsonContainsKey($column, $boolean = 'and', $not = false) - { - $type = 'JsonContainsKey'; - - $this->wheres[] = compact('type', 'column', 'boolean', 'not'); - - return $this; - } - - /** - * Add an "or" clause that determines if a JSON path exists to the query. - * - * @param string $column - * @return $this - */ - public function orWhereJsonContainsKey($column) - { - return $this->whereJsonContainsKey($column, 'or'); - } - - /** - * Add a clause that determines if a JSON path does not exist to the query. - * - * @param string $column - * @param string $boolean - * @return $this - */ - public function whereJsonDoesntContainKey($column, $boolean = 'and') - { - return $this->whereJsonContainsKey($column, $boolean, true); - } - - /** - * Add an "or" clause that determines if a JSON path does not exist to the query. - * - * @param string $column - * @return $this - */ - public function orWhereJsonDoesntContainKey($column) - { - return $this->whereJsonDoesntContainKey($column, 'or'); - } - - /** - * Add a "where JSON length" clause to the query. - * - * @param string $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return $this - */ - public function whereJsonLength($column, $operator, $value = null, $boolean = 'and') - { - $type = 'JsonLength'; - - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - // If the given operator is not found in the list of valid operators we will - // assume that the developer is just short-cutting the '=' operators and - // we will set the operators to '=' and set the values appropriately. - if ($this->invalidOperator($operator)) { - [$value, $operator] = [$operator, '=']; - } - - $this->wheres[] = compact('type', 'column', 'operator', 'value', 'boolean'); - - if (! $value instanceof ExpressionContract) { - $this->addBinding((int) $this->flattenValue($value)); - } - - return $this; - } - - /** - * Add an "or where JSON length" clause to the query. - * - * @param string $column - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhereJsonLength($column, $operator, $value = null) - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - return $this->whereJsonLength($column, $operator, $value, 'or'); - } - - /** - * Handles dynamic "where" clauses to the query. - * - * @param string $method - * @param array $parameters - * @return $this - */ - public function dynamicWhere($method, $parameters) - { - $finder = substr($method, 5); - - $segments = preg_split( - '/(And|Or)(?=[A-Z])/', $finder, -1, PREG_SPLIT_DELIM_CAPTURE - ); - - // The connector variable will determine which connector will be used for the - // query condition. We will change it as we come across new boolean values - // in the dynamic method strings, which could contain a number of these. - $connector = 'and'; - - $index = 0; - - foreach ($segments as $segment) { - // If the segment is not a boolean connector, we can assume it is a column's name - // and we will add it to the query as a new constraint as a where clause, then - // we can keep iterating through the dynamic method string's segments again. - if ($segment !== 'And' && $segment !== 'Or') { - $this->addDynamic($segment, $connector, $parameters, $index); - - $index++; - } - - // Otherwise, we will store the connector so we know how the next where clause we - // find in the query should be connected to the previous ones, meaning we will - // have the proper boolean connector to connect the next where clause found. - else { - $connector = $segment; - } - } - - return $this; - } - - /** - * Add a single dynamic where clause statement to the query. - * - * @param string $segment - * @param string $connector - * @param array $parameters - * @param int $index - * @return void - */ - protected function addDynamic($segment, $connector, $parameters, $index) - { - // Once we have parsed out the columns and formatted the boolean operators we - // are ready to add it to this query as a where clause just like any other - // clause on the query. Then we'll increment the parameter index values. - $bool = strtolower($connector); - - $this->where(Str::snake($segment), '=', $parameters[$index], $bool); - } - - /** - * Add a "where fulltext" clause to the query. - * - * @param string|string[] $columns - * @param string $value - * @param string $boolean - * @return $this - */ - public function whereFullText($columns, $value, array $options = [], $boolean = 'and') - { - $type = 'Fulltext'; - - $columns = (array) $columns; - - $this->wheres[] = compact('type', 'columns', 'value', 'options', 'boolean'); - - $this->addBinding($value); - - return $this; - } - - /** - * Add a "or where fulltext" clause to the query. - * - * @param string|string[] $columns - * @param string $value - * @return $this - */ - public function orWhereFullText($columns, $value, array $options = []) - { - return $this->whereFullText($columns, $value, $options, 'or'); - } - - /** - * Add a "where" clause to the query for multiple columns with "and" conditions between them. - * - * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return $this - */ - public function whereAll($columns, $operator = null, $value = null, $boolean = 'and') - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - $this->whereNested(function ($query) use ($columns, $operator, $value) { - foreach ($columns as $column) { - $query->where($column, $operator, $value, 'and'); - } - }, $boolean); - - return $this; - } - - /** - * Add an "or where" clause to the query for multiple columns with "and" conditions between them. - * - * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhereAll($columns, $operator = null, $value = null) - { - return $this->whereAll($columns, $operator, $value, 'or'); - } - - /** - * Add a "where" clause to the query for multiple columns with "or" conditions between them. - * - * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return $this - */ - public function whereAny($columns, $operator = null, $value = null, $boolean = 'and') - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - $this->whereNested(function ($query) use ($columns, $operator, $value) { - foreach ($columns as $column) { - $query->where($column, $operator, $value, 'or'); - } - }, $boolean); - - return $this; - } - - /** - * Add an "or where" clause to the query for multiple columns with "or" conditions between them. - * - * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhereAny($columns, $operator = null, $value = null) - { - return $this->whereAny($columns, $operator, $value, 'or'); - } - - /** - * Add a "where not" clause to the query for multiple columns where none of the conditions should be true. - * - * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return $this - */ - public function whereNone($columns, $operator = null, $value = null, $boolean = 'and') - { - return $this->whereAny($columns, $operator, $value, $boolean.' not'); - } - - /** - * Add an "or where not" clause to the query for multiple columns where none of the conditions should be true. - * - * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns - * @param mixed $operator - * @param mixed $value - * @return $this - */ - public function orWhereNone($columns, $operator = null, $value = null) - { - return $this->whereNone($columns, $operator, $value, 'or'); - } - - /** - * Add a "group by" clause to the query. - * - * @param array|\Illuminate\Contracts\Database\Query\Expression|string ...$groups - * @return $this - */ - public function groupBy(...$groups) - { - foreach ($groups as $group) { - $this->groups = array_merge( - (array) $this->groups, - Arr::wrap($group) - ); - } - - return $this; - } - - /** - * Add a raw groupBy clause to the query. - * - * @param string $sql - * @return $this - */ - public function groupByRaw($sql, array $bindings = []) - { - $this->groups[] = new Expression($sql); - - $this->addBinding($bindings, 'groupBy'); - - return $this; - } - - /** - * Add a "having" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|\Closure|string $column - * @param string|int|float|null $operator - * @param string|int|float|null $value - * @param string $boolean - * @return $this - */ - public function having($column, $operator = null, $value = null, $boolean = 'and') - { - $type = 'Basic'; - - if ($column instanceof ConditionExpression) { - $type = 'Expression'; - - $this->havings[] = compact('type', 'column', 'boolean'); - - return $this; - } - - // Here we will make some assumptions about the operator. If only 2 values are - // passed to the method, we will assume that the operator is an equals sign - // and keep going. Otherwise, we'll require the operator to be passed in. - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - if ($column instanceof Closure && is_null($operator)) { - return $this->havingNested($column, $boolean); - } - - // If the given operator is not found in the list of valid operators we will - // assume that the developer is just short-cutting the '=' operators and - // we will set the operators to '=' and set the values appropriately. - if ($this->invalidOperator($operator)) { - [$value, $operator] = [$operator, '=']; - } - - if ($this->isBitwiseOperator($operator)) { - $type = 'Bitwise'; - } - - $this->havings[] = compact('type', 'column', 'operator', 'value', 'boolean'); - - if (! $value instanceof ExpressionContract) { - $this->addBinding($this->flattenValue($value), 'having'); - } - - return $this; - } - - /** - * Add an "or having" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|\Closure|string $column - * @param string|int|float|null $operator - * @param string|int|float|null $value - * @return $this - */ - public function orHaving($column, $operator = null, $value = null) - { - [$value, $operator] = $this->prepareValueAndOperator( - $value, $operator, func_num_args() === 2 - ); - - return $this->having($column, $operator, $value, 'or'); - } - - /** - * Add a nested having statement to the query. - * - * @param string $boolean - * @return $this - */ - public function havingNested(Closure $callback, $boolean = 'and') - { - $callback($query = $this->forNestedWhere()); - - return $this->addNestedHavingQuery($query, $boolean); - } - - /** - * Add another query builder as a nested having to the query builder. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $boolean - * @return $this - */ - public function addNestedHavingQuery($query, $boolean = 'and') - { - if (count($query->havings)) { - $type = 'Nested'; - - $this->havings[] = compact('type', 'query', 'boolean'); - - $this->addBinding($query->getRawBindings()['having'], 'having'); - } - - return $this; - } - - /** - * Add a "having null" clause to the query. - * - * @param array|string $columns - * @param string $boolean - * @param bool $not - * @return $this - */ - public function havingNull($columns, $boolean = 'and', $not = false) - { - $type = $not ? 'NotNull' : 'Null'; - - foreach (Arr::wrap($columns) as $column) { - $this->havings[] = compact('type', 'column', 'boolean'); - } - - return $this; - } - - /** - * Add an "or having null" clause to the query. - * - * @param string $column - * @return $this - */ - public function orHavingNull($column) - { - return $this->havingNull($column, 'or'); - } - - /** - * Add a "having not null" clause to the query. - * - * @param array|string $columns - * @param string $boolean - * @return $this - */ - public function havingNotNull($columns, $boolean = 'and') - { - return $this->havingNull($columns, $boolean, true); - } - - /** - * Add an "or having not null" clause to the query. - * - * @param string $column - * @return $this - */ - public function orHavingNotNull($column) - { - return $this->havingNotNull($column, 'or'); - } - - /** - * Add a "having between " clause to the query. - * - * @param string $column - * @param string $boolean - * @param bool $not - * @return $this - */ - public function havingBetween($column, iterable $values, $boolean = 'and', $not = false) - { - $type = 'between'; - - if ($values instanceof CarbonPeriod) { - $values = [$values->getStartDate(), $values->getEndDate()]; - } - - $this->havings[] = compact('type', 'column', 'values', 'boolean', 'not'); - - $this->addBinding(array_slice($this->cleanBindings(Arr::flatten($values)), 0, 2), 'having'); - - return $this; - } - - /** - * Add a raw having clause to the query. - * - * @param string $sql - * @param string $boolean - * @return $this - */ - public function havingRaw($sql, array $bindings = [], $boolean = 'and') - { - $type = 'Raw'; - - $this->havings[] = compact('type', 'sql', 'boolean'); - - $this->addBinding($bindings, 'having'); - - return $this; - } - - /** - * Add a raw or having clause to the query. - * - * @param string $sql - * @return $this - */ - public function orHavingRaw($sql, array $bindings = []) - { - return $this->havingRaw($sql, $bindings, 'or'); - } - - /** - * Add an "order by" clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|\Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $direction - * @return $this - * - * @throws \InvalidArgumentException - */ - public function orderBy($column, $direction = 'asc') - { - if ($this->isQueryable($column)) { - [$query, $bindings] = $this->createSub($column); - - $column = new Expression('('.$query.')'); - - $this->addBinding($bindings, $this->unions ? 'unionOrder' : 'order'); - } - - $direction = strtolower($direction); - - if (! in_array($direction, ['asc', 'desc'], true)) { - throw new InvalidArgumentException('Order direction must be "asc" or "desc".'); - } - - $this->{$this->unions ? 'unionOrders' : 'orders'}[] = [ - 'column' => $column, - 'direction' => $direction, - ]; - - return $this; - } - - /** - * Add a descending "order by" clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|\Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function orderByDesc($column) - { - return $this->orderBy($column, 'desc'); - } - - /** - * Add an "order by" clause for a timestamp to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function latest($column = 'created_at') - { - return $this->orderBy($column, 'desc'); - } - - /** - * Add an "order by" clause for a timestamp to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Contracts\Database\Query\Expression|string $column - * @return $this - */ - public function oldest($column = 'created_at') - { - return $this->orderBy($column, 'asc'); - } - - /** - * Put the query's results in random order. - * - * @param string|int $seed - * @return $this - */ - public function inRandomOrder($seed = '') - { - return $this->orderByRaw($this->grammar->compileRandom($seed)); - } - - /** - * Add a raw "order by" clause to the query. - * - * @param string $sql - * @param array $bindings - * @return $this - */ - public function orderByRaw($sql, $bindings = []) - { - $type = 'Raw'; - - $this->{$this->unions ? 'unionOrders' : 'orders'}[] = compact('type', 'sql'); - - $this->addBinding($bindings, $this->unions ? 'unionOrder' : 'order'); - - return $this; - } - - /** - * Alias to set the "offset" value of the query. - * - * @param int $value - * @return $this - */ - public function skip($value) - { - return $this->offset($value); - } - - /** - * Set the "offset" value of the query. - * - * @param int $value - * @return $this - */ - public function offset($value) - { - $property = $this->unions ? 'unionOffset' : 'offset'; - - $this->$property = max(0, (int) $value); - - return $this; - } - - /** - * Alias to set the "limit" value of the query. - * - * @param int $value - * @return $this - */ - public function take($value) - { - return $this->limit($value); - } - - /** - * Set the "limit" value of the query. - * - * @param int $value - * @return $this - */ - public function limit($value) - { - $property = $this->unions ? 'unionLimit' : 'limit'; - - if ($value >= 0) { - $this->$property = ! is_null($value) ? (int) $value : null; - } - - return $this; - } - - /** - * Add a "group limit" clause to the query. - * - * @param int $value - * @param string $column - * @return $this - */ - public function groupLimit($value, $column) - { - if ($value >= 0) { - $this->groupLimit = compact('value', 'column'); - } - - return $this; - } - - /** - * Set the limit and offset for a given page. - * - * @param int $page - * @param int $perPage - * @return $this - */ - public function forPage($page, $perPage = 15) - { - return $this->offset(($page - 1) * $perPage)->limit($perPage); - } - - /** - * Constrain the query to the previous "page" of results before a given ID. - * - * @param int $perPage - * @param int|null $lastId - * @param string $column - * @return $this - */ - public function forPageBeforeId($perPage = 15, $lastId = 0, $column = 'id') - { - $this->orders = $this->removeExistingOrdersFor($column); - - if (! is_null($lastId)) { - $this->where($column, '<', $lastId); - } - - return $this->orderBy($column, 'desc') - ->limit($perPage); - } - - /** - * Constrain the query to the next "page" of results after a given ID. - * - * @param int $perPage - * @param int|null $lastId - * @param string $column - * @return $this - */ - public function forPageAfterId($perPage = 15, $lastId = 0, $column = 'id') - { - $this->orders = $this->removeExistingOrdersFor($column); - - if (! is_null($lastId)) { - $this->where($column, '>', $lastId); - } - - return $this->orderBy($column, 'asc') - ->limit($perPage); - } - - /** - * Remove all existing orders and optionally add a new order. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Contracts\Database\Query\Expression|string|null $column - * @param string $direction - * @return $this - */ - public function reorder($column = null, $direction = 'asc') - { - $this->orders = null; - $this->unionOrders = null; - $this->bindings['order'] = []; - $this->bindings['unionOrder'] = []; - - if ($column) { - return $this->orderBy($column, $direction); - } - - return $this; - } - - /** - * Get an array with all orders with a given column removed. - * - * @param string $column - * @return array - */ - protected function removeExistingOrdersFor($column) - { - return (new Collection($this->orders)) - ->reject(function ($order) use ($column) { - return isset($order['column']) - ? $order['column'] === $column : false; - })->values()->all(); - } - - /** - * Add a union statement to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $query - * @param bool $all - * @return $this - */ - public function union($query, $all = false) - { - if ($query instanceof Closure) { - $query($query = $this->newQuery()); - } - - $this->unions[] = compact('query', 'all'); - - $this->addBinding($query->getBindings(), 'union'); - - return $this; - } - - /** - * Add a union all statement to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*> $query - * @return $this - */ - public function unionAll($query) - { - return $this->union($query, true); - } - - /** - * Lock the selected rows in the table. - * - * @param string|bool $value - * @return $this - */ - public function lock($value = true) - { - $this->lock = $value; - - if (! is_null($this->lock)) { - $this->useWritePdo(); - } - - return $this; - } - - /** - * Lock the selected rows in the table for updating. - * - * @return $this - */ - public function lockForUpdate() - { - return $this->lock(true); - } - - /** - * Share lock the selected rows in the table. - * - * @return $this - */ - public function sharedLock() - { - return $this->lock(false); - } - - /** - * Register a closure to be invoked before the query is executed. - * - * @return $this - */ - public function beforeQuery(callable $callback) - { - $this->beforeQueryCallbacks[] = $callback; - - return $this; - } - - /** - * Invoke the "before query" modification callbacks. - * - * @return void - */ - public function applyBeforeQueryCallbacks() - { - foreach ($this->beforeQueryCallbacks as $callback) { - $callback($this); - } - - $this->beforeQueryCallbacks = []; - } - - /** - * Register a closure to be invoked after the query is executed. - * - * @return $this - */ - public function afterQuery(Closure $callback) - { - $this->afterQueryCallbacks[] = $callback; - - return $this; - } - - /** - * Invoke the "after query" modification callbacks. - * - * @param mixed $result - * @return mixed - */ - public function applyAfterQueryCallbacks($result) - { - foreach ($this->afterQueryCallbacks as $afterQueryCallback) { - $result = $afterQueryCallback($result) ?: $result; - } - - return $result; - } - - /** - * Get the SQL representation of the query. - * - * @return string - */ - public function toSql() - { - $this->applyBeforeQueryCallbacks(); - - return $this->grammar->compileSelect($this); - } - - /** - * Get the raw SQL representation of the query with embedded bindings. - * - * @return string - */ - public function toRawSql() - { - return $this->grammar->substituteBindingsIntoRawSql( - $this->toSql(), $this->connection->prepareBindings($this->getBindings()) - ); - } - - /** - * Execute a query for a single record by ID. - * - * @param int|string $id - * @param array|string $columns - * @return object|null - */ - public function find($id, $columns = ['*']) - { - return $this->where('id', '=', $id)->first($columns); - } - - /** - * Execute a query for a single record by ID or call a callback. - * - * @template TValue - * - * @param mixed $id - * @param (\Closure(): TValue)|list|string $columns - * @param (\Closure(): TValue)|null $callback - * @return object|TValue - */ - public function findOr($id, $columns = ['*'], ?Closure $callback = null) - { - if ($columns instanceof Closure) { - $callback = $columns; - - $columns = ['*']; - } - - if (! is_null($data = $this->find($id, $columns))) { - return $data; - } - - return $callback(); - } - - /** - * Get a single column's value from the first result of a query. - * - * @param string $column - * @return mixed - */ - public function value($column) - { - $result = (array) $this->first([$column]); - - return count($result) > 0 ? reset($result) : null; - } - - /** - * Get a single expression value from the first result of a query. - * - * @return mixed - */ - public function rawValue(string $expression, array $bindings = []) - { - $result = (array) $this->selectRaw($expression, $bindings)->first(); - - return count($result) > 0 ? reset($result) : null; - } - - /** - * Get a single column's value from the first result of a query if it's the sole matching record. - * - * @param string $column - * @return mixed - * - * @throws \Illuminate\Database\RecordsNotFoundException - * @throws \Illuminate\Database\MultipleRecordsFoundException - */ - public function soleValue($column) - { - $result = (array) $this->sole([$column]); - - return reset($result); - } - - /** - * Execute the query as a "select" statement. - * - * @param array|string $columns - * @return \Illuminate\Support\Collection - */ - public function get($columns = ['*']) - { - $items = new Collection($this->onceWithColumns(Arr::wrap($columns), function () { - return $this->processor->processSelect($this, $this->runSelect()); - })); - - return $this->applyAfterQueryCallbacks( - isset($this->groupLimit) ? $this->withoutGroupLimitKeys($items) : $items - ); - } - - /** - * Run the query as a "select" statement against the connection. - * - * @return array - */ - protected function runSelect() - { - return $this->connection->select( - $this->toSql(), $this->getBindings(), ! $this->useWritePdo - ); - } - - /** - * Remove the group limit keys from the results in the collection. - * - * @param \Illuminate\Support\Collection $items - * @return \Illuminate\Support\Collection - */ - protected function withoutGroupLimitKeys($items) - { - $keysToRemove = ['laravel_row']; - - if (is_string($this->groupLimit['column'])) { - $column = last(explode('.', $this->groupLimit['column'])); - - $keysToRemove[] = '@laravel_group := '.$this->grammar->wrap($column); - $keysToRemove[] = '@laravel_group := '.$this->grammar->wrap('pivot_'.$column); - } - - $items->each(function ($item) use ($keysToRemove) { - foreach ($keysToRemove as $key) { - unset($item->$key); - } - }); - - return $items; - } - - /** - * Paginate the given query into a simple paginator. - * - * @param int|\Closure $perPage - * @param array|string $columns - * @param string $pageName - * @param int|null $page - * @param \Closure|int|null $total - * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator - */ - public function paginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null, $total = null) - { - $page = $page ?: Paginator::resolveCurrentPage($pageName); - - $total = value($total) ?? $this->getCountForPagination(); - - $perPage = value($perPage, $total); - - $results = $total ? $this->forPage($page, $perPage)->get($columns) : new Collection; - - return $this->paginator($results, $total, $perPage, $page, [ - 'path' => Paginator::resolveCurrentPath(), - 'pageName' => $pageName, - ]); - } - - /** - * Get a paginator only supporting simple next and previous links. - * - * This is more efficient on larger data-sets, etc. - * - * @param int $perPage - * @param array|string $columns - * @param string $pageName - * @param int|null $page - * @return \Illuminate\Contracts\Pagination\Paginator - */ - public function simplePaginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null) - { - $page = $page ?: Paginator::resolveCurrentPage($pageName); - - $this->offset(($page - 1) * $perPage)->limit($perPage + 1); - - return $this->simplePaginator($this->get($columns), $perPage, $page, [ - 'path' => Paginator::resolveCurrentPath(), - 'pageName' => $pageName, - ]); - } - - /** - * Get a paginator only supporting simple next and previous links. - * - * This is more efficient on larger data-sets, etc. - * - * @param int|null $perPage - * @param array|string $columns - * @param string $cursorName - * @param \Illuminate\Pagination\Cursor|string|null $cursor - * @return \Illuminate\Contracts\Pagination\CursorPaginator - */ - public function cursorPaginate($perPage = 15, $columns = ['*'], $cursorName = 'cursor', $cursor = null) - { - return $this->paginateUsingCursor($perPage, $columns, $cursorName, $cursor); - } - - /** - * Ensure the proper order by required for cursor pagination. - * - * @param bool $shouldReverse - * @return \Illuminate\Support\Collection - */ - protected function ensureOrderForCursorPagination($shouldReverse = false) - { - if (empty($this->orders) && empty($this->unionOrders)) { - $this->enforceOrderBy(); - } - - $reverseDirection = function ($order) { - if (! isset($order['direction'])) { - return $order; - } - - $order['direction'] = $order['direction'] === 'asc' ? 'desc' : 'asc'; - - return $order; - }; - - if ($shouldReverse) { - $this->orders = (new Collection($this->orders))->map($reverseDirection)->toArray(); - $this->unionOrders = (new Collection($this->unionOrders))->map($reverseDirection)->toArray(); - } - - $orders = ! empty($this->unionOrders) ? $this->unionOrders : $this->orders; - - return (new Collection($orders)) - ->filter(fn ($order) => Arr::has($order, 'direction')) - ->values(); - } - - /** - * Get the count of the total records for the paginator. - * - * @param array $columns - * @return int - */ - public function getCountForPagination($columns = ['*']) - { - $results = $this->runPaginationCountQuery($columns); - - // Once we have run the pagination count query, we will get the resulting count and - // take into account what type of query it was. When there is a group by we will - // just return the count of the entire results set since that will be correct. - if (! isset($results[0])) { - return 0; - } elseif (is_object($results[0])) { - return (int) $results[0]->aggregate; - } - - return (int) array_change_key_case((array) $results[0])['aggregate']; - } - - /** - * Run a pagination count query. - * - * @param array $columns - * @return array - */ - protected function runPaginationCountQuery($columns = ['*']) - { - if ($this->groups || $this->havings) { - $clone = $this->cloneForPaginationCount(); - - if (is_null($clone->columns) && ! empty($this->joins)) { - $clone->select($this->from.'.*'); - } - - return $this->newQuery() - ->from(new Expression('('.$clone->toSql().') as '.$this->grammar->wrap('aggregate_table'))) - ->mergeBindings($clone) - ->setAggregate('count', $this->withoutSelectAliases($columns)) - ->get()->all(); - } - - $without = $this->unions ? ['unionOrders', 'unionLimit', 'unionOffset'] : ['columns', 'orders', 'limit', 'offset']; - - return $this->cloneWithout($without) - ->cloneWithoutBindings($this->unions ? ['unionOrder'] : ['select', 'order']) - ->setAggregate('count', $this->withoutSelectAliases($columns)) - ->get()->all(); - } - - /** - * Clone the existing query instance for usage in a pagination subquery. - * - * @return self - */ - protected function cloneForPaginationCount() - { - return $this->cloneWithout(['orders', 'limit', 'offset']) - ->cloneWithoutBindings(['order']); - } - - /** - * Remove the column aliases since they will break count queries. - * - * @return array - */ - protected function withoutSelectAliases(array $columns) - { - return array_map(function ($column) { - return is_string($column) && ($aliasPosition = stripos($column, ' as ')) !== false - ? substr($column, 0, $aliasPosition) : $column; - }, $columns); - } - - /** - * Get a lazy collection for the given query. - * - * @return \Illuminate\Support\LazyCollection - */ - public function cursor() - { - if (is_null($this->columns)) { - $this->columns = ['*']; - } - - return (new LazyCollection(function () { - yield from $this->connection->cursor( - $this->toSql(), $this->getBindings(), ! $this->useWritePdo - ); - }))->map(function ($item) { - return $this->applyAfterQueryCallbacks(new Collection([$item]))->first(); - })->reject(fn ($item) => is_null($item)); - } - - /** - * Throw an exception if the query doesn't have an orderBy clause. - * - * @return void - * - * @throws \RuntimeException - */ - protected function enforceOrderBy() - { - if (empty($this->orders) && empty($this->unionOrders)) { - throw new RuntimeException('You must specify an orderBy clause when using this function.'); - } - } - - /** - * Get a collection instance containing the values of a given column. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string|null $key - * @return \Illuminate\Support\Collection - */ - public function pluck($column, $key = null) - { - // First, we will need to select the results of the query accounting for the - // given columns / key. Once we have the results, we will be able to take - // the results and get the exact data that was requested for the query. - $queryResult = $this->onceWithColumns( - is_null($key) || $key === $column ? [$column] : [$column, $key], - function () { - return $this->processor->processSelect( - $this, $this->runSelect() - ); - } - ); - - if (empty($queryResult)) { - return new Collection; - } - - // If the columns are qualified with a table or have an alias, we cannot use - // those directly in the "pluck" operations since the results from the DB - // are only keyed by the column itself. We'll strip the table out here. - $column = $this->stripTableForPluck($column); - - $key = $this->stripTableForPluck($key); - - return $this->applyAfterQueryCallbacks( - is_array($queryResult[0]) - ? $this->pluckFromArrayColumn($queryResult, $column, $key) - : $this->pluckFromObjectColumn($queryResult, $column, $key) - ); - } - - /** - * Strip off the table name or alias from a column identifier. - * - * @param string $column - * @return string|null - */ - protected function stripTableForPluck($column) - { - if (is_null($column)) { - return $column; - } - - $columnString = $column instanceof ExpressionContract - ? $this->grammar->getValue($column) - : $column; - - $separator = str_contains(strtolower($columnString), ' as ') ? ' as ' : '\.'; - - return last(preg_split('~'.$separator.'~i', $columnString)); - } - - /** - * Retrieve column values from rows represented as objects. - * - * @param array $queryResult - * @param string $column - * @param string $key - * @return \Illuminate\Support\Collection - */ - protected function pluckFromObjectColumn($queryResult, $column, $key) - { - $results = []; - - if (is_null($key)) { - foreach ($queryResult as $row) { - $results[] = $row->$column; - } - } else { - foreach ($queryResult as $row) { - $results[$row->$key] = $row->$column; - } - } - - return new Collection($results); - } - - /** - * Retrieve column values from rows represented as arrays. - * - * @param array $queryResult - * @param string $column - * @param string $key - * @return \Illuminate\Support\Collection - */ - protected function pluckFromArrayColumn($queryResult, $column, $key) - { - $results = []; - - if (is_null($key)) { - foreach ($queryResult as $row) { - $results[] = $row[$column]; - } - } else { - foreach ($queryResult as $row) { - $results[$row[$key]] = $row[$column]; - } - } - - return new Collection($results); - } - - /** - * Concatenate values of a given column as a string. - * - * @param string $column - * @param string $glue - * @return string - */ - public function implode($column, $glue = '') - { - return $this->pluck($column)->implode($glue); - } - - /** - * Determine if any rows exist for the current query. - * - * @return bool - */ - public function exists() - { - $this->applyBeforeQueryCallbacks(); - - $results = $this->connection->select( - $this->grammar->compileExists($this), $this->getBindings(), ! $this->useWritePdo - ); - - // If the results have rows, we will get the row and see if the exists column is a - // boolean true. If there are no results for this query we will return false as - // there are no rows for this query at all, and we can return that info here. - if (isset($results[0])) { - $results = (array) $results[0]; - - return (bool) $results['exists']; - } - - return false; - } - - /** - * Determine if no rows exist for the current query. - * - * @return bool - */ - public function doesntExist() - { - return ! $this->exists(); - } - - /** - * Execute the given callback if no rows exist for the current query. - * - * @return mixed - */ - public function existsOr(Closure $callback) - { - return $this->exists() ? true : $callback(); - } - - /** - * Execute the given callback if rows exist for the current query. - * - * @return mixed - */ - public function doesntExistOr(Closure $callback) - { - return $this->doesntExist() ? true : $callback(); - } - - /** - * Retrieve the "count" result of the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $columns - * @return int - */ - public function count($columns = '*') - { - return (int) $this->aggregate(__FUNCTION__, Arr::wrap($columns)); - } - - /** - * Retrieve the minimum value of a given column. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return mixed - */ - public function min($column) - { - return $this->aggregate(__FUNCTION__, [$column]); - } - - /** - * Retrieve the maximum value of a given column. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return mixed - */ - public function max($column) - { - return $this->aggregate(__FUNCTION__, [$column]); - } - - /** - * Retrieve the sum of the values of a given column. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return mixed - */ - public function sum($column) - { - $result = $this->aggregate(__FUNCTION__, [$column]); - - return $result ?: 0; - } - - /** - * Retrieve the average of the values of a given column. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return mixed - */ - public function avg($column) - { - return $this->aggregate(__FUNCTION__, [$column]); - } - - /** - * Alias for the "avg" method. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return mixed - */ - public function average($column) - { - return $this->avg($column); - } - - /** - * Execute an aggregate function on the database. - * - * @param string $function - * @param array $columns - * @return mixed - */ - public function aggregate($function, $columns = ['*']) - { - $results = $this->cloneWithout($this->unions || $this->havings ? [] : ['columns']) - ->cloneWithoutBindings($this->unions || $this->havings ? [] : ['select']) - ->setAggregate($function, $columns) - ->get($columns); - - if (! $results->isEmpty()) { - return array_change_key_case((array) $results[0])['aggregate']; - } - } - - /** - * Execute a numeric aggregate function on the database. - * - * @param string $function - * @param array $columns - * @return float|int - */ - public function numericAggregate($function, $columns = ['*']) - { - $result = $this->aggregate($function, $columns); - - // If there is no result, we can obviously just return 0 here. Next, we will check - // if the result is an integer or float. If it is already one of these two data - // types we can just return the result as-is, otherwise we will convert this. - if (! $result) { - return 0; - } - - if (is_int($result) || is_float($result)) { - return $result; - } - - // If the result doesn't contain a decimal place, we will assume it is an int then - // cast it to one. When it does we will cast it to a float since it needs to be - // cast to the expected data type for the developers out of pure convenience. - return ! str_contains((string) $result, '.') - ? (int) $result : (float) $result; - } - - /** - * Set the aggregate property without running the query. - * - * @param string $function - * @param array $columns - * @return $this - */ - protected function setAggregate($function, $columns) - { - $this->aggregate = compact('function', 'columns'); - - if (empty($this->groups)) { - $this->orders = null; - - $this->bindings['order'] = []; - } - - return $this; - } - - /** - * Execute the given callback while selecting the given columns. - * - * After running the callback, the columns are reset to the original value. - * - * @param array $columns - * @param callable $callback - * @return mixed - */ - protected function onceWithColumns($columns, $callback) - { - $original = $this->columns; - - if (is_null($original)) { - $this->columns = $columns; - } - - $result = $callback(); - - $this->columns = $original; - - return $result; - } - - /** - * Insert new records into the database. - * - * @return bool - */ - public function insert(array $values) - { - // Since every insert gets treated like a batch insert, we will make sure the - // bindings are structured in a way that is convenient when building these - // inserts statements by verifying these elements are actually an array. - if (empty($values)) { - return true; - } - - if (! is_array(reset($values))) { - $values = [$values]; - } - - // Here, we will sort the insert keys for every record so that each insert is - // in the same order for the record. We need to make sure this is the case - // so there are not any errors or problems when inserting these records. - else { - foreach ($values as $key => $value) { - ksort($value); - - $values[$key] = $value; - } - } - - $this->applyBeforeQueryCallbacks(); - - // Finally, we will run this query against the database connection and return - // the results. We will need to also flatten these bindings before running - // the query so they are all in one huge, flattened array for execution. - return $this->connection->insert( - $this->grammar->compileInsert($this, $values), - $this->cleanBindings(Arr::flatten($values, 1)) - ); - } - - /** - * Insert new records into the database while ignoring errors. - * - * @return int - */ - public function insertOrIgnore(array $values) - { - if (empty($values)) { - return 0; - } - - if (! is_array(reset($values))) { - $values = [$values]; - } else { - foreach ($values as $key => $value) { - ksort($value); - - $values[$key] = $value; - } - } - - $this->applyBeforeQueryCallbacks(); - - return $this->connection->affectingStatement( - $this->grammar->compileInsertOrIgnore($this, $values), - $this->cleanBindings(Arr::flatten($values, 1)) - ); - } - - /** - * Insert a new record and get the value of the primary key. - * - * @param string|null $sequence - * @return int - */ - public function insertGetId(array $values, $sequence = null) - { - $this->applyBeforeQueryCallbacks(); - - $sql = $this->grammar->compileInsertGetId($this, $values, $sequence); - - $values = $this->cleanBindings($values); - - return $this->processor->processInsertGetId($this, $sql, $values, $sequence); - } - - /** - * Insert new records into the table using a subquery. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query - * @return int - */ - public function insertUsing(array $columns, $query) - { - $this->applyBeforeQueryCallbacks(); - - [$sql, $bindings] = $this->createSub($query); - - return $this->connection->affectingStatement( - $this->grammar->compileInsertUsing($this, $columns, $sql), - $this->cleanBindings($bindings) - ); - } - - /** - * Insert new records into the table using a subquery while ignoring errors. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<*>|string $query - * @return int - */ - public function insertOrIgnoreUsing(array $columns, $query) - { - $this->applyBeforeQueryCallbacks(); - - [$sql, $bindings] = $this->createSub($query); - - return $this->connection->affectingStatement( - $this->grammar->compileInsertOrIgnoreUsing($this, $columns, $sql), - $this->cleanBindings($bindings) - ); - } - - /** - * Update records in the database. - * - * @return int - */ - public function update(array $values) - { - $this->applyBeforeQueryCallbacks(); - - $values = (new Collection($values))->map(function ($value) { - if (! $value instanceof Builder) { - return ['value' => $value, 'bindings' => match (true) { - $value instanceof Collection => $value->all(), - $value instanceof UnitEnum => enum_value($value), - default => $value, - }]; - } - - [$query, $bindings] = $this->parseSub($value); - - return ['value' => new Expression("({$query})"), 'bindings' => fn () => $bindings]; - }); - - $sql = $this->grammar->compileUpdate($this, $values->map(fn ($value) => $value['value'])->all()); - - return $this->connection->update($sql, $this->cleanBindings( - $this->grammar->prepareBindingsForUpdate($this->bindings, $values->map(fn ($value) => $value['bindings'])->all()) - )); - } - - /** - * Update records in a PostgreSQL database using the update from syntax. - * - * @return int - */ - public function updateFrom(array $values) - { - if (! method_exists($this->grammar, 'compileUpdateFrom')) { - throw new LogicException('This database engine does not support the updateFrom method.'); - } - - $this->applyBeforeQueryCallbacks(); - - $sql = $this->grammar->compileUpdateFrom($this, $values); - - return $this->connection->update($sql, $this->cleanBindings( - $this->grammar->prepareBindingsForUpdateFrom($this->bindings, $values) - )); - } - - /** - * Insert or update a record matching the attributes, and fill it with values. - * - * @return bool - */ - public function updateOrInsert(array $attributes, array|callable $values = []) - { - $exists = $this->where($attributes)->exists(); - - if ($values instanceof Closure) { - $values = $values($exists); - } - - if (! $exists) { - return $this->insert(array_merge($attributes, $values)); - } - - if (empty($values)) { - return true; - } - - return (bool) $this->limit(1)->update($values); - } - - /** - * Insert new records or update the existing ones. - * - * @param array|string $uniqueBy - * @param array|null $update - * @return int - */ - public function upsert(array $values, $uniqueBy, $update = null) - { - if (empty($values)) { - return 0; - } elseif ($update === []) { - return (int) $this->insert($values); - } - - if (! is_array(reset($values))) { - $values = [$values]; - } else { - foreach ($values as $key => $value) { - ksort($value); - - $values[$key] = $value; - } - } - - if (is_null($update)) { - $update = array_keys(reset($values)); - } - - $this->applyBeforeQueryCallbacks(); - - $bindings = $this->cleanBindings(array_merge( - Arr::flatten($values, 1), - (new Collection($update)) - ->reject(fn ($value, $key) => is_int($key)) - ->all() - )); - - return $this->connection->affectingStatement( - $this->grammar->compileUpsert($this, $values, (array) $uniqueBy, $update), - $bindings - ); - } - - /** - * Increment a column's value by a given amount. - * - * @param string $column - * @param float|int $amount - * @return int - * - * @throws \InvalidArgumentException - */ - public function increment($column, $amount = 1, array $extra = []) - { - if (! is_numeric($amount)) { - throw new InvalidArgumentException('Non-numeric value passed to increment method.'); - } - - return $this->incrementEach([$column => $amount], $extra); - } - - /** - * Increment the given column's values by the given amounts. - * - * @param array $columns - * @param array $extra - * @return int - * - * @throws \InvalidArgumentException - */ - public function incrementEach(array $columns, array $extra = []) - { - foreach ($columns as $column => $amount) { - if (! is_numeric($amount)) { - throw new InvalidArgumentException("Non-numeric value passed as increment amount for column: '$column'."); - } elseif (! is_string($column)) { - throw new InvalidArgumentException('Non-associative array passed to incrementEach method.'); - } - - $columns[$column] = $this->raw("{$this->grammar->wrap($column)} + $amount"); - } - - return $this->update(array_merge($columns, $extra)); - } - - /** - * Decrement a column's value by a given amount. - * - * @param string $column - * @param float|int $amount - * @return int - * - * @throws \InvalidArgumentException - */ - public function decrement($column, $amount = 1, array $extra = []) - { - if (! is_numeric($amount)) { - throw new InvalidArgumentException('Non-numeric value passed to decrement method.'); - } - - return $this->decrementEach([$column => $amount], $extra); - } - - /** - * Decrement the given column's values by the given amounts. - * - * @param array $columns - * @param array $extra - * @return int - * - * @throws \InvalidArgumentException - */ - public function decrementEach(array $columns, array $extra = []) - { - foreach ($columns as $column => $amount) { - if (! is_numeric($amount)) { - throw new InvalidArgumentException("Non-numeric value passed as decrement amount for column: '$column'."); - } elseif (! is_string($column)) { - throw new InvalidArgumentException('Non-associative array passed to decrementEach method.'); - } - - $columns[$column] = $this->raw("{$this->grammar->wrap($column)} - $amount"); - } - - return $this->update(array_merge($columns, $extra)); - } - - /** - * Delete records from the database. - * - * @param mixed $id - * @return int - */ - public function delete($id = null) - { - // If an ID is passed to the method, we will set the where clause to check the - // ID to let developers to simply and quickly remove a single row from this - // database without manually specifying the "where" clauses on the query. - if (! is_null($id)) { - $this->where($this->from.'.id', '=', $id); - } - - $this->applyBeforeQueryCallbacks(); - - return $this->connection->delete( - $this->grammar->compileDelete($this), $this->cleanBindings( - $this->grammar->prepareBindingsForDelete($this->bindings) - ) - ); - } - - /** - * Run a truncate statement on the table. - * - * @return void - */ - public function truncate() - { - $this->applyBeforeQueryCallbacks(); - - foreach ($this->grammar->compileTruncate($this) as $sql => $bindings) { - $this->connection->statement($sql, $bindings); - } - } - - /** - * Get a new instance of the query builder. - * - * @return \Illuminate\Database\Query\Builder - */ - public function newQuery() - { - return new static($this->connection, $this->grammar, $this->processor); - } - - /** - * Create a new query instance for a sub-query. - * - * @return \Illuminate\Database\Query\Builder - */ - protected function forSubQuery() - { - return $this->newQuery(); - } - - /** - * Get all of the query builder's columns in a text-only array with all expressions evaluated. - * - * @return array - */ - public function getColumns() - { - return ! is_null($this->columns) - ? array_map(fn ($column) => $this->grammar->getValue($column), $this->columns) - : []; - } - - /** - * Create a raw database expression. - * - * @param mixed $value - * @return \Illuminate\Contracts\Database\Query\Expression - */ - public function raw($value) - { - return $this->connection->raw($value); - } - - /** - * Get the query builder instances that are used in the union of the query. - * - * @return \Illuminate\Support\Collection - */ - protected function getUnionBuilders() - { - return isset($this->unions) - ? (new Collection($this->unions))->pluck('query') - : new Collection; - } - - /** - * Get the current query value bindings in a flattened array. - * - * @return array - */ - public function getBindings() - { - return Arr::flatten($this->bindings); - } - - /** - * Get the raw array of bindings. - * - * @return array - */ - public function getRawBindings() - { - return $this->bindings; - } - - /** - * Set the bindings on the query builder. - * - * @param string $type - * @return $this - * - * @throws \InvalidArgumentException - */ - public function setBindings(array $bindings, $type = 'where') - { - if (! array_key_exists($type, $this->bindings)) { - throw new InvalidArgumentException("Invalid binding type: {$type}."); - } - - $this->bindings[$type] = $bindings; - - return $this; - } - - /** - * Add a binding to the query. - * - * @param mixed $value - * @param string $type - * @return $this - * - * @throws \InvalidArgumentException - */ - public function addBinding($value, $type = 'where') - { - if (! array_key_exists($type, $this->bindings)) { - throw new InvalidArgumentException("Invalid binding type: {$type}."); - } - - if (is_array($value)) { - $this->bindings[$type] = array_values(array_map( - [$this, 'castBinding'], - array_merge($this->bindings[$type], $value), - )); - } else { - $this->bindings[$type][] = $this->castBinding($value); - } - - return $this; - } - - /** - * Cast the given binding value. - * - * @param mixed $value - * @return mixed - */ - public function castBinding($value) - { - if ($value instanceof UnitEnum) { - return enum_value($value); - } - - return $value; - } - - /** - * Merge an array of bindings into our bindings. - * - * @return $this - */ - public function mergeBindings(self $query) - { - $this->bindings = array_merge_recursive($this->bindings, $query->bindings); - - return $this; - } - - /** - * Remove all of the expressions from a list of bindings. - * - * @return array - */ - public function cleanBindings(array $bindings) - { - return (new Collection($bindings)) - ->reject(function ($binding) { - return $binding instanceof ExpressionContract; - }) - ->map([$this, 'castBinding']) - ->values() - ->all(); - } - - /** - * Get a scalar type value from an unknown type of input. - * - * @param mixed $value - * @return mixed - */ - protected function flattenValue($value) - { - return is_array($value) ? head(Arr::flatten($value)) : $value; - } - - /** - * Get the default key name of the table. - * - * @return string - */ - protected function defaultKeyName() - { - return 'id'; - } - - /** - * Get the database connection instance. - * - * @return \Illuminate\Database\ConnectionInterface - */ - public function getConnection() - { - return $this->connection; - } - - /** - * Get the database query processor instance. - * - * @return \Illuminate\Database\Query\Processors\Processor - */ - public function getProcessor() - { - return $this->processor; - } - - /** - * Get the query grammar instance. - * - * @return \Illuminate\Database\Query\Grammars\Grammar - */ - public function getGrammar() - { - return $this->grammar; - } - - /** - * Use the "write" PDO connection when executing the query. - * - * @return $this - */ - public function useWritePdo() - { - $this->useWritePdo = true; - - return $this; - } - - /** - * Determine if the value is a query builder instance or a Closure. - * - * @param mixed $value - * @return bool - */ - protected function isQueryable($value) - { - return $value instanceof self || - $value instanceof EloquentBuilder || - $value instanceof Relation || - $value instanceof Closure; - } - - /** - * Clone the query. - * - * @return static - */ - public function clone() - { - return clone $this; - } - - /** - * Clone the query without the given properties. - * - * @return static - */ - public function cloneWithout(array $properties) - { - return tap($this->clone(), function ($clone) use ($properties) { - foreach ($properties as $property) { - $clone->{$property} = null; - } - }); - } - - /** - * Clone the query without the given bindings. - * - * @return static - */ - public function cloneWithoutBindings(array $except) - { - return tap($this->clone(), function ($clone) use ($except) { - foreach ($except as $type) { - $clone->bindings[$type] = []; - } - }); - } - - /** - * Dump the current SQL and bindings. - * - * @param mixed ...$args - * @return $this - */ - public function dump(...$args) - { - dump( - $this->toSql(), - $this->getBindings(), - ...$args, - ); - - return $this; - } - - /** - * Dump the raw current SQL with embedded bindings. - * - * @return $this - */ - public function dumpRawSql() - { - dump($this->toRawSql()); - - return $this; - } - - /** - * Die and dump the current SQL and bindings. - * - * @return never - */ - public function dd() - { - dd($this->toSql(), $this->getBindings()); - } - - /** - * Die and dump the current SQL with embedded bindings. - * - * @return never - */ - public function ddRawSql() - { - dd($this->toRawSql()); - } - - /** - * Handle dynamic method calls into the method. - * - * @param string $method - * @param array $parameters - * @return mixed - * - * @throws \BadMethodCallException - */ - public function __call($method, $parameters) - { - if (static::hasMacro($method)) { - return $this->macroCall($method, $parameters); - } - - if (str_starts_with($method, 'where')) { - return $this->dynamicWhere($method, $parameters); - } - - static::throwBadMethodCallException($method); - } -} diff --git a/vendor/illuminate/database/Query/Expression.php b/vendor/illuminate/database/Query/Expression.php deleted file mode 100644 index 1da00d5..0000000 --- a/vendor/illuminate/database/Query/Expression.php +++ /dev/null @@ -1,34 +0,0 @@ -value; - } -} diff --git a/vendor/illuminate/database/Query/Grammars/Grammar.php b/vendor/illuminate/database/Query/Grammars/Grammar.php deleted file mode 100644 index c64aa49..0000000 --- a/vendor/illuminate/database/Query/Grammars/Grammar.php +++ /dev/null @@ -1,1578 +0,0 @@ -unions || $query->havings) && $query->aggregate) { - return $this->compileUnionAggregate($query); - } - - // If a "group limit" is in place, we will need to compile the SQL to use a - // different syntax. This primarily supports limits on eager loads using - // Eloquent. We'll also set the columns if they have not been defined. - if (isset($query->groupLimit)) { - if (is_null($query->columns)) { - $query->columns = ['*']; - } - - return $this->compileGroupLimit($query); - } - - // If the query does not have any columns set, we'll set the columns to the - // * character to just get all of the columns from the database. Then we - // can build the query and concatenate all the pieces together as one. - $original = $query->columns; - - if (is_null($query->columns)) { - $query->columns = ['*']; - } - - // To compile the query, we'll spin through each component of the query and - // see if that component exists. If it does we'll just call the compiler - // function for the component which is responsible for making the SQL. - $sql = trim($this->concatenate( - $this->compileComponents($query)) - ); - - if ($query->unions) { - $sql = $this->wrapUnion($sql).' '.$this->compileUnions($query); - } - - $query->columns = $original; - - return $sql; - } - - /** - * Compile the components necessary for a select clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @return array - */ - protected function compileComponents(Builder $query) - { - $sql = []; - - foreach ($this->selectComponents as $component) { - if (isset($query->$component)) { - $method = 'compile'.ucfirst($component); - - $sql[$component] = $this->$method($query, $query->$component); - } - } - - return $sql; - } - - /** - * Compile an aggregated select clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $aggregate - * @return string - */ - protected function compileAggregate(Builder $query, $aggregate) - { - $column = $this->columnize($aggregate['columns']); - - // If the query has a "distinct" constraint and we're not asking for all columns - // we need to prepend "distinct" onto the column name so that the query takes - // it into account when it performs the aggregating operations on the data. - if (is_array($query->distinct)) { - $column = 'distinct '.$this->columnize($query->distinct); - } elseif ($query->distinct && $column !== '*') { - $column = 'distinct '.$column; - } - - return 'select '.$aggregate['function'].'('.$column.') as aggregate'; - } - - /** - * Compile the "select *" portion of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $columns - * @return string|null - */ - protected function compileColumns(Builder $query, $columns) - { - // If the query is actually performing an aggregating select, we will let that - // compiler handle the building of the select clauses, as it will need some - // more syntax that is best handled by that function to keep things neat. - if (! is_null($query->aggregate)) { - return; - } - - if ($query->distinct) { - $select = 'select distinct '; - } else { - $select = 'select '; - } - - return $select.$this->columnize($columns); - } - - /** - * Compile the "from" portion of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $table - * @return string - */ - protected function compileFrom(Builder $query, $table) - { - return 'from '.$this->wrapTable($table); - } - - /** - * Compile the "join" portions of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $joins - * @return string - */ - protected function compileJoins(Builder $query, $joins) - { - return (new Collection($joins))->map(function ($join) use ($query) { - $table = $this->wrapTable($join->table); - - $nestedJoins = is_null($join->joins) ? '' : ' '.$this->compileJoins($query, $join->joins); - - $tableAndNestedJoins = is_null($join->joins) ? $table : '('.$table.$nestedJoins.')'; - - if ($join instanceof JoinLateralClause) { - return $this->compileJoinLateral($join, $tableAndNestedJoins); - } - - return trim("{$join->type} join {$tableAndNestedJoins} {$this->compileWheres($join)}"); - })->implode(' '); - } - - /** - * Compile a "lateral join" clause. - * - * @param \Illuminate\Database\Query\JoinLateralClause $join - * @param string $expression - * @return string - * - * @throws \RuntimeException - */ - public function compileJoinLateral(JoinLateralClause $join, string $expression): string - { - throw new RuntimeException('This database engine does not support lateral joins.'); - } - - /** - * Compile the "where" portions of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - public function compileWheres(Builder $query) - { - // Each type of where clause has its own compiler function, which is responsible - // for actually creating the where clauses SQL. This helps keep the code nice - // and maintainable since each clause has a very small method that it uses. - if (is_null($query->wheres)) { - return ''; - } - - // If we actually have some where clauses, we will strip off the first boolean - // operator, which is added by the query builders for convenience so we can - // avoid checking for the first clauses in each of the compilers methods. - if (count($sql = $this->compileWheresToArray($query)) > 0) { - return $this->concatenateWhereClauses($query, $sql); - } - - return ''; - } - - /** - * Get an array of all the where clauses for the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @return array - */ - protected function compileWheresToArray($query) - { - return (new Collection($query->wheres)) - ->map(fn ($where) => $where['boolean'].' '.$this->{"where{$where['type']}"}($query, $where)) - ->all(); - } - - /** - * Format the where clause statements into one string. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $sql - * @return string - */ - protected function concatenateWhereClauses($query, $sql) - { - $conjunction = $query instanceof JoinClause ? 'on' : 'where'; - - return $conjunction.' '.$this->removeLeadingBoolean(implode(' ', $sql)); - } - - /** - * Compile a raw where clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereRaw(Builder $query, $where) - { - return $where['sql'] instanceof Expression ? $where['sql']->getValue($this) : $where['sql']; - } - - /** - * Compile a basic where clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereBasic(Builder $query, $where) - { - $value = $this->parameter($where['value']); - - $operator = str_replace('?', '??', $where['operator']); - - return $this->wrap($where['column']).' '.$operator.' '.$value; - } - - /** - * Compile a bitwise operator where clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereBitwise(Builder $query, $where) - { - return $this->whereBasic($query, $where); - } - - /** - * Compile a "where like" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereLike(Builder $query, $where) - { - if ($where['caseSensitive']) { - throw new RuntimeException('This database engine does not support case sensitive like operations.'); - } - - $where['operator'] = $where['not'] ? 'not like' : 'like'; - - return $this->whereBasic($query, $where); - } - - /** - * Compile a "where in" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereIn(Builder $query, $where) - { - if (! empty($where['values'])) { - return $this->wrap($where['column']).' in ('.$this->parameterize($where['values']).')'; - } - - return '0 = 1'; - } - - /** - * Compile a "where not in" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereNotIn(Builder $query, $where) - { - if (! empty($where['values'])) { - return $this->wrap($where['column']).' not in ('.$this->parameterize($where['values']).')'; - } - - return '1 = 1'; - } - - /** - * Compile a "where not in raw" clause. - * - * For safety, whereIntegerInRaw ensures this method is only used with integer values. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereNotInRaw(Builder $query, $where) - { - if (! empty($where['values'])) { - return $this->wrap($where['column']).' not in ('.implode(', ', $where['values']).')'; - } - - return '1 = 1'; - } - - /** - * Compile a "where in raw" clause. - * - * For safety, whereIntegerInRaw ensures this method is only used with integer values. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereInRaw(Builder $query, $where) - { - if (! empty($where['values'])) { - return $this->wrap($where['column']).' in ('.implode(', ', $where['values']).')'; - } - - return '0 = 1'; - } - - /** - * Compile a "where null" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereNull(Builder $query, $where) - { - return $this->wrap($where['column']).' is null'; - } - - /** - * Compile a "where not null" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereNotNull(Builder $query, $where) - { - return $this->wrap($where['column']).' is not null'; - } - - /** - * Compile a "between" where clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereBetween(Builder $query, $where) - { - $between = $where['not'] ? 'not between' : 'between'; - - $min = $this->parameter(is_array($where['values']) ? reset($where['values']) : $where['values'][0]); - - $max = $this->parameter(is_array($where['values']) ? end($where['values']) : $where['values'][1]); - - return $this->wrap($where['column']).' '.$between.' '.$min.' and '.$max; - } - - /** - * Compile a "between" where clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereBetweenColumns(Builder $query, $where) - { - $between = $where['not'] ? 'not between' : 'between'; - - $min = $this->wrap(is_array($where['values']) ? reset($where['values']) : $where['values'][0]); - - $max = $this->wrap(is_array($where['values']) ? end($where['values']) : $where['values'][1]); - - return $this->wrap($where['column']).' '.$between.' '.$min.' and '.$max; - } - - /** - * Compile a "where date" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereDate(Builder $query, $where) - { - return $this->dateBasedWhere('date', $query, $where); - } - - /** - * Compile a "where time" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereTime(Builder $query, $where) - { - return $this->dateBasedWhere('time', $query, $where); - } - - /** - * Compile a "where day" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereDay(Builder $query, $where) - { - return $this->dateBasedWhere('day', $query, $where); - } - - /** - * Compile a "where month" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereMonth(Builder $query, $where) - { - return $this->dateBasedWhere('month', $query, $where); - } - - /** - * Compile a "where year" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereYear(Builder $query, $where) - { - return $this->dateBasedWhere('year', $query, $where); - } - - /** - * Compile a date based where clause. - * - * @param string $type - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function dateBasedWhere($type, Builder $query, $where) - { - $value = $this->parameter($where['value']); - - return $type.'('.$this->wrap($where['column']).') '.$where['operator'].' '.$value; - } - - /** - * Compile a where clause comparing two columns. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereColumn(Builder $query, $where) - { - return $this->wrap($where['first']).' '.$where['operator'].' '.$this->wrap($where['second']); - } - - /** - * Compile a nested where clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereNested(Builder $query, $where) - { - // Here we will calculate what portion of the string we need to remove. If this - // is a join clause query, we need to remove the "on" portion of the SQL and - // if it is a normal query we need to take the leading "where" of queries. - $offset = $where['query'] instanceof JoinClause ? 3 : 6; - - return '('.substr($this->compileWheres($where['query']), $offset).')'; - } - - /** - * Compile a where condition with a sub-select. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereSub(Builder $query, $where) - { - $select = $this->compileSelect($where['query']); - - return $this->wrap($where['column']).' '.$where['operator']." ($select)"; - } - - /** - * Compile a where exists clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereExists(Builder $query, $where) - { - return 'exists ('.$this->compileSelect($where['query']).')'; - } - - /** - * Compile a where exists clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereNotExists(Builder $query, $where) - { - return 'not exists ('.$this->compileSelect($where['query']).')'; - } - - /** - * Compile a where row values condition. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereRowValues(Builder $query, $where) - { - $columns = $this->columnize($where['columns']); - - $values = $this->parameterize($where['values']); - - return '('.$columns.') '.$where['operator'].' ('.$values.')'; - } - - /** - * Compile a "where JSON boolean" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereJsonBoolean(Builder $query, $where) - { - $column = $this->wrapJsonBooleanSelector($where['column']); - - $value = $this->wrapJsonBooleanValue( - $this->parameter($where['value']) - ); - - return $column.' '.$where['operator'].' '.$value; - } - - /** - * Compile a "where JSON contains" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereJsonContains(Builder $query, $where) - { - $not = $where['not'] ? 'not ' : ''; - - return $not.$this->compileJsonContains( - $where['column'], - $this->parameter($where['value']) - ); - } - - /** - * Compile a "JSON contains" statement into SQL. - * - * @param string $column - * @param string $value - * @return string - * - * @throws \RuntimeException - */ - protected function compileJsonContains($column, $value) - { - throw new RuntimeException('This database engine does not support JSON contains operations.'); - } - - /** - * Compile a "where JSON overlaps" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereJsonOverlaps(Builder $query, $where) - { - $not = $where['not'] ? 'not ' : ''; - - return $not.$this->compileJsonOverlaps( - $where['column'], - $this->parameter($where['value']) - ); - } - - /** - * Compile a "JSON overlaps" statement into SQL. - * - * @param string $column - * @param string $value - * @return string - * - * @throws \RuntimeException - */ - protected function compileJsonOverlaps($column, $value) - { - throw new RuntimeException('This database engine does not support JSON overlaps operations.'); - } - - /** - * Prepare the binding for a "JSON contains" statement. - * - * @param mixed $binding - * @return string - */ - public function prepareBindingForJsonContains($binding) - { - return json_encode($binding, JSON_UNESCAPED_UNICODE); - } - - /** - * Compile a "where JSON contains key" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereJsonContainsKey(Builder $query, $where) - { - $not = $where['not'] ? 'not ' : ''; - - return $not.$this->compileJsonContainsKey( - $where['column'] - ); - } - - /** - * Compile a "JSON contains key" statement into SQL. - * - * @param string $column - * @return string - * - * @throws \RuntimeException - */ - protected function compileJsonContainsKey($column) - { - throw new RuntimeException('This database engine does not support JSON contains key operations.'); - } - - /** - * Compile a "where JSON length" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereJsonLength(Builder $query, $where) - { - return $this->compileJsonLength( - $where['column'], - $where['operator'], - $this->parameter($where['value']) - ); - } - - /** - * Compile a "JSON length" statement into SQL. - * - * @param string $column - * @param string $operator - * @param string $value - * @return string - * - * @throws \RuntimeException - */ - protected function compileJsonLength($column, $operator, $value) - { - throw new RuntimeException('This database engine does not support JSON length operations.'); - } - - /** - * Compile a "JSON value cast" statement into SQL. - * - * @param string $value - * @return string - */ - public function compileJsonValueCast($value) - { - return $value; - } - - /** - * Compile a "where fulltext" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - public function whereFullText(Builder $query, $where) - { - throw new RuntimeException('This database engine does not support fulltext search operations.'); - } - - /** - * Compile a clause based on an expression. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - public function whereExpression(Builder $query, $where) - { - return $where['column']->getValue($this); - } - - /** - * Compile the "group by" portions of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $groups - * @return string - */ - protected function compileGroups(Builder $query, $groups) - { - return 'group by '.$this->columnize($groups); - } - - /** - * Compile the "having" portions of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - protected function compileHavings(Builder $query) - { - return 'having '.$this->removeLeadingBoolean((new Collection($query->havings))->map(function ($having) { - return $having['boolean'].' '.$this->compileHaving($having); - })->implode(' ')); - } - - /** - * Compile a single having clause. - * - * @param array $having - * @return string - */ - protected function compileHaving(array $having) - { - // If the having clause is "raw", we can just return the clause straight away - // without doing any more processing on it. Otherwise, we will compile the - // clause into SQL based on the components that make it up from builder. - return match ($having['type']) { - 'Raw' => $having['sql'], - 'between' => $this->compileHavingBetween($having), - 'Null' => $this->compileHavingNull($having), - 'NotNull' => $this->compileHavingNotNull($having), - 'bit' => $this->compileHavingBit($having), - 'Expression' => $this->compileHavingExpression($having), - 'Nested' => $this->compileNestedHavings($having), - default => $this->compileBasicHaving($having), - }; - } - - /** - * Compile a basic having clause. - * - * @param array $having - * @return string - */ - protected function compileBasicHaving($having) - { - $column = $this->wrap($having['column']); - - $parameter = $this->parameter($having['value']); - - return $column.' '.$having['operator'].' '.$parameter; - } - - /** - * Compile a "between" having clause. - * - * @param array $having - * @return string - */ - protected function compileHavingBetween($having) - { - $between = $having['not'] ? 'not between' : 'between'; - - $column = $this->wrap($having['column']); - - $min = $this->parameter(head($having['values'])); - - $max = $this->parameter(last($having['values'])); - - return $column.' '.$between.' '.$min.' and '.$max; - } - - /** - * Compile a having null clause. - * - * @param array $having - * @return string - */ - protected function compileHavingNull($having) - { - $column = $this->wrap($having['column']); - - return $column.' is null'; - } - - /** - * Compile a having not null clause. - * - * @param array $having - * @return string - */ - protected function compileHavingNotNull($having) - { - $column = $this->wrap($having['column']); - - return $column.' is not null'; - } - - /** - * Compile a having clause involving a bit operator. - * - * @param array $having - * @return string - */ - protected function compileHavingBit($having) - { - $column = $this->wrap($having['column']); - - $parameter = $this->parameter($having['value']); - - return '('.$column.' '.$having['operator'].' '.$parameter.') != 0'; - } - - /** - * Compile a having clause involving an expression. - * - * @param array $having - * @return string - */ - protected function compileHavingExpression($having) - { - return $having['column']->getValue($this); - } - - /** - * Compile a nested having clause. - * - * @param array $having - * @return string - */ - protected function compileNestedHavings($having) - { - return '('.substr($this->compileHavings($having['query']), 7).')'; - } - - /** - * Compile the "order by" portions of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $orders - * @return string - */ - protected function compileOrders(Builder $query, $orders) - { - if (! empty($orders)) { - return 'order by '.implode(', ', $this->compileOrdersToArray($query, $orders)); - } - - return ''; - } - - /** - * Compile the query orders to an array. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $orders - * @return array - */ - protected function compileOrdersToArray(Builder $query, $orders) - { - return array_map(function ($order) { - return $order['sql'] ?? $this->wrap($order['column']).' '.$order['direction']; - }, $orders); - } - - /** - * Compile the random statement into SQL. - * - * @param string|int $seed - * @return string - */ - public function compileRandom($seed) - { - return 'RANDOM()'; - } - - /** - * Compile the "limit" portions of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param int $limit - * @return string - */ - protected function compileLimit(Builder $query, $limit) - { - return 'limit '.(int) $limit; - } - - /** - * Compile a group limit clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - protected function compileGroupLimit(Builder $query) - { - $selectBindings = array_merge($query->getRawBindings()['select'], $query->getRawBindings()['order']); - - $query->setBindings($selectBindings, 'select'); - $query->setBindings([], 'order'); - - $limit = (int) $query->groupLimit['value']; - $offset = $query->offset; - - if (isset($offset)) { - $offset = (int) $offset; - $limit += $offset; - - $query->offset = null; - } - - $components = $this->compileComponents($query); - - $components['columns'] .= $this->compileRowNumber( - $query->groupLimit['column'], - $components['orders'] ?? '' - ); - - unset($components['orders']); - - $table = $this->wrap('laravel_table'); - $row = $this->wrap('laravel_row'); - - $sql = $this->concatenate($components); - - $sql = 'select * from ('.$sql.') as '.$table.' where '.$row.' <= '.$limit; - - if (isset($offset)) { - $sql .= ' and '.$row.' > '.$offset; - } - - return $sql.' order by '.$row; - } - - /** - * Compile a row number clause. - * - * @param string $partition - * @param string $orders - * @return string - */ - protected function compileRowNumber($partition, $orders) - { - $over = trim('partition by '.$this->wrap($partition).' '.$orders); - - return ', row_number() over ('.$over.') as '.$this->wrap('laravel_row'); - } - - /** - * Compile the "offset" portions of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param int $offset - * @return string - */ - protected function compileOffset(Builder $query, $offset) - { - return 'offset '.(int) $offset; - } - - /** - * Compile the "union" queries attached to the main query. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - protected function compileUnions(Builder $query) - { - $sql = ''; - - foreach ($query->unions as $union) { - $sql .= $this->compileUnion($union); - } - - if (! empty($query->unionOrders)) { - $sql .= ' '.$this->compileOrders($query, $query->unionOrders); - } - - if (isset($query->unionLimit)) { - $sql .= ' '.$this->compileLimit($query, $query->unionLimit); - } - - if (isset($query->unionOffset)) { - $sql .= ' '.$this->compileOffset($query, $query->unionOffset); - } - - return ltrim($sql); - } - - /** - * Compile a single union statement. - * - * @param array $union - * @return string - */ - protected function compileUnion(array $union) - { - $conjunction = $union['all'] ? ' union all ' : ' union '; - - return $conjunction.$this->wrapUnion($union['query']->toSql()); - } - - /** - * Wrap a union subquery in parentheses. - * - * @param string $sql - * @return string - */ - protected function wrapUnion($sql) - { - return '('.$sql.')'; - } - - /** - * Compile a union aggregate query into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - protected function compileUnionAggregate(Builder $query) - { - $sql = $this->compileAggregate($query, $query->aggregate); - - $query->aggregate = null; - - return $sql.' from ('.$this->compileSelect($query).') as '.$this->wrapTable('temp_table'); - } - - /** - * Compile an exists statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - public function compileExists(Builder $query) - { - $select = $this->compileSelect($query); - - return "select exists({$select}) as {$this->wrap('exists')}"; - } - - /** - * Compile an insert statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - public function compileInsert(Builder $query, array $values) - { - // Essentially we will force every insert to be treated as a batch insert which - // simply makes creating the SQL easier for us since we can utilize the same - // basic routine regardless of an amount of records given to us to insert. - $table = $this->wrapTable($query->from); - - if (empty($values)) { - return "insert into {$table} default values"; - } - - if (! is_array(reset($values))) { - $values = [$values]; - } - - $columns = $this->columnize(array_keys(reset($values))); - - // We need to build a list of parameter place-holders of values that are bound - // to the query. Each insert should have the exact same number of parameter - // bindings so we will loop through the record and parameterize them all. - $parameters = (new Collection($values))->map(function ($record) { - return '('.$this->parameterize($record).')'; - })->implode(', '); - - return "insert into $table ($columns) values $parameters"; - } - - /** - * Compile an insert ignore statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - * - * @throws \RuntimeException - */ - public function compileInsertOrIgnore(Builder $query, array $values) - { - throw new RuntimeException('This database engine does not support inserting while ignoring errors.'); - } - - /** - * Compile an insert and get ID statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @param string $sequence - * @return string - */ - public function compileInsertGetId(Builder $query, $values, $sequence) - { - return $this->compileInsert($query, $values); - } - - /** - * Compile an insert statement using a subquery into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $columns - * @param string $sql - * @return string - */ - public function compileInsertUsing(Builder $query, array $columns, string $sql) - { - $table = $this->wrapTable($query->from); - - if (empty($columns) || $columns === ['*']) { - return "insert into {$table} $sql"; - } - - return "insert into {$table} ({$this->columnize($columns)}) $sql"; - } - - /** - * Compile an insert ignore statement using a subquery into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $columns - * @param string $sql - * @return string - * - * @throws \RuntimeException - */ - public function compileInsertOrIgnoreUsing(Builder $query, array $columns, string $sql) - { - throw new RuntimeException('This database engine does not support inserting while ignoring errors.'); - } - - /** - * Compile an update statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - public function compileUpdate(Builder $query, array $values) - { - $table = $this->wrapTable($query->from); - - $columns = $this->compileUpdateColumns($query, $values); - - $where = $this->compileWheres($query); - - return trim( - isset($query->joins) - ? $this->compileUpdateWithJoins($query, $table, $columns, $where) - : $this->compileUpdateWithoutJoins($query, $table, $columns, $where) - ); - } - - /** - * Compile the columns for an update statement. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - protected function compileUpdateColumns(Builder $query, array $values) - { - return (new Collection($values))->map(function ($value, $key) { - return $this->wrap($key).' = '.$this->parameter($value); - })->implode(', '); - } - - /** - * Compile an update statement without joins into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $table - * @param string $columns - * @param string $where - * @return string - */ - protected function compileUpdateWithoutJoins(Builder $query, $table, $columns, $where) - { - return "update {$table} set {$columns} {$where}"; - } - - /** - * Compile an update statement with joins into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $table - * @param string $columns - * @param string $where - * @return string - */ - protected function compileUpdateWithJoins(Builder $query, $table, $columns, $where) - { - $joins = $this->compileJoins($query, $query->joins); - - return "update {$table} {$joins} set {$columns} {$where}"; - } - - /** - * Compile an "upsert" statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @param array $uniqueBy - * @param array $update - * @return string - * - * @throws \RuntimeException - */ - public function compileUpsert(Builder $query, array $values, array $uniqueBy, array $update) - { - throw new RuntimeException('This database engine does not support upserts.'); - } - - /** - * Prepare the bindings for an update statement. - * - * @param array $bindings - * @param array $values - * @return array - */ - public function prepareBindingsForUpdate(array $bindings, array $values) - { - $cleanBindings = Arr::except($bindings, ['select', 'join']); - - $values = Arr::flatten(array_map(fn ($value) => value($value), $values)); - - return array_values( - array_merge($bindings['join'], $values, Arr::flatten($cleanBindings)) - ); - } - - /** - * Compile a delete statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - public function compileDelete(Builder $query) - { - $table = $this->wrapTable($query->from); - - $where = $this->compileWheres($query); - - return trim( - isset($query->joins) - ? $this->compileDeleteWithJoins($query, $table, $where) - : $this->compileDeleteWithoutJoins($query, $table, $where) - ); - } - - /** - * Compile a delete statement without joins into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $table - * @param string $where - * @return string - */ - protected function compileDeleteWithoutJoins(Builder $query, $table, $where) - { - return "delete from {$table} {$where}"; - } - - /** - * Compile a delete statement with joins into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $table - * @param string $where - * @return string - */ - protected function compileDeleteWithJoins(Builder $query, $table, $where) - { - $alias = last(explode(' as ', $table)); - - $joins = $this->compileJoins($query, $query->joins); - - return "delete {$alias} from {$table} {$joins} {$where}"; - } - - /** - * Prepare the bindings for a delete statement. - * - * @param array $bindings - * @return array - */ - public function prepareBindingsForDelete(array $bindings) - { - return Arr::flatten( - Arr::except($bindings, 'select') - ); - } - - /** - * Compile a truncate table statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return array - */ - public function compileTruncate(Builder $query) - { - return ['truncate table '.$this->wrapTable($query->from) => []]; - } - - /** - * Compile the lock into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param bool|string $value - * @return string - */ - protected function compileLock(Builder $query, $value) - { - return is_string($value) ? $value : ''; - } - - /** - * Compile a query to get the number of open connections for a database. - * - * @return string|null - */ - public function compileThreadCount() - { - return null; - } - - /** - * Determine if the grammar supports savepoints. - * - * @return bool - */ - public function supportsSavepoints() - { - return true; - } - - /** - * Compile the SQL statement to define a savepoint. - * - * @param string $name - * @return string - */ - public function compileSavepoint($name) - { - return 'SAVEPOINT '.$name; - } - - /** - * Compile the SQL statement to execute a savepoint rollback. - * - * @param string $name - * @return string - */ - public function compileSavepointRollBack($name) - { - return 'ROLLBACK TO SAVEPOINT '.$name; - } - - /** - * Wrap the given JSON selector for boolean values. - * - * @param string $value - * @return string - */ - protected function wrapJsonBooleanSelector($value) - { - return $this->wrapJsonSelector($value); - } - - /** - * Wrap the given JSON boolean value. - * - * @param string $value - * @return string - */ - protected function wrapJsonBooleanValue($value) - { - return $value; - } - - /** - * Concatenate an array of segments, removing empties. - * - * @param array $segments - * @return string - */ - protected function concatenate($segments) - { - return implode(' ', array_filter($segments, function ($value) { - return (string) $value !== ''; - })); - } - - /** - * Remove the leading boolean from a statement. - * - * @param string $value - * @return string - */ - protected function removeLeadingBoolean($value) - { - return preg_replace('/and |or /i', '', $value, 1); - } - - /** - * Substitute the given bindings into the given raw SQL query. - * - * @param string $sql - * @param array $bindings - * @return string - */ - public function substituteBindingsIntoRawSql($sql, $bindings) - { - $bindings = array_map(fn ($value) => $this->escape($value, is_resource($value) || gettype($value) === 'resource (closed)'), $bindings); - - $query = ''; - - $isStringLiteral = false; - - for ($i = 0; $i < strlen($sql); $i++) { - $char = $sql[$i]; - $nextChar = $sql[$i + 1] ?? null; - - // Single quotes can be escaped as '' according to the SQL standard while - // MySQL uses \'. Postgres has operators like ?| that must get encoded - // in PHP like ??|. We should skip over the escaped characters here. - if (in_array($char.$nextChar, ["\'", "''", '??'])) { - $query .= $char.$nextChar; - $i += 1; - } elseif ($char === "'") { // Starting / leaving string literal... - $query .= $char; - $isStringLiteral = ! $isStringLiteral; - } elseif ($char === '?' && ! $isStringLiteral) { // Substitutable binding... - $query .= array_shift($bindings) ?? '?'; - } else { // Normal character... - $query .= $char; - } - } - - return $query; - } - - /** - * Get the grammar specific operators. - * - * @return array - */ - public function getOperators() - { - return $this->operators; - } - - /** - * Get the grammar specific bitwise operators. - * - * @return array - */ - public function getBitwiseOperators() - { - return $this->bitwiseOperators; - } -} diff --git a/vendor/illuminate/database/Query/Grammars/MariaDbGrammar.php b/vendor/illuminate/database/Query/Grammars/MariaDbGrammar.php deleted file mode 100644 index da51125..0000000 --- a/vendor/illuminate/database/Query/Grammars/MariaDbGrammar.php +++ /dev/null @@ -1,56 +0,0 @@ -whereBasic($query, $where); - } - - /** - * Add a "where null" clause to the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereNull(Builder $query, $where) - { - $columnValue = (string) $this->getValue($where['column']); - - if ($this->isJsonSelector($columnValue)) { - [$field, $path] = $this->wrapJsonFieldAndPath($columnValue); - - return '(json_extract('.$field.$path.') is null OR json_type(json_extract('.$field.$path.')) = \'NULL\')'; - } - - return parent::whereNull($query, $where); - } - - /** - * Add a "where not null" clause to the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereNotNull(Builder $query, $where) - { - $columnValue = (string) $this->getValue($where['column']); - - if ($this->isJsonSelector($columnValue)) { - [$field, $path] = $this->wrapJsonFieldAndPath($columnValue); - - return '(json_extract('.$field.$path.') is not null AND json_type(json_extract('.$field.$path.')) != \'NULL\')'; - } - - return parent::whereNotNull($query, $where); - } - - /** - * Compile a "where fulltext" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - public function whereFullText(Builder $query, $where) - { - $columns = $this->columnize($where['columns']); - - $value = $this->parameter($where['value']); - - $mode = ($where['options']['mode'] ?? []) === 'boolean' - ? ' in boolean mode' - : ' in natural language mode'; - - $expanded = ($where['options']['expanded'] ?? []) && ($where['options']['mode'] ?? []) !== 'boolean' - ? ' with query expansion' - : ''; - - return "match ({$columns}) against (".$value."{$mode}{$expanded})"; - } - - /** - * Compile the index hints for the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param \Illuminate\Database\Query\IndexHint $indexHint - * @return string - */ - protected function compileIndexHint(Builder $query, $indexHint) - { - return match ($indexHint->type) { - 'hint' => "use index ({$indexHint->index})", - 'force' => "force index ({$indexHint->index})", - default => "ignore index ({$indexHint->index})", - }; - } - - /** - * Compile a group limit clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - protected function compileGroupLimit(Builder $query) - { - return $this->useLegacyGroupLimit($query) - ? $this->compileLegacyGroupLimit($query) - : parent::compileGroupLimit($query); - } - - /** - * Determine whether to use a legacy group limit clause for MySQL < 8.0. - * - * @param \Illuminate\Database\Query\Builder $query - * @return bool - */ - public function useLegacyGroupLimit(Builder $query) - { - $version = $query->getConnection()->getServerVersion(); - - return ! $query->getConnection()->isMaria() && version_compare($version, '8.0.11') < 0; - } - - /** - * Compile a group limit clause for MySQL < 8.0. - * - * Derived from https://softonsofa.com/tweaking-eloquent-relations-how-to-get-n-related-models-per-parent/. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - protected function compileLegacyGroupLimit(Builder $query) - { - $limit = (int) $query->groupLimit['value']; - $offset = $query->offset; - - if (isset($offset)) { - $offset = (int) $offset; - $limit += $offset; - - $query->offset = null; - } - - $column = last(explode('.', $query->groupLimit['column'])); - $column = $this->wrap($column); - - $partition = ', @laravel_row := if(@laravel_group = '.$column.', @laravel_row + 1, 1) as `laravel_row`'; - $partition .= ', @laravel_group := '.$column; - - $orders = (array) $query->orders; - - array_unshift($orders, [ - 'column' => $query->groupLimit['column'], - 'direction' => 'asc', - ]); - - $query->orders = $orders; - - $components = $this->compileComponents($query); - - $sql = $this->concatenate($components); - - $from = '(select @laravel_row := 0, @laravel_group := 0) as `laravel_vars`, ('.$sql.') as `laravel_table`'; - - $sql = 'select `laravel_table`.*'.$partition.' from '.$from.' having `laravel_row` <= '.$limit; - - if (isset($offset)) { - $sql .= ' and `laravel_row` > '.$offset; - } - - return $sql.' order by `laravel_row`'; - } - - /** - * Compile an insert ignore statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - public function compileInsertOrIgnore(Builder $query, array $values) - { - return Str::replaceFirst('insert', 'insert ignore', $this->compileInsert($query, $values)); - } - - /** - * Compile an insert ignore statement using a subquery into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $columns - * @param string $sql - * @return string - */ - public function compileInsertOrIgnoreUsing(Builder $query, array $columns, string $sql) - { - return Str::replaceFirst('insert', 'insert ignore', $this->compileInsertUsing($query, $columns, $sql)); - } - - /** - * Compile a "JSON contains" statement into SQL. - * - * @param string $column - * @param string $value - * @return string - */ - protected function compileJsonContains($column, $value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($column); - - return 'json_contains('.$field.', '.$value.$path.')'; - } - - /** - * Compile a "JSON overlaps" statement into SQL. - * - * @param string $column - * @param string $value - * @return string - */ - protected function compileJsonOverlaps($column, $value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($column); - - return 'json_overlaps('.$field.', '.$value.$path.')'; - } - - /** - * Compile a "JSON contains key" statement into SQL. - * - * @param string $column - * @return string - */ - protected function compileJsonContainsKey($column) - { - [$field, $path] = $this->wrapJsonFieldAndPath($column); - - return 'ifnull(json_contains_path('.$field.', \'one\''.$path.'), 0)'; - } - - /** - * Compile a "JSON length" statement into SQL. - * - * @param string $column - * @param string $operator - * @param string $value - * @return string - */ - protected function compileJsonLength($column, $operator, $value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($column); - - return 'json_length('.$field.$path.') '.$operator.' '.$value; - } - - /** - * Compile a "JSON value cast" statement into SQL. - * - * @param string $value - * @return string - */ - public function compileJsonValueCast($value) - { - return 'cast('.$value.' as json)'; - } - - /** - * Compile the random statement into SQL. - * - * @param string|int $seed - * @return string - */ - public function compileRandom($seed) - { - return 'RAND('.$seed.')'; - } - - /** - * Compile the lock into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param bool|string $value - * @return string - */ - protected function compileLock(Builder $query, $value) - { - if (! is_string($value)) { - return $value ? 'for update' : 'lock in share mode'; - } - - return $value; - } - - /** - * Compile an insert statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - public function compileInsert(Builder $query, array $values) - { - if (empty($values)) { - $values = [[]]; - } - - return parent::compileInsert($query, $values); - } - - /** - * Compile the columns for an update statement. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - protected function compileUpdateColumns(Builder $query, array $values) - { - return (new Collection($values))->map(function ($value, $key) { - if ($this->isJsonSelector($key)) { - return $this->compileJsonUpdateColumn($key, $value); - } - - return $this->wrap($key).' = '.$this->parameter($value); - })->implode(', '); - } - - /** - * Compile an "upsert" statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @param array $uniqueBy - * @param array $update - * @return string - */ - public function compileUpsert(Builder $query, array $values, array $uniqueBy, array $update) - { - $useUpsertAlias = $query->connection->getConfig('use_upsert_alias'); - - $sql = $this->compileInsert($query, $values); - - if ($useUpsertAlias) { - $sql .= ' as laravel_upsert_alias'; - } - - $sql .= ' on duplicate key update '; - - $columns = (new Collection($update))->map(function ($value, $key) use ($useUpsertAlias) { - if (! is_numeric($key)) { - return $this->wrap($key).' = '.$this->parameter($value); - } - - return $useUpsertAlias - ? $this->wrap($value).' = '.$this->wrap('laravel_upsert_alias').'.'.$this->wrap($value) - : $this->wrap($value).' = values('.$this->wrap($value).')'; - })->implode(', '); - - return $sql.$columns; - } - - /** - * Compile a "lateral join" clause. - * - * @param \Illuminate\Database\Query\JoinLateralClause $join - * @param string $expression - * @return string - */ - public function compileJoinLateral(JoinLateralClause $join, string $expression): string - { - return trim("{$join->type} join lateral {$expression} on true"); - } - - /** - * Prepare a JSON column being updated using the JSON_SET function. - * - * @param string $key - * @param mixed $value - * @return string - */ - protected function compileJsonUpdateColumn($key, $value) - { - if (is_bool($value)) { - $value = $value ? 'true' : 'false'; - } elseif (is_array($value)) { - $value = 'cast(? as json)'; - } else { - $value = $this->parameter($value); - } - - [$field, $path] = $this->wrapJsonFieldAndPath($key); - - return "{$field} = json_set({$field}{$path}, {$value})"; - } - - /** - * Compile an update statement without joins into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $table - * @param string $columns - * @param string $where - * @return string - */ - protected function compileUpdateWithoutJoins(Builder $query, $table, $columns, $where) - { - $sql = parent::compileUpdateWithoutJoins($query, $table, $columns, $where); - - if (! empty($query->orders)) { - $sql .= ' '.$this->compileOrders($query, $query->orders); - } - - if (isset($query->limit)) { - $sql .= ' '.$this->compileLimit($query, $query->limit); - } - - return $sql; - } - - /** - * Prepare the bindings for an update statement. - * - * Booleans, integers, and doubles are inserted into JSON updates as raw values. - * - * @param array $bindings - * @param array $values - * @return array - */ - public function prepareBindingsForUpdate(array $bindings, array $values) - { - $values = (new Collection($values)) - ->reject(fn ($value, $column) => $this->isJsonSelector($column) && is_bool($value)) - ->map(fn ($value) => is_array($value) ? json_encode($value) : $value) - ->all(); - - return parent::prepareBindingsForUpdate($bindings, $values); - } - - /** - * Compile a delete query that does not use joins. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $table - * @param string $where - * @return string - */ - protected function compileDeleteWithoutJoins(Builder $query, $table, $where) - { - $sql = parent::compileDeleteWithoutJoins($query, $table, $where); - - // When using MySQL, delete statements may contain order by statements and limits - // so we will compile both of those here. Once we have finished compiling this - // we will return the completed SQL statement so it will be executed for us. - if (! empty($query->orders)) { - $sql .= ' '.$this->compileOrders($query, $query->orders); - } - - if (isset($query->limit)) { - $sql .= ' '.$this->compileLimit($query, $query->limit); - } - - return $sql; - } - - /** - * Compile a query to get the number of open connections for a database. - * - * @return string - */ - public function compileThreadCount() - { - return 'select variable_value as `Value` from performance_schema.session_status where variable_name = \'threads_connected\''; - } - - /** - * Wrap a single string in keyword identifiers. - * - * @param string $value - * @return string - */ - protected function wrapValue($value) - { - return $value === '*' ? $value : '`'.str_replace('`', '``', $value).'`'; - } - - /** - * Wrap the given JSON selector. - * - * @param string $value - * @return string - */ - protected function wrapJsonSelector($value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($value); - - return 'json_unquote(json_extract('.$field.$path.'))'; - } - - /** - * Wrap the given JSON selector for boolean values. - * - * @param string $value - * @return string - */ - protected function wrapJsonBooleanSelector($value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($value); - - return 'json_extract('.$field.$path.')'; - } -} diff --git a/vendor/illuminate/database/Query/Grammars/PostgresGrammar.php b/vendor/illuminate/database/Query/Grammars/PostgresGrammar.php deleted file mode 100644 index 2103f6c..0000000 --- a/vendor/illuminate/database/Query/Grammars/PostgresGrammar.php +++ /dev/null @@ -1,828 +0,0 @@ -', '<=', '>=', '<>', '!=', - 'like', 'not like', 'between', 'ilike', 'not ilike', - '~', '&', '|', '#', '<<', '>>', '<<=', '>>=', - '&&', '@>', '<@', '?', '?|', '?&', '||', '-', '@?', '@@', '#-', - 'is distinct from', 'is not distinct from', - ]; - - /** - * The Postgres grammar specific custom operators. - * - * @var array - */ - protected static $customOperators = []; - - /** - * The grammar specific bitwise operators. - * - * @var array - */ - protected $bitwiseOperators = [ - '~', '&', '|', '#', '<<', '>>', '<<=', '>>=', - ]; - - /** - * Indicates if the cascade option should be used when truncating. - * - * @var bool - */ - protected static $cascadeTruncate = true; - - /** - * Compile a basic where clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereBasic(Builder $query, $where) - { - if (str_contains(strtolower($where['operator']), 'like')) { - return sprintf( - '%s::text %s %s', - $this->wrap($where['column']), - $where['operator'], - $this->parameter($where['value']) - ); - } - - return parent::whereBasic($query, $where); - } - - /** - * Compile a bitwise operator where clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereBitwise(Builder $query, $where) - { - $value = $this->parameter($where['value']); - - $operator = str_replace('?', '??', $where['operator']); - - return '('.$this->wrap($where['column']).' '.$operator.' '.$value.')::bool'; - } - - /** - * Compile a "where like" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereLike(Builder $query, $where) - { - $where['operator'] = $where['not'] ? 'not ' : ''; - - $where['operator'] .= $where['caseSensitive'] ? 'like' : 'ilike'; - - return $this->whereBasic($query, $where); - } - - /** - * Compile a "where date" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereDate(Builder $query, $where) - { - $value = $this->parameter($where['value']); - - return $this->wrap($where['column']).'::date '.$where['operator'].' '.$value; - } - - /** - * Compile a "where time" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereTime(Builder $query, $where) - { - $value = $this->parameter($where['value']); - - return $this->wrap($where['column']).'::time '.$where['operator'].' '.$value; - } - - /** - * Compile a date based where clause. - * - * @param string $type - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function dateBasedWhere($type, Builder $query, $where) - { - $value = $this->parameter($where['value']); - - return 'extract('.$type.' from '.$this->wrap($where['column']).') '.$where['operator'].' '.$value; - } - - /** - * Compile a "where fulltext" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - public function whereFullText(Builder $query, $where) - { - $language = $where['options']['language'] ?? 'english'; - - if (! in_array($language, $this->validFullTextLanguages())) { - $language = 'english'; - } - - $columns = (new Collection($where['columns']))->map(function ($column) use ($language) { - return "to_tsvector('{$language}', {$this->wrap($column)})"; - })->implode(' || '); - - $mode = 'plainto_tsquery'; - - if (($where['options']['mode'] ?? []) === 'phrase') { - $mode = 'phraseto_tsquery'; - } - - if (($where['options']['mode'] ?? []) === 'websearch') { - $mode = 'websearch_to_tsquery'; - } - - return "({$columns}) @@ {$mode}('{$language}', {$this->parameter($where['value'])})"; - } - - /** - * Get an array of valid full text languages. - * - * @return array - */ - protected function validFullTextLanguages() - { - return [ - 'simple', - 'arabic', - 'danish', - 'dutch', - 'english', - 'finnish', - 'french', - 'german', - 'hungarian', - 'indonesian', - 'irish', - 'italian', - 'lithuanian', - 'nepali', - 'norwegian', - 'portuguese', - 'romanian', - 'russian', - 'spanish', - 'swedish', - 'tamil', - 'turkish', - ]; - } - - /** - * Compile the "select *" portion of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $columns - * @return string|null - */ - protected function compileColumns(Builder $query, $columns) - { - // If the query is actually performing an aggregating select, we will let that - // compiler handle the building of the select clauses, as it will need some - // more syntax that is best handled by that function to keep things neat. - if (! is_null($query->aggregate)) { - return; - } - - if (is_array($query->distinct)) { - $select = 'select distinct on ('.$this->columnize($query->distinct).') '; - } elseif ($query->distinct) { - $select = 'select distinct '; - } else { - $select = 'select '; - } - - return $select.$this->columnize($columns); - } - - /** - * Compile a "JSON contains" statement into SQL. - * - * @param string $column - * @param string $value - * @return string - */ - protected function compileJsonContains($column, $value) - { - $column = str_replace('->>', '->', $this->wrap($column)); - - return '('.$column.')::jsonb @> '.$value; - } - - /** - * Compile a "JSON contains key" statement into SQL. - * - * @param string $column - * @return string - */ - protected function compileJsonContainsKey($column) - { - $segments = explode('->', $column); - - $lastSegment = array_pop($segments); - - if (filter_var($lastSegment, FILTER_VALIDATE_INT) !== false) { - $i = $lastSegment; - } elseif (preg_match('/\[(-?[0-9]+)\]$/', $lastSegment, $matches)) { - $segments[] = Str::beforeLast($lastSegment, $matches[0]); - - $i = $matches[1]; - } - - $column = str_replace('->>', '->', $this->wrap(implode('->', $segments))); - - if (isset($i)) { - return vsprintf('case when %s then %s else false end', [ - 'jsonb_typeof(('.$column.")::jsonb) = 'array'", - 'jsonb_array_length(('.$column.')::jsonb) >= '.($i < 0 ? abs($i) : $i + 1), - ]); - } - - $key = "'".str_replace("'", "''", $lastSegment)."'"; - - return 'coalesce(('.$column.')::jsonb ?? '.$key.', false)'; - } - - /** - * Compile a "JSON length" statement into SQL. - * - * @param string $column - * @param string $operator - * @param string $value - * @return string - */ - protected function compileJsonLength($column, $operator, $value) - { - $column = str_replace('->>', '->', $this->wrap($column)); - - return 'jsonb_array_length(('.$column.')::jsonb) '.$operator.' '.$value; - } - - /** - * Compile a single having clause. - * - * @param array $having - * @return string - */ - protected function compileHaving(array $having) - { - if ($having['type'] === 'Bitwise') { - return $this->compileHavingBitwise($having); - } - - return parent::compileHaving($having); - } - - /** - * Compile a having clause involving a bitwise operator. - * - * @param array $having - * @return string - */ - protected function compileHavingBitwise($having) - { - $column = $this->wrap($having['column']); - - $parameter = $this->parameter($having['value']); - - return '('.$column.' '.$having['operator'].' '.$parameter.')::bool'; - } - - /** - * Compile the lock into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param bool|string $value - * @return string - */ - protected function compileLock(Builder $query, $value) - { - if (! is_string($value)) { - return $value ? 'for update' : 'for share'; - } - - return $value; - } - - /** - * Compile an insert ignore statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - public function compileInsertOrIgnore(Builder $query, array $values) - { - return $this->compileInsert($query, $values).' on conflict do nothing'; - } - - /** - * Compile an insert ignore statement using a subquery into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $columns - * @param string $sql - * @return string - */ - public function compileInsertOrIgnoreUsing(Builder $query, array $columns, string $sql) - { - return $this->compileInsertUsing($query, $columns, $sql).' on conflict do nothing'; - } - - /** - * Compile an insert and get ID statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @param string $sequence - * @return string - */ - public function compileInsertGetId(Builder $query, $values, $sequence) - { - return $this->compileInsert($query, $values).' returning '.$this->wrap($sequence ?: 'id'); - } - - /** - * Compile an update statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - public function compileUpdate(Builder $query, array $values) - { - if (isset($query->joins) || isset($query->limit)) { - return $this->compileUpdateWithJoinsOrLimit($query, $values); - } - - return parent::compileUpdate($query, $values); - } - - /** - * Compile the columns for an update statement. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - protected function compileUpdateColumns(Builder $query, array $values) - { - return (new Collection($values))->map(function ($value, $key) { - $column = last(explode('.', $key)); - - if ($this->isJsonSelector($key)) { - return $this->compileJsonUpdateColumn($column, $value); - } - - return $this->wrap($column).' = '.$this->parameter($value); - })->implode(', '); - } - - /** - * Compile an "upsert" statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @param array $uniqueBy - * @param array $update - * @return string - */ - public function compileUpsert(Builder $query, array $values, array $uniqueBy, array $update) - { - $sql = $this->compileInsert($query, $values); - - $sql .= ' on conflict ('.$this->columnize($uniqueBy).') do update set '; - - $columns = (new Collection($update))->map(function ($value, $key) { - return is_numeric($key) - ? $this->wrap($value).' = '.$this->wrapValue('excluded').'.'.$this->wrap($value) - : $this->wrap($key).' = '.$this->parameter($value); - })->implode(', '); - - return $sql.$columns; - } - - /** - * Compile a "lateral join" clause. - * - * @param \Illuminate\Database\Query\JoinLateralClause $join - * @param string $expression - * @return string - */ - public function compileJoinLateral(JoinLateralClause $join, string $expression): string - { - return trim("{$join->type} join lateral {$expression} on true"); - } - - /** - * Prepares a JSON column being updated using the JSONB_SET function. - * - * @param string $key - * @param mixed $value - * @return string - */ - protected function compileJsonUpdateColumn($key, $value) - { - $segments = explode('->', $key); - - $field = $this->wrap(array_shift($segments)); - - $path = "'{".implode(',', $this->wrapJsonPathAttributes($segments, '"'))."}'"; - - return "{$field} = jsonb_set({$field}::jsonb, {$path}, {$this->parameter($value)})"; - } - - /** - * Compile an update from statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - public function compileUpdateFrom(Builder $query, $values) - { - $table = $this->wrapTable($query->from); - - // Each one of the columns in the update statements needs to be wrapped in the - // keyword identifiers, also a place-holder needs to be created for each of - // the values in the list of bindings so we can make the sets statements. - $columns = $this->compileUpdateColumns($query, $values); - - $from = ''; - - if (isset($query->joins)) { - // When using Postgres, updates with joins list the joined tables in the from - // clause, which is different than other systems like MySQL. Here, we will - // compile out the tables that are joined and add them to a from clause. - $froms = (new Collection($query->joins)) - ->map(fn ($join) => $this->wrapTable($join->table)) - ->all(); - - if (count($froms) > 0) { - $from = ' from '.implode(', ', $froms); - } - } - - $where = $this->compileUpdateWheres($query); - - return trim("update {$table} set {$columns}{$from} {$where}"); - } - - /** - * Compile the additional where clauses for updates with joins. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - protected function compileUpdateWheres(Builder $query) - { - $baseWheres = $this->compileWheres($query); - - if (! isset($query->joins)) { - return $baseWheres; - } - - // Once we compile the join constraints, we will either use them as the where - // clause or append them to the existing base where clauses. If we need to - // strip the leading boolean we will do so when using as the only where. - $joinWheres = $this->compileUpdateJoinWheres($query); - - if (trim($baseWheres) == '') { - return 'where '.$this->removeLeadingBoolean($joinWheres); - } - - return $baseWheres.' '.$joinWheres; - } - - /** - * Compile the "join" clause where clauses for an update. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - protected function compileUpdateJoinWheres(Builder $query) - { - $joinWheres = []; - - // Here we will just loop through all of the join constraints and compile them - // all out then implode them. This should give us "where" like syntax after - // everything has been built and then we will join it to the real wheres. - foreach ($query->joins as $join) { - foreach ($join->wheres as $where) { - $method = "where{$where['type']}"; - - $joinWheres[] = $where['boolean'].' '.$this->$method($query, $where); - } - } - - return implode(' ', $joinWheres); - } - - /** - * Prepare the bindings for an update statement. - * - * @param array $bindings - * @param array $values - * @return array - */ - public function prepareBindingsForUpdateFrom(array $bindings, array $values) - { - $values = (new Collection($values)) - ->map(function ($value, $column) { - return is_array($value) || ($this->isJsonSelector($column) && ! $this->isExpression($value)) - ? json_encode($value) - : $value; - }) - ->all(); - - $bindingsWithoutWhere = Arr::except($bindings, ['select', 'where']); - - return array_values( - array_merge($values, $bindings['where'], Arr::flatten($bindingsWithoutWhere)) - ); - } - - /** - * Compile an update statement with joins or limit into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - protected function compileUpdateWithJoinsOrLimit(Builder $query, array $values) - { - $table = $this->wrapTable($query->from); - - $columns = $this->compileUpdateColumns($query, $values); - - $alias = last(preg_split('/\s+as\s+/i', $query->from)); - - $selectSql = $this->compileSelect($query->select($alias.'.ctid')); - - return "update {$table} set {$columns} where {$this->wrap('ctid')} in ({$selectSql})"; - } - - /** - * Prepare the bindings for an update statement. - * - * @param array $bindings - * @param array $values - * @return array - */ - public function prepareBindingsForUpdate(array $bindings, array $values) - { - $values = (new Collection($values))->map(function ($value, $column) { - return is_array($value) || ($this->isJsonSelector($column) && ! $this->isExpression($value)) - ? json_encode($value) - : $value; - })->all(); - - $cleanBindings = Arr::except($bindings, 'select'); - - return array_values( - array_merge($values, Arr::flatten($cleanBindings)) - ); - } - - /** - * Compile a delete statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - public function compileDelete(Builder $query) - { - if (isset($query->joins) || isset($query->limit)) { - return $this->compileDeleteWithJoinsOrLimit($query); - } - - return parent::compileDelete($query); - } - - /** - * Compile a delete statement with joins or limit into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - protected function compileDeleteWithJoinsOrLimit(Builder $query) - { - $table = $this->wrapTable($query->from); - - $alias = last(preg_split('/\s+as\s+/i', $query->from)); - - $selectSql = $this->compileSelect($query->select($alias.'.ctid')); - - return "delete from {$table} where {$this->wrap('ctid')} in ({$selectSql})"; - } - - /** - * Compile a truncate table statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return array - */ - public function compileTruncate(Builder $query) - { - return ['truncate '.$this->wrapTable($query->from).' restart identity'.(static::$cascadeTruncate ? ' cascade' : '') => []]; - } - - /** - * Compile a query to get the number of open connections for a database. - * - * @return string - */ - public function compileThreadCount() - { - return 'select count(*) as "Value" from pg_stat_activity'; - } - - /** - * Wrap the given JSON selector. - * - * @param string $value - * @return string - */ - protected function wrapJsonSelector($value) - { - $path = explode('->', $value); - - $field = $this->wrapSegments(explode('.', array_shift($path))); - - $wrappedPath = $this->wrapJsonPathAttributes($path); - - $attribute = array_pop($wrappedPath); - - if (! empty($wrappedPath)) { - return $field.'->'.implode('->', $wrappedPath).'->>'.$attribute; - } - - return $field.'->>'.$attribute; - } - - /** - * Wrap the given JSON selector for boolean values. - * - * @param string $value - * @return string - */ - protected function wrapJsonBooleanSelector($value) - { - $selector = str_replace( - '->>', '->', - $this->wrapJsonSelector($value) - ); - - return '('.$selector.')::jsonb'; - } - - /** - * Wrap the given JSON boolean value. - * - * @param string $value - * @return string - */ - protected function wrapJsonBooleanValue($value) - { - return "'".$value."'::jsonb"; - } - - /** - * Wrap the attributes of the given JSON path. - * - * @param array $path - * @return array - */ - protected function wrapJsonPathAttributes($path) - { - $quote = func_num_args() === 2 ? func_get_arg(1) : "'"; - - return (new Collection($path)) - ->map(fn ($attribute) => $this->parseJsonPathArrayKeys($attribute)) - ->collapse() - ->map(function ($attribute) use ($quote) { - return filter_var($attribute, FILTER_VALIDATE_INT) !== false - ? $attribute - : $quote.$attribute.$quote; - }) - ->all(); - } - - /** - * Parse the given JSON path attribute for array keys. - * - * @param string $attribute - * @return array - */ - protected function parseJsonPathArrayKeys($attribute) - { - if (preg_match('/(\[[^\]]+\])+$/', $attribute, $parts)) { - $key = Str::beforeLast($attribute, $parts[0]); - - preg_match_all('/\[([^\]]+)\]/', $parts[0], $keys); - - return (new Collection([$key])) - ->merge($keys[1]) - ->diff('') - ->values() - ->all(); - } - - return [$attribute]; - } - - /** - * Substitute the given bindings into the given raw SQL query. - * - * @param string $sql - * @param array $bindings - * @return string - */ - public function substituteBindingsIntoRawSql($sql, $bindings) - { - $query = parent::substituteBindingsIntoRawSql($sql, $bindings); - - foreach ($this->operators as $operator) { - if (! str_contains($operator, '?')) { - continue; - } - - $query = str_replace(str_replace('?', '??', $operator), $operator, $query); - } - - return $query; - } - - /** - * Get the Postgres grammar specific operators. - * - * @return array - */ - public function getOperators() - { - return array_values(array_unique(array_merge(parent::getOperators(), static::$customOperators))); - } - - /** - * Set any Postgres grammar specific custom operators. - * - * @param array $operators - * @return void - */ - public static function customOperators(array $operators) - { - static::$customOperators = array_values( - array_merge(static::$customOperators, array_filter(array_filter($operators, 'is_string'))) - ); - } - - /** - * Enable or disable the "cascade" option when compiling the truncate statement. - * - * @param bool $value - * @return void - */ - public static function cascadeOnTrucate(bool $value = true) - { - static::$cascadeTruncate = $value; - } -} diff --git a/vendor/illuminate/database/Query/Grammars/SQLiteGrammar.php b/vendor/illuminate/database/Query/Grammars/SQLiteGrammar.php deleted file mode 100644 index 0999f4e..0000000 --- a/vendor/illuminate/database/Query/Grammars/SQLiteGrammar.php +++ /dev/null @@ -1,460 +0,0 @@ -', '<=', '>=', '<>', '!=', - 'like', 'not like', 'ilike', - '&', '|', '<<', '>>', - ]; - - /** - * Compile the lock into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param bool|string $value - * @return string - */ - protected function compileLock(Builder $query, $value) - { - return ''; - } - - /** - * Wrap a union subquery in parentheses. - * - * @param string $sql - * @return string - */ - protected function wrapUnion($sql) - { - return 'select * from ('.$sql.')'; - } - - /** - * Compile a "where like" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereLike(Builder $query, $where) - { - if ($where['caseSensitive'] == false) { - return parent::whereLike($query, $where); - } - $where['operator'] = $where['not'] ? 'not glob' : 'glob'; - - return $this->whereBasic($query, $where); - } - - /** - * Convert a LIKE pattern to a GLOB pattern using simple string replacement. - * - * @param string $value - * @param bool $caseSensitive - * @return string - */ - public function prepareWhereLikeBinding($value, $caseSensitive) - { - return $caseSensitive === false ? $value : str_replace( - ['*', '?', '%', '_'], - ['[*]', '[?]', '*', '?'], - $value - ); - } - - /** - * Compile a "where date" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereDate(Builder $query, $where) - { - return $this->dateBasedWhere('%Y-%m-%d', $query, $where); - } - - /** - * Compile a "where day" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereDay(Builder $query, $where) - { - return $this->dateBasedWhere('%d', $query, $where); - } - - /** - * Compile a "where month" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereMonth(Builder $query, $where) - { - return $this->dateBasedWhere('%m', $query, $where); - } - - /** - * Compile a "where year" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereYear(Builder $query, $where) - { - return $this->dateBasedWhere('%Y', $query, $where); - } - - /** - * Compile a "where time" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereTime(Builder $query, $where) - { - return $this->dateBasedWhere('%H:%M:%S', $query, $where); - } - - /** - * Compile a date based where clause. - * - * @param string $type - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function dateBasedWhere($type, Builder $query, $where) - { - $value = $this->parameter($where['value']); - - return "strftime('{$type}', {$this->wrap($where['column'])}) {$where['operator']} cast({$value} as text)"; - } - - /** - * Compile the index hints for the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param \Illuminate\Database\Query\IndexHint $indexHint - * @return string - */ - protected function compileIndexHint(Builder $query, $indexHint) - { - return $indexHint->type === 'force' - ? "indexed by {$indexHint->index}" - : ''; - } - - /** - * Compile a "JSON length" statement into SQL. - * - * @param string $column - * @param string $operator - * @param string $value - * @return string - */ - protected function compileJsonLength($column, $operator, $value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($column); - - return 'json_array_length('.$field.$path.') '.$operator.' '.$value; - } - - /** - * Compile a "JSON contains" statement into SQL. - * - * @param string $column - * @param mixed $value - * @return string - */ - protected function compileJsonContains($column, $value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($column); - - return 'exists (select 1 from json_each('.$field.$path.') where '.$this->wrap('json_each.value').' is '.$value.')'; - } - - /** - * Prepare the binding for a "JSON contains" statement. - * - * @param mixed $binding - * @return mixed - */ - public function prepareBindingForJsonContains($binding) - { - return $binding; - } - - /** - * Compile a "JSON contains key" statement into SQL. - * - * @param string $column - * @return string - */ - protected function compileJsonContainsKey($column) - { - [$field, $path] = $this->wrapJsonFieldAndPath($column); - - return 'json_type('.$field.$path.') is not null'; - } - - /** - * Compile a group limit clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - protected function compileGroupLimit(Builder $query) - { - $version = $query->getConnection()->getServerVersion(); - - if (version_compare($version, '3.25.0') >= 0) { - return parent::compileGroupLimit($query); - } - - $query->groupLimit = null; - - return $this->compileSelect($query); - } - - /** - * Compile an update statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - public function compileUpdate(Builder $query, array $values) - { - if (isset($query->joins) || isset($query->limit)) { - return $this->compileUpdateWithJoinsOrLimit($query, $values); - } - - return parent::compileUpdate($query, $values); - } - - /** - * Compile an insert ignore statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - public function compileInsertOrIgnore(Builder $query, array $values) - { - return Str::replaceFirst('insert', 'insert or ignore', $this->compileInsert($query, $values)); - } - - /** - * Compile an insert ignore statement using a subquery into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $columns - * @param string $sql - * @return string - */ - public function compileInsertOrIgnoreUsing(Builder $query, array $columns, string $sql) - { - return Str::replaceFirst('insert', 'insert or ignore', $this->compileInsertUsing($query, $columns, $sql)); - } - - /** - * Compile the columns for an update statement. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - protected function compileUpdateColumns(Builder $query, array $values) - { - $jsonGroups = $this->groupJsonColumnsForUpdate($values); - - return (new Collection($values))->reject(function ($value, $key) { - return $this->isJsonSelector($key); - })->merge($jsonGroups)->map(function ($value, $key) use ($jsonGroups) { - $column = last(explode('.', $key)); - - $value = isset($jsonGroups[$key]) ? $this->compileJsonPatch($column, $value) : $this->parameter($value); - - return $this->wrap($column).' = '.$value; - })->implode(', '); - } - - /** - * Compile an "upsert" statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @param array $uniqueBy - * @param array $update - * @return string - */ - public function compileUpsert(Builder $query, array $values, array $uniqueBy, array $update) - { - $sql = $this->compileInsert($query, $values); - - $sql .= ' on conflict ('.$this->columnize($uniqueBy).') do update set '; - - $columns = (new Collection($update))->map(function ($value, $key) { - return is_numeric($key) - ? $this->wrap($value).' = '.$this->wrapValue('excluded').'.'.$this->wrap($value) - : $this->wrap($key).' = '.$this->parameter($value); - })->implode(', '); - - return $sql.$columns; - } - - /** - * Group the nested JSON columns. - * - * @param array $values - * @return array - */ - protected function groupJsonColumnsForUpdate(array $values) - { - $groups = []; - - foreach ($values as $key => $value) { - if ($this->isJsonSelector($key)) { - Arr::set($groups, str_replace('->', '.', Str::after($key, '.')), $value); - } - } - - return $groups; - } - - /** - * Compile a "JSON" patch statement into SQL. - * - * @param string $column - * @param mixed $value - * @return string - */ - protected function compileJsonPatch($column, $value) - { - return "json_patch(ifnull({$this->wrap($column)}, json('{}')), json({$this->parameter($value)}))"; - } - - /** - * Compile an update statement with joins or limit into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @return string - */ - protected function compileUpdateWithJoinsOrLimit(Builder $query, array $values) - { - $table = $this->wrapTable($query->from); - - $columns = $this->compileUpdateColumns($query, $values); - - $alias = last(preg_split('/\s+as\s+/i', $query->from)); - - $selectSql = $this->compileSelect($query->select($alias.'.rowid')); - - return "update {$table} set {$columns} where {$this->wrap('rowid')} in ({$selectSql})"; - } - - /** - * Prepare the bindings for an update statement. - * - * @param array $bindings - * @param array $values - * @return array - */ - public function prepareBindingsForUpdate(array $bindings, array $values) - { - $groups = $this->groupJsonColumnsForUpdate($values); - - $values = (new Collection($values)) - ->reject(fn ($value, $key) => $this->isJsonSelector($key)) - ->merge($groups) - ->map(fn ($value) => is_array($value) ? json_encode($value) : $value) - ->all(); - - $cleanBindings = Arr::except($bindings, 'select'); - - return array_values( - array_merge($values, Arr::flatten($cleanBindings)) - ); - } - - /** - * Compile a delete statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - public function compileDelete(Builder $query) - { - if (isset($query->joins) || isset($query->limit)) { - return $this->compileDeleteWithJoinsOrLimit($query); - } - - return parent::compileDelete($query); - } - - /** - * Compile a delete statement with joins or limit into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - protected function compileDeleteWithJoinsOrLimit(Builder $query) - { - $table = $this->wrapTable($query->from); - - $alias = last(preg_split('/\s+as\s+/i', $query->from)); - - $selectSql = $this->compileSelect($query->select($alias.'.rowid')); - - return "delete from {$table} where {$this->wrap('rowid')} in ({$selectSql})"; - } - - /** - * Compile a truncate table statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return array - */ - public function compileTruncate(Builder $query) - { - return [ - 'delete from sqlite_sequence where name = ?' => [$this->getTablePrefix().$query->from], - 'delete from '.$this->wrapTable($query->from) => [], - ]; - } - - /** - * Wrap the given JSON selector. - * - * @param string $value - * @return string - */ - protected function wrapJsonSelector($value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($value); - - return 'json_extract('.$field.$path.')'; - } -} diff --git a/vendor/illuminate/database/Query/Grammars/SqlServerGrammar.php b/vendor/illuminate/database/Query/Grammars/SqlServerGrammar.php deleted file mode 100644 index ff1ac5c..0000000 --- a/vendor/illuminate/database/Query/Grammars/SqlServerGrammar.php +++ /dev/null @@ -1,585 +0,0 @@ -', '<=', '>=', '!<', '!>', '<>', '!=', - 'like', 'not like', 'ilike', - '&', '&=', '|', '|=', '^', '^=', - ]; - - /** - * The components that make up a select clause. - * - * @var string[] - */ - protected $selectComponents = [ - 'aggregate', - 'columns', - 'from', - 'indexHint', - 'joins', - 'wheres', - 'groups', - 'havings', - 'orders', - 'offset', - 'limit', - 'lock', - ]; - - /** - * Compile a select query into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - public function compileSelect(Builder $query) - { - // An order by clause is required for SQL Server offset to function... - if ($query->offset && empty($query->orders)) { - $query->orders[] = ['sql' => '(SELECT 0)']; - } - - return parent::compileSelect($query); - } - - /** - * Compile the "select *" portion of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $columns - * @return string|null - */ - protected function compileColumns(Builder $query, $columns) - { - if (! is_null($query->aggregate)) { - return; - } - - $select = $query->distinct ? 'select distinct ' : 'select '; - - // If there is a limit on the query, but not an offset, we will add the top - // clause to the query, which serves as a "limit" type clause within the - // SQL Server system similar to the limit keywords available in MySQL. - if (is_numeric($query->limit) && $query->limit > 0 && $query->offset <= 0) { - $select .= 'top '.((int) $query->limit).' '; - } - - return $select.$this->columnize($columns); - } - - /** - * Compile the "from" portion of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $table - * @return string - */ - protected function compileFrom(Builder $query, $table) - { - $from = parent::compileFrom($query, $table); - - if (is_string($query->lock)) { - return $from.' '.$query->lock; - } - - if (! is_null($query->lock)) { - return $from.' with(rowlock,'.($query->lock ? 'updlock,' : '').'holdlock)'; - } - - return $from; - } - - /** - * Compile the index hints for the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param \Illuminate\Database\Query\IndexHint $indexHint - * @return string - */ - protected function compileIndexHint(Builder $query, $indexHint) - { - return $indexHint->type === 'force' - ? "with (index({$indexHint->index}))" - : ''; - } - - /** - * {@inheritdoc} - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereBitwise(Builder $query, $where) - { - $value = $this->parameter($where['value']); - - $operator = str_replace('?', '??', $where['operator']); - - return '('.$this->wrap($where['column']).' '.$operator.' '.$value.') != 0'; - } - - /** - * Compile a "where date" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereDate(Builder $query, $where) - { - $value = $this->parameter($where['value']); - - return 'cast('.$this->wrap($where['column']).' as date) '.$where['operator'].' '.$value; - } - - /** - * Compile a "where time" clause. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $where - * @return string - */ - protected function whereTime(Builder $query, $where) - { - $value = $this->parameter($where['value']); - - return 'cast('.$this->wrap($where['column']).' as time) '.$where['operator'].' '.$value; - } - - /** - * Compile a "JSON contains" statement into SQL. - * - * @param string $column - * @param string $value - * @return string - */ - protected function compileJsonContains($column, $value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($column); - - return $value.' in (select [value] from openjson('.$field.$path.'))'; - } - - /** - * Prepare the binding for a "JSON contains" statement. - * - * @param mixed $binding - * @return string - */ - public function prepareBindingForJsonContains($binding) - { - return is_bool($binding) ? json_encode($binding) : $binding; - } - - /** - * Compile a "JSON contains key" statement into SQL. - * - * @param string $column - * @return string - */ - protected function compileJsonContainsKey($column) - { - $segments = explode('->', $column); - - $lastSegment = array_pop($segments); - - if (preg_match('/\[([0-9]+)\]$/', $lastSegment, $matches)) { - $segments[] = Str::beforeLast($lastSegment, $matches[0]); - - $key = $matches[1]; - } else { - $key = "'".str_replace("'", "''", $lastSegment)."'"; - } - - [$field, $path] = $this->wrapJsonFieldAndPath(implode('->', $segments)); - - return $key.' in (select [key] from openjson('.$field.$path.'))'; - } - - /** - * Compile a "JSON length" statement into SQL. - * - * @param string $column - * @param string $operator - * @param string $value - * @return string - */ - protected function compileJsonLength($column, $operator, $value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($column); - - return '(select count(*) from openjson('.$field.$path.')) '.$operator.' '.$value; - } - - /** - * Compile a "JSON value cast" statement into SQL. - * - * @param string $value - * @return string - */ - public function compileJsonValueCast($value) - { - return 'json_query('.$value.')'; - } - - /** - * Compile a single having clause. - * - * @param array $having - * @return string - */ - protected function compileHaving(array $having) - { - if ($having['type'] === 'Bitwise') { - return $this->compileHavingBitwise($having); - } - - return parent::compileHaving($having); - } - - /** - * Compile a having clause involving a bitwise operator. - * - * @param array $having - * @return string - */ - protected function compileHavingBitwise($having) - { - $column = $this->wrap($having['column']); - - $parameter = $this->parameter($having['value']); - - return '('.$column.' '.$having['operator'].' '.$parameter.') != 0'; - } - - /** - * Compile a delete statement without joins into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $table - * @param string $where - * @return string - */ - protected function compileDeleteWithoutJoins(Builder $query, $table, $where) - { - $sql = parent::compileDeleteWithoutJoins($query, $table, $where); - - return ! is_null($query->limit) && $query->limit > 0 && $query->offset <= 0 - ? Str::replaceFirst('delete', 'delete top ('.$query->limit.')', $sql) - : $sql; - } - - /** - * Compile the random statement into SQL. - * - * @param string|int $seed - * @return string - */ - public function compileRandom($seed) - { - return 'NEWID()'; - } - - /** - * Compile the "limit" portions of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param int $limit - * @return string - */ - protected function compileLimit(Builder $query, $limit) - { - $limit = (int) $limit; - - if ($limit && $query->offset > 0) { - return "fetch next {$limit} rows only"; - } - - return ''; - } - - /** - * Compile a row number clause. - * - * @param string $partition - * @param string $orders - * @return string - */ - protected function compileRowNumber($partition, $orders) - { - if (empty($orders)) { - $orders = 'order by (select 0)'; - } - - return parent::compileRowNumber($partition, $orders); - } - - /** - * Compile the "offset" portions of the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param int $offset - * @return string - */ - protected function compileOffset(Builder $query, $offset) - { - $offset = (int) $offset; - - if ($offset) { - return "offset {$offset} rows"; - } - - return ''; - } - - /** - * Compile the lock into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param bool|string $value - * @return string - */ - protected function compileLock(Builder $query, $value) - { - return ''; - } - - /** - * Wrap a union subquery in parentheses. - * - * @param string $sql - * @return string - */ - protected function wrapUnion($sql) - { - return 'select * from ('.$sql.') as '.$this->wrapTable('temp_table'); - } - - /** - * Compile an exists statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @return string - */ - public function compileExists(Builder $query) - { - $existsQuery = clone $query; - - $existsQuery->columns = []; - - return $this->compileSelect($existsQuery->selectRaw('1 [exists]')->limit(1)); - } - - /** - * Compile an update statement with joins into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $table - * @param string $columns - * @param string $where - * @return string - */ - protected function compileUpdateWithJoins(Builder $query, $table, $columns, $where) - { - $alias = last(explode(' as ', $table)); - - $joins = $this->compileJoins($query, $query->joins); - - return "update {$alias} set {$columns} from {$table} {$joins} {$where}"; - } - - /** - * Compile an "upsert" statement into SQL. - * - * @param \Illuminate\Database\Query\Builder $query - * @param array $values - * @param array $uniqueBy - * @param array $update - * @return string - */ - public function compileUpsert(Builder $query, array $values, array $uniqueBy, array $update) - { - $columns = $this->columnize(array_keys(reset($values))); - - $sql = 'merge '.$this->wrapTable($query->from).' '; - - $parameters = (new Collection($values))->map(function ($record) { - return '('.$this->parameterize($record).')'; - })->implode(', '); - - $sql .= 'using (values '.$parameters.') '.$this->wrapTable('laravel_source').' ('.$columns.') '; - - $on = (new Collection($uniqueBy))->map(function ($column) use ($query) { - return $this->wrap('laravel_source.'.$column).' = '.$this->wrap($query->from.'.'.$column); - })->implode(' and '); - - $sql .= 'on '.$on.' '; - - if ($update) { - $update = (new Collection($update))->map(function ($value, $key) { - return is_numeric($key) - ? $this->wrap($value).' = '.$this->wrap('laravel_source.'.$value) - : $this->wrap($key).' = '.$this->parameter($value); - })->implode(', '); - - $sql .= 'when matched then update set '.$update.' '; - } - - $sql .= 'when not matched then insert ('.$columns.') values ('.$columns.');'; - - return $sql; - } - - /** - * Prepare the bindings for an update statement. - * - * @param array $bindings - * @param array $values - * @return array - */ - public function prepareBindingsForUpdate(array $bindings, array $values) - { - $cleanBindings = Arr::except($bindings, 'select'); - - return array_values( - array_merge($values, Arr::flatten($cleanBindings)) - ); - } - - /** - * Compile a "lateral join" clause. - * - * @param \Illuminate\Database\Query\JoinLateralClause $join - * @param string $expression - * @return string - */ - public function compileJoinLateral(JoinLateralClause $join, string $expression): string - { - $type = $join->type == 'left' ? 'outer' : 'cross'; - - return trim("{$type} apply {$expression}"); - } - - /** - * Compile the SQL statement to define a savepoint. - * - * @param string $name - * @return string - */ - public function compileSavepoint($name) - { - return 'SAVE TRANSACTION '.$name; - } - - /** - * Compile the SQL statement to execute a savepoint rollback. - * - * @param string $name - * @return string - */ - public function compileSavepointRollBack($name) - { - return 'ROLLBACK TRANSACTION '.$name; - } - - /** - * Compile a query to get the number of open connections for a database. - * - * @return string - */ - public function compileThreadCount() - { - return 'select count(*) Value from sys.dm_exec_sessions where status = N\'running\''; - } - - /** - * Get the format for database stored dates. - * - * @return string - */ - public function getDateFormat() - { - return 'Y-m-d H:i:s.v'; - } - - /** - * Wrap a single string in keyword identifiers. - * - * @param string $value - * @return string - */ - protected function wrapValue($value) - { - return $value === '*' ? $value : '['.str_replace(']', ']]', $value).']'; - } - - /** - * Wrap the given JSON selector. - * - * @param string $value - * @return string - */ - protected function wrapJsonSelector($value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($value); - - return 'json_value('.$field.$path.')'; - } - - /** - * Wrap the given JSON boolean value. - * - * @param string $value - * @return string - */ - protected function wrapJsonBooleanValue($value) - { - return "'".$value."'"; - } - - /** - * Wrap a table in keyword identifiers. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @return string - */ - public function wrapTable($table) - { - if (! $this->isExpression($table)) { - return $this->wrapTableValuedFunction(parent::wrapTable($table)); - } - - return $this->getValue($table); - } - - /** - * Wrap a table in keyword identifiers. - * - * @param string $table - * @return string - */ - protected function wrapTableValuedFunction($table) - { - if (preg_match('/^(.+?)(\(.*?\))]$/', $table, $matches) === 1) { - $table = $matches[1].']'.$matches[2]; - } - - return $table; - } -} diff --git a/vendor/illuminate/database/Query/IndexHint.php b/vendor/illuminate/database/Query/IndexHint.php deleted file mode 100644 index 2a720a2..0000000 --- a/vendor/illuminate/database/Query/IndexHint.php +++ /dev/null @@ -1,33 +0,0 @@ -type = $type; - $this->index = $index; - } -} diff --git a/vendor/illuminate/database/Query/JoinClause.php b/vendor/illuminate/database/Query/JoinClause.php deleted file mode 100644 index 37a002c..0000000 --- a/vendor/illuminate/database/Query/JoinClause.php +++ /dev/null @@ -1,146 +0,0 @@ -type = $type; - $this->table = $table; - $this->parentClass = get_class($parentQuery); - $this->parentGrammar = $parentQuery->getGrammar(); - $this->parentProcessor = $parentQuery->getProcessor(); - $this->parentConnection = $parentQuery->getConnection(); - - parent::__construct( - $this->parentConnection, $this->parentGrammar, $this->parentProcessor - ); - } - - /** - * Add an "on" clause to the join. - * - * On clauses can be chained, e.g. - * - * $join->on('contacts.user_id', '=', 'users.id') - * ->on('contacts.info_id', '=', 'info.id') - * - * will produce the following SQL: - * - * on `contacts`.`user_id` = `users`.`id` and `contacts`.`info_id` = `info`.`id` - * - * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @param string $boolean - * @return $this - * - * @throws \InvalidArgumentException - */ - public function on($first, $operator = null, $second = null, $boolean = 'and') - { - if ($first instanceof Closure) { - return $this->whereNested($first, $boolean); - } - - return $this->whereColumn($first, $operator, $second, $boolean); - } - - /** - * Add an "or on" clause to the join. - * - * @param \Closure|\Illuminate\Contracts\Database\Query\Expression|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return \Illuminate\Database\Query\JoinClause - */ - public function orOn($first, $operator = null, $second = null) - { - return $this->on($first, $operator, $second, 'or'); - } - - /** - * Get a new instance of the join clause builder. - * - * @return \Illuminate\Database\Query\JoinClause - */ - public function newQuery() - { - return new static($this->newParentQuery(), $this->type, $this->table); - } - - /** - * Create a new query instance for sub-query. - * - * @return \Illuminate\Database\Query\Builder - */ - protected function forSubQuery() - { - return $this->newParentQuery()->newQuery(); - } - - /** - * Create a new parent query instance. - * - * @return \Illuminate\Database\Query\Builder - */ - protected function newParentQuery() - { - $class = $this->parentClass; - - return new $class($this->parentConnection, $this->parentGrammar, $this->parentProcessor); - } -} diff --git a/vendor/illuminate/database/Query/JoinLateralClause.php b/vendor/illuminate/database/Query/JoinLateralClause.php deleted file mode 100644 index 1be31d2..0000000 --- a/vendor/illuminate/database/Query/JoinLateralClause.php +++ /dev/null @@ -1,8 +0,0 @@ -column_name; - }, $results); - } - - /** - * Process an "insert get ID" query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $sql - * @param array $values - * @param string|null $sequence - * @return int - */ - public function processInsertGetId(Builder $query, $sql, $values, $sequence = null) - { - $query->getConnection()->insert($sql, $values, $sequence); - - $id = $query->getConnection()->getLastInsertId(); - - return is_numeric($id) ? (int) $id : $id; - } - - /** - * Process the results of a columns query. - * - * @param array $results - * @return array - */ - public function processColumns($results) - { - return array_map(function ($result) { - $result = (object) $result; - - return [ - 'name' => $result->name, - 'type_name' => $result->type_name, - 'type' => $result->type, - 'collation' => $result->collation, - 'nullable' => $result->nullable === 'YES', - 'default' => $result->default, - 'auto_increment' => $result->extra === 'auto_increment', - 'comment' => $result->comment ?: null, - 'generation' => $result->expression ? [ - 'type' => match ($result->extra) { - 'STORED GENERATED' => 'stored', - 'VIRTUAL GENERATED' => 'virtual', - default => null, - }, - 'expression' => $result->expression, - ] : null, - ]; - }, $results); - } - - /** - * Process the results of an indexes query. - * - * @param array $results - * @return array - */ - public function processIndexes($results) - { - return array_map(function ($result) { - $result = (object) $result; - - return [ - 'name' => $name = strtolower($result->name), - 'columns' => $result->columns ? explode(',', $result->columns) : [], - 'type' => strtolower($result->type), - 'unique' => (bool) $result->unique, - 'primary' => $name === 'primary', - ]; - }, $results); - } - - /** - * Process the results of a foreign keys query. - * - * @param array $results - * @return array - */ - public function processForeignKeys($results) - { - return array_map(function ($result) { - $result = (object) $result; - - return [ - 'name' => $result->name, - 'columns' => explode(',', $result->columns), - 'foreign_schema' => $result->foreign_schema, - 'foreign_table' => $result->foreign_table, - 'foreign_columns' => explode(',', $result->foreign_columns), - 'on_update' => strtolower($result->on_update), - 'on_delete' => strtolower($result->on_delete), - ]; - }, $results); - } -} diff --git a/vendor/illuminate/database/Query/Processors/PostgresProcessor.php b/vendor/illuminate/database/Query/Processors/PostgresProcessor.php deleted file mode 100644 index 80babf3..0000000 --- a/vendor/illuminate/database/Query/Processors/PostgresProcessor.php +++ /dev/null @@ -1,171 +0,0 @@ -getConnection(); - - $connection->recordsHaveBeenModified(); - - $result = $connection->selectFromWriteConnection($sql, $values)[0]; - - $sequence = $sequence ?: 'id'; - - $id = is_object($result) ? $result->{$sequence} : $result[$sequence]; - - return is_numeric($id) ? (int) $id : $id; - } - - /** - * Process the results of a types query. - * - * @param array $results - * @return array - */ - public function processTypes($results) - { - return array_map(function ($result) { - $result = (object) $result; - - return [ - 'name' => $result->name, - 'schema' => $result->schema, - 'implicit' => (bool) $result->implicit, - 'type' => match (strtolower($result->type)) { - 'b' => 'base', - 'c' => 'composite', - 'd' => 'domain', - 'e' => 'enum', - 'p' => 'pseudo', - 'r' => 'range', - 'm' => 'multirange', - default => null, - }, - 'category' => match (strtolower($result->category)) { - 'a' => 'array', - 'b' => 'boolean', - 'c' => 'composite', - 'd' => 'date_time', - 'e' => 'enum', - 'g' => 'geometric', - 'i' => 'network_address', - 'n' => 'numeric', - 'p' => 'pseudo', - 'r' => 'range', - 's' => 'string', - 't' => 'timespan', - 'u' => 'user_defined', - 'v' => 'bit_string', - 'x' => 'unknown', - 'z' => 'internal_use', - default => null, - }, - ]; - }, $results); - } - - /** - * Process the results of a columns query. - * - * @param array $results - * @return array - */ - public function processColumns($results) - { - return array_map(function ($result) { - $result = (object) $result; - - $autoincrement = $result->default !== null && str_starts_with($result->default, 'nextval('); - - return [ - 'name' => $result->name, - 'type_name' => $result->type_name, - 'type' => $result->type, - 'collation' => $result->collation, - 'nullable' => (bool) $result->nullable, - 'default' => $result->generated ? null : $result->default, - 'auto_increment' => $autoincrement, - 'comment' => $result->comment, - 'generation' => $result->generated ? [ - 'type' => match ($result->generated) { - 's' => 'stored', - default => null, - }, - 'expression' => $result->default, - ] : null, - ]; - }, $results); - } - - /** - * Process the results of an indexes query. - * - * @param array $results - * @return array - */ - public function processIndexes($results) - { - return array_map(function ($result) { - $result = (object) $result; - - return [ - 'name' => strtolower($result->name), - 'columns' => $result->columns ? explode(',', $result->columns) : [], - 'type' => strtolower($result->type), - 'unique' => (bool) $result->unique, - 'primary' => (bool) $result->primary, - ]; - }, $results); - } - - /** - * Process the results of a foreign keys query. - * - * @param array $results - * @return array - */ - public function processForeignKeys($results) - { - return array_map(function ($result) { - $result = (object) $result; - - return [ - 'name' => $result->name, - 'columns' => explode(',', $result->columns), - 'foreign_schema' => $result->foreign_schema, - 'foreign_table' => $result->foreign_table, - 'foreign_columns' => explode(',', $result->foreign_columns), - 'on_update' => match (strtolower($result->on_update)) { - 'a' => 'no action', - 'r' => 'restrict', - 'c' => 'cascade', - 'n' => 'set null', - 'd' => 'set default', - default => null, - }, - 'on_delete' => match (strtolower($result->on_delete)) { - 'a' => 'no action', - 'r' => 'restrict', - 'c' => 'cascade', - 'n' => 'set null', - 'd' => 'set default', - default => null, - }, - ]; - }, $results); - } -} diff --git a/vendor/illuminate/database/Query/Processors/Processor.php b/vendor/illuminate/database/Query/Processors/Processor.php deleted file mode 100644 index 936e624..0000000 --- a/vendor/illuminate/database/Query/Processors/Processor.php +++ /dev/null @@ -1,123 +0,0 @@ -getConnection()->insert($sql, $values); - - $id = $query->getConnection()->getPdo()->lastInsertId($sequence); - - return is_numeric($id) ? (int) $id : $id; - } - - /** - * Process the results of a tables query. - * - * @param array $results - * @return array - */ - public function processTables($results) - { - return array_map(function ($result) { - $result = (object) $result; - - return [ - 'name' => $result->name, - 'schema' => $result->schema ?? null, // PostgreSQL and SQL Server - 'size' => isset($result->size) ? (int) $result->size : null, - 'comment' => $result->comment ?? null, // MySQL and PostgreSQL - 'collation' => $result->collation ?? null, // MySQL only - 'engine' => $result->engine ?? null, // MySQL only - ]; - }, $results); - } - - /** - * Process the results of a views query. - * - * @param array $results - * @return array - */ - public function processViews($results) - { - return array_map(function ($result) { - $result = (object) $result; - - return [ - 'name' => $result->name, - 'schema' => $result->schema ?? null, // PostgreSQL and SQL Server - 'definition' => $result->definition, - ]; - }, $results); - } - - /** - * Process the results of a types query. - * - * @param array $results - * @return array - */ - public function processTypes($results) - { - return $results; - } - - /** - * Process the results of a columns query. - * - * @param array $results - * @return array - */ - public function processColumns($results) - { - return $results; - } - - /** - * Process the results of an indexes query. - * - * @param array $results - * @return array - */ - public function processIndexes($results) - { - return $results; - } - - /** - * Process the results of a foreign keys query. - * - * @param array $results - * @return array - */ - public function processForeignKeys($results) - { - return $results; - } -} diff --git a/vendor/illuminate/database/Query/Processors/SQLiteProcessor.php b/vendor/illuminate/database/Query/Processors/SQLiteProcessor.php deleted file mode 100644 index dadeaeb..0000000 --- a/vendor/illuminate/database/Query/Processors/SQLiteProcessor.php +++ /dev/null @@ -1,115 +0,0 @@ -type); - - $safeName = preg_quote($result->name, '/'); - - $collation = preg_match( - '/\b'.$safeName.'\b[^,(]+(?:\([^()]+\)[^,]*)?(?:(?:default|check|as)\s*(?:\(.*?\))?[^,]*)*collate\s+["\'`]?(\w+)/i', - $sql, - $matches - ) === 1 ? strtolower($matches[1]) : null; - - $isGenerated = in_array($result->extra, [2, 3]); - - $expression = $isGenerated && preg_match( - '/\b'.$safeName.'\b[^,]+\s+as\s+\(((?:[^()]+|\((?:[^()]+|\([^()]*\))*\))*)\)/i', - $sql, - $matches - ) === 1 ? $matches[1] : null; - - return [ - 'name' => $result->name, - 'type_name' => strtok($type, '(') ?: '', - 'type' => $type, - 'collation' => $collation, - 'nullable' => (bool) $result->nullable, - 'default' => $result->default, - 'auto_increment' => $hasPrimaryKey && $result->primary && $type === 'integer', - 'comment' => null, - 'generation' => $isGenerated ? [ - 'type' => match ((int) $result->extra) { - 3 => 'stored', - 2 => 'virtual', - default => null, - }, - 'expression' => $expression, - ] : null, - ]; - }, $results); - } - - /** - * Process the results of an indexes query. - * - * @param array $results - * @return array - */ - public function processIndexes($results) - { - $primaryCount = 0; - - $indexes = array_map(function ($result) use (&$primaryCount) { - $result = (object) $result; - - if ($isPrimary = (bool) $result->primary) { - $primaryCount += 1; - } - - return [ - 'name' => strtolower($result->name), - 'columns' => $result->columns ? explode(',', $result->columns) : [], - 'type' => null, - 'unique' => (bool) $result->unique, - 'primary' => $isPrimary, - ]; - }, $results); - - if ($primaryCount > 1) { - $indexes = array_filter($indexes, fn ($index) => $index['name'] !== 'primary'); - } - - return $indexes; - } - - /** - * Process the results of a foreign keys query. - * - * @param array $results - * @return array - */ - public function processForeignKeys($results) - { - return array_map(function ($result) { - $result = (object) $result; - - return [ - 'name' => null, - 'columns' => explode(',', $result->columns), - 'foreign_schema' => null, - 'foreign_table' => $result->foreign_table, - 'foreign_columns' => explode(',', $result->foreign_columns), - 'on_update' => strtolower($result->on_update), - 'on_delete' => strtolower($result->on_delete), - ]; - }, $results); - } -} diff --git a/vendor/illuminate/database/Query/Processors/SqlServerProcessor.php b/vendor/illuminate/database/Query/Processors/SqlServerProcessor.php deleted file mode 100644 index f567955..0000000 --- a/vendor/illuminate/database/Query/Processors/SqlServerProcessor.php +++ /dev/null @@ -1,136 +0,0 @@ -getConnection(); - - $connection->insert($sql, $values); - - if ($connection->getConfig('odbc') === true) { - $id = $this->processInsertGetIdForOdbc($connection); - } else { - $id = $connection->getPdo()->lastInsertId(); - } - - return is_numeric($id) ? (int) $id : $id; - } - - /** - * Process an "insert get ID" query for ODBC. - * - * @param \Illuminate\Database\Connection $connection - * @return int - * - * @throws \Exception - */ - protected function processInsertGetIdForOdbc(Connection $connection) - { - $result = $connection->selectFromWriteConnection( - 'SELECT CAST(COALESCE(SCOPE_IDENTITY(), @@IDENTITY) AS int) AS insertid' - ); - - if (! $result) { - throw new Exception('Unable to retrieve lastInsertID for ODBC.'); - } - - $row = $result[0]; - - return is_object($row) ? $row->insertid : $row['insertid']; - } - - /** - * Process the results of a columns query. - * - * @param array $results - * @return array - */ - public function processColumns($results) - { - return array_map(function ($result) { - $result = (object) $result; - - $type = match ($typeName = $result->type_name) { - 'binary', 'varbinary', 'char', 'varchar', 'nchar', 'nvarchar' => $result->length == -1 ? $typeName.'(max)' : $typeName."($result->length)", - 'decimal', 'numeric' => $typeName."($result->precision,$result->places)", - 'float', 'datetime2', 'datetimeoffset', 'time' => $typeName."($result->precision)", - default => $typeName, - }; - - return [ - 'name' => $result->name, - 'type_name' => $result->type_name, - 'type' => $type, - 'collation' => $result->collation, - 'nullable' => (bool) $result->nullable, - 'default' => $result->default, - 'auto_increment' => (bool) $result->autoincrement, - 'comment' => $result->comment, - 'generation' => $result->expression ? [ - 'type' => $result->persisted ? 'stored' : 'virtual', - 'expression' => $result->expression, - ] : null, - ]; - }, $results); - } - - /** - * Process the results of an indexes query. - * - * @param array $results - * @return array - */ - public function processIndexes($results) - { - return array_map(function ($result) { - $result = (object) $result; - - return [ - 'name' => strtolower($result->name), - 'columns' => $result->columns ? explode(',', $result->columns) : [], - 'type' => strtolower($result->type), - 'unique' => (bool) $result->unique, - 'primary' => (bool) $result->primary, - ]; - }, $results); - } - - /** - * Process the results of a foreign keys query. - * - * @param array $results - * @return array - */ - public function processForeignKeys($results) - { - return array_map(function ($result) { - $result = (object) $result; - - return [ - 'name' => $result->name, - 'columns' => explode(',', $result->columns), - 'foreign_schema' => $result->foreign_schema, - 'foreign_table' => $result->foreign_table, - 'foreign_columns' => explode(',', $result->foreign_columns), - 'on_update' => strtolower(str_replace('_', ' ', $result->on_update)), - 'on_delete' => strtolower(str_replace('_', ' ', $result->on_delete)), - ]; - }, $results); - } -} diff --git a/vendor/illuminate/database/QueryException.php b/vendor/illuminate/database/QueryException.php deleted file mode 100644 index 84aebb1..0000000 --- a/vendor/illuminate/database/QueryException.php +++ /dev/null @@ -1,99 +0,0 @@ -connectionName = $connectionName; - $this->sql = $sql; - $this->bindings = $bindings; - $this->code = $previous->getCode(); - $this->message = $this->formatMessage($connectionName, $sql, $bindings, $previous); - - if ($previous instanceof PDOException) { - $this->errorInfo = $previous->errorInfo; - } - } - - /** - * Format the SQL error message. - * - * @param string $connectionName - * @param string $sql - * @param array $bindings - * @param \Throwable $previous - * @return string - */ - protected function formatMessage($connectionName, $sql, $bindings, Throwable $previous) - { - return $previous->getMessage().' (Connection: '.$connectionName.', SQL: '.Str::replaceArray('?', $bindings, $sql).')'; - } - - /** - * Get the connection name for the query. - * - * @return string - */ - public function getConnectionName() - { - return $this->connectionName; - } - - /** - * Get the SQL for the query. - * - * @return string - */ - public function getSql() - { - return $this->sql; - } - - /** - * Get the bindings for the query. - * - * @return array - */ - public function getBindings() - { - return $this->bindings; - } -} diff --git a/vendor/illuminate/database/README.md b/vendor/illuminate/database/README.md deleted file mode 100644 index 9019936..0000000 --- a/vendor/illuminate/database/README.md +++ /dev/null @@ -1,69 +0,0 @@ -## Illuminate Database - -The Illuminate Database component is a full database toolkit for PHP, providing an expressive query builder, ActiveRecord style ORM, and schema builder. It currently supports MySQL, Postgres, SQL Server, and SQLite. It also serves as the database layer of the Laravel PHP framework. - -### Usage Instructions - -First, create a new "Capsule" manager instance. Capsule aims to make configuring the library for usage outside of the Laravel framework as easy as possible. - -```PHP -use Illuminate\Database\Capsule\Manager as Capsule; - -$capsule = new Capsule; - -$capsule->addConnection([ - 'driver' => 'mysql', - 'host' => 'localhost', - 'database' => 'database', - 'username' => 'root', - 'password' => 'password', - 'charset' => 'utf8', - 'collation' => 'utf8_unicode_ci', - 'prefix' => '', -]); - -// Set the event dispatcher used by Eloquent models... (optional) -use Illuminate\Events\Dispatcher; -use Illuminate\Container\Container; -$capsule->setEventDispatcher(new Dispatcher(new Container)); - -// Make this Capsule instance available globally via static methods... (optional) -$capsule->setAsGlobal(); - -// Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher()) -$capsule->bootEloquent(); -``` - -> `composer require "illuminate/events"` required when you need to use observers with Eloquent. - -Once the Capsule instance has been registered. You may use it like so: - -**Using The Query Builder** - -```PHP -$users = Capsule::table('users')->where('votes', '>', 100)->get(); -``` -Other core methods may be accessed directly from the Capsule in the same manner as from the DB facade: -```PHP -$results = Capsule::select('select * from users where id = ?', [1]); -``` - -**Using The Schema Builder** - -```PHP -Capsule::schema()->create('users', function ($table) { - $table->increments('id'); - $table->string('email')->unique(); - $table->timestamps(); -}); -``` - -**Using The Eloquent ORM** - -```PHP -class User extends Illuminate\Database\Eloquent\Model {} - -$users = User::where('votes', '>', 1)->get(); -``` - -For further documentation on using the various database facilities this library provides, consult the [Laravel framework documentation](https://laravel.com/docs). diff --git a/vendor/illuminate/database/RecordNotFoundException.php b/vendor/illuminate/database/RecordNotFoundException.php deleted file mode 100644 index 3a717fe..0000000 --- a/vendor/illuminate/database/RecordNotFoundException.php +++ /dev/null @@ -1,10 +0,0 @@ -configureForeignKeyConstraints(); - $this->configureBusyTimeout(); - $this->configureJournalMode(); - $this->configureSynchronous(); - } - - /** - * {@inheritdoc} - */ - public function getDriverTitle() - { - return 'SQLite'; - } - - /** - * Enable or disable foreign key constraints if configured. - * - * @return void - */ - protected function configureForeignKeyConstraints(): void - { - $enableForeignKeyConstraints = $this->getConfig('foreign_key_constraints'); - - if ($enableForeignKeyConstraints === null) { - return; - } - - $schemaBuilder = $this->getSchemaBuilder(); - - try { - $enableForeignKeyConstraints - ? $schemaBuilder->enableForeignKeyConstraints() - : $schemaBuilder->disableForeignKeyConstraints(); - } catch (QueryException $e) { - if (! $e->getPrevious() instanceof SQLiteDatabaseDoesNotExistException) { - throw $e; - } - } - } - - /** - * Set the busy timeout if configured. - * - * @return void - */ - protected function configureBusyTimeout(): void - { - $milliseconds = $this->getConfig('busy_timeout'); - - if ($milliseconds === null) { - return; - } - - try { - $this->getSchemaBuilder()->setBusyTimeout($milliseconds); - } catch (QueryException $e) { - if (! $e->getPrevious() instanceof SQLiteDatabaseDoesNotExistException) { - throw $e; - } - } - } - - /** - * Set the journal mode if configured. - * - * @return void - */ - protected function configureJournalMode(): void - { - $mode = $this->getConfig('journal_mode'); - - if ($mode === null) { - return; - } - - try { - $this->getSchemaBuilder()->setJournalMode($mode); - } catch (QueryException $e) { - if (! $e->getPrevious() instanceof SQLiteDatabaseDoesNotExistException) { - throw $e; - } - } - } - - /** - * Set the synchronous mode if configured. - * - * @return void - */ - protected function configureSynchronous(): void - { - $mode = $this->getConfig('synchronous'); - - if ($mode === null) { - return; - } - - try { - $this->getSchemaBuilder()->setSynchronous($mode); - } catch (QueryException $e) { - if (! $e->getPrevious() instanceof SQLiteDatabaseDoesNotExistException) { - throw $e; - } - } - } - - /** - * Escape a binary value for safe SQL embedding. - * - * @param string $value - * @return string - */ - protected function escapeBinary($value) - { - $hex = bin2hex($value); - - return "x'{$hex}'"; - } - - /** - * Determine if the given database exception was caused by a unique constraint violation. - * - * @param \Exception $exception - * @return bool - */ - protected function isUniqueConstraintError(Exception $exception) - { - return boolval(preg_match('#(column(s)? .* (is|are) not unique|UNIQUE constraint failed: .*)#i', $exception->getMessage())); - } - - /** - * Get the default query grammar instance. - * - * @return \Illuminate\Database\Query\Grammars\SQLiteGrammar - */ - protected function getDefaultQueryGrammar() - { - ($grammar = new QueryGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); - } - - /** - * Get a schema builder instance for the connection. - * - * @return \Illuminate\Database\Schema\SQLiteBuilder - */ - public function getSchemaBuilder() - { - if (is_null($this->schemaGrammar)) { - $this->useDefaultSchemaGrammar(); - } - - return new SQLiteBuilder($this); - } - - /** - * Get the default schema grammar instance. - * - * @return \Illuminate\Database\Schema\Grammars\SQLiteGrammar - */ - protected function getDefaultSchemaGrammar() - { - ($grammar = new SchemaGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); - } - - /** - * Get the schema state for the connection. - * - * @param \Illuminate\Filesystem\Filesystem|null $files - * @param callable|null $processFactory - * - * @throws \RuntimeException - */ - public function getSchemaState(?Filesystem $files = null, ?callable $processFactory = null) - { - return new SqliteSchemaState($this, $files, $processFactory); - } - - /** - * Get the default post processor instance. - * - * @return \Illuminate\Database\Query\Processors\SQLiteProcessor - */ - protected function getDefaultPostProcessor() - { - return new SQLiteProcessor; - } -} diff --git a/vendor/illuminate/database/SQLiteDatabaseDoesNotExistException.php b/vendor/illuminate/database/SQLiteDatabaseDoesNotExistException.php deleted file mode 100644 index f93cfe4..0000000 --- a/vendor/illuminate/database/SQLiteDatabaseDoesNotExistException.php +++ /dev/null @@ -1,28 +0,0 @@ -path = $path; - } -} diff --git a/vendor/illuminate/database/Schema/Blueprint.php b/vendor/illuminate/database/Schema/Blueprint.php deleted file mode 100644 index ca2eed4..0000000 --- a/vendor/illuminate/database/Schema/Blueprint.php +++ /dev/null @@ -1,1889 +0,0 @@ -table = $table; - $this->prefix = $prefix; - - if (! is_null($callback)) { - $callback($this); - } - } - - /** - * Execute the blueprint against the database. - * - * @param \Illuminate\Database\Connection $connection - * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar - * @return void - */ - public function build(Connection $connection, Grammar $grammar) - { - foreach ($this->toSql($connection, $grammar) as $statement) { - $connection->statement($statement); - } - } - - /** - * Get the raw SQL statements for the blueprint. - * - * @param \Illuminate\Database\Connection $connection - * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar - * @return array - */ - public function toSql(Connection $connection, Grammar $grammar) - { - $this->addImpliedCommands($connection, $grammar); - - $statements = []; - - // Each type of command has a corresponding compiler function on the schema - // grammar which is used to build the necessary SQL statements to build - // the blueprint element, so we'll just call that compilers function. - $this->ensureCommandsAreValid($connection); - - foreach ($this->commands as $command) { - if ($command->shouldBeSkipped) { - continue; - } - - $method = 'compile'.ucfirst($command->name); - - if (method_exists($grammar, $method) || $grammar::hasMacro($method)) { - if ($this->hasState()) { - $this->state->update($command); - } - - if (! is_null($sql = $grammar->$method($this, $command, $connection))) { - $statements = array_merge($statements, (array) $sql); - } - } - } - - return $statements; - } - - /** - * Ensure the commands on the blueprint are valid for the connection type. - * - * @param \Illuminate\Database\Connection $connection - * @return void - * - * @throws \BadMethodCallException - */ - protected function ensureCommandsAreValid(Connection $connection) - { - // - } - - /** - * Get all of the commands matching the given names. - * - * @deprecated Will be removed in a future Laravel version. - * - * @param array $names - * @return \Illuminate\Support\Collection - */ - protected function commandsNamed(array $names) - { - return (new Collection($this->commands))->filter(function ($command) use ($names) { - return in_array($command->name, $names); - }); - } - - /** - * Add the commands that are implied by the blueprint's state. - * - * @param \Illuminate\Database\Connection $connection - * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar - * @return void - */ - protected function addImpliedCommands(Connection $connection, Grammar $grammar) - { - $this->addFluentIndexes($connection, $grammar); - - $this->addFluentCommands($connection, $grammar); - - if (! $this->creating()) { - $this->commands = array_map( - fn ($command) => $command instanceof ColumnDefinition - ? $this->createCommand($command->change ? 'change' : 'add', ['column' => $command]) - : $command, - $this->commands - ); - - $this->addAlterCommands($connection, $grammar); - } - } - - /** - * Add the index commands fluently specified on columns. - * - * @param \Illuminate\Database\Connection $connection - * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar - * @return void - */ - protected function addFluentIndexes(Connection $connection, Grammar $grammar) - { - foreach ($this->columns as $column) { - foreach (['primary', 'unique', 'index', 'fulltext', 'fullText', 'spatialIndex'] as $index) { - // If the column is supposed to be changed to an auto increment column and - // the specified index is primary, there is no need to add a command on - // MySQL, as it will be handled during the column definition instead. - if ($index === 'primary' && $column->autoIncrement && $column->change && $grammar instanceof MySqlGrammar) { - continue 2; - } - - // If the index has been specified on the given column, but is simply equal - // to "true" (boolean), no name has been specified for this index so the - // index method can be called without a name and it will generate one. - if ($column->{$index} === true) { - $this->{$index}($column->name); - $column->{$index} = null; - - continue 2; - } - - // If the index has been specified on the given column, but it equals false - // and the column is supposed to be changed, we will call the drop index - // method with an array of column to drop it by its conventional name. - elseif ($column->{$index} === false && $column->change) { - $this->{'drop'.ucfirst($index)}([$column->name]); - $column->{$index} = null; - - continue 2; - } - - // If the index has been specified on the given column, and it has a string - // value, we'll go ahead and call the index method and pass the name for - // the index since the developer specified the explicit name for this. - elseif (isset($column->{$index})) { - $this->{$index}($column->name, $column->{$index}); - $column->{$index} = null; - - continue 2; - } - } - } - } - - /** - * Add the fluent commands specified on any columns. - * - * @param \Illuminate\Database\Connection $connection - * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar - * @return void - */ - public function addFluentCommands(Connection $connection, Grammar $grammar) - { - foreach ($this->columns as $column) { - foreach ($grammar->getFluentCommands() as $commandName) { - $this->addCommand($commandName, compact('column')); - } - } - } - - /** - * Add the alter commands if whenever needed. - * - * @param \Illuminate\Database\Connection $connection - * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar - * @return void - */ - public function addAlterCommands(Connection $connection, Grammar $grammar) - { - if (! $grammar instanceof SQLiteGrammar) { - return; - } - - $alterCommands = $grammar->getAlterCommands($connection); - - [$commands, $lastCommandWasAlter, $hasAlterCommand] = [ - [], false, false, - ]; - - foreach ($this->commands as $command) { - if (in_array($command->name, $alterCommands)) { - $hasAlterCommand = true; - $lastCommandWasAlter = true; - } elseif ($lastCommandWasAlter) { - $commands[] = $this->createCommand('alter'); - $lastCommandWasAlter = false; - } - - $commands[] = $command; - } - - if ($lastCommandWasAlter) { - $commands[] = $this->createCommand('alter'); - } - - if ($hasAlterCommand) { - $this->state = new BlueprintState($this, $connection, $grammar); - } - - $this->commands = $commands; - } - - /** - * Determine if the blueprint has a create command. - * - * @return bool - */ - public function creating() - { - return (new Collection($this->commands))->contains(function ($command) { - return ! $command instanceof ColumnDefinition && $command->name === 'create'; - }); - } - - /** - * Indicate that the table needs to be created. - * - * @return \Illuminate\Support\Fluent - */ - public function create() - { - return $this->addCommand('create'); - } - - /** - * Specify the storage engine that should be used for the table. - * - * @param string $engine - * @return void - */ - public function engine($engine) - { - $this->engine = $engine; - } - - /** - * Specify that the InnoDB storage engine should be used for the table (MySQL only). - * - * @return void - */ - public function innoDb() - { - $this->engine('InnoDB'); - } - - /** - * Specify the character set that should be used for the table. - * - * @param string $charset - * @return void - */ - public function charset($charset) - { - $this->charset = $charset; - } - - /** - * Specify the collation that should be used for the table. - * - * @param string $collation - * @return void - */ - public function collation($collation) - { - $this->collation = $collation; - } - - /** - * Indicate that the table needs to be temporary. - * - * @return void - */ - public function temporary() - { - $this->temporary = true; - } - - /** - * Indicate that the table should be dropped. - * - * @return \Illuminate\Support\Fluent - */ - public function drop() - { - return $this->addCommand('drop'); - } - - /** - * Indicate that the table should be dropped if it exists. - * - * @return \Illuminate\Support\Fluent - */ - public function dropIfExists() - { - return $this->addCommand('dropIfExists'); - } - - /** - * Indicate that the given columns should be dropped. - * - * @param array|mixed $columns - * @return \Illuminate\Support\Fluent - */ - public function dropColumn($columns) - { - $columns = is_array($columns) ? $columns : func_get_args(); - - return $this->addCommand('dropColumn', compact('columns')); - } - - /** - * Indicate that the given columns should be renamed. - * - * @param string $from - * @param string $to - * @return \Illuminate\Support\Fluent - */ - public function renameColumn($from, $to) - { - return $this->addCommand('renameColumn', compact('from', 'to')); - } - - /** - * Indicate that the given primary key should be dropped. - * - * @param string|array|null $index - * @return \Illuminate\Support\Fluent - */ - public function dropPrimary($index = null) - { - return $this->dropIndexCommand('dropPrimary', 'primary', $index); - } - - /** - * Indicate that the given unique key should be dropped. - * - * @param string|array $index - * @return \Illuminate\Support\Fluent - */ - public function dropUnique($index) - { - return $this->dropIndexCommand('dropUnique', 'unique', $index); - } - - /** - * Indicate that the given index should be dropped. - * - * @param string|array $index - * @return \Illuminate\Support\Fluent - */ - public function dropIndex($index) - { - return $this->dropIndexCommand('dropIndex', 'index', $index); - } - - /** - * Indicate that the given fulltext index should be dropped. - * - * @param string|array $index - * @return \Illuminate\Support\Fluent - */ - public function dropFullText($index) - { - return $this->dropIndexCommand('dropFullText', 'fulltext', $index); - } - - /** - * Indicate that the given spatial index should be dropped. - * - * @param string|array $index - * @return \Illuminate\Support\Fluent - */ - public function dropSpatialIndex($index) - { - return $this->dropIndexCommand('dropSpatialIndex', 'spatialIndex', $index); - } - - /** - * Indicate that the given foreign key should be dropped. - * - * @param string|array $index - * @return \Illuminate\Support\Fluent - */ - public function dropForeign($index) - { - return $this->dropIndexCommand('dropForeign', 'foreign', $index); - } - - /** - * Indicate that the given column and foreign key should be dropped. - * - * @param string $column - * @return \Illuminate\Support\Fluent - */ - public function dropConstrainedForeignId($column) - { - $this->dropForeign([$column]); - - return $this->dropColumn($column); - } - - /** - * Indicate that the given foreign key should be dropped. - * - * @param \Illuminate\Database\Eloquent\Model|string $model - * @param string|null $column - * @return \Illuminate\Support\Fluent - */ - public function dropForeignIdFor($model, $column = null) - { - if (is_string($model)) { - $model = new $model; - } - - return $this->dropForeign([$column ?: $model->getForeignKey()]); - } - - /** - * Indicate that the given foreign key should be dropped. - * - * @param \Illuminate\Database\Eloquent\Model|string $model - * @param string|null $column - * @return \Illuminate\Support\Fluent - */ - public function dropConstrainedForeignIdFor($model, $column = null) - { - if (is_string($model)) { - $model = new $model; - } - - return $this->dropConstrainedForeignId($column ?: $model->getForeignKey()); - } - - /** - * Indicate that the given indexes should be renamed. - * - * @param string $from - * @param string $to - * @return \Illuminate\Support\Fluent - */ - public function renameIndex($from, $to) - { - return $this->addCommand('renameIndex', compact('from', 'to')); - } - - /** - * Indicate that the timestamp columns should be dropped. - * - * @return void - */ - public function dropTimestamps() - { - $this->dropColumn('created_at', 'updated_at'); - } - - /** - * Indicate that the timestamp columns should be dropped. - * - * @return void - */ - public function dropTimestampsTz() - { - $this->dropTimestamps(); - } - - /** - * Indicate that the soft delete column should be dropped. - * - * @param string $column - * @return void - */ - public function dropSoftDeletes($column = 'deleted_at') - { - $this->dropColumn($column); - } - - /** - * Indicate that the soft delete column should be dropped. - * - * @param string $column - * @return void - */ - public function dropSoftDeletesTz($column = 'deleted_at') - { - $this->dropSoftDeletes($column); - } - - /** - * Indicate that the remember token column should be dropped. - * - * @return void - */ - public function dropRememberToken() - { - $this->dropColumn('remember_token'); - } - - /** - * Indicate that the polymorphic columns should be dropped. - * - * @param string $name - * @param string|null $indexName - * @return void - */ - public function dropMorphs($name, $indexName = null) - { - $this->dropIndex($indexName ?: $this->createIndexName('index', ["{$name}_type", "{$name}_id"])); - - $this->dropColumn("{$name}_type", "{$name}_id"); - } - - /** - * Rename the table to a given name. - * - * @param string $to - * @return \Illuminate\Support\Fluent - */ - public function rename($to) - { - return $this->addCommand('rename', compact('to')); - } - - /** - * Specify the primary key(s) for the table. - * - * @param string|array $columns - * @param string|null $name - * @param string|null $algorithm - * @return \Illuminate\Database\Schema\IndexDefinition - */ - public function primary($columns, $name = null, $algorithm = null) - { - return $this->indexCommand('primary', $columns, $name, $algorithm); - } - - /** - * Specify a unique index for the table. - * - * @param string|array $columns - * @param string|null $name - * @param string|null $algorithm - * @return \Illuminate\Database\Schema\IndexDefinition - */ - public function unique($columns, $name = null, $algorithm = null) - { - return $this->indexCommand('unique', $columns, $name, $algorithm); - } - - /** - * Specify an index for the table. - * - * @param string|array $columns - * @param string|null $name - * @param string|null $algorithm - * @return \Illuminate\Database\Schema\IndexDefinition - */ - public function index($columns, $name = null, $algorithm = null) - { - return $this->indexCommand('index', $columns, $name, $algorithm); - } - - /** - * Specify a fulltext index for the table. - * - * @param string|array $columns - * @param string|null $name - * @param string|null $algorithm - * @return \Illuminate\Database\Schema\IndexDefinition - */ - public function fullText($columns, $name = null, $algorithm = null) - { - return $this->indexCommand('fulltext', $columns, $name, $algorithm); - } - - /** - * Specify a spatial index for the table. - * - * @param string|array $columns - * @param string|null $name - * @return \Illuminate\Database\Schema\IndexDefinition - */ - public function spatialIndex($columns, $name = null) - { - return $this->indexCommand('spatialIndex', $columns, $name); - } - - /** - * Specify a raw index for the table. - * - * @param string $expression - * @param string $name - * @return \Illuminate\Database\Schema\IndexDefinition - */ - public function rawIndex($expression, $name) - { - return $this->index([new Expression($expression)], $name); - } - - /** - * Specify a foreign key for the table. - * - * @param string|array $columns - * @param string|null $name - * @return \Illuminate\Database\Schema\ForeignKeyDefinition - */ - public function foreign($columns, $name = null) - { - $command = new ForeignKeyDefinition( - $this->indexCommand('foreign', $columns, $name)->getAttributes() - ); - - $this->commands[count($this->commands) - 1] = $command; - - return $command; - } - - /** - * Create a new auto-incrementing big integer (8-byte) column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function id($column = 'id') - { - return $this->bigIncrements($column); - } - - /** - * Create a new auto-incrementing integer (4-byte) column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function increments($column) - { - return $this->unsignedInteger($column, true); - } - - /** - * Create a new auto-incrementing integer (4-byte) column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function integerIncrements($column) - { - return $this->unsignedInteger($column, true); - } - - /** - * Create a new auto-incrementing tiny integer (1-byte) column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function tinyIncrements($column) - { - return $this->unsignedTinyInteger($column, true); - } - - /** - * Create a new auto-incrementing small integer (2-byte) column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function smallIncrements($column) - { - return $this->unsignedSmallInteger($column, true); - } - - /** - * Create a new auto-incrementing medium integer (3-byte) column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function mediumIncrements($column) - { - return $this->unsignedMediumInteger($column, true); - } - - /** - * Create a new auto-incrementing big integer (8-byte) column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function bigIncrements($column) - { - return $this->unsignedBigInteger($column, true); - } - - /** - * Create a new char column on the table. - * - * @param string $column - * @param int|null $length - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function char($column, $length = null) - { - $length = ! is_null($length) ? $length : Builder::$defaultStringLength; - - return $this->addColumn('char', $column, compact('length')); - } - - /** - * Create a new string column on the table. - * - * @param string $column - * @param int|null $length - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function string($column, $length = null) - { - $length = $length ?: Builder::$defaultStringLength; - - return $this->addColumn('string', $column, compact('length')); - } - - /** - * Create a new tiny text column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function tinyText($column) - { - return $this->addColumn('tinyText', $column); - } - - /** - * Create a new text column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function text($column) - { - return $this->addColumn('text', $column); - } - - /** - * Create a new medium text column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function mediumText($column) - { - return $this->addColumn('mediumText', $column); - } - - /** - * Create a new long text column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function longText($column) - { - return $this->addColumn('longText', $column); - } - - /** - * Create a new integer (4-byte) column on the table. - * - * @param string $column - * @param bool $autoIncrement - * @param bool $unsigned - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function integer($column, $autoIncrement = false, $unsigned = false) - { - return $this->addColumn('integer', $column, compact('autoIncrement', 'unsigned')); - } - - /** - * Create a new tiny integer (1-byte) column on the table. - * - * @param string $column - * @param bool $autoIncrement - * @param bool $unsigned - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function tinyInteger($column, $autoIncrement = false, $unsigned = false) - { - return $this->addColumn('tinyInteger', $column, compact('autoIncrement', 'unsigned')); - } - - /** - * Create a new small integer (2-byte) column on the table. - * - * @param string $column - * @param bool $autoIncrement - * @param bool $unsigned - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function smallInteger($column, $autoIncrement = false, $unsigned = false) - { - return $this->addColumn('smallInteger', $column, compact('autoIncrement', 'unsigned')); - } - - /** - * Create a new medium integer (3-byte) column on the table. - * - * @param string $column - * @param bool $autoIncrement - * @param bool $unsigned - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function mediumInteger($column, $autoIncrement = false, $unsigned = false) - { - return $this->addColumn('mediumInteger', $column, compact('autoIncrement', 'unsigned')); - } - - /** - * Create a new big integer (8-byte) column on the table. - * - * @param string $column - * @param bool $autoIncrement - * @param bool $unsigned - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function bigInteger($column, $autoIncrement = false, $unsigned = false) - { - return $this->addColumn('bigInteger', $column, compact('autoIncrement', 'unsigned')); - } - - /** - * Create a new unsigned integer (4-byte) column on the table. - * - * @param string $column - * @param bool $autoIncrement - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function unsignedInteger($column, $autoIncrement = false) - { - return $this->integer($column, $autoIncrement, true); - } - - /** - * Create a new unsigned tiny integer (1-byte) column on the table. - * - * @param string $column - * @param bool $autoIncrement - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function unsignedTinyInteger($column, $autoIncrement = false) - { - return $this->tinyInteger($column, $autoIncrement, true); - } - - /** - * Create a new unsigned small integer (2-byte) column on the table. - * - * @param string $column - * @param bool $autoIncrement - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function unsignedSmallInteger($column, $autoIncrement = false) - { - return $this->smallInteger($column, $autoIncrement, true); - } - - /** - * Create a new unsigned medium integer (3-byte) column on the table. - * - * @param string $column - * @param bool $autoIncrement - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function unsignedMediumInteger($column, $autoIncrement = false) - { - return $this->mediumInteger($column, $autoIncrement, true); - } - - /** - * Create a new unsigned big integer (8-byte) column on the table. - * - * @param string $column - * @param bool $autoIncrement - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function unsignedBigInteger($column, $autoIncrement = false) - { - return $this->bigInteger($column, $autoIncrement, true); - } - - /** - * Create a new unsigned big integer (8-byte) column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ForeignIdColumnDefinition - */ - public function foreignId($column) - { - return $this->addColumnDefinition(new ForeignIdColumnDefinition($this, [ - 'type' => 'bigInteger', - 'name' => $column, - 'autoIncrement' => false, - 'unsigned' => true, - ])); - } - - /** - * Create a foreign ID column for the given model. - * - * @param \Illuminate\Database\Eloquent\Model|string $model - * @param string|null $column - * @return \Illuminate\Database\Schema\ForeignIdColumnDefinition - */ - public function foreignIdFor($model, $column = null) - { - if (is_string($model)) { - $model = new $model; - } - - $column = $column ?: $model->getForeignKey(); - - if ($model->getKeyType() === 'int') { - return $this->foreignId($column) - ->table($model->getTable()) - ->referencesModelColumn($model->getKeyName()); - } - - $modelTraits = class_uses_recursive($model); - - if (in_array(HasUlids::class, $modelTraits, true)) { - return $this->foreignUlid($column, 26) - ->table($model->getTable()) - ->referencesModelColumn($model->getKeyName()); - } - - return $this->foreignUuid($column) - ->table($model->getTable()) - ->referencesModelColumn($model->getKeyName()); - } - - /** - * Create a new float column on the table. - * - * @param string $column - * @param int $precision - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function float($column, $precision = 53) - { - return $this->addColumn('float', $column, compact('precision')); - } - - /** - * Create a new double column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function double($column) - { - return $this->addColumn('double', $column); - } - - /** - * Create a new decimal column on the table. - * - * @param string $column - * @param int $total - * @param int $places - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function decimal($column, $total = 8, $places = 2) - { - return $this->addColumn('decimal', $column, compact('total', 'places')); - } - - /** - * Create a new boolean column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function boolean($column) - { - return $this->addColumn('boolean', $column); - } - - /** - * Create a new enum column on the table. - * - * @param string $column - * @param array $allowed - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function enum($column, array $allowed) - { - return $this->addColumn('enum', $column, compact('allowed')); - } - - /** - * Create a new set column on the table. - * - * @param string $column - * @param array $allowed - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function set($column, array $allowed) - { - return $this->addColumn('set', $column, compact('allowed')); - } - - /** - * Create a new json column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function json($column) - { - return $this->addColumn('json', $column); - } - - /** - * Create a new jsonb column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function jsonb($column) - { - return $this->addColumn('jsonb', $column); - } - - /** - * Create a new date column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function date($column) - { - return $this->addColumn('date', $column); - } - - /** - * Create a new date-time column on the table. - * - * @param string $column - * @param int|null $precision - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function dateTime($column, $precision = 0) - { - return $this->addColumn('dateTime', $column, compact('precision')); - } - - /** - * Create a new date-time column (with time zone) on the table. - * - * @param string $column - * @param int|null $precision - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function dateTimeTz($column, $precision = 0) - { - return $this->addColumn('dateTimeTz', $column, compact('precision')); - } - - /** - * Create a new time column on the table. - * - * @param string $column - * @param int|null $precision - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function time($column, $precision = 0) - { - return $this->addColumn('time', $column, compact('precision')); - } - - /** - * Create a new time column (with time zone) on the table. - * - * @param string $column - * @param int|null $precision - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function timeTz($column, $precision = 0) - { - return $this->addColumn('timeTz', $column, compact('precision')); - } - - /** - * Create a new timestamp column on the table. - * - * @param string $column - * @param int|null $precision - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function timestamp($column, $precision = 0) - { - return $this->addColumn('timestamp', $column, compact('precision')); - } - - /** - * Create a new timestamp (with time zone) column on the table. - * - * @param string $column - * @param int|null $precision - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function timestampTz($column, $precision = 0) - { - return $this->addColumn('timestampTz', $column, compact('precision')); - } - - /** - * Add nullable creation and update timestamps to the table. - * - * @param int|null $precision - * @return void - */ - public function timestamps($precision = 0) - { - $this->timestamp('created_at', $precision)->nullable(); - - $this->timestamp('updated_at', $precision)->nullable(); - } - - /** - * Add nullable creation and update timestamps to the table. - * - * Alias for self::timestamps(). - * - * @param int|null $precision - * @return void - */ - public function nullableTimestamps($precision = 0) - { - $this->timestamps($precision); - } - - /** - * Add creation and update timestampTz columns to the table. - * - * @param int|null $precision - * @return void - */ - public function timestampsTz($precision = 0) - { - $this->timestampTz('created_at', $precision)->nullable(); - - $this->timestampTz('updated_at', $precision)->nullable(); - } - - /** - * Add creation and update datetime columns to the table. - * - * @param int|null $precision - * @return void - */ - public function datetimes($precision = 0) - { - $this->datetime('created_at', $precision)->nullable(); - - $this->datetime('updated_at', $precision)->nullable(); - } - - /** - * Add a "deleted at" timestamp for the table. - * - * @param string $column - * @param int|null $precision - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function softDeletes($column = 'deleted_at', $precision = 0) - { - return $this->timestamp($column, $precision)->nullable(); - } - - /** - * Add a "deleted at" timestampTz for the table. - * - * @param string $column - * @param int|null $precision - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function softDeletesTz($column = 'deleted_at', $precision = 0) - { - return $this->timestampTz($column, $precision)->nullable(); - } - - /** - * Add a "deleted at" datetime column to the table. - * - * @param string $column - * @param int|null $precision - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function softDeletesDatetime($column = 'deleted_at', $precision = 0) - { - return $this->datetime($column, $precision)->nullable(); - } - - /** - * Create a new year column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function year($column) - { - return $this->addColumn('year', $column); - } - - /** - * Create a new binary column on the table. - * - * @param string $column - * @param int|null $length - * @param bool $fixed - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function binary($column, $length = null, $fixed = false) - { - return $this->addColumn('binary', $column, compact('length', 'fixed')); - } - - /** - * Create a new UUID column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function uuid($column = 'uuid') - { - return $this->addColumn('uuid', $column); - } - - /** - * Create a new UUID column on the table with a foreign key constraint. - * - * @param string $column - * @return \Illuminate\Database\Schema\ForeignIdColumnDefinition - */ - public function foreignUuid($column) - { - return $this->addColumnDefinition(new ForeignIdColumnDefinition($this, [ - 'type' => 'uuid', - 'name' => $column, - ])); - } - - /** - * Create a new ULID column on the table. - * - * @param string $column - * @param int|null $length - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function ulid($column = 'ulid', $length = 26) - { - return $this->char($column, $length); - } - - /** - * Create a new ULID column on the table with a foreign key constraint. - * - * @param string $column - * @param int|null $length - * @return \Illuminate\Database\Schema\ForeignIdColumnDefinition - */ - public function foreignUlid($column, $length = 26) - { - return $this->addColumnDefinition(new ForeignIdColumnDefinition($this, [ - 'type' => 'char', - 'name' => $column, - 'length' => $length, - ])); - } - - /** - * Create a new IP address column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function ipAddress($column = 'ip_address') - { - return $this->addColumn('ipAddress', $column); - } - - /** - * Create a new MAC address column on the table. - * - * @param string $column - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function macAddress($column = 'mac_address') - { - return $this->addColumn('macAddress', $column); - } - - /** - * Create a new geometry column on the table. - * - * @param string $column - * @param string|null $subtype - * @param int $srid - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function geometry($column, $subtype = null, $srid = 0) - { - return $this->addColumn('geometry', $column, compact('subtype', 'srid')); - } - - /** - * Create a new geography column on the table. - * - * @param string $column - * @param string|null $subtype - * @param int $srid - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function geography($column, $subtype = null, $srid = 4326) - { - return $this->addColumn('geography', $column, compact('subtype', 'srid')); - } - - /** - * Create a new generated, computed column on the table. - * - * @param string $column - * @param string $expression - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function computed($column, $expression) - { - return $this->addColumn('computed', $column, compact('expression')); - } - - /** - * Create a new vector column on the table. - * - * @param string $column - * @param int|null $dimensions - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function vector($column, $dimensions = null) - { - $options = $dimensions ? compact('dimensions') : []; - - return $this->addColumn('vector', $column, $options); - } - - /** - * Add the proper columns for a polymorphic table. - * - * @param string $name - * @param string|null $indexName - * @return void - */ - public function morphs($name, $indexName = null) - { - if (Builder::$defaultMorphKeyType === 'uuid') { - $this->uuidMorphs($name, $indexName); - } elseif (Builder::$defaultMorphKeyType === 'ulid') { - $this->ulidMorphs($name, $indexName); - } else { - $this->numericMorphs($name, $indexName); - } - } - - /** - * Add nullable columns for a polymorphic table. - * - * @param string $name - * @param string|null $indexName - * @return void - */ - public function nullableMorphs($name, $indexName = null) - { - if (Builder::$defaultMorphKeyType === 'uuid') { - $this->nullableUuidMorphs($name, $indexName); - } elseif (Builder::$defaultMorphKeyType === 'ulid') { - $this->nullableUlidMorphs($name, $indexName); - } else { - $this->nullableNumericMorphs($name, $indexName); - } - } - - /** - * Add the proper columns for a polymorphic table using numeric IDs (incremental). - * - * @param string $name - * @param string|null $indexName - * @return void - */ - public function numericMorphs($name, $indexName = null) - { - $this->string("{$name}_type"); - - $this->unsignedBigInteger("{$name}_id"); - - $this->index(["{$name}_type", "{$name}_id"], $indexName); - } - - /** - * Add nullable columns for a polymorphic table using numeric IDs (incremental). - * - * @param string $name - * @param string|null $indexName - * @return void - */ - public function nullableNumericMorphs($name, $indexName = null) - { - $this->string("{$name}_type")->nullable(); - - $this->unsignedBigInteger("{$name}_id")->nullable(); - - $this->index(["{$name}_type", "{$name}_id"], $indexName); - } - - /** - * Add the proper columns for a polymorphic table using UUIDs. - * - * @param string $name - * @param string|null $indexName - * @return void - */ - public function uuidMorphs($name, $indexName = null) - { - $this->string("{$name}_type"); - - $this->uuid("{$name}_id"); - - $this->index(["{$name}_type", "{$name}_id"], $indexName); - } - - /** - * Add nullable columns for a polymorphic table using UUIDs. - * - * @param string $name - * @param string|null $indexName - * @return void - */ - public function nullableUuidMorphs($name, $indexName = null) - { - $this->string("{$name}_type")->nullable(); - - $this->uuid("{$name}_id")->nullable(); - - $this->index(["{$name}_type", "{$name}_id"], $indexName); - } - - /** - * Add the proper columns for a polymorphic table using ULIDs. - * - * @param string $name - * @param string|null $indexName - * @return void - */ - public function ulidMorphs($name, $indexName = null) - { - $this->string("{$name}_type"); - - $this->ulid("{$name}_id"); - - $this->index(["{$name}_type", "{$name}_id"], $indexName); - } - - /** - * Add nullable columns for a polymorphic table using ULIDs. - * - * @param string $name - * @param string|null $indexName - * @return void - */ - public function nullableUlidMorphs($name, $indexName = null) - { - $this->string("{$name}_type")->nullable(); - - $this->ulid("{$name}_id")->nullable(); - - $this->index(["{$name}_type", "{$name}_id"], $indexName); - } - - /** - * Add the `remember_token` column to the table. - * - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function rememberToken() - { - return $this->string('remember_token', 100)->nullable(); - } - - /** - * Create a new custom column on the table. - * - * @param string $column - * @param string $definition - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function rawColumn($column, $definition) - { - return $this->addColumn('raw', $column, compact('definition')); - } - - /** - * Add a comment to the table. - * - * @param string $comment - * @return \Illuminate\Support\Fluent - */ - public function comment($comment) - { - return $this->addCommand('tableComment', compact('comment')); - } - - /** - * Add a new index command to the blueprint. - * - * @param string $type - * @param string|array $columns - * @param string $index - * @param string|null $algorithm - * @return \Illuminate\Support\Fluent - */ - protected function indexCommand($type, $columns, $index, $algorithm = null) - { - $columns = (array) $columns; - - // If no name was specified for this index, we will create one using a basic - // convention of the table name, followed by the columns, followed by an - // index type, such as primary or index, which makes the index unique. - $index = $index ?: $this->createIndexName($type, $columns); - - return $this->addCommand( - $type, compact('index', 'columns', 'algorithm') - ); - } - - /** - * Create a new drop index command on the blueprint. - * - * @param string $command - * @param string $type - * @param string|array $index - * @return \Illuminate\Support\Fluent - */ - protected function dropIndexCommand($command, $type, $index) - { - $columns = []; - - // If the given "index" is actually an array of columns, the developer means - // to drop an index merely by specifying the columns involved without the - // conventional name, so we will build the index name from the columns. - if (is_array($index)) { - $index = $this->createIndexName($type, $columns = $index); - } - - return $this->indexCommand($command, $columns, $index); - } - - /** - * Create a default index name for the table. - * - * @param string $type - * @param array $columns - * @return string - */ - protected function createIndexName($type, array $columns) - { - $table = str_contains($this->table, '.') - ? substr_replace($this->table, '.'.$this->prefix, strrpos($this->table, '.'), 1) - : $this->prefix.$this->table; - - $index = strtolower($table.'_'.implode('_', $columns).'_'.$type); - - return str_replace(['-', '.'], '_', $index); - } - - /** - * Add a new column to the blueprint. - * - * @param string $type - * @param string $name - * @param array $parameters - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - public function addColumn($type, $name, array $parameters = []) - { - return $this->addColumnDefinition(new ColumnDefinition( - array_merge(compact('type', 'name'), $parameters) - )); - } - - /** - * Add a new column definition to the blueprint. - * - * @param \Illuminate\Database\Schema\ColumnDefinition $definition - * @return \Illuminate\Database\Schema\ColumnDefinition - */ - protected function addColumnDefinition($definition) - { - $this->columns[] = $definition; - - if (! $this->creating()) { - $this->commands[] = $definition; - } - - if ($this->after) { - $definition->after($this->after); - - $this->after = $definition->name; - } - - return $definition; - } - - /** - * Add the columns from the callback after the given column. - * - * @param string $column - * @param \Closure $callback - * @return void - */ - public function after($column, Closure $callback) - { - $this->after = $column; - - $callback($this); - - $this->after = null; - } - - /** - * Remove a column from the schema blueprint. - * - * @param string $name - * @return $this - */ - public function removeColumn($name) - { - $this->columns = array_values(array_filter($this->columns, function ($c) use ($name) { - return $c['name'] != $name; - })); - - $this->commands = array_values(array_filter($this->commands, function ($c) use ($name) { - return ! $c instanceof ColumnDefinition || $c['name'] != $name; - })); - - return $this; - } - - /** - * Add a new command to the blueprint. - * - * @param string $name - * @param array $parameters - * @return \Illuminate\Support\Fluent - */ - protected function addCommand($name, array $parameters = []) - { - $this->commands[] = $command = $this->createCommand($name, $parameters); - - return $command; - } - - /** - * Create a new Fluent command. - * - * @param string $name - * @param array $parameters - * @return \Illuminate\Support\Fluent - */ - protected function createCommand($name, array $parameters = []) - { - return new Fluent(array_merge(compact('name'), $parameters)); - } - - /** - * Get the table the blueprint describes. - * - * @return string - */ - public function getTable() - { - return $this->table; - } - - /** - * Get the table prefix. - * - * @return string - */ - public function getPrefix() - { - return $this->prefix; - } - - /** - * Get the columns on the blueprint. - * - * @return \Illuminate\Database\Schema\ColumnDefinition[] - */ - public function getColumns() - { - return $this->columns; - } - - /** - * Get the commands on the blueprint. - * - * @return \Illuminate\Support\Fluent[] - */ - public function getCommands() - { - return $this->commands; - } - - /** - * Determine if the blueprint has state. - * - * @param mixed $name - * @return bool - */ - private function hasState(): bool - { - return ! is_null($this->state); - } - - /** - * Get the state of the blueprint. - * - * @return \Illuminate\Database\Schema\BlueprintState - */ - public function getState() - { - return $this->state; - } - - /** - * Get the columns on the blueprint that should be added. - * - * @return \Illuminate\Database\Schema\ColumnDefinition[] - */ - public function getAddedColumns() - { - return array_filter($this->columns, function ($column) { - return ! $column->change; - }); - } - - /** - * Get the columns on the blueprint that should be changed. - * - * @deprecated Will be removed in a future Laravel version. - * - * @return \Illuminate\Database\Schema\ColumnDefinition[] - */ - public function getChangedColumns() - { - return array_filter($this->columns, function ($column) { - return (bool) $column->change; - }); - } -} diff --git a/vendor/illuminate/database/Schema/BlueprintState.php b/vendor/illuminate/database/Schema/BlueprintState.php deleted file mode 100644 index 4a2ea12..0000000 --- a/vendor/illuminate/database/Schema/BlueprintState.php +++ /dev/null @@ -1,256 +0,0 @@ -blueprint = $blueprint; - $this->connection = $connection; - $this->grammar = $grammar; - - $schema = $connection->getSchemaBuilder(); - $table = $blueprint->getTable(); - - $this->columns = (new Collection($schema->getColumns($table)))->map(fn ($column) => new ColumnDefinition([ - 'name' => $column['name'], - 'type' => $column['type_name'], - 'full_type_definition' => $column['type'], - 'nullable' => $column['nullable'], - 'default' => is_null($column['default']) ? null : new Expression(Str::wrap($column['default'], '(', ')')), - 'autoIncrement' => $column['auto_increment'], - 'collation' => $column['collation'], - 'comment' => $column['comment'], - 'virtualAs' => ! is_null($column['generation']) && $column['generation']['type'] === 'virtual' - ? $column['generation']['expression'] : null, - 'storedAs' => ! is_null($column['generation']) && $column['generation']['type'] === 'stored' - ? $column['generation']['expression'] : null, - ]))->all(); - - [$primary, $indexes] = (new Collection($schema->getIndexes($table)))->map(fn ($index) => new IndexDefinition([ - 'name' => match (true) { - $index['primary'] => 'primary', - $index['unique'] => 'unique', - default => 'index', - }, - 'index' => $index['name'], - 'columns' => $index['columns'], - ]))->partition(fn ($index) => $index->name === 'primary'); - - $this->indexes = $indexes->all(); - $this->primaryKey = $primary->first(); - - $this->foreignKeys = (new Collection($schema->getForeignKeys($table)))->map(fn ($foreignKey) => new ForeignKeyDefinition([ - 'columns' => $foreignKey['columns'], - 'on' => new Expression($foreignKey['foreign_table']), - 'references' => $foreignKey['foreign_columns'], - 'onUpdate' => $foreignKey['on_update'], - 'onDelete' => $foreignKey['on_delete'], - ]))->all(); - } - - /** - * Get the primary key. - * - * @return \Illuminate\Database\Schema\IndexDefinition|null - */ - public function getPrimaryKey() - { - return $this->primaryKey; - } - - /** - * Get the columns. - * - * @return \Illuminate\Database\Schema\ColumnDefinition[] - */ - public function getColumns() - { - return $this->columns; - } - - /** - * Get the indexes. - * - * @return \Illuminate\Database\Schema\IndexDefinition[] - */ - public function getIndexes() - { - return $this->indexes; - } - - /** - * Get the foreign keys. - * - * @return \Illuminate\Database\Schema\ForeignKeyDefinition[] - */ - public function getForeignKeys() - { - return $this->foreignKeys; - } - - /* - * Update the blueprint's state. - * - * @param \Illuminate\Support\Fluent $command - * @return void - */ - public function update(Fluent $command) - { - switch ($command->name) { - case 'alter': - // Already handled... - break; - - case 'add': - $this->columns[] = $command->column; - break; - - case 'change': - foreach ($this->columns as &$column) { - if ($column->name === $command->column->name) { - $column = $command->column; - break; - } - } - - break; - - case 'renameColumn': - foreach ($this->columns as $column) { - if ($column->name === $command->from) { - $column->name = $command->to; - break; - } - } - - if ($this->primaryKey) { - $this->primaryKey->columns = str_replace($command->from, $command->to, $this->primaryKey->columns); - } - - foreach ($this->indexes as $index) { - $index->columns = str_replace($command->from, $command->to, $index->columns); - } - - foreach ($this->foreignKeys as $foreignKey) { - $foreignKey->columns = str_replace($command->from, $command->to, $foreignKey->columns); - } - - break; - - case 'dropColumn': - $this->columns = array_values( - array_filter($this->columns, fn ($column) => ! in_array($column->name, $command->columns)) - ); - - break; - - case 'primary': - $this->primaryKey = $command; - break; - - case 'unique': - case 'index': - $this->indexes[] = $command; - break; - - case 'renameIndex': - foreach ($this->indexes as $index) { - if ($index->index === $command->from) { - $index->index = $command->to; - break; - } - } - - break; - - case 'foreign': - $this->foreignKeys[] = $command; - break; - - case 'dropPrimary': - $this->primaryKey = null; - break; - - case 'dropIndex': - case 'dropUnique': - $this->indexes = array_values( - array_filter($this->indexes, fn ($index) => $index->index !== $command->index) - ); - - break; - - case 'dropForeign': - $this->foreignKeys = array_values( - array_filter($this->foreignKeys, fn ($fk) => $fk->columns !== $command->columns) - ); - - break; - } - } -} diff --git a/vendor/illuminate/database/Schema/Builder.php b/vendor/illuminate/database/Schema/Builder.php deleted file mode 100644 index 9af11e2..0000000 --- a/vendor/illuminate/database/Schema/Builder.php +++ /dev/null @@ -1,620 +0,0 @@ -connection = $connection; - $this->grammar = $connection->getSchemaGrammar(); - } - - /** - * Set the default string length for migrations. - * - * @param int $length - * @return void - */ - public static function defaultStringLength($length) - { - static::$defaultStringLength = $length; - } - - /** - * Set the default morph key type for migrations. - * - * @param string $type - * @return void - * - * @throws \InvalidArgumentException - */ - public static function defaultMorphKeyType(string $type) - { - if (! in_array($type, ['int', 'uuid', 'ulid'])) { - throw new InvalidArgumentException("Morph key type must be 'int', 'uuid', or 'ulid'."); - } - - static::$defaultMorphKeyType = $type; - } - - /** - * Set the default morph key type for migrations to UUIDs. - * - * @return void - */ - public static function morphUsingUuids() - { - static::defaultMorphKeyType('uuid'); - } - - /** - * Set the default morph key type for migrations to ULIDs. - * - * @return void - */ - public static function morphUsingUlids() - { - static::defaultMorphKeyType('ulid'); - } - - /** - * Create a database in the schema. - * - * @param string $name - * @return bool - * - * @throws \LogicException - */ - public function createDatabase($name) - { - throw new LogicException('This database driver does not support creating databases.'); - } - - /** - * Drop a database from the schema if the database exists. - * - * @param string $name - * @return bool - * - * @throws \LogicException - */ - public function dropDatabaseIfExists($name) - { - throw new LogicException('This database driver does not support dropping databases.'); - } - - /** - * Determine if the given table exists. - * - * @param string $table - * @return bool - */ - public function hasTable($table) - { - $table = $this->connection->getTablePrefix().$table; - - foreach ($this->getTables() as $value) { - if (strtolower($table) === strtolower($value['name'])) { - return true; - } - } - - return false; - } - - /** - * Determine if the given view exists. - * - * @param string $view - * @return bool - */ - public function hasView($view) - { - $view = $this->connection->getTablePrefix().$view; - - foreach ($this->getViews() as $value) { - if (strtolower($view) === strtolower($value['name'])) { - return true; - } - } - - return false; - } - - /** - * Get the tables that belong to the database. - * - * @return array - */ - public function getTables() - { - return $this->connection->getPostProcessor()->processTables( - $this->connection->selectFromWriteConnection($this->grammar->compileTables()) - ); - } - - /** - * Get the names of the tables that belong to the database. - * - * @return array - */ - public function getTableListing() - { - return array_column($this->getTables(), 'name'); - } - - /** - * Get the views that belong to the database. - * - * @return array - */ - public function getViews() - { - return $this->connection->getPostProcessor()->processViews( - $this->connection->selectFromWriteConnection($this->grammar->compileViews()) - ); - } - - /** - * Get the user-defined types that belong to the database. - * - * @return array - */ - public function getTypes() - { - throw new LogicException('This database driver does not support user-defined types.'); - } - - /** - * Determine if the given table has a given column. - * - * @param string $table - * @param string $column - * @return bool - */ - public function hasColumn($table, $column) - { - return in_array( - strtolower($column), array_map('strtolower', $this->getColumnListing($table)) - ); - } - - /** - * Determine if the given table has given columns. - * - * @param string $table - * @param array $columns - * @return bool - */ - public function hasColumns($table, array $columns) - { - $tableColumns = array_map('strtolower', $this->getColumnListing($table)); - - foreach ($columns as $column) { - if (! in_array(strtolower($column), $tableColumns)) { - return false; - } - } - - return true; - } - - /** - * Execute a table builder callback if the given table has a given column. - * - * @param string $table - * @param string $column - * @param \Closure $callback - * @return void - */ - public function whenTableHasColumn(string $table, string $column, Closure $callback) - { - if ($this->hasColumn($table, $column)) { - $this->table($table, fn (Blueprint $table) => $callback($table)); - } - } - - /** - * Execute a table builder callback if the given table doesn't have a given column. - * - * @param string $table - * @param string $column - * @param \Closure $callback - * @return void - */ - public function whenTableDoesntHaveColumn(string $table, string $column, Closure $callback) - { - if (! $this->hasColumn($table, $column)) { - $this->table($table, fn (Blueprint $table) => $callback($table)); - } - } - - /** - * Get the data type for the given column name. - * - * @param string $table - * @param string $column - * @param bool $fullDefinition - * @return string - */ - public function getColumnType($table, $column, $fullDefinition = false) - { - $columns = $this->getColumns($table); - - foreach ($columns as $value) { - if (strtolower($value['name']) === strtolower($column)) { - return $fullDefinition ? $value['type'] : $value['type_name']; - } - } - - throw new InvalidArgumentException("There is no column with name '$column' on table '$table'."); - } - - /** - * Get the column listing for a given table. - * - * @param string $table - * @return array - */ - public function getColumnListing($table) - { - return array_column($this->getColumns($table), 'name'); - } - - /** - * Get the columns for a given table. - * - * @param string $table - * @return array - */ - public function getColumns($table) - { - $table = $this->connection->getTablePrefix().$table; - - return $this->connection->getPostProcessor()->processColumns( - $this->connection->selectFromWriteConnection($this->grammar->compileColumns($table)) - ); - } - - /** - * Get the indexes for a given table. - * - * @param string $table - * @return array - */ - public function getIndexes($table) - { - $table = $this->connection->getTablePrefix().$table; - - return $this->connection->getPostProcessor()->processIndexes( - $this->connection->selectFromWriteConnection($this->grammar->compileIndexes($table)) - ); - } - - /** - * Get the names of the indexes for a given table. - * - * @param string $table - * @return array - */ - public function getIndexListing($table) - { - return array_column($this->getIndexes($table), 'name'); - } - - /** - * Determine if the given table has a given index. - * - * @param string $table - * @param string|array $index - * @param string|null $type - * @return bool - */ - public function hasIndex($table, $index, $type = null) - { - $type = is_null($type) ? $type : strtolower($type); - - foreach ($this->getIndexes($table) as $value) { - $typeMatches = is_null($type) - || ($type === 'primary' && $value['primary']) - || ($type === 'unique' && $value['unique']) - || $type === $value['type']; - - if (($value['name'] === $index || $value['columns'] === $index) && $typeMatches) { - return true; - } - } - - return false; - } - - /** - * Get the foreign keys for a given table. - * - * @param string $table - * @return array - */ - public function getForeignKeys($table) - { - $table = $this->connection->getTablePrefix().$table; - - return $this->connection->getPostProcessor()->processForeignKeys( - $this->connection->selectFromWriteConnection($this->grammar->compileForeignKeys($table)) - ); - } - - /** - * Modify a table on the schema. - * - * @param string $table - * @param \Closure $callback - * @return void - */ - public function table($table, Closure $callback) - { - $this->build($this->createBlueprint($table, $callback)); - } - - /** - * Create a new table on the schema. - * - * @param string $table - * @param \Closure $callback - * @return void - */ - public function create($table, Closure $callback) - { - $this->build(tap($this->createBlueprint($table), function ($blueprint) use ($callback) { - $blueprint->create(); - - $callback($blueprint); - })); - } - - /** - * Drop a table from the schema. - * - * @param string $table - * @return void - */ - public function drop($table) - { - $this->build(tap($this->createBlueprint($table), function ($blueprint) { - $blueprint->drop(); - })); - } - - /** - * Drop a table from the schema if it exists. - * - * @param string $table - * @return void - */ - public function dropIfExists($table) - { - $this->build(tap($this->createBlueprint($table), function ($blueprint) { - $blueprint->dropIfExists(); - })); - } - - /** - * Drop columns from a table schema. - * - * @param string $table - * @param string|array $columns - * @return void - */ - public function dropColumns($table, $columns) - { - $this->table($table, function (Blueprint $blueprint) use ($columns) { - $blueprint->dropColumn($columns); - }); - } - - /** - * Drop all tables from the database. - * - * @return void - * - * @throws \LogicException - */ - public function dropAllTables() - { - throw new LogicException('This database driver does not support dropping all tables.'); - } - - /** - * Drop all views from the database. - * - * @return void - * - * @throws \LogicException - */ - public function dropAllViews() - { - throw new LogicException('This database driver does not support dropping all views.'); - } - - /** - * Drop all types from the database. - * - * @return void - * - * @throws \LogicException - */ - public function dropAllTypes() - { - throw new LogicException('This database driver does not support dropping all types.'); - } - - /** - * Rename a table on the schema. - * - * @param string $from - * @param string $to - * @return void - */ - public function rename($from, $to) - { - $this->build(tap($this->createBlueprint($from), function ($blueprint) use ($to) { - $blueprint->rename($to); - })); - } - - /** - * Enable foreign key constraints. - * - * @return bool - */ - public function enableForeignKeyConstraints() - { - return $this->connection->statement( - $this->grammar->compileEnableForeignKeyConstraints() - ); - } - - /** - * Disable foreign key constraints. - * - * @return bool - */ - public function disableForeignKeyConstraints() - { - return $this->connection->statement( - $this->grammar->compileDisableForeignKeyConstraints() - ); - } - - /** - * Disable foreign key constraints during the execution of a callback. - * - * @param \Closure $callback - * @return mixed - */ - public function withoutForeignKeyConstraints(Closure $callback) - { - $this->disableForeignKeyConstraints(); - - try { - return $callback(); - } finally { - $this->enableForeignKeyConstraints(); - } - } - - /** - * Execute the blueprint to build / modify the table. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @return void - */ - protected function build(Blueprint $blueprint) - { - $blueprint->build($this->connection, $this->grammar); - } - - /** - * Create a new command set with a Closure. - * - * @param string $table - * @param \Closure|null $callback - * @return \Illuminate\Database\Schema\Blueprint - */ - protected function createBlueprint($table, ?Closure $callback = null) - { - $prefix = $this->connection->getConfig('prefix_indexes') - ? $this->connection->getConfig('prefix') - : ''; - - if (isset($this->resolver)) { - return call_user_func($this->resolver, $table, $callback, $prefix); - } - - return Container::getInstance()->make(Blueprint::class, compact('table', 'callback', 'prefix')); - } - - /** - * Get the database connection instance. - * - * @return \Illuminate\Database\Connection - */ - public function getConnection() - { - return $this->connection; - } - - /** - * Set the database connection instance. - * - * @param \Illuminate\Database\Connection $connection - * @return $this - */ - public function setConnection(Connection $connection) - { - $this->connection = $connection; - - return $this; - } - - /** - * Set the Schema Blueprint resolver callback. - * - * @param \Closure $resolver - * @return void - */ - public function blueprintResolver(Closure $resolver) - { - $this->resolver = $resolver; - } -} diff --git a/vendor/illuminate/database/Schema/ColumnDefinition.php b/vendor/illuminate/database/Schema/ColumnDefinition.php deleted file mode 100644 index 255ddab..0000000 --- a/vendor/illuminate/database/Schema/ColumnDefinition.php +++ /dev/null @@ -1,38 +0,0 @@ -blueprint = $blueprint; - } - - /** - * Create a foreign key constraint on this column referencing the "id" column of the conventionally related table. - * - * @param string|null $table - * @param string|null $column - * @param string|null $indexName - * @return \Illuminate\Database\Schema\ForeignKeyDefinition - */ - public function constrained($table = null, $column = null, $indexName = null) - { - $table ??= $this->table; - $column ??= $this->referencesModelColumn ?? 'id'; - - return $this->references($column, $indexName)->on($table ?? (new Stringable($this->name))->beforeLast('_'.$column)->plural()); - } - - /** - * Specify which column this foreign ID references on another table. - * - * @param string $column - * @param string $indexName - * @return \Illuminate\Database\Schema\ForeignKeyDefinition - */ - public function references($column, $indexName = null) - { - return $this->blueprint->foreign($this->name, $indexName)->references($column); - } -} diff --git a/vendor/illuminate/database/Schema/ForeignKeyDefinition.php b/vendor/illuminate/database/Schema/ForeignKeyDefinition.php deleted file mode 100644 index 1ce0361..0000000 --- a/vendor/illuminate/database/Schema/ForeignKeyDefinition.php +++ /dev/null @@ -1,96 +0,0 @@ -onUpdate('cascade'); - } - - /** - * Indicate that updates should be restricted. - * - * @return $this - */ - public function restrictOnUpdate() - { - return $this->onUpdate('restrict'); - } - - /** - * Indicate that updates should set the foreign key value to null. - * - * @return $this - */ - public function nullOnUpdate() - { - return $this->onUpdate('set null'); - } - - /** - * Indicate that updates should have "no action". - * - * @return $this - */ - public function noActionOnUpdate() - { - return $this->onUpdate('no action'); - } - - /** - * Indicate that deletes should cascade. - * - * @return $this - */ - public function cascadeOnDelete() - { - return $this->onDelete('cascade'); - } - - /** - * Indicate that deletes should be restricted. - * - * @return $this - */ - public function restrictOnDelete() - { - return $this->onDelete('restrict'); - } - - /** - * Indicate that deletes should set the foreign key value to null. - * - * @return $this - */ - public function nullOnDelete() - { - return $this->onDelete('set null'); - } - - /** - * Indicate that deletes should have "no action". - * - * @return $this - */ - public function noActionOnDelete() - { - return $this->onDelete('no action'); - } -} diff --git a/vendor/illuminate/database/Schema/Grammars/Grammar.php b/vendor/illuminate/database/Schema/Grammars/Grammar.php deleted file mode 100644 index b21fcf2..0000000 --- a/vendor/illuminate/database/Schema/Grammars/Grammar.php +++ /dev/null @@ -1,408 +0,0 @@ -wrapTable($blueprint), - $this->wrap($command->from), - $this->wrap($command->to) - ); - } - - /** - * Compile a change column command into a series of SQL statements. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return array|string - * - * @throws \RuntimeException - */ - public function compileChange(Blueprint $blueprint, Fluent $command, Connection $connection) - { - throw new LogicException('This database driver does not support modifying columns.'); - } - - /** - * Compile a fulltext index key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - * - * @throws \RuntimeException - */ - public function compileFulltext(Blueprint $blueprint, Fluent $command) - { - throw new RuntimeException('This database driver does not support fulltext index creation.'); - } - - /** - * Compile a drop fulltext index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - * - * @throws \RuntimeException - */ - public function compileDropFullText(Blueprint $blueprint, Fluent $command) - { - throw new RuntimeException('This database driver does not support fulltext index removal.'); - } - - /** - * Compile a foreign key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileForeign(Blueprint $blueprint, Fluent $command) - { - // We need to prepare several of the elements of the foreign key definition - // before we can create the SQL, such as wrapping the tables and convert - // an array of columns to comma-delimited strings for the SQL queries. - $sql = sprintf('alter table %s add constraint %s ', - $this->wrapTable($blueprint), - $this->wrap($command->index) - ); - - // Once we have the initial portion of the SQL statement we will add on the - // key name, table name, and referenced columns. These will complete the - // main portion of the SQL statement and this SQL will almost be done. - $sql .= sprintf('foreign key (%s) references %s (%s)', - $this->columnize($command->columns), - $this->wrapTable($command->on), - $this->columnize((array) $command->references) - ); - - // Once we have the basic foreign key creation statement constructed we can - // build out the syntax for what should happen on an update or delete of - // the affected columns, which will get something like "cascade", etc. - if (! is_null($command->onDelete)) { - $sql .= " on delete {$command->onDelete}"; - } - - if (! is_null($command->onUpdate)) { - $sql .= " on update {$command->onUpdate}"; - } - - return $sql; - } - - /** - * Compile a drop foreign key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropForeign(Blueprint $blueprint, Fluent $command) - { - throw new RuntimeException('This database driver does not support dropping foreign keys.'); - } - - /** - * Compile the blueprint's added column definitions. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @return array - */ - protected function getColumns(Blueprint $blueprint) - { - $columns = []; - - foreach ($blueprint->getAddedColumns() as $column) { - $columns[] = $this->getColumn($blueprint, $column); - } - - return $columns; - } - - /** - * Compile the column definition. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Database\Schema\ColumnDefinition $column - * @return string - */ - protected function getColumn(Blueprint $blueprint, $column) - { - // Each of the column types has their own compiler functions, which are tasked - // with turning the column definition into its SQL format for this platform - // used by the connection. The column's modifiers are compiled and added. - $sql = $this->wrap($column).' '.$this->getType($column); - - return $this->addModifiers($sql, $blueprint, $column); - } - - /** - * Get the SQL for the column data type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function getType(Fluent $column) - { - return $this->{'type'.ucfirst($column->type)}($column); - } - - /** - * Create the column definition for a generated, computed column type. - * - * @param \Illuminate\Support\Fluent $column - * @return void - * - * @throws \RuntimeException - */ - protected function typeComputed(Fluent $column) - { - throw new RuntimeException('This database driver does not support the computed type.'); - } - - /** - * Create the column definition for a vector type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - * - * @throws \RuntimeException - */ - protected function typeVector(Fluent $column) - { - throw new RuntimeException('This database driver does not support the vector type.'); - } - - /** - * Create the column definition for a raw column type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeRaw(Fluent $column) - { - return $column->offsetGet('definition'); - } - - /** - * Add the column modifiers to the definition. - * - * @param string $sql - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function addModifiers($sql, Blueprint $blueprint, Fluent $column) - { - foreach ($this->modifiers as $modifier) { - if (method_exists($this, $method = "modify{$modifier}")) { - $sql .= $this->{$method}($blueprint, $column); - } - } - - return $sql; - } - - /** - * Get the command with a given name if it exists on the blueprint. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param string $name - * @return \Illuminate\Support\Fluent|null - */ - protected function getCommandByName(Blueprint $blueprint, $name) - { - $commands = $this->getCommandsByName($blueprint, $name); - - if (count($commands) > 0) { - return reset($commands); - } - } - - /** - * Get all of the commands with a given name. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param string $name - * @return array - */ - protected function getCommandsByName(Blueprint $blueprint, $name) - { - return array_filter($blueprint->getCommands(), function ($value) use ($name) { - return $value->name == $name; - }); - } - - /* - * Determine if a command with a given name exists on the blueprint. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param string $name - * @return bool - */ - protected function hasCommand(Blueprint $blueprint, $name) - { - foreach ($blueprint->getCommands() as $command) { - if ($command->name === $name) { - return true; - } - } - - return false; - } - - /** - * Add a prefix to an array of values. - * - * @param string $prefix - * @param array $values - * @return array - */ - public function prefixArray($prefix, array $values) - { - return array_map(function ($value) use ($prefix) { - return $prefix.' '.$value; - }, $values); - } - - /** - * Wrap a table in keyword identifiers. - * - * @param mixed $table - * @return string - */ - public function wrapTable($table) - { - return parent::wrapTable( - $table instanceof Blueprint ? $table->getTable() : $table - ); - } - - /** - * Wrap a value in keyword identifiers. - * - * @param \Illuminate\Support\Fluent|\Illuminate\Contracts\Database\Query\Expression|string $value - * @return string - */ - public function wrap($value) - { - return parent::wrap( - $value instanceof Fluent ? $value->name : $value, - ); - } - - /** - * Format a value so that it can be used in "default" clauses. - * - * @param mixed $value - * @return string - */ - protected function getDefaultValue($value) - { - if ($value instanceof Expression) { - return $this->getValue($value); - } - - if ($value instanceof BackedEnum) { - return "'{$value->value}'"; - } - - return is_bool($value) - ? "'".(int) $value."'" - : "'".(string) $value."'"; - } - - /** - * Get the fluent commands for the grammar. - * - * @return array - */ - public function getFluentCommands() - { - return $this->fluentCommands; - } - - /** - * Check if this Grammar supports schema changes wrapped in a transaction. - * - * @return bool - */ - public function supportsSchemaTransactions() - { - return $this->transactions; - } -} diff --git a/vendor/illuminate/database/Schema/Grammars/MariaDbGrammar.php b/vendor/illuminate/database/Schema/Grammars/MariaDbGrammar.php deleted file mode 100644 index 2996406..0000000 --- a/vendor/illuminate/database/Schema/Grammars/MariaDbGrammar.php +++ /dev/null @@ -1,58 +0,0 @@ -getServerVersion(), '10.5.2', '<')) { - return $this->compileLegacyRenameColumn($blueprint, $command, $connection); - } - - return parent::compileRenameColumn($blueprint, $command, $connection); - } - - /** - * Create the column definition for a uuid type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeUuid(Fluent $column) - { - return 'uuid'; - } - - /** - * Create the column definition for a spatial Geometry type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeGeometry(Fluent $column) - { - $subtype = $column->subtype ? strtolower($column->subtype) : null; - - if (! in_array($subtype, ['point', 'linestring', 'polygon', 'geometrycollection', 'multipoint', 'multilinestring', 'multipolygon'])) { - $subtype = null; - } - - return sprintf('%s%s', - $subtype ?? 'geometry', - $column->srid ? ' ref_system_id='.$column->srid : '' - ); - } -} diff --git a/vendor/illuminate/database/Schema/Grammars/MySqlGrammar.php b/vendor/illuminate/database/Schema/Grammars/MySqlGrammar.php deleted file mode 100644 index 456210c..0000000 --- a/vendor/illuminate/database/Schema/Grammars/MySqlGrammar.php +++ /dev/null @@ -1,1371 +0,0 @@ -getConfig('charset'); - $collation = $connection->getConfig('collation'); - - if (! $charset || ! $collation) { - return sprintf( - 'create database %s', - $this->wrapValue($name), - ); - } - - return sprintf( - 'create database %s default character set %s default collate %s', - $this->wrapValue($name), - $this->wrapValue($charset), - $this->wrapValue($collation), - ); - } - - /** - * Compile a drop database if exists command. - * - * @param string $name - * @return string - */ - public function compileDropDatabaseIfExists($name) - { - return sprintf( - 'drop database if exists %s', - $this->wrapValue($name) - ); - } - - /** - * Compile the query to determine if the given table exists. - * - * @param string $database - * @param string $table - * @return string - */ - public function compileTableExists($database, $table) - { - return sprintf( - 'select exists (select 1 from information_schema.tables where ' - ."table_schema = %s and table_name = %s and table_type in ('BASE TABLE', 'SYSTEM VERSIONED')) as `exists`", - $this->quoteString($database), - $this->quoteString($table) - ); - } - - /** - * Compile the query to determine the tables. - * - * @param string $database - * @return string - */ - public function compileTables($database) - { - return sprintf( - 'select table_name as `name`, (data_length + index_length) as `size`, ' - .'table_comment as `comment`, engine as `engine`, table_collation as `collation` ' - ."from information_schema.tables where table_schema = %s and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') " - .'order by table_name', - $this->quoteString($database) - ); - } - - /** - * Compile the query to determine the views. - * - * @param string $database - * @return string - */ - public function compileViews($database) - { - return sprintf( - 'select table_name as `name`, view_definition as `definition` ' - .'from information_schema.views where table_schema = %s ' - .'order by table_name', - $this->quoteString($database) - ); - } - - /** - * Compile the query to determine the columns. - * - * @param string $database - * @param string $table - * @return string - */ - public function compileColumns($database, $table) - { - return sprintf( - 'select column_name as `name`, data_type as `type_name`, column_type as `type`, ' - .'collation_name as `collation`, is_nullable as `nullable`, ' - .'column_default as `default`, column_comment as `comment`, ' - .'generation_expression as `expression`, extra as `extra` ' - .'from information_schema.columns where table_schema = %s and table_name = %s ' - .'order by ordinal_position asc', - $this->quoteString($database), - $this->quoteString($table) - ); - } - - /** - * Compile the query to determine the indexes. - * - * @param string $database - * @param string $table - * @return string - */ - public function compileIndexes($database, $table) - { - return sprintf( - 'select index_name as `name`, group_concat(column_name order by seq_in_index) as `columns`, ' - .'index_type as `type`, not non_unique as `unique` ' - .'from information_schema.statistics where table_schema = %s and table_name = %s ' - .'group by index_name, index_type, non_unique', - $this->quoteString($database), - $this->quoteString($table) - ); - } - - /** - * Compile the query to determine the foreign keys. - * - * @param string $database - * @param string $table - * @return string - */ - public function compileForeignKeys($database, $table) - { - return sprintf( - 'select kc.constraint_name as `name`, ' - .'group_concat(kc.column_name order by kc.ordinal_position) as `columns`, ' - .'kc.referenced_table_schema as `foreign_schema`, ' - .'kc.referenced_table_name as `foreign_table`, ' - .'group_concat(kc.referenced_column_name order by kc.ordinal_position) as `foreign_columns`, ' - .'rc.update_rule as `on_update`, ' - .'rc.delete_rule as `on_delete` ' - .'from information_schema.key_column_usage kc join information_schema.referential_constraints rc ' - .'on kc.constraint_schema = rc.constraint_schema and kc.constraint_name = rc.constraint_name ' - .'where kc.table_schema = %s and kc.table_name = %s and kc.referenced_table_name is not null ' - .'group by kc.constraint_name, kc.referenced_table_schema, kc.referenced_table_name, rc.update_rule, rc.delete_rule', - $this->quoteString($database), - $this->quoteString($table) - ); - } - - /** - * Compile a create table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return string - */ - public function compileCreate(Blueprint $blueprint, Fluent $command, Connection $connection) - { - $sql = $this->compileCreateTable( - $blueprint, $command, $connection - ); - - // Once we have the primary SQL, we can add the encoding option to the SQL for - // the table. Then, we can check if a storage engine has been supplied for - // the table. If so, we will add the engine declaration to the SQL query. - $sql = $this->compileCreateEncoding( - $sql, $connection, $blueprint - ); - - // Finally, we will append the engine configuration onto this SQL statement as - // the final thing we do before returning this finished SQL. Once this gets - // added the query will be ready to execute against the real connections. - return $this->compileCreateEngine($sql, $connection, $blueprint); - } - - /** - * Create the main create table clause. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return string - */ - protected function compileCreateTable($blueprint, $command, $connection) - { - $tableStructure = $this->getColumns($blueprint); - - if ($primaryKey = $this->getCommandByName($blueprint, 'primary')) { - $tableStructure[] = sprintf( - 'primary key %s(%s)', - $primaryKey->algorithm ? 'using '.$primaryKey->algorithm : '', - $this->columnize($primaryKey->columns) - ); - - $primaryKey->shouldBeSkipped = true; - } - - return sprintf('%s table %s (%s)', - $blueprint->temporary ? 'create temporary' : 'create', - $this->wrapTable($blueprint), - implode(', ', $tableStructure) - ); - } - - /** - * Append the character set specifications to a command. - * - * @param string $sql - * @param \Illuminate\Database\Connection $connection - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @return string - */ - protected function compileCreateEncoding($sql, Connection $connection, Blueprint $blueprint) - { - // First we will set the character set if one has been set on either the create - // blueprint itself or on the root configuration for the connection that the - // table is being created on. We will add these to the create table query. - if (isset($blueprint->charset)) { - $sql .= ' default character set '.$blueprint->charset; - } elseif (! is_null($charset = $connection->getConfig('charset'))) { - $sql .= ' default character set '.$charset; - } - - // Next we will add the collation to the create table statement if one has been - // added to either this create table blueprint or the configuration for this - // connection that the query is targeting. We'll add it to this SQL query. - if (isset($blueprint->collation)) { - $sql .= " collate '{$blueprint->collation}'"; - } elseif (! is_null($collation = $connection->getConfig('collation'))) { - $sql .= " collate '{$collation}'"; - } - - return $sql; - } - - /** - * Append the engine specifications to a command. - * - * @param string $sql - * @param \Illuminate\Database\Connection $connection - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @return string - */ - protected function compileCreateEngine($sql, Connection $connection, Blueprint $blueprint) - { - if (isset($blueprint->engine)) { - return $sql.' engine = '.$blueprint->engine; - } elseif (! is_null($engine = $connection->getConfig('engine'))) { - return $sql.' engine = '.$engine; - } - - return $sql; - } - - /** - * Compile an add column command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileAdd(Blueprint $blueprint, Fluent $command) - { - return sprintf('alter table %s add %s', - $this->wrapTable($blueprint), - $this->getColumn($blueprint, $command->column) - ); - } - - /** - * Compile the auto-incrementing column starting values. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileAutoIncrementStartingValues(Blueprint $blueprint, Fluent $command) - { - if ($command->column->autoIncrement - && $value = $command->column->get('startingValue', $command->column->get('from'))) { - return 'alter table '.$this->wrapTable($blueprint).' auto_increment = '.$value; - } - } - - /** - * Compile a rename column command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return array|string - */ - public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) - { - $version = $connection->getServerVersion(); - - if (($connection->isMaria() && version_compare($version, '10.5.2', '<')) || - (! $connection->isMaria() && version_compare($version, '8.0.3', '<'))) { - return $this->compileLegacyRenameColumn($blueprint, $command, $connection); - } - - return parent::compileRenameColumn($blueprint, $command, $connection); - } - - /** - * Compile a rename column command for legacy versions of MySQL. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return string - */ - protected function compileLegacyRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) - { - $column = (new Collection($connection->getSchemaBuilder()->getColumns($blueprint->getTable()))) - ->firstWhere('name', $command->from); - - $modifiers = $this->addModifiers($column['type'], $blueprint, new ColumnDefinition([ - 'change' => true, - 'type' => match ($column['type_name']) { - 'bigint' => 'bigInteger', - 'int' => 'integer', - 'mediumint' => 'mediumInteger', - 'smallint' => 'smallInteger', - 'tinyint' => 'tinyInteger', - default => $column['type_name'], - }, - 'nullable' => $column['nullable'], - 'default' => $column['default'] && (str_starts_with(strtolower($column['default']), 'current_timestamp') || $column['default'] === 'NULL') - ? new Expression($column['default']) - : $column['default'], - 'autoIncrement' => $column['auto_increment'], - 'collation' => $column['collation'], - 'comment' => $column['comment'], - 'virtualAs' => ! is_null($column['generation']) && $column['generation']['type'] === 'virtual' - ? $column['generation']['expression'] : null, - 'storedAs' => ! is_null($column['generation']) && $column['generation']['type'] === 'stored' - ? $column['generation']['expression'] : null, - ])); - - return sprintf('alter table %s change %s %s %s', - $this->wrapTable($blueprint), - $this->wrap($command->from), - $this->wrap($command->to), - $modifiers - ); - } - - /** - * Compile a change column command into a series of SQL statements. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return array|string - * - * @throws \RuntimeException - */ - public function compileChange(Blueprint $blueprint, Fluent $command, Connection $connection) - { - $column = $command->column; - - $sql = sprintf('alter table %s %s %s%s %s', - $this->wrapTable($blueprint), - is_null($column->renameTo) ? 'modify' : 'change', - $this->wrap($column), - is_null($column->renameTo) ? '' : ' '.$this->wrap($column->renameTo), - $this->getType($column) - ); - - return $this->addModifiers($sql, $blueprint, $column); - } - - /** - * Compile a primary key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compilePrimary(Blueprint $blueprint, Fluent $command) - { - return sprintf('alter table %s add primary key %s(%s)', - $this->wrapTable($blueprint), - $command->algorithm ? 'using '.$command->algorithm : '', - $this->columnize($command->columns) - ); - } - - /** - * Compile a unique key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileUnique(Blueprint $blueprint, Fluent $command) - { - return $this->compileKey($blueprint, $command, 'unique'); - } - - /** - * Compile a plain index key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileIndex(Blueprint $blueprint, Fluent $command) - { - return $this->compileKey($blueprint, $command, 'index'); - } - - /** - * Compile a fulltext index key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileFullText(Blueprint $blueprint, Fluent $command) - { - return $this->compileKey($blueprint, $command, 'fulltext'); - } - - /** - * Compile a spatial index key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileSpatialIndex(Blueprint $blueprint, Fluent $command) - { - return $this->compileKey($blueprint, $command, 'spatial index'); - } - - /** - * Compile an index creation command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param string $type - * @return string - */ - protected function compileKey(Blueprint $blueprint, Fluent $command, $type) - { - return sprintf('alter table %s add %s %s%s(%s)', - $this->wrapTable($blueprint), - $type, - $this->wrap($command->index), - $command->algorithm ? ' using '.$command->algorithm : '', - $this->columnize($command->columns) - ); - } - - /** - * Compile a drop table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDrop(Blueprint $blueprint, Fluent $command) - { - return 'drop table '.$this->wrapTable($blueprint); - } - - /** - * Compile a drop table (if exists) command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropIfExists(Blueprint $blueprint, Fluent $command) - { - return 'drop table if exists '.$this->wrapTable($blueprint); - } - - /** - * Compile a drop column command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropColumn(Blueprint $blueprint, Fluent $command) - { - $columns = $this->prefixArray('drop', $this->wrapArray($command->columns)); - - return 'alter table '.$this->wrapTable($blueprint).' '.implode(', ', $columns); - } - - /** - * Compile a drop primary key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropPrimary(Blueprint $blueprint, Fluent $command) - { - return 'alter table '.$this->wrapTable($blueprint).' drop primary key'; - } - - /** - * Compile a drop unique key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropUnique(Blueprint $blueprint, Fluent $command) - { - $index = $this->wrap($command->index); - - return "alter table {$this->wrapTable($blueprint)} drop index {$index}"; - } - - /** - * Compile a drop index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropIndex(Blueprint $blueprint, Fluent $command) - { - $index = $this->wrap($command->index); - - return "alter table {$this->wrapTable($blueprint)} drop index {$index}"; - } - - /** - * Compile a drop fulltext index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropFullText(Blueprint $blueprint, Fluent $command) - { - return $this->compileDropIndex($blueprint, $command); - } - - /** - * Compile a drop spatial index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropSpatialIndex(Blueprint $blueprint, Fluent $command) - { - return $this->compileDropIndex($blueprint, $command); - } - - /** - * Compile a drop foreign key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropForeign(Blueprint $blueprint, Fluent $command) - { - $index = $this->wrap($command->index); - - return "alter table {$this->wrapTable($blueprint)} drop foreign key {$index}"; - } - - /** - * Compile a rename table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileRename(Blueprint $blueprint, Fluent $command) - { - $from = $this->wrapTable($blueprint); - - return "rename table {$from} to ".$this->wrapTable($command->to); - } - - /** - * Compile a rename index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileRenameIndex(Blueprint $blueprint, Fluent $command) - { - return sprintf('alter table %s rename index %s to %s', - $this->wrapTable($blueprint), - $this->wrap($command->from), - $this->wrap($command->to) - ); - } - - /** - * Compile the SQL needed to drop all tables. - * - * @param array $tables - * @return string - */ - public function compileDropAllTables($tables) - { - return 'drop table '.implode(',', $this->wrapArray($tables)); - } - - /** - * Compile the SQL needed to drop all views. - * - * @param array $views - * @return string - */ - public function compileDropAllViews($views) - { - return 'drop view '.implode(',', $this->wrapArray($views)); - } - - /** - * Compile the command to enable foreign key constraints. - * - * @return string - */ - public function compileEnableForeignKeyConstraints() - { - return 'SET FOREIGN_KEY_CHECKS=1;'; - } - - /** - * Compile the command to disable foreign key constraints. - * - * @return string - */ - public function compileDisableForeignKeyConstraints() - { - return 'SET FOREIGN_KEY_CHECKS=0;'; - } - - /** - * Compile a table comment command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileTableComment(Blueprint $blueprint, Fluent $command) - { - return sprintf('alter table %s comment = %s', - $this->wrapTable($blueprint), - "'".str_replace("'", "''", $command->comment)."'" - ); - } - - /** - * Create the column definition for a char type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeChar(Fluent $column) - { - return "char({$column->length})"; - } - - /** - * Create the column definition for a string type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeString(Fluent $column) - { - return "varchar({$column->length})"; - } - - /** - * Create the column definition for a tiny text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTinyText(Fluent $column) - { - return 'tinytext'; - } - - /** - * Create the column definition for a text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeText(Fluent $column) - { - return 'text'; - } - - /** - * Create the column definition for a medium text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMediumText(Fluent $column) - { - return 'mediumtext'; - } - - /** - * Create the column definition for a long text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeLongText(Fluent $column) - { - return 'longtext'; - } - - /** - * Create the column definition for a big integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBigInteger(Fluent $column) - { - return 'bigint'; - } - - /** - * Create the column definition for an integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeInteger(Fluent $column) - { - return 'int'; - } - - /** - * Create the column definition for a medium integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMediumInteger(Fluent $column) - { - return 'mediumint'; - } - - /** - * Create the column definition for a tiny integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTinyInteger(Fluent $column) - { - return 'tinyint'; - } - - /** - * Create the column definition for a small integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeSmallInteger(Fluent $column) - { - return 'smallint'; - } - - /** - * Create the column definition for a float type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeFloat(Fluent $column) - { - if ($column->precision) { - return "float({$column->precision})"; - } - - return 'float'; - } - - /** - * Create the column definition for a double type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDouble(Fluent $column) - { - return 'double'; - } - - /** - * Create the column definition for a decimal type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDecimal(Fluent $column) - { - return "decimal({$column->total}, {$column->places})"; - } - - /** - * Create the column definition for a boolean type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBoolean(Fluent $column) - { - return 'tinyint(1)'; - } - - /** - * Create the column definition for an enumeration type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeEnum(Fluent $column) - { - return sprintf('enum(%s)', $this->quoteString($column->allowed)); - } - - /** - * Create the column definition for a set enumeration type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeSet(Fluent $column) - { - return sprintf('set(%s)', $this->quoteString($column->allowed)); - } - - /** - * Create the column definition for a json type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeJson(Fluent $column) - { - return 'json'; - } - - /** - * Create the column definition for a jsonb type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeJsonb(Fluent $column) - { - return 'json'; - } - - /** - * Create the column definition for a date type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDate(Fluent $column) - { - return 'date'; - } - - /** - * Create the column definition for a date-time type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDateTime(Fluent $column) - { - $current = $column->precision ? "CURRENT_TIMESTAMP($column->precision)" : 'CURRENT_TIMESTAMP'; - - if ($column->useCurrent) { - $column->default(new Expression($current)); - } - - if ($column->useCurrentOnUpdate) { - $column->onUpdate(new Expression($current)); - } - - return $column->precision ? "datetime($column->precision)" : 'datetime'; - } - - /** - * Create the column definition for a date-time (with time zone) type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDateTimeTz(Fluent $column) - { - return $this->typeDateTime($column); - } - - /** - * Create the column definition for a time type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTime(Fluent $column) - { - return $column->precision ? "time($column->precision)" : 'time'; - } - - /** - * Create the column definition for a time (with time zone) type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimeTz(Fluent $column) - { - return $this->typeTime($column); - } - - /** - * Create the column definition for a timestamp type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimestamp(Fluent $column) - { - $current = $column->precision ? "CURRENT_TIMESTAMP($column->precision)" : 'CURRENT_TIMESTAMP'; - - if ($column->useCurrent) { - $column->default(new Expression($current)); - } - - if ($column->useCurrentOnUpdate) { - $column->onUpdate(new Expression($current)); - } - - return $column->precision ? "timestamp($column->precision)" : 'timestamp'; - } - - /** - * Create the column definition for a timestamp (with time zone) type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimestampTz(Fluent $column) - { - return $this->typeTimestamp($column); - } - - /** - * Create the column definition for a year type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeYear(Fluent $column) - { - return 'year'; - } - - /** - * Create the column definition for a binary type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBinary(Fluent $column) - { - if ($column->length) { - return $column->fixed ? "binary({$column->length})" : "varbinary({$column->length})"; - } - - return 'blob'; - } - - /** - * Create the column definition for a uuid type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeUuid(Fluent $column) - { - return 'char(36)'; - } - - /** - * Create the column definition for an IP address type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeIpAddress(Fluent $column) - { - return 'varchar(45)'; - } - - /** - * Create the column definition for a MAC address type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMacAddress(Fluent $column) - { - return 'varchar(17)'; - } - - /** - * Create the column definition for a spatial Geometry type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeGeometry(Fluent $column) - { - $subtype = $column->subtype ? strtolower($column->subtype) : null; - - if (! in_array($subtype, ['point', 'linestring', 'polygon', 'geometrycollection', 'multipoint', 'multilinestring', 'multipolygon'])) { - $subtype = null; - } - - return sprintf('%s%s', - $subtype ?? 'geometry', - match (true) { - $column->srid && $this->connection?->isMaria() => ' ref_system_id='.$column->srid, - (bool) $column->srid => ' srid '.$column->srid, - default => '', - } - ); - } - - /** - * Create the column definition for a spatial Geography type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeGeography(Fluent $column) - { - return $this->typeGeometry($column); - } - - /** - * Create the column definition for a generated, computed column type. - * - * @param \Illuminate\Support\Fluent $column - * @return void - * - * @throws \RuntimeException - */ - protected function typeComputed(Fluent $column) - { - throw new RuntimeException('This database driver requires a type, see the virtualAs / storedAs modifiers.'); - } - - /** - * Create the column definition for a vector type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeVector(Fluent $column) - { - return isset($column->dimensions) && $column->dimensions !== '' - ? "vector({$column->dimensions})" - : 'vector'; - } - - /** - * Get the SQL for a generated virtual column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyVirtualAs(Blueprint $blueprint, Fluent $column) - { - if (! is_null($virtualAs = $column->virtualAsJson)) { - if ($this->isJsonSelector($virtualAs)) { - $virtualAs = $this->wrapJsonSelector($virtualAs); - } - - return " as ({$virtualAs})"; - } - - if (! is_null($virtualAs = $column->virtualAs)) { - return " as ({$this->getValue($virtualAs)})"; - } - } - - /** - * Get the SQL for a generated stored column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyStoredAs(Blueprint $blueprint, Fluent $column) - { - if (! is_null($storedAs = $column->storedAsJson)) { - if ($this->isJsonSelector($storedAs)) { - $storedAs = $this->wrapJsonSelector($storedAs); - } - - return " as ({$storedAs}) stored"; - } - - if (! is_null($storedAs = $column->storedAs)) { - return " as ({$this->getValue($storedAs)}) stored"; - } - } - - /** - * Get the SQL for an unsigned column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyUnsigned(Blueprint $blueprint, Fluent $column) - { - if ($column->unsigned) { - return ' unsigned'; - } - } - - /** - * Get the SQL for a character set column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyCharset(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->charset)) { - return ' character set '.$column->charset; - } - } - - /** - * Get the SQL for a collation column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyCollate(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->collation)) { - return " collate '{$column->collation}'"; - } - } - - /** - * Get the SQL for a nullable column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyNullable(Blueprint $blueprint, Fluent $column) - { - if (is_null($column->virtualAs) && - is_null($column->virtualAsJson) && - is_null($column->storedAs) && - is_null($column->storedAsJson)) { - return $column->nullable ? ' null' : ' not null'; - } - - if ($column->nullable === false) { - return ' not null'; - } - } - - /** - * Get the SQL for an invisible column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyInvisible(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->invisible)) { - return ' invisible'; - } - } - - /** - * Get the SQL for a default column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyDefault(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->default)) { - return ' default '.$this->getDefaultValue($column->default); - } - } - - /** - * Get the SQL for an "on update" column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyOnUpdate(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->onUpdate)) { - return ' on update '.$this->getValue($column->onUpdate); - } - } - - /** - * Get the SQL for an auto-increment column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyIncrement(Blueprint $blueprint, Fluent $column) - { - if (in_array($column->type, $this->serials) && $column->autoIncrement) { - return $this->hasCommand($blueprint, 'primary') || ($column->change && ! $column->primary) - ? ' auto_increment' - : ' auto_increment primary key'; - } - } - - /** - * Get the SQL for a "first" column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyFirst(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->first)) { - return ' first'; - } - } - - /** - * Get the SQL for an "after" column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyAfter(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->after)) { - return ' after '.$this->wrap($column->after); - } - } - - /** - * Get the SQL for a "comment" column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyComment(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->comment)) { - return " comment '".addslashes($column->comment)."'"; - } - } - - /** - * Wrap a single string in keyword identifiers. - * - * @param string $value - * @return string - */ - protected function wrapValue($value) - { - if ($value !== '*') { - return '`'.str_replace('`', '``', $value).'`'; - } - - return $value; - } - - /** - * Wrap the given JSON selector. - * - * @param string $value - * @return string - */ - protected function wrapJsonSelector($value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($value); - - return 'json_unquote(json_extract('.$field.$path.'))'; - } -} diff --git a/vendor/illuminate/database/Schema/Grammars/PostgresGrammar.php b/vendor/illuminate/database/Schema/Grammars/PostgresGrammar.php deleted file mode 100644 index c9a579f..0000000 --- a/vendor/illuminate/database/Schema/Grammars/PostgresGrammar.php +++ /dev/null @@ -1,1235 +0,0 @@ -wrapValue($name), - $this->wrapValue($connection->getConfig('charset')), - ); - } - - /** - * Compile a drop database if exists command. - * - * @param string $name - * @return string - */ - public function compileDropDatabaseIfExists($name) - { - return sprintf( - 'drop database if exists %s', - $this->wrapValue($name) - ); - } - - /** - * Compile the query to determine if the given table exists. - * - * @param string $schema - * @param string $table - * @return string - */ - public function compileTableExists($schema, $table) - { - return sprintf( - 'select exists (select 1 from pg_class c, pg_namespace n where ' - ."n.nspname = %s and c.relname = %s and c.relkind in ('r', 'p') and n.oid = c.relnamespace)", - $this->quoteString($schema), - $this->quoteString($table) - ); - } - - /** - * Compile the query to determine the tables. - * - * @return string - */ - public function compileTables() - { - return 'select c.relname as name, n.nspname as schema, pg_total_relation_size(c.oid) as size, ' - ."obj_description(c.oid, 'pg_class') as comment from pg_class c, pg_namespace n " - ."where c.relkind in ('r', 'p') and n.oid = c.relnamespace and n.nspname not in ('pg_catalog', 'information_schema') " - .'order by c.relname'; - } - - /** - * Compile the query to determine the views. - * - * @return string - */ - public function compileViews() - { - return "select viewname as name, schemaname as schema, definition from pg_views where schemaname not in ('pg_catalog', 'information_schema') order by viewname"; - } - - /** - * Compile the query to determine the user-defined types. - * - * @return string - */ - public function compileTypes() - { - return 'select t.typname as name, n.nspname as schema, t.typtype as type, t.typcategory as category, ' - ."((t.typinput = 'array_in'::regproc and t.typoutput = 'array_out'::regproc) or t.typtype = 'm') as implicit " - .'from pg_type t join pg_namespace n on n.oid = t.typnamespace ' - .'left join pg_class c on c.oid = t.typrelid ' - .'left join pg_type el on el.oid = t.typelem ' - .'left join pg_class ce on ce.oid = el.typrelid ' - ."where ((t.typrelid = 0 and (ce.relkind = 'c' or ce.relkind is null)) or c.relkind = 'c') " - ."and not exists (select 1 from pg_depend d where d.objid in (t.oid, t.typelem) and d.deptype = 'e') " - ."and n.nspname not in ('pg_catalog', 'information_schema')"; - } - - /** - * Compile the query to determine the columns. - * - * @param string $schema - * @param string $table - * @return string - */ - public function compileColumns($schema, $table) - { - return sprintf( - 'select a.attname as name, t.typname as type_name, format_type(a.atttypid, a.atttypmod) as type, ' - .'(select tc.collcollate from pg_catalog.pg_collation tc where tc.oid = a.attcollation) as collation, ' - .'not a.attnotnull as nullable, ' - .'(select pg_get_expr(adbin, adrelid) from pg_attrdef where c.oid = pg_attrdef.adrelid and pg_attrdef.adnum = a.attnum) as default, ' - .(version_compare($this->connection?->getServerVersion(), '12.0', '<') ? "'' as generated, " : 'a.attgenerated as generated, ') - .'col_description(c.oid, a.attnum) as comment ' - .'from pg_attribute a, pg_class c, pg_type t, pg_namespace n ' - .'where c.relname = %s and n.nspname = %s and a.attnum > 0 and a.attrelid = c.oid and a.atttypid = t.oid and n.oid = c.relnamespace ' - .'order by a.attnum', - $this->quoteString($table), - $this->quoteString($schema) - ); - } - - /** - * Compile the query to determine the indexes. - * - * @param string $schema - * @param string $table - * @return string - */ - public function compileIndexes($schema, $table) - { - return sprintf( - "select ic.relname as name, string_agg(a.attname, ',' order by indseq.ord) as columns, " - .'am.amname as "type", i.indisunique as "unique", i.indisprimary as "primary" ' - .'from pg_index i ' - .'join pg_class tc on tc.oid = i.indrelid ' - .'join pg_namespace tn on tn.oid = tc.relnamespace ' - .'join pg_class ic on ic.oid = i.indexrelid ' - .'join pg_am am on am.oid = ic.relam ' - .'join lateral unnest(i.indkey) with ordinality as indseq(num, ord) on true ' - .'left join pg_attribute a on a.attrelid = i.indrelid and a.attnum = indseq.num ' - .'where tc.relname = %s and tn.nspname = %s ' - .'group by ic.relname, am.amname, i.indisunique, i.indisprimary', - $this->quoteString($table), - $this->quoteString($schema) - ); - } - - /** - * Compile the query to determine the foreign keys. - * - * @param string $schema - * @param string $table - * @return string - */ - public function compileForeignKeys($schema, $table) - { - return sprintf( - 'select c.conname as name, ' - ."string_agg(la.attname, ',' order by conseq.ord) as columns, " - .'fn.nspname as foreign_schema, fc.relname as foreign_table, ' - ."string_agg(fa.attname, ',' order by conseq.ord) as foreign_columns, " - .'c.confupdtype as on_update, c.confdeltype as on_delete ' - .'from pg_constraint c ' - .'join pg_class tc on c.conrelid = tc.oid ' - .'join pg_namespace tn on tn.oid = tc.relnamespace ' - .'join pg_class fc on c.confrelid = fc.oid ' - .'join pg_namespace fn on fn.oid = fc.relnamespace ' - .'join lateral unnest(c.conkey) with ordinality as conseq(num, ord) on true ' - .'join pg_attribute la on la.attrelid = c.conrelid and la.attnum = conseq.num ' - .'join pg_attribute fa on fa.attrelid = c.confrelid and fa.attnum = c.confkey[conseq.ord] ' - ."where c.contype = 'f' and tc.relname = %s and tn.nspname = %s " - .'group by c.conname, fn.nspname, fc.relname, c.confupdtype, c.confdeltype', - $this->quoteString($table), - $this->quoteString($schema) - ); - } - - /** - * Compile a create table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileCreate(Blueprint $blueprint, Fluent $command) - { - return sprintf('%s table %s (%s)', - $blueprint->temporary ? 'create temporary' : 'create', - $this->wrapTable($blueprint), - implode(', ', $this->getColumns($blueprint)) - ); - } - - /** - * Compile a column addition command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileAdd(Blueprint $blueprint, Fluent $command) - { - return sprintf('alter table %s add column %s', - $this->wrapTable($blueprint), - $this->getColumn($blueprint, $command->column) - ); - } - - /** - * Compile the auto-incrementing column starting values. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileAutoIncrementStartingValues(Blueprint $blueprint, Fluent $command) - { - if ($command->column->autoIncrement - && $value = $command->column->get('startingValue', $command->column->get('from'))) { - $table = last(explode('.', $blueprint->getTable())); - - return 'alter sequence '.$blueprint->getPrefix().$table.'_'.$command->column->name.'_seq restart with '.$value; - } - } - - /** - * Compile a change column command into a series of SQL statements. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return array|string - * - * @throws \RuntimeException - */ - public function compileChange(Blueprint $blueprint, Fluent $command, Connection $connection) - { - $column = $command->column; - - $changes = ['type '.$this->getType($column).$this->modifyCollate($blueprint, $column)]; - - foreach ($this->modifiers as $modifier) { - if ($modifier === 'Collate') { - continue; - } - - if (method_exists($this, $method = "modify{$modifier}")) { - $constraints = (array) $this->{$method}($blueprint, $column); - - foreach ($constraints as $constraint) { - $changes[] = $constraint; - } - } - } - - return sprintf('alter table %s %s', - $this->wrapTable($blueprint), - implode(', ', $this->prefixArray('alter column '.$this->wrap($column), $changes)) - ); - } - - /** - * Compile a primary key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compilePrimary(Blueprint $blueprint, Fluent $command) - { - $columns = $this->columnize($command->columns); - - return 'alter table '.$this->wrapTable($blueprint)." add primary key ({$columns})"; - } - - /** - * Compile a unique key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileUnique(Blueprint $blueprint, Fluent $command) - { - $sql = sprintf('alter table %s add constraint %s unique (%s)', - $this->wrapTable($blueprint), - $this->wrap($command->index), - $this->columnize($command->columns) - ); - - if (! is_null($command->deferrable)) { - $sql .= $command->deferrable ? ' deferrable' : ' not deferrable'; - } - - if ($command->deferrable && ! is_null($command->initiallyImmediate)) { - $sql .= $command->initiallyImmediate ? ' initially immediate' : ' initially deferred'; - } - - return $sql; - } - - /** - * Compile a plain index key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileIndex(Blueprint $blueprint, Fluent $command) - { - return sprintf('create index %s on %s%s (%s)', - $this->wrap($command->index), - $this->wrapTable($blueprint), - $command->algorithm ? ' using '.$command->algorithm : '', - $this->columnize($command->columns) - ); - } - - /** - * Compile a fulltext index key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - * - * @throws \RuntimeException - */ - public function compileFulltext(Blueprint $blueprint, Fluent $command) - { - $language = $command->language ?: 'english'; - - $columns = array_map(function ($column) use ($language) { - return "to_tsvector({$this->quoteString($language)}, {$this->wrap($column)})"; - }, $command->columns); - - return sprintf('create index %s on %s using gin ((%s))', - $this->wrap($command->index), - $this->wrapTable($blueprint), - implode(' || ', $columns) - ); - } - - /** - * Compile a spatial index key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileSpatialIndex(Blueprint $blueprint, Fluent $command) - { - $command->algorithm = 'gist'; - - return $this->compileIndex($blueprint, $command); - } - - /** - * Compile a foreign key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileForeign(Blueprint $blueprint, Fluent $command) - { - $sql = parent::compileForeign($blueprint, $command); - - if (! is_null($command->deferrable)) { - $sql .= $command->deferrable ? ' deferrable' : ' not deferrable'; - } - - if ($command->deferrable && ! is_null($command->initiallyImmediate)) { - $sql .= $command->initiallyImmediate ? ' initially immediate' : ' initially deferred'; - } - - if (! is_null($command->notValid)) { - $sql .= ' not valid'; - } - - return $sql; - } - - /** - * Compile a drop table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDrop(Blueprint $blueprint, Fluent $command) - { - return 'drop table '.$this->wrapTable($blueprint); - } - - /** - * Compile a drop table (if exists) command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropIfExists(Blueprint $blueprint, Fluent $command) - { - return 'drop table if exists '.$this->wrapTable($blueprint); - } - - /** - * Compile the SQL needed to drop all tables. - * - * @param array $tables - * @return string - */ - public function compileDropAllTables($tables) - { - return 'drop table '.implode(',', $this->escapeNames($tables)).' cascade'; - } - - /** - * Compile the SQL needed to drop all views. - * - * @param array $views - * @return string - */ - public function compileDropAllViews($views) - { - return 'drop view '.implode(',', $this->escapeNames($views)).' cascade'; - } - - /** - * Compile the SQL needed to drop all types. - * - * @param array $types - * @return string - */ - public function compileDropAllTypes($types) - { - return 'drop type '.implode(',', $this->escapeNames($types)).' cascade'; - } - - /** - * Compile the SQL needed to drop all domains. - * - * @param array $domains - * @return string - */ - public function compileDropAllDomains($domains) - { - return 'drop domain '.implode(',', $this->escapeNames($domains)).' cascade'; - } - - /** - * Compile a drop column command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropColumn(Blueprint $blueprint, Fluent $command) - { - $columns = $this->prefixArray('drop column', $this->wrapArray($command->columns)); - - return 'alter table '.$this->wrapTable($blueprint).' '.implode(', ', $columns); - } - - /** - * Compile a drop primary key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropPrimary(Blueprint $blueprint, Fluent $command) - { - $table = last(explode('.', $blueprint->getTable())); - $index = $this->wrap("{$blueprint->getPrefix()}{$table}_pkey"); - - return 'alter table '.$this->wrapTable($blueprint)." drop constraint {$index}"; - } - - /** - * Compile a drop unique key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropUnique(Blueprint $blueprint, Fluent $command) - { - $index = $this->wrap($command->index); - - return "alter table {$this->wrapTable($blueprint)} drop constraint {$index}"; - } - - /** - * Compile a drop index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropIndex(Blueprint $blueprint, Fluent $command) - { - return "drop index {$this->wrap($command->index)}"; - } - - /** - * Compile a drop fulltext index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropFullText(Blueprint $blueprint, Fluent $command) - { - return $this->compileDropIndex($blueprint, $command); - } - - /** - * Compile a drop spatial index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropSpatialIndex(Blueprint $blueprint, Fluent $command) - { - return $this->compileDropIndex($blueprint, $command); - } - - /** - * Compile a drop foreign key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropForeign(Blueprint $blueprint, Fluent $command) - { - $index = $this->wrap($command->index); - - return "alter table {$this->wrapTable($blueprint)} drop constraint {$index}"; - } - - /** - * Compile a rename table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileRename(Blueprint $blueprint, Fluent $command) - { - $from = $this->wrapTable($blueprint); - - return "alter table {$from} rename to ".$this->wrapTable($command->to); - } - - /** - * Compile a rename index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileRenameIndex(Blueprint $blueprint, Fluent $command) - { - return sprintf('alter index %s rename to %s', - $this->wrap($command->from), - $this->wrap($command->to) - ); - } - - /** - * Compile the command to enable foreign key constraints. - * - * @return string - */ - public function compileEnableForeignKeyConstraints() - { - return 'SET CONSTRAINTS ALL IMMEDIATE;'; - } - - /** - * Compile the command to disable foreign key constraints. - * - * @return string - */ - public function compileDisableForeignKeyConstraints() - { - return 'SET CONSTRAINTS ALL DEFERRED;'; - } - - /** - * Compile a comment command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileComment(Blueprint $blueprint, Fluent $command) - { - if (! is_null($comment = $command->column->comment) || $command->column->change) { - return sprintf('comment on column %s.%s is %s', - $this->wrapTable($blueprint), - $this->wrap($command->column->name), - is_null($comment) ? 'NULL' : "'".str_replace("'", "''", $comment)."'" - ); - } - } - - /** - * Compile a table comment command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileTableComment(Blueprint $blueprint, Fluent $command) - { - return sprintf('comment on table %s is %s', - $this->wrapTable($blueprint), - "'".str_replace("'", "''", $command->comment)."'" - ); - } - - /** - * Quote-escape the given tables, views, or types. - * - * @param array $names - * @return array - */ - public function escapeNames($names) - { - return array_map(static function ($name) { - return '"'.(new Collection(explode('.', $name))) - ->map(fn ($segment) => trim($segment, '\'"')) - ->implode('"."').'"'; - }, $names); - } - - /** - * Create the column definition for a char type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeChar(Fluent $column) - { - if ($column->length) { - return "char({$column->length})"; - } - - return 'char'; - } - - /** - * Create the column definition for a string type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeString(Fluent $column) - { - if ($column->length) { - return "varchar({$column->length})"; - } - - return 'varchar'; - } - - /** - * Create the column definition for a tiny text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTinyText(Fluent $column) - { - return 'varchar(255)'; - } - - /** - * Create the column definition for a text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeText(Fluent $column) - { - return 'text'; - } - - /** - * Create the column definition for a medium text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMediumText(Fluent $column) - { - return 'text'; - } - - /** - * Create the column definition for a long text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeLongText(Fluent $column) - { - return 'text'; - } - - /** - * Create the column definition for an integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeInteger(Fluent $column) - { - return $column->autoIncrement && is_null($column->generatedAs) && ! $column->change ? 'serial' : 'integer'; - } - - /** - * Create the column definition for a big integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBigInteger(Fluent $column) - { - return $column->autoIncrement && is_null($column->generatedAs) && ! $column->change ? 'bigserial' : 'bigint'; - } - - /** - * Create the column definition for a medium integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMediumInteger(Fluent $column) - { - return $this->typeInteger($column); - } - - /** - * Create the column definition for a tiny integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTinyInteger(Fluent $column) - { - return $this->typeSmallInteger($column); - } - - /** - * Create the column definition for a small integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeSmallInteger(Fluent $column) - { - return $column->autoIncrement && is_null($column->generatedAs) && ! $column->change ? 'smallserial' : 'smallint'; - } - - /** - * Create the column definition for a float type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeFloat(Fluent $column) - { - if ($column->precision) { - return "float({$column->precision})"; - } - - return 'float'; - } - - /** - * Create the column definition for a double type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDouble(Fluent $column) - { - return 'double precision'; - } - - /** - * Create the column definition for a real type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeReal(Fluent $column) - { - return 'real'; - } - - /** - * Create the column definition for a decimal type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDecimal(Fluent $column) - { - return "decimal({$column->total}, {$column->places})"; - } - - /** - * Create the column definition for a boolean type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBoolean(Fluent $column) - { - return 'boolean'; - } - - /** - * Create the column definition for an enumeration type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeEnum(Fluent $column) - { - return sprintf( - 'varchar(255) check ("%s" in (%s))', - $column->name, - $this->quoteString($column->allowed) - ); - } - - /** - * Create the column definition for a json type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeJson(Fluent $column) - { - return 'json'; - } - - /** - * Create the column definition for a jsonb type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeJsonb(Fluent $column) - { - return 'jsonb'; - } - - /** - * Create the column definition for a date type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDate(Fluent $column) - { - return 'date'; - } - - /** - * Create the column definition for a date-time type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDateTime(Fluent $column) - { - return $this->typeTimestamp($column); - } - - /** - * Create the column definition for a date-time (with time zone) type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDateTimeTz(Fluent $column) - { - return $this->typeTimestampTz($column); - } - - /** - * Create the column definition for a time type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTime(Fluent $column) - { - return 'time'.(is_null($column->precision) ? '' : "($column->precision)").' without time zone'; - } - - /** - * Create the column definition for a time (with time zone) type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimeTz(Fluent $column) - { - return 'time'.(is_null($column->precision) ? '' : "($column->precision)").' with time zone'; - } - - /** - * Create the column definition for a timestamp type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimestamp(Fluent $column) - { - if ($column->useCurrent) { - $column->default(new Expression('CURRENT_TIMESTAMP')); - } - - return 'timestamp'.(is_null($column->precision) ? '' : "($column->precision)").' without time zone'; - } - - /** - * Create the column definition for a timestamp (with time zone) type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimestampTz(Fluent $column) - { - if ($column->useCurrent) { - $column->default(new Expression('CURRENT_TIMESTAMP')); - } - - return 'timestamp'.(is_null($column->precision) ? '' : "($column->precision)").' with time zone'; - } - - /** - * Create the column definition for a year type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeYear(Fluent $column) - { - return $this->typeInteger($column); - } - - /** - * Create the column definition for a binary type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBinary(Fluent $column) - { - return 'bytea'; - } - - /** - * Create the column definition for a uuid type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeUuid(Fluent $column) - { - return 'uuid'; - } - - /** - * Create the column definition for an IP address type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeIpAddress(Fluent $column) - { - return 'inet'; - } - - /** - * Create the column definition for a MAC address type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMacAddress(Fluent $column) - { - return 'macaddr'; - } - - /** - * Create the column definition for a spatial Geometry type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeGeometry(Fluent $column) - { - if ($column->subtype) { - return sprintf('geometry(%s%s)', - strtolower($column->subtype), - $column->srid ? ','.$column->srid : '' - ); - } - - return 'geometry'; - } - - /** - * Create the column definition for a spatial Geography type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeGeography(Fluent $column) - { - if ($column->subtype) { - return sprintf('geography(%s%s)', - strtolower($column->subtype), - $column->srid ? ','.$column->srid : '' - ); - } - - return 'geography'; - } - - /** - * Create the column definition for a vector type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeVector(Fluent $column) - { - return isset($column->dimensions) && $column->dimensions !== '' - ? "vector({$column->dimensions})" - : 'vector'; - } - - /** - * Get the SQL for a collation column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyCollate(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->collation)) { - return ' collate '.$this->wrapValue($column->collation); - } - } - - /** - * Get the SQL for a nullable column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyNullable(Blueprint $blueprint, Fluent $column) - { - if ($column->change) { - return $column->nullable ? 'drop not null' : 'set not null'; - } - - return $column->nullable ? ' null' : ' not null'; - } - - /** - * Get the SQL for a default column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyDefault(Blueprint $blueprint, Fluent $column) - { - if ($column->change) { - if (! $column->autoIncrement || ! is_null($column->generatedAs)) { - return is_null($column->default) ? 'drop default' : 'set default '.$this->getDefaultValue($column->default); - } - - return null; - } - - if (! is_null($column->default)) { - return ' default '.$this->getDefaultValue($column->default); - } - } - - /** - * Get the SQL for an auto-increment column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyIncrement(Blueprint $blueprint, Fluent $column) - { - if (! $column->change - && ! $this->hasCommand($blueprint, 'primary') - && (in_array($column->type, $this->serials) || ($column->generatedAs !== null)) - && $column->autoIncrement) { - return ' primary key'; - } - } - - /** - * Get the SQL for a generated virtual column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyVirtualAs(Blueprint $blueprint, Fluent $column) - { - if ($column->change) { - if (array_key_exists('virtualAs', $column->getAttributes())) { - return is_null($column->virtualAs) - ? 'drop expression if exists' - : throw new LogicException('This database driver does not support modifying generated columns.'); - } - - return null; - } - - if (! is_null($column->virtualAs)) { - return " generated always as ({$this->getValue($column->virtualAs)})"; - } - } - - /** - * Get the SQL for a generated stored column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyStoredAs(Blueprint $blueprint, Fluent $column) - { - if ($column->change) { - if (array_key_exists('storedAs', $column->getAttributes())) { - return is_null($column->storedAs) - ? 'drop expression if exists' - : throw new LogicException('This database driver does not support modifying generated columns.'); - } - - return null; - } - - if (! is_null($column->storedAs)) { - return " generated always as ({$this->getValue($column->storedAs)}) stored"; - } - } - - /** - * Get the SQL for an identity column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|array|null - */ - protected function modifyGeneratedAs(Blueprint $blueprint, Fluent $column) - { - $sql = null; - - if (! is_null($column->generatedAs)) { - $sql = sprintf( - ' generated %s as identity%s', - $column->always ? 'always' : 'by default', - ! is_bool($column->generatedAs) && ! empty($column->generatedAs) ? " ({$column->generatedAs})" : '' - ); - } - - if ($column->change) { - $changes = $column->autoIncrement && is_null($sql) ? [] : ['drop identity if exists']; - - if (! is_null($sql)) { - $changes[] = 'add '.$sql; - } - - return $changes; - } - - return $sql; - } -} diff --git a/vendor/illuminate/database/Schema/Grammars/SQLiteGrammar.php b/vendor/illuminate/database/Schema/Grammars/SQLiteGrammar.php deleted file mode 100644 index b40f6cf..0000000 --- a/vendor/illuminate/database/Schema/Grammars/SQLiteGrammar.php +++ /dev/null @@ -1,1183 +0,0 @@ -getServerVersion(), '3.35', '<')) { - $alterCommands[] = 'dropColumn'; - } - - return $alterCommands; - } - - /** - * Compile the query to determine the SQL text that describes the given object. - * - * @param string $name - * @param string $type - * @return string - */ - public function compileSqlCreateStatement($name, $type = 'table') - { - return sprintf('select "sql" from sqlite_master where type = %s and name = %s', - $this->quoteString($type), - $this->quoteString(str_replace('.', '__', $name)) - ); - } - - /** - * Compile the query to determine if the dbstat table is available. - * - * @return string - */ - public function compileDbstatExists() - { - return "select exists (select 1 from pragma_compile_options where compile_options = 'ENABLE_DBSTAT_VTAB') as enabled"; - } - - /** - * Compile the query to determine if the given table exists. - * - * @param string $table - * @return string - */ - public function compileTableExists($table) - { - return sprintf( - 'select exists (select 1 from sqlite_master where name = %s and type = \'table\') as "exists"', - $this->quoteString(str_replace('.', '__', $table)) - ); - } - - /** - * Compile the query to determine the tables. - * - * @param bool $withSize - * @return string - */ - public function compileTables($withSize = false) - { - return $withSize - ? 'select m.tbl_name as name, sum(s.pgsize) as size from sqlite_master as m ' - .'join dbstat as s on s.name = m.name ' - ."where m.type in ('table', 'index') and m.tbl_name not like 'sqlite_%' " - .'group by m.tbl_name ' - .'order by m.tbl_name' - : "select name from sqlite_master where type = 'table' and name not like 'sqlite_%' order by name"; - } - - /** - * Compile the query to determine the views. - * - * @return string - */ - public function compileViews() - { - return "select name, sql as definition from sqlite_master where type = 'view' order by name"; - } - - /** - * Compile the query to determine the columns. - * - * @param string $table - * @return string - */ - public function compileColumns($table) - { - return sprintf( - 'select name, type, not "notnull" as "nullable", dflt_value as "default", pk as "primary", hidden as "extra" ' - .'from pragma_table_xinfo(%s) order by cid asc', - $this->quoteString(str_replace('.', '__', $table)) - ); - } - - /** - * Compile the query to determine the indexes. - * - * @param string $table - * @return string - */ - public function compileIndexes($table) - { - return sprintf( - 'select \'primary\' as name, group_concat(col) as columns, 1 as "unique", 1 as "primary" ' - .'from (select name as col from pragma_table_info(%s) where pk > 0 order by pk, cid) group by name ' - .'union select name, group_concat(col) as columns, "unique", origin = \'pk\' as "primary" ' - .'from (select il.*, ii.name as col from pragma_index_list(%s) il, pragma_index_info(il.name) ii order by il.seq, ii.seqno) ' - .'group by name, "unique", "primary"', - $table = $this->quoteString(str_replace('.', '__', $table)), - $table - ); - } - - /** - * Compile the query to determine the foreign keys. - * - * @param string $table - * @return string - */ - public function compileForeignKeys($table) - { - return sprintf( - 'select group_concat("from") as columns, "table" as foreign_table, ' - .'group_concat("to") as foreign_columns, on_update, on_delete ' - .'from (select * from pragma_foreign_key_list(%s) order by id desc, seq) ' - .'group by id, "table", on_update, on_delete', - $this->quoteString(str_replace('.', '__', $table)) - ); - } - - /** - * Compile a create table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileCreate(Blueprint $blueprint, Fluent $command) - { - return sprintf('%s table %s (%s%s%s)', - $blueprint->temporary ? 'create temporary' : 'create', - $this->wrapTable($blueprint), - implode(', ', $this->getColumns($blueprint)), - $this->addForeignKeys($this->getCommandsByName($blueprint, 'foreign')), - $this->addPrimaryKeys($this->getCommandByName($blueprint, 'primary')) - ); - } - - /** - * Get the foreign key syntax for a table creation statement. - * - * @param \Illuminate\Database\Schema\ForeignKeyDefinition[] $foreignKeys - * @return string|null - */ - protected function addForeignKeys($foreignKeys) - { - return (new Collection($foreignKeys))->reduce(function ($sql, $foreign) { - // Once we have all the foreign key commands for the table creation statement - // we'll loop through each of them and add them to the create table SQL we - // are building, since SQLite needs foreign keys on the tables creation. - return $sql.$this->getForeignKey($foreign); - }, ''); - } - - /** - * Get the SQL for the foreign key. - * - * @param \Illuminate\Support\Fluent $foreign - * @return string - */ - protected function getForeignKey($foreign) - { - // We need to columnize the columns that the foreign key is being defined for - // so that it is a properly formatted list. Once we have done this, we can - // return the foreign key SQL declaration to the calling method for use. - $sql = sprintf(', foreign key(%s) references %s(%s)', - $this->columnize($foreign->columns), - $this->wrapTable($foreign->on), - $this->columnize((array) $foreign->references) - ); - - if (! is_null($foreign->onDelete)) { - $sql .= " on delete {$foreign->onDelete}"; - } - - // If this foreign key specifies the action to be taken on update we will add - // that to the statement here. We'll append it to this SQL and then return - // this SQL so we can keep adding any other foreign constraints to this. - if (! is_null($foreign->onUpdate)) { - $sql .= " on update {$foreign->onUpdate}"; - } - - return $sql; - } - - /** - * Get the primary key syntax for a table creation statement. - * - * @param \Illuminate\Support\Fluent|null $primary - * @return string|null - */ - protected function addPrimaryKeys($primary) - { - if (! is_null($primary)) { - return ", primary key ({$this->columnize($primary->columns)})"; - } - } - - /** - * Compile alter table commands for adding columns. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileAdd(Blueprint $blueprint, Fluent $command) - { - return sprintf('alter table %s add column %s', - $this->wrapTable($blueprint), - $this->getColumn($blueprint, $command->column) - ); - } - - /** - * Compile alter table command into a series of SQL statements. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return array|string - * - * @throws \RuntimeException - */ - public function compileAlter(Blueprint $blueprint, Fluent $command, Connection $connection) - { - $columnNames = []; - $autoIncrementColumn = null; - - $columns = (new Collection($blueprint->getState()->getColumns())) - ->map(function ($column) use ($blueprint, &$columnNames, &$autoIncrementColumn) { - $name = $this->wrap($column); - - $autoIncrementColumn = $column->autoIncrement ? $column->name : $autoIncrementColumn; - - if (is_null($column->virtualAs) && is_null($column->virtualAsJson) && - is_null($column->storedAs) && is_null($column->storedAsJson)) { - $columnNames[] = $name; - } - - return $this->addModifiers( - $this->wrap($column).' '.($column->full_type_definition ?? $this->getType($column)), - $blueprint, - $column - ); - })->all(); - - $indexes = (new Collection($blueprint->getState()->getIndexes())) - ->reject(fn ($index) => str_starts_with('sqlite_', $index->index)) - ->map(fn ($index) => $this->{'compile'.ucfirst($index->name)}($blueprint, $index)) - ->all(); - - $tempTable = $this->wrap('__temp__'.$blueprint->getPrefix().$blueprint->getTable()); - $table = $this->wrapTable($blueprint); - $columnNames = implode(', ', $columnNames); - - $foreignKeyConstraintsEnabled = $connection->scalar('pragma foreign_keys'); - - return array_filter(array_merge([ - $foreignKeyConstraintsEnabled ? $this->compileDisableForeignKeyConstraints() : null, - sprintf('create table %s (%s%s%s)', - $tempTable, - implode(', ', $columns), - $this->addForeignKeys($blueprint->getState()->getForeignKeys()), - $autoIncrementColumn ? '' : $this->addPrimaryKeys($blueprint->getState()->getPrimaryKey()) - ), - sprintf('insert into %s (%s) select %s from %s', $tempTable, $columnNames, $columnNames, $table), - sprintf('drop table %s', $table), - sprintf('alter table %s rename to %s', $tempTable, $table), - ], $indexes, [$foreignKeyConstraintsEnabled ? $this->compileEnableForeignKeyConstraints() : null])); - } - - /** - * Compile a change column command into a series of SQL statements. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return array|string - * - * @throws \RuntimeException - */ - public function compileChange(Blueprint $blueprint, Fluent $command, Connection $connection) - { - // Handled on table alteration... - } - - /** - * Compile a primary key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compilePrimary(Blueprint $blueprint, Fluent $command) - { - // Handled on table creation or alteration... - } - - /** - * Compile a unique key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileUnique(Blueprint $blueprint, Fluent $command) - { - return sprintf('create unique index %s on %s (%s)', - $this->wrap($command->index), - $this->wrapTable($blueprint), - $this->columnize($command->columns) - ); - } - - /** - * Compile a plain index key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileIndex(Blueprint $blueprint, Fluent $command) - { - return sprintf('create index %s on %s (%s)', - $this->wrap($command->index), - $this->wrapTable($blueprint), - $this->columnize($command->columns) - ); - } - - /** - * Compile a spatial index key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return void - * - * @throws \RuntimeException - */ - public function compileSpatialIndex(Blueprint $blueprint, Fluent $command) - { - throw new RuntimeException('The database driver in use does not support spatial indexes.'); - } - - /** - * Compile a foreign key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string|null - */ - public function compileForeign(Blueprint $blueprint, Fluent $command) - { - // Handled on table creation or alteration... - } - - /** - * Compile a drop table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDrop(Blueprint $blueprint, Fluent $command) - { - return 'drop table '.$this->wrapTable($blueprint); - } - - /** - * Compile a drop table (if exists) command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropIfExists(Blueprint $blueprint, Fluent $command) - { - return 'drop table if exists '.$this->wrapTable($blueprint); - } - - /** - * Compile the SQL needed to drop all tables. - * - * @return string - */ - public function compileDropAllTables() - { - return "delete from sqlite_master where type in ('table', 'index', 'trigger')"; - } - - /** - * Compile the SQL needed to drop all views. - * - * @return string - */ - public function compileDropAllViews() - { - return "delete from sqlite_master where type in ('view')"; - } - - /** - * Compile the SQL needed to rebuild the database. - * - * @return string - */ - public function compileRebuild() - { - return 'vacuum'; - } - - /** - * Compile a drop column command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return array|null - */ - public function compileDropColumn(Blueprint $blueprint, Fluent $command, Connection $connection) - { - if (version_compare($connection->getServerVersion(), '3.35', '<')) { - // Handled on table alteration... - - return null; - } - - $table = $this->wrapTable($blueprint); - - $columns = $this->prefixArray('drop column', $this->wrapArray($command->columns)); - - return (new Collection($columns))->map(fn ($column) => 'alter table '.$table.' '.$column)->all(); - } - - /** - * Compile a drop primary key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropPrimary(Blueprint $blueprint, Fluent $command) - { - // Handled on table alteration... - } - - /** - * Compile a drop unique key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropUnique(Blueprint $blueprint, Fluent $command) - { - $index = $this->wrap($command->index); - - return "drop index {$index}"; - } - - /** - * Compile a drop index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropIndex(Blueprint $blueprint, Fluent $command) - { - $index = $this->wrap($command->index); - - return "drop index {$index}"; - } - - /** - * Compile a drop spatial index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return void - * - * @throws \RuntimeException - */ - public function compileDropSpatialIndex(Blueprint $blueprint, Fluent $command) - { - throw new RuntimeException('The database driver in use does not support spatial indexes.'); - } - - /** - * Compile a drop foreign key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return array - */ - public function compileDropForeign(Blueprint $blueprint, Fluent $command) - { - if (empty($command->columns)) { - throw new RuntimeException('This database driver does not support dropping foreign keys by name.'); - } - - // Handled on table alteration... - } - - /** - * Compile a rename table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileRename(Blueprint $blueprint, Fluent $command) - { - $from = $this->wrapTable($blueprint); - - return "alter table {$from} rename to ".$this->wrapTable($command->to); - } - - /** - * Compile a rename index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return array - * - * @throws \RuntimeException - */ - public function compileRenameIndex(Blueprint $blueprint, Fluent $command, Connection $connection) - { - $indexes = $connection->getSchemaBuilder()->getIndexes($blueprint->getTable()); - - $index = Arr::first($indexes, fn ($index) => $index['name'] === $command->from); - - if (! $index) { - throw new RuntimeException("Index [{$command->from}] does not exist."); - } - - if ($index['primary']) { - throw new RuntimeException('SQLite does not support altering primary keys.'); - } - - if ($index['unique']) { - return [ - $this->compileDropUnique($blueprint, new IndexDefinition(['index' => $index['name']])), - $this->compileUnique($blueprint, - new IndexDefinition(['index' => $command->to, 'columns' => $index['columns']]) - ), - ]; - } - - return [ - $this->compileDropIndex($blueprint, new IndexDefinition(['index' => $index['name']])), - $this->compileIndex($blueprint, - new IndexDefinition(['index' => $command->to, 'columns' => $index['columns']]) - ), - ]; - } - - /** - * Compile the command to enable foreign key constraints. - * - * @return string - */ - public function compileEnableForeignKeyConstraints() - { - return $this->pragma('foreign_keys', 'ON'); - } - - /** - * Compile the command to disable foreign key constraints. - * - * @return string - */ - public function compileDisableForeignKeyConstraints() - { - return $this->pragma('foreign_keys', 'OFF'); - } - - /** - * Compile the command to set the busy timeout. - * - * @param int $milliseconds - * @return string - */ - public function compileSetBusyTimeout($milliseconds) - { - return $this->pragma('busy_timeout', $milliseconds); - } - - /** - * Compile the command to set the journal mode. - * - * @param string $mode - * @return string - */ - public function compileSetJournalMode($mode) - { - return $this->pragma('journal_mode', $mode); - } - - /** - * Compile the command to set the synchronous mode. - * - * @param string $mode - * @return string - */ - public function compileSetSynchronous($mode) - { - return $this->pragma('synchronous', $mode); - } - - /** - * Compile the SQL needed to enable a writable schema. - * - * @return string - */ - public function compileEnableWriteableSchema() - { - return $this->pragma('writable_schema', 1); - } - - /** - * Compile the SQL needed to disable a writable schema. - * - * @return string - */ - public function compileDisableWriteableSchema() - { - return $this->pragma('writable_schema', 0); - } - - /** - * Get the SQL to set a PRAGMA value. - * - * @param string $name - * @param mixed $value - * @return string - */ - protected function pragma(string $name, mixed $value): string - { - return sprintf('PRAGMA %s = %s;', $name, $value); - } - - /** - * Create the column definition for a char type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeChar(Fluent $column) - { - return 'varchar'; - } - - /** - * Create the column definition for a string type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeString(Fluent $column) - { - return 'varchar'; - } - - /** - * Create the column definition for a tiny text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTinyText(Fluent $column) - { - return 'text'; - } - - /** - * Create the column definition for a text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeText(Fluent $column) - { - return 'text'; - } - - /** - * Create the column definition for a medium text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMediumText(Fluent $column) - { - return 'text'; - } - - /** - * Create the column definition for a long text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeLongText(Fluent $column) - { - return 'text'; - } - - /** - * Create the column definition for an integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeInteger(Fluent $column) - { - return 'integer'; - } - - /** - * Create the column definition for a big integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBigInteger(Fluent $column) - { - return 'integer'; - } - - /** - * Create the column definition for a medium integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMediumInteger(Fluent $column) - { - return 'integer'; - } - - /** - * Create the column definition for a tiny integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTinyInteger(Fluent $column) - { - return 'integer'; - } - - /** - * Create the column definition for a small integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeSmallInteger(Fluent $column) - { - return 'integer'; - } - - /** - * Create the column definition for a float type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeFloat(Fluent $column) - { - return 'float'; - } - - /** - * Create the column definition for a double type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDouble(Fluent $column) - { - return 'double'; - } - - /** - * Create the column definition for a decimal type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDecimal(Fluent $column) - { - return 'numeric'; - } - - /** - * Create the column definition for a boolean type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBoolean(Fluent $column) - { - return 'tinyint(1)'; - } - - /** - * Create the column definition for an enumeration type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeEnum(Fluent $column) - { - return sprintf( - 'varchar check ("%s" in (%s))', - $column->name, - $this->quoteString($column->allowed) - ); - } - - /** - * Create the column definition for a json type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeJson(Fluent $column) - { - return 'text'; - } - - /** - * Create the column definition for a jsonb type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeJsonb(Fluent $column) - { - return 'text'; - } - - /** - * Create the column definition for a date type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDate(Fluent $column) - { - return 'date'; - } - - /** - * Create the column definition for a date-time type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDateTime(Fluent $column) - { - return $this->typeTimestamp($column); - } - - /** - * Create the column definition for a date-time (with time zone) type. - * - * Note: "SQLite does not have a storage class set aside for storing dates and/or times." - * - * @link https://www.sqlite.org/datatype3.html - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDateTimeTz(Fluent $column) - { - return $this->typeDateTime($column); - } - - /** - * Create the column definition for a time type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTime(Fluent $column) - { - return 'time'; - } - - /** - * Create the column definition for a time (with time zone) type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimeTz(Fluent $column) - { - return $this->typeTime($column); - } - - /** - * Create the column definition for a timestamp type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimestamp(Fluent $column) - { - if ($column->useCurrent) { - $column->default(new Expression('CURRENT_TIMESTAMP')); - } - - return 'datetime'; - } - - /** - * Create the column definition for a timestamp (with time zone) type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimestampTz(Fluent $column) - { - return $this->typeTimestamp($column); - } - - /** - * Create the column definition for a year type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeYear(Fluent $column) - { - return $this->typeInteger($column); - } - - /** - * Create the column definition for a binary type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBinary(Fluent $column) - { - return 'blob'; - } - - /** - * Create the column definition for a uuid type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeUuid(Fluent $column) - { - return 'varchar'; - } - - /** - * Create the column definition for an IP address type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeIpAddress(Fluent $column) - { - return 'varchar'; - } - - /** - * Create the column definition for a MAC address type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMacAddress(Fluent $column) - { - return 'varchar'; - } - - /** - * Create the column definition for a spatial Geometry type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeGeometry(Fluent $column) - { - return 'geometry'; - } - - /** - * Create the column definition for a spatial Geography type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeGeography(Fluent $column) - { - return $this->typeGeometry($column); - } - - /** - * Create the column definition for a generated, computed column type. - * - * @param \Illuminate\Support\Fluent $column - * @return void - * - * @throws \RuntimeException - */ - protected function typeComputed(Fluent $column) - { - throw new RuntimeException('This database driver requires a type, see the virtualAs / storedAs modifiers.'); - } - - /** - * Get the SQL for a generated virtual column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyVirtualAs(Blueprint $blueprint, Fluent $column) - { - if (! is_null($virtualAs = $column->virtualAsJson)) { - if ($this->isJsonSelector($virtualAs)) { - $virtualAs = $this->wrapJsonSelector($virtualAs); - } - - return " as ({$virtualAs})"; - } - - if (! is_null($virtualAs = $column->virtualAs)) { - return " as ({$this->getValue($virtualAs)})"; - } - } - - /** - * Get the SQL for a generated stored column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyStoredAs(Blueprint $blueprint, Fluent $column) - { - if (! is_null($storedAs = $column->storedAsJson)) { - if ($this->isJsonSelector($storedAs)) { - $storedAs = $this->wrapJsonSelector($storedAs); - } - - return " as ({$storedAs}) stored"; - } - - if (! is_null($storedAs = $column->storedAs)) { - return " as ({$this->getValue($column->storedAs)}) stored"; - } - } - - /** - * Get the SQL for a nullable column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyNullable(Blueprint $blueprint, Fluent $column) - { - if (is_null($column->virtualAs) && - is_null($column->virtualAsJson) && - is_null($column->storedAs) && - is_null($column->storedAsJson)) { - return $column->nullable ? '' : ' not null'; - } - - if ($column->nullable === false) { - return ' not null'; - } - } - - /** - * Get the SQL for a default column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyDefault(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->default) && is_null($column->virtualAs) && is_null($column->virtualAsJson) && is_null($column->storedAs)) { - return ' default '.$this->getDefaultValue($column->default); - } - } - - /** - * Get the SQL for an auto-increment column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyIncrement(Blueprint $blueprint, Fluent $column) - { - if (in_array($column->type, $this->serials) && $column->autoIncrement) { - return ' primary key autoincrement'; - } - } - - /** - * Get the SQL for a collation column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyCollate(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->collation)) { - return " collate '{$column->collation}'"; - } - } - - /** - * Wrap the given JSON selector. - * - * @param string $value - * @return string - */ - protected function wrapJsonSelector($value) - { - [$field, $path] = $this->wrapJsonFieldAndPath($value); - - return 'json_extract('.$field.$path.')'; - } -} diff --git a/vendor/illuminate/database/Schema/Grammars/SqlServerGrammar.php b/vendor/illuminate/database/Schema/Grammars/SqlServerGrammar.php deleted file mode 100644 index 81258f2..0000000 --- a/vendor/illuminate/database/Schema/Grammars/SqlServerGrammar.php +++ /dev/null @@ -1,1072 +0,0 @@ -wrapValue($name), - ); - } - - /** - * Compile a drop database if exists command. - * - * @param string $name - * @return string - */ - public function compileDropDatabaseIfExists($name) - { - return sprintf( - 'drop database if exists %s', - $this->wrapValue($name) - ); - } - - /** - * Compile the query to determine if the given table exists. - * - * @param string|null $schema - * @param string $table - * @return string - */ - public function compileTableExists($schema, $table) - { - return sprintf( - 'select (case when object_id(%s, \'U\') is null then 0 else 1 end) as [exists]', - $this->quoteString($schema ? $schema.'.'.$table : $table) - ); - } - - /** - * Compile the query to determine the tables. - * - * @return string - */ - public function compileTables() - { - return 'select t.name as name, schema_name(t.schema_id) as [schema], sum(u.total_pages) * 8 * 1024 as size ' - .'from sys.tables as t ' - .'join sys.partitions as p on p.object_id = t.object_id ' - .'join sys.allocation_units as u on u.container_id = p.hobt_id ' - .'group by t.name, t.schema_id ' - .'order by t.name'; - } - - /** - * Compile the query to determine the views. - * - * @return string - */ - public function compileViews() - { - return 'select name, schema_name(v.schema_id) as [schema], definition from sys.views as v ' - .'inner join sys.sql_modules as m on v.object_id = m.object_id ' - .'order by name'; - } - - /** - * Compile the query to determine the columns. - * - * @param string $schema - * @param string $table - * @return string - */ - public function compileColumns($schema, $table) - { - return sprintf( - 'select col.name, type.name as type_name, ' - .'col.max_length as length, col.precision as precision, col.scale as places, ' - .'col.is_nullable as nullable, def.definition as [default], ' - .'col.is_identity as autoincrement, col.collation_name as collation, ' - .'com.definition as [expression], is_persisted as [persisted], ' - .'cast(prop.value as nvarchar(max)) as comment ' - .'from sys.columns as col ' - .'join sys.types as type on col.user_type_id = type.user_type_id ' - .'join sys.objects as obj on col.object_id = obj.object_id ' - .'join sys.schemas as scm on obj.schema_id = scm.schema_id ' - .'left join sys.default_constraints def on col.default_object_id = def.object_id and col.object_id = def.parent_object_id ' - ."left join sys.extended_properties as prop on obj.object_id = prop.major_id and col.column_id = prop.minor_id and prop.name = 'MS_Description' " - .'left join sys.computed_columns as com on col.column_id = com.column_id and col.object_id = com.object_id ' - ."where obj.type in ('U', 'V') and obj.name = %s and scm.name = %s " - .'order by col.column_id', - $this->quoteString($table), - $schema ? $this->quoteString($schema) : 'schema_name()', - ); - } - - /** - * Compile the query to determine the indexes. - * - * @param string $schema - * @param string $table - * @return string - */ - public function compileIndexes($schema, $table) - { - return sprintf( - "select idx.name as name, string_agg(col.name, ',') within group (order by idxcol.key_ordinal) as columns, " - .'idx.type_desc as [type], idx.is_unique as [unique], idx.is_primary_key as [primary] ' - .'from sys.indexes as idx ' - .'join sys.tables as tbl on idx.object_id = tbl.object_id ' - .'join sys.schemas as scm on tbl.schema_id = scm.schema_id ' - .'join sys.index_columns as idxcol on idx.object_id = idxcol.object_id and idx.index_id = idxcol.index_id ' - .'join sys.columns as col on idxcol.object_id = col.object_id and idxcol.column_id = col.column_id ' - .'where tbl.name = %s and scm.name = %s ' - .'group by idx.name, idx.type_desc, idx.is_unique, idx.is_primary_key', - $this->quoteString($table), - $schema ? $this->quoteString($schema) : 'schema_name()', - ); - } - - /** - * Compile the query to determine the foreign keys. - * - * @param string $schema - * @param string $table - * @return string - */ - public function compileForeignKeys($schema, $table) - { - return sprintf( - 'select fk.name as name, ' - ."string_agg(lc.name, ',') within group (order by fkc.constraint_column_id) as columns, " - .'fs.name as foreign_schema, ft.name as foreign_table, ' - ."string_agg(fc.name, ',') within group (order by fkc.constraint_column_id) as foreign_columns, " - .'fk.update_referential_action_desc as on_update, ' - .'fk.delete_referential_action_desc as on_delete ' - .'from sys.foreign_keys as fk ' - .'join sys.foreign_key_columns as fkc on fkc.constraint_object_id = fk.object_id ' - .'join sys.tables as lt on lt.object_id = fk.parent_object_id ' - .'join sys.schemas as ls on lt.schema_id = ls.schema_id ' - .'join sys.columns as lc on fkc.parent_object_id = lc.object_id and fkc.parent_column_id = lc.column_id ' - .'join sys.tables as ft on ft.object_id = fk.referenced_object_id ' - .'join sys.schemas as fs on ft.schema_id = fs.schema_id ' - .'join sys.columns as fc on fkc.referenced_object_id = fc.object_id and fkc.referenced_column_id = fc.column_id ' - .'where lt.name = %s and ls.name = %s ' - .'group by fk.name, fs.name, ft.name, fk.update_referential_action_desc, fk.delete_referential_action_desc', - $this->quoteString($table), - $schema ? $this->quoteString($schema) : 'schema_name()', - ); - } - - /** - * Compile a create table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileCreate(Blueprint $blueprint, Fluent $command) - { - $columns = implode(', ', $this->getColumns($blueprint)); - - return 'create table '.$this->wrapTable($blueprint)." ($columns)"; - } - - /** - * Compile a column addition table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileAdd(Blueprint $blueprint, Fluent $command) - { - return sprintf('alter table %s add %s', - $this->wrapTable($blueprint), - $this->getColumn($blueprint, $command->column) - ); - } - - /** - * Compile a rename column command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return array|string - */ - public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) - { - return sprintf("sp_rename %s, %s, N'COLUMN'", - $this->quoteString($this->wrapTable($blueprint).'.'.$this->wrap($command->from)), - $this->wrap($command->to) - ); - } - - /** - * Compile a change column command into a series of SQL statements. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection - * @return array|string - * - * @throws \RuntimeException - */ - public function compileChange(Blueprint $blueprint, Fluent $command, Connection $connection) - { - return [ - $this->compileDropDefaultConstraint($blueprint, $command), - sprintf('alter table %s alter column %s', - $this->wrapTable($blueprint), - $this->getColumn($blueprint, $command->column), - ), - ]; - } - - /** - * Compile a primary key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compilePrimary(Blueprint $blueprint, Fluent $command) - { - return sprintf('alter table %s add constraint %s primary key (%s)', - $this->wrapTable($blueprint), - $this->wrap($command->index), - $this->columnize($command->columns) - ); - } - - /** - * Compile a unique key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileUnique(Blueprint $blueprint, Fluent $command) - { - return sprintf('create unique index %s on %s (%s)', - $this->wrap($command->index), - $this->wrapTable($blueprint), - $this->columnize($command->columns) - ); - } - - /** - * Compile a plain index key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileIndex(Blueprint $blueprint, Fluent $command) - { - return sprintf('create index %s on %s (%s)', - $this->wrap($command->index), - $this->wrapTable($blueprint), - $this->columnize($command->columns) - ); - } - - /** - * Compile a spatial index key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileSpatialIndex(Blueprint $blueprint, Fluent $command) - { - return sprintf('create spatial index %s on %s (%s)', - $this->wrap($command->index), - $this->wrapTable($blueprint), - $this->columnize($command->columns) - ); - } - - /** - * Compile a default command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string|null - */ - public function compileDefault(Blueprint $blueprint, Fluent $command) - { - if ($command->column->change && ! is_null($command->column->default)) { - return sprintf('alter table %s add default %s for %s', - $this->wrapTable($blueprint), - $this->getDefaultValue($command->column->default), - $this->wrap($command->column) - ); - } - } - - /** - * Compile a drop table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDrop(Blueprint $blueprint, Fluent $command) - { - return 'drop table '.$this->wrapTable($blueprint); - } - - /** - * Compile a drop table (if exists) command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropIfExists(Blueprint $blueprint, Fluent $command) - { - return sprintf('if object_id(%s, \'U\') is not null drop table %s', - $this->quoteString($this->wrapTable($blueprint)), - $this->wrapTable($blueprint) - ); - } - - /** - * Compile the SQL needed to drop all tables. - * - * @return string - */ - public function compileDropAllTables() - { - return "EXEC sp_msforeachtable 'DROP TABLE ?'"; - } - - /** - * Compile a drop column command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropColumn(Blueprint $blueprint, Fluent $command) - { - $columns = $this->wrapArray($command->columns); - - $dropExistingConstraintsSql = $this->compileDropDefaultConstraint($blueprint, $command).';'; - - return $dropExistingConstraintsSql.'alter table '.$this->wrapTable($blueprint).' drop column '.implode(', ', $columns); - } - - /** - * Compile a drop default constraint command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropDefaultConstraint(Blueprint $blueprint, Fluent $command) - { - $columns = $command->name === 'change' - ? "'".$command->column->name."'" - : "'".implode("','", $command->columns)."'"; - - $table = $this->wrapTable($blueprint); - $tableName = $this->quoteString($this->wrapTable($blueprint)); - - $sql = "DECLARE @sql NVARCHAR(MAX) = '';"; - $sql .= "SELECT @sql += 'ALTER TABLE $table DROP CONSTRAINT ' + OBJECT_NAME([default_object_id]) + ';' "; - $sql .= 'FROM sys.columns '; - $sql .= "WHERE [object_id] = OBJECT_ID($tableName) AND [name] in ($columns) AND [default_object_id] <> 0;"; - $sql .= 'EXEC(@sql)'; - - return $sql; - } - - /** - * Compile a drop primary key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropPrimary(Blueprint $blueprint, Fluent $command) - { - $index = $this->wrap($command->index); - - return "alter table {$this->wrapTable($blueprint)} drop constraint {$index}"; - } - - /** - * Compile a drop unique key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropUnique(Blueprint $blueprint, Fluent $command) - { - $index = $this->wrap($command->index); - - return "drop index {$index} on {$this->wrapTable($blueprint)}"; - } - - /** - * Compile a drop index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropIndex(Blueprint $blueprint, Fluent $command) - { - $index = $this->wrap($command->index); - - return "drop index {$index} on {$this->wrapTable($blueprint)}"; - } - - /** - * Compile a drop spatial index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropSpatialIndex(Blueprint $blueprint, Fluent $command) - { - return $this->compileDropIndex($blueprint, $command); - } - - /** - * Compile a drop foreign key command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileDropForeign(Blueprint $blueprint, Fluent $command) - { - $index = $this->wrap($command->index); - - return "alter table {$this->wrapTable($blueprint)} drop constraint {$index}"; - } - - /** - * Compile a rename table command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileRename(Blueprint $blueprint, Fluent $command) - { - return sprintf('sp_rename %s, %s', - $this->quoteString($this->wrapTable($blueprint)), - $this->wrapTable($command->to) - ); - } - - /** - * Compile a rename index command. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $command - * @return string - */ - public function compileRenameIndex(Blueprint $blueprint, Fluent $command) - { - return sprintf("sp_rename %s, %s, N'INDEX'", - $this->quoteString($this->wrapTable($blueprint).'.'.$this->wrap($command->from)), - $this->wrap($command->to) - ); - } - - /** - * Compile the command to enable foreign key constraints. - * - * @return string - */ - public function compileEnableForeignKeyConstraints() - { - return 'EXEC sp_msforeachtable @command1="print \'?\'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all";'; - } - - /** - * Compile the command to disable foreign key constraints. - * - * @return string - */ - public function compileDisableForeignKeyConstraints() - { - return 'EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";'; - } - - /** - * Compile the command to drop all foreign keys. - * - * @return string - */ - public function compileDropAllForeignKeys() - { - return "DECLARE @sql NVARCHAR(MAX) = N''; - SELECT @sql += 'ALTER TABLE ' - + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' + + QUOTENAME(OBJECT_NAME(parent_object_id)) - + ' DROP CONSTRAINT ' + QUOTENAME(name) + ';' - FROM sys.foreign_keys; - - EXEC sp_executesql @sql;"; - } - - /** - * Compile the command to drop all views. - * - * @return string - */ - public function compileDropAllViews() - { - return "DECLARE @sql NVARCHAR(MAX) = N''; - SELECT @sql += 'DROP VIEW ' + QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + QUOTENAME(name) + ';' - FROM sys.views; - - EXEC sp_executesql @sql;"; - } - - /** - * Create the column definition for a char type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeChar(Fluent $column) - { - return "nchar({$column->length})"; - } - - /** - * Create the column definition for a string type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeString(Fluent $column) - { - return "nvarchar({$column->length})"; - } - - /** - * Create the column definition for a tiny text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTinyText(Fluent $column) - { - return 'nvarchar(255)'; - } - - /** - * Create the column definition for a text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeText(Fluent $column) - { - return 'nvarchar(max)'; - } - - /** - * Create the column definition for a medium text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMediumText(Fluent $column) - { - return 'nvarchar(max)'; - } - - /** - * Create the column definition for a long text type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeLongText(Fluent $column) - { - return 'nvarchar(max)'; - } - - /** - * Create the column definition for an integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeInteger(Fluent $column) - { - return 'int'; - } - - /** - * Create the column definition for a big integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBigInteger(Fluent $column) - { - return 'bigint'; - } - - /** - * Create the column definition for a medium integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMediumInteger(Fluent $column) - { - return 'int'; - } - - /** - * Create the column definition for a tiny integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTinyInteger(Fluent $column) - { - return 'tinyint'; - } - - /** - * Create the column definition for a small integer type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeSmallInteger(Fluent $column) - { - return 'smallint'; - } - - /** - * Create the column definition for a float type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeFloat(Fluent $column) - { - if ($column->precision) { - return "float({$column->precision})"; - } - - return 'float'; - } - - /** - * Create the column definition for a double type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDouble(Fluent $column) - { - return 'double precision'; - } - - /** - * Create the column definition for a decimal type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDecimal(Fluent $column) - { - return "decimal({$column->total}, {$column->places})"; - } - - /** - * Create the column definition for a boolean type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBoolean(Fluent $column) - { - return 'bit'; - } - - /** - * Create the column definition for an enumeration type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeEnum(Fluent $column) - { - return sprintf( - 'nvarchar(255) check ("%s" in (%s))', - $column->name, - $this->quoteString($column->allowed) - ); - } - - /** - * Create the column definition for a json type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeJson(Fluent $column) - { - return 'nvarchar(max)'; - } - - /** - * Create the column definition for a jsonb type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeJsonb(Fluent $column) - { - return 'nvarchar(max)'; - } - - /** - * Create the column definition for a date type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDate(Fluent $column) - { - return 'date'; - } - - /** - * Create the column definition for a date-time type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDateTime(Fluent $column) - { - return $this->typeTimestamp($column); - } - - /** - * Create the column definition for a date-time (with time zone) type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeDateTimeTz(Fluent $column) - { - return $this->typeTimestampTz($column); - } - - /** - * Create the column definition for a time type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTime(Fluent $column) - { - return $column->precision ? "time($column->precision)" : 'time'; - } - - /** - * Create the column definition for a time (with time zone) type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimeTz(Fluent $column) - { - return $this->typeTime($column); - } - - /** - * Create the column definition for a timestamp type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimestamp(Fluent $column) - { - if ($column->useCurrent) { - $column->default(new Expression('CURRENT_TIMESTAMP')); - } - - return $column->precision ? "datetime2($column->precision)" : 'datetime'; - } - - /** - * Create the column definition for a timestamp (with time zone) type. - * - * @link https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetimeoffset-transact-sql?view=sql-server-ver15 - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeTimestampTz(Fluent $column) - { - if ($column->useCurrent) { - $column->default(new Expression('CURRENT_TIMESTAMP')); - } - - return $column->precision ? "datetimeoffset($column->precision)" : 'datetimeoffset'; - } - - /** - * Create the column definition for a year type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeYear(Fluent $column) - { - return $this->typeInteger($column); - } - - /** - * Create the column definition for a binary type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeBinary(Fluent $column) - { - if ($column->length) { - return $column->fixed ? "binary({$column->length})" : "varbinary({$column->length})"; - } - - return 'varbinary(max)'; - } - - /** - * Create the column definition for a uuid type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeUuid(Fluent $column) - { - return 'uniqueidentifier'; - } - - /** - * Create the column definition for an IP address type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeIpAddress(Fluent $column) - { - return 'nvarchar(45)'; - } - - /** - * Create the column definition for a MAC address type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeMacAddress(Fluent $column) - { - return 'nvarchar(17)'; - } - - /** - * Create the column definition for a spatial Geometry type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeGeometry(Fluent $column) - { - return 'geometry'; - } - - /** - * Create the column definition for a spatial Geography type. - * - * @param \Illuminate\Support\Fluent $column - * @return string - */ - protected function typeGeography(Fluent $column) - { - return 'geography'; - } - - /** - * Create the column definition for a generated, computed column type. - * - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function typeComputed(Fluent $column) - { - return "as ({$this->getValue($column->expression)})"; - } - - /** - * Get the SQL for a collation column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyCollate(Blueprint $blueprint, Fluent $column) - { - if (! is_null($column->collation)) { - return ' collate '.$column->collation; - } - } - - /** - * Get the SQL for a nullable column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyNullable(Blueprint $blueprint, Fluent $column) - { - if ($column->type !== 'computed') { - return $column->nullable ? ' null' : ' not null'; - } - } - - /** - * Get the SQL for a default column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyDefault(Blueprint $blueprint, Fluent $column) - { - if (! $column->change && ! is_null($column->default)) { - return ' default '.$this->getDefaultValue($column->default); - } - } - - /** - * Get the SQL for an auto-increment column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyIncrement(Blueprint $blueprint, Fluent $column) - { - if (! $column->change && in_array($column->type, $this->serials) && $column->autoIncrement) { - return $this->hasCommand($blueprint, 'primary') ? ' identity' : ' identity primary key'; - } - } - - /** - * Get the SQL for a generated stored column modifier. - * - * @param \Illuminate\Database\Schema\Blueprint $blueprint - * @param \Illuminate\Support\Fluent $column - * @return string|null - */ - protected function modifyPersisted(Blueprint $blueprint, Fluent $column) - { - if ($column->change) { - if ($column->type === 'computed') { - return $column->persisted ? ' add persisted' : ' drop persisted'; - } - - return null; - } - - if ($column->persisted) { - return ' persisted'; - } - } - - /** - * Wrap a table in keyword identifiers. - * - * @param \Illuminate\Database\Schema\Blueprint|\Illuminate\Contracts\Database\Query\Expression|string $table - * @return string - */ - public function wrapTable($table) - { - if ($table instanceof Blueprint && $table->temporary) { - $this->setTablePrefix('#'); - } - - return parent::wrapTable($table); - } - - /** - * Quote the given string literal. - * - * @param string|array $value - * @return string - */ - public function quoteString($value) - { - if (is_array($value)) { - return implode(', ', array_map([$this, __FUNCTION__], $value)); - } - - return "N'$value'"; - } -} diff --git a/vendor/illuminate/database/Schema/IndexDefinition.php b/vendor/illuminate/database/Schema/IndexDefinition.php deleted file mode 100644 index fc5d78e..0000000 --- a/vendor/illuminate/database/Schema/IndexDefinition.php +++ /dev/null @@ -1,16 +0,0 @@ -connectionString().' --no-tablespaces --skip-add-locks --skip-comments --skip-set-charset --tz-utc --column-statistics=0'; - - return $command.' "${:LARAVEL_LOAD_DATABASE}"'; - } -} diff --git a/vendor/illuminate/database/Schema/MySqlBuilder.php b/vendor/illuminate/database/Schema/MySqlBuilder.php deleted file mode 100644 index 8421305..0000000 --- a/vendor/illuminate/database/Schema/MySqlBuilder.php +++ /dev/null @@ -1,168 +0,0 @@ -connection->statement( - $this->grammar->compileCreateDatabase($name, $this->connection) - ); - } - - /** - * Drop a database from the schema if the database exists. - * - * @param string $name - * @return bool - */ - public function dropDatabaseIfExists($name) - { - return $this->connection->statement( - $this->grammar->compileDropDatabaseIfExists($name) - ); - } - - /** - * Determine if the given table exists. - * - * @param string $table - * @return bool - */ - public function hasTable($table) - { - $table = $this->connection->getTablePrefix().$table; - - $database = $this->connection->getDatabaseName(); - - return (bool) $this->connection->scalar( - $this->grammar->compileTableExists($database, $table) - ); - } - - /** - * Get the tables for the database. - * - * @return array - */ - public function getTables() - { - return $this->connection->getPostProcessor()->processTables( - $this->connection->selectFromWriteConnection( - $this->grammar->compileTables($this->connection->getDatabaseName()) - ) - ); - } - - /** - * Get the views for the database. - * - * @return array - */ - public function getViews() - { - return $this->connection->getPostProcessor()->processViews( - $this->connection->selectFromWriteConnection( - $this->grammar->compileViews($this->connection->getDatabaseName()) - ) - ); - } - - /** - * Get the columns for a given table. - * - * @param string $table - * @return array - */ - public function getColumns($table) - { - $table = $this->connection->getTablePrefix().$table; - - $results = $this->connection->selectFromWriteConnection( - $this->grammar->compileColumns($this->connection->getDatabaseName(), $table) - ); - - return $this->connection->getPostProcessor()->processColumns($results); - } - - /** - * Get the indexes for a given table. - * - * @param string $table - * @return array - */ - public function getIndexes($table) - { - $table = $this->connection->getTablePrefix().$table; - - return $this->connection->getPostProcessor()->processIndexes( - $this->connection->selectFromWriteConnection( - $this->grammar->compileIndexes($this->connection->getDatabaseName(), $table) - ) - ); - } - - /** - * Get the foreign keys for a given table. - * - * @param string $table - * @return array - */ - public function getForeignKeys($table) - { - $table = $this->connection->getTablePrefix().$table; - - return $this->connection->getPostProcessor()->processForeignKeys( - $this->connection->selectFromWriteConnection( - $this->grammar->compileForeignKeys($this->connection->getDatabaseName(), $table) - ) - ); - } - - /** - * Drop all tables from the database. - * - * @return void - */ - public function dropAllTables() - { - $tables = array_column($this->getTables(), 'name'); - - if (empty($tables)) { - return; - } - - $this->disableForeignKeyConstraints(); - - $this->connection->statement( - $this->grammar->compileDropAllTables($tables) - ); - - $this->enableForeignKeyConstraints(); - } - - /** - * Drop all views from the database. - * - * @return void - */ - public function dropAllViews() - { - $views = array_column($this->getViews(), 'name'); - - if (empty($views)) { - return; - } - - $this->connection->statement( - $this->grammar->compileDropAllViews($views) - ); - } -} diff --git a/vendor/illuminate/database/Schema/MySqlSchemaState.php b/vendor/illuminate/database/Schema/MySqlSchemaState.php deleted file mode 100644 index be5e227..0000000 --- a/vendor/illuminate/database/Schema/MySqlSchemaState.php +++ /dev/null @@ -1,177 +0,0 @@ -executeDumpProcess($this->makeProcess( - $this->baseDumpCommand().' --routines --result-file="${:LARAVEL_LOAD_PATH}" --no-data' - ), $this->output, array_merge($this->baseVariables($this->connection->getConfig()), [ - 'LARAVEL_LOAD_PATH' => $path, - ])); - - $this->removeAutoIncrementingState($path); - - if ($this->hasMigrationTable()) { - $this->appendMigrationData($path); - } - } - - /** - * Remove the auto-incrementing state from the given schema dump. - * - * @param string $path - * @return void - */ - protected function removeAutoIncrementingState(string $path) - { - $this->files->put($path, preg_replace( - '/\s+AUTO_INCREMENT=[0-9]+/iu', - '', - $this->files->get($path) - )); - } - - /** - * Append the migration data to the schema dump. - * - * @param string $path - * @return void - */ - protected function appendMigrationData(string $path) - { - $process = $this->executeDumpProcess($this->makeProcess( - $this->baseDumpCommand().' '.$this->getMigrationTable().' --no-create-info --skip-extended-insert --skip-routines --compact --complete-insert' - ), null, array_merge($this->baseVariables($this->connection->getConfig()), [ - // - ])); - - $this->files->append($path, $process->getOutput()); - } - - /** - * Load the given schema file into the database. - * - * @param string $path - * @return void - */ - public function load($path) - { - $command = 'mysql '.$this->connectionString().' --database="${:LARAVEL_LOAD_DATABASE}" < "${:LARAVEL_LOAD_PATH}"'; - - $process = $this->makeProcess($command)->setTimeout(null); - - $process->mustRun(null, array_merge($this->baseVariables($this->connection->getConfig()), [ - 'LARAVEL_LOAD_PATH' => $path, - ])); - } - - /** - * Get the base dump command arguments for MySQL as a string. - * - * @return string - */ - protected function baseDumpCommand() - { - $command = 'mysqldump '.$this->connectionString().' --no-tablespaces --skip-add-locks --skip-comments --skip-set-charset --tz-utc --column-statistics=0'; - - if (! $this->connection->isMaria()) { - $command .= ' --set-gtid-purged=OFF'; - } - - return $command.' "${:LARAVEL_LOAD_DATABASE}"'; - } - - /** - * Generate a basic connection string (--socket, --host, --port, --user, --password) for the database. - * - * @return string - */ - protected function connectionString() - { - $value = ' --user="${:LARAVEL_LOAD_USER}" --password="${:LARAVEL_LOAD_PASSWORD}"'; - - $config = $this->connection->getConfig(); - - $value .= $config['unix_socket'] ?? false - ? ' --socket="${:LARAVEL_LOAD_SOCKET}"' - : ' --host="${:LARAVEL_LOAD_HOST}" --port="${:LARAVEL_LOAD_PORT}"'; - - if (isset($config['options'][\PDO::MYSQL_ATTR_SSL_CA])) { - $value .= ' --ssl-ca="${:LARAVEL_LOAD_SSL_CA}"'; - } - - return $value; - } - - /** - * Get the base variables for a dump / load command. - * - * @param array $config - * @return array - */ - protected function baseVariables(array $config) - { - $config['host'] ??= ''; - - return [ - 'LARAVEL_LOAD_SOCKET' => $config['unix_socket'] ?? '', - 'LARAVEL_LOAD_HOST' => is_array($config['host']) ? $config['host'][0] : $config['host'], - 'LARAVEL_LOAD_PORT' => $config['port'] ?? '', - 'LARAVEL_LOAD_USER' => $config['username'], - 'LARAVEL_LOAD_PASSWORD' => $config['password'] ?? '', - 'LARAVEL_LOAD_DATABASE' => $config['database'], - 'LARAVEL_LOAD_SSL_CA' => $config['options'][\PDO::MYSQL_ATTR_SSL_CA] ?? '', - ]; - } - - /** - * Execute the given dump process. - * - * @param \Symfony\Component\Process\Process $process - * @param callable $output - * @param array $variables - * @param int $depth - * @return \Symfony\Component\Process\Process - */ - protected function executeDumpProcess(Process $process, $output, array $variables, int $depth = 0) - { - if ($depth > 30) { - throw new Exception('Dump execution exceeded maximum depth of 30.'); - } - - try { - $process->setTimeout(null)->mustRun($output, $variables); - } catch (Exception $e) { - if (Str::contains($e->getMessage(), ['column-statistics', 'column_statistics'])) { - return $this->executeDumpProcess(Process::fromShellCommandLine( - str_replace(' --column-statistics=0', '', $process->getCommandLine()) - ), $output, $variables, $depth + 1); - } - - if (str_contains($e->getMessage(), 'set-gtid-purged')) { - return $this->executeDumpProcess(Process::fromShellCommandLine( - str_replace(' --set-gtid-purged=OFF', '', $process->getCommandLine()) - ), $output, $variables, $depth + 1); - } - - throw $e; - } - - return $process; - } -} diff --git a/vendor/illuminate/database/Schema/PostgresBuilder.php b/vendor/illuminate/database/Schema/PostgresBuilder.php deleted file mode 100644 index b39486c..0000000 --- a/vendor/illuminate/database/Schema/PostgresBuilder.php +++ /dev/null @@ -1,287 +0,0 @@ -connection->statement( - $this->grammar->compileCreateDatabase($name, $this->connection) - ); - } - - /** - * Drop a database from the schema if the database exists. - * - * @param string $name - * @return bool - */ - public function dropDatabaseIfExists($name) - { - return $this->connection->statement( - $this->grammar->compileDropDatabaseIfExists($name) - ); - } - - /** - * Determine if the given table exists. - * - * @param string $table - * @return bool - */ - public function hasTable($table) - { - [$schema, $table] = $this->parseSchemaAndTable($table); - - $table = $this->connection->getTablePrefix().$table; - - return (bool) $this->connection->scalar( - $this->grammar->compileTableExists($schema, $table) - ); - } - - /** - * Determine if the given view exists. - * - * @param string $view - * @return bool - */ - public function hasView($view) - { - [$schema, $view] = $this->parseSchemaAndTable($view); - - $view = $this->connection->getTablePrefix().$view; - - foreach ($this->getViews() as $value) { - if (strtolower($view) === strtolower($value['name']) - && strtolower($schema) === strtolower($value['schema'])) { - return true; - } - } - - return false; - } - - /** - * Get the user-defined types that belong to the database. - * - * @return array - */ - public function getTypes() - { - return $this->connection->getPostProcessor()->processTypes( - $this->connection->selectFromWriteConnection($this->grammar->compileTypes()) - ); - } - - /** - * Drop all tables from the database. - * - * @return void - */ - public function dropAllTables() - { - $tables = []; - - $excludedTables = $this->connection->getConfig('dont_drop') ?? ['spatial_ref_sys']; - - $schemas = $this->getSchemas(); - - foreach ($this->getTables() as $table) { - $qualifiedName = $table['schema'].'.'.$table['name']; - - if (in_array($table['schema'], $schemas) && - empty(array_intersect([$table['name'], $qualifiedName], $excludedTables))) { - $tables[] = $qualifiedName; - } - } - - if (empty($tables)) { - return; - } - - $this->connection->statement( - $this->grammar->compileDropAllTables($tables) - ); - } - - /** - * Drop all views from the database. - * - * @return void - */ - public function dropAllViews() - { - $views = []; - - $schemas = $this->getSchemas(); - - foreach ($this->getViews() as $view) { - if (in_array($view['schema'], $schemas)) { - $views[] = $view['schema'].'.'.$view['name']; - } - } - - if (empty($views)) { - return; - } - - $this->connection->statement( - $this->grammar->compileDropAllViews($views) - ); - } - - /** - * Drop all types from the database. - * - * @return void - */ - public function dropAllTypes() - { - $types = []; - $domains = []; - - $schemas = $this->getSchemas(); - - foreach ($this->getTypes() as $type) { - if (! $type['implicit'] && in_array($type['schema'], $schemas)) { - if ($type['type'] === 'domain') { - $domains[] = $type['schema'].'.'.$type['name']; - } else { - $types[] = $type['schema'].'.'.$type['name']; - } - } - } - - if (! empty($types)) { - $this->connection->statement($this->grammar->compileDropAllTypes($types)); - } - - if (! empty($domains)) { - $this->connection->statement($this->grammar->compileDropAllDomains($domains)); - } - } - - /** - * Get the columns for a given table. - * - * @param string $table - * @return array - */ - public function getColumns($table) - { - [$schema, $table] = $this->parseSchemaAndTable($table); - - $table = $this->connection->getTablePrefix().$table; - - $results = $this->connection->selectFromWriteConnection( - $this->grammar->compileColumns($schema, $table) - ); - - return $this->connection->getPostProcessor()->processColumns($results); - } - - /** - * Get the indexes for a given table. - * - * @param string $table - * @return array - */ - public function getIndexes($table) - { - [$schema, $table] = $this->parseSchemaAndTable($table); - - $table = $this->connection->getTablePrefix().$table; - - return $this->connection->getPostProcessor()->processIndexes( - $this->connection->selectFromWriteConnection($this->grammar->compileIndexes($schema, $table)) - ); - } - - /** - * Get the foreign keys for a given table. - * - * @param string $table - * @return array - */ - public function getForeignKeys($table) - { - [$schema, $table] = $this->parseSchemaAndTable($table); - - $table = $this->connection->getTablePrefix().$table; - - return $this->connection->getPostProcessor()->processForeignKeys( - $this->connection->selectFromWriteConnection($this->grammar->compileForeignKeys($schema, $table)) - ); - } - - /** - * Get the schemas for the connection. - * - * @return array - */ - public function getSchemas() - { - return $this->parseSearchPath( - $this->connection->getConfig('search_path') ?: $this->connection->getConfig('schema') ?: 'public' - ); - } - - /** - * Parse the database object reference and extract the schema and table. - * - * @param string $reference - * @return array - */ - public function parseSchemaAndTable($reference) - { - $parts = explode('.', $reference); - - if (count($parts) > 2) { - $database = $parts[0]; - - throw new InvalidArgumentException("Using three-part reference is not supported, you may use `Schema::connection('$database')` instead."); - } - - // We will use the default schema unless the schema has been specified in the - // query. If the schema has been specified in the query then we can use it - // instead of a default schema configured in the connection search path. - $schema = $this->getSchemas()[0]; - - if (count($parts) === 2) { - $schema = $parts[0]; - array_shift($parts); - } - - return [$schema, $parts[0]]; - } - - /** - * Parse the "search_path" configuration value into an array. - * - * @param string|array|null $searchPath - * @return array - */ - protected function parseSearchPath($searchPath) - { - return array_map(function ($schema) { - return $schema === '$user' - ? $this->connection->getConfig('username') - : $schema; - }, $this->baseParseSearchPath($searchPath)); - } -} diff --git a/vendor/illuminate/database/Schema/PostgresSchemaState.php b/vendor/illuminate/database/Schema/PostgresSchemaState.php deleted file mode 100644 index a968941..0000000 --- a/vendor/illuminate/database/Schema/PostgresSchemaState.php +++ /dev/null @@ -1,95 +0,0 @@ -baseDumpCommand().' --schema-only > '.$path, - ]); - - if ($this->hasMigrationTable()) { - $commands->push($this->baseDumpCommand().' -t '.$this->getMigrationTable().' --data-only >> '.$path); - } - - $commands->map(function ($command, $path) { - $this->makeProcess($command)->mustRun($this->output, array_merge($this->baseVariables($this->connection->getConfig()), [ - 'LARAVEL_LOAD_PATH' => $path, - ])); - }); - } - - /** - * Load the given schema file into the database. - * - * @param string $path - * @return void - */ - public function load($path) - { - $command = 'pg_restore --no-owner --no-acl --clean --if-exists --host="${:LARAVEL_LOAD_HOST}" --port="${:LARAVEL_LOAD_PORT}" --username="${:LARAVEL_LOAD_USER}" --dbname="${:LARAVEL_LOAD_DATABASE}" "${:LARAVEL_LOAD_PATH}"'; - - if (str_ends_with($path, '.sql')) { - $command = 'psql --file="${:LARAVEL_LOAD_PATH}" --host="${:LARAVEL_LOAD_HOST}" --port="${:LARAVEL_LOAD_PORT}" --username="${:LARAVEL_LOAD_USER}" --dbname="${:LARAVEL_LOAD_DATABASE}"'; - } - - $process = $this->makeProcess($command); - - $process->mustRun(null, array_merge($this->baseVariables($this->connection->getConfig()), [ - 'LARAVEL_LOAD_PATH' => $path, - ])); - } - - /** - * Get the name of the application's migration table. - * - * @return string - */ - protected function getMigrationTable(): string - { - [$schema, $table] = $this->connection->getSchemaBuilder()->parseSchemaAndTable($this->migrationTable); - - return $schema.'.'.$this->connection->getTablePrefix().$table; - } - - /** - * Get the base dump command arguments for PostgreSQL as a string. - * - * @return string - */ - protected function baseDumpCommand() - { - return 'pg_dump --no-owner --no-acl --host="${:LARAVEL_LOAD_HOST}" --port="${:LARAVEL_LOAD_PORT}" --username="${:LARAVEL_LOAD_USER}" --dbname="${:LARAVEL_LOAD_DATABASE}"'; - } - - /** - * Get the base variables for a dump / load command. - * - * @param array $config - * @return array - */ - protected function baseVariables(array $config) - { - $config['host'] ??= ''; - - return [ - 'LARAVEL_LOAD_HOST' => is_array($config['host']) ? $config['host'][0] : $config['host'], - 'LARAVEL_LOAD_PORT' => $config['port'] ?? '', - 'LARAVEL_LOAD_USER' => $config['username'], - 'PGPASSWORD' => $config['password'], - 'LARAVEL_LOAD_DATABASE' => $config['database'], - ]; - } -} diff --git a/vendor/illuminate/database/Schema/SQLiteBuilder.php b/vendor/illuminate/database/Schema/SQLiteBuilder.php deleted file mode 100644 index 25111eb..0000000 --- a/vendor/illuminate/database/Schema/SQLiteBuilder.php +++ /dev/null @@ -1,175 +0,0 @@ -connection->getTablePrefix().$table; - - return (bool) $this->connection->scalar( - $this->grammar->compileTableExists($table) - ); - } - - /** - * Get the tables for the database. - * - * @param bool $withSize - * @return array - */ - public function getTables($withSize = true) - { - if ($withSize) { - try { - $withSize = $this->connection->scalar($this->grammar->compileDbstatExists()); - } catch (QueryException $e) { - $withSize = false; - } - } - - return $this->connection->getPostProcessor()->processTables( - $this->connection->selectFromWriteConnection($this->grammar->compileTables($withSize)) - ); - } - - /** - * Get the columns for a given table. - * - * @param string $table - * @return array - */ - public function getColumns($table) - { - $table = $this->connection->getTablePrefix().$table; - - return $this->connection->getPostProcessor()->processColumns( - $this->connection->selectFromWriteConnection($this->grammar->compileColumns($table)), - $this->connection->scalar($this->grammar->compileSqlCreateStatement($table)) - ); - } - - /** - * Drop all tables from the database. - * - * @return void - */ - public function dropAllTables() - { - $database = $this->connection->getDatabaseName(); - - if ($database !== ':memory:' && - ! str_contains($database, '?mode=memory') && - ! str_contains($database, '&mode=memory') - ) { - return $this->refreshDatabaseFile(); - } - - $this->connection->select($this->grammar->compileEnableWriteableSchema()); - - $this->connection->select($this->grammar->compileDropAllTables()); - - $this->connection->select($this->grammar->compileDisableWriteableSchema()); - - $this->connection->select($this->grammar->compileRebuild()); - } - - /** - * Drop all views from the database. - * - * @return void - */ - public function dropAllViews() - { - $this->connection->select($this->grammar->compileEnableWriteableSchema()); - - $this->connection->select($this->grammar->compileDropAllViews()); - - $this->connection->select($this->grammar->compileDisableWriteableSchema()); - - $this->connection->select($this->grammar->compileRebuild()); - } - - /** - * Set the busy timeout. - * - * @param int $milliseconds - * @return bool - */ - public function setBusyTimeout($milliseconds) - { - return $this->connection->statement( - $this->grammar->compileSetBusyTimeout($milliseconds) - ); - } - - /** - * Set the journal mode. - * - * @param string $mode - * @return bool - */ - public function setJournalMode($mode) - { - return $this->connection->statement( - $this->grammar->compileSetJournalMode($mode) - ); - } - - /** - * Set the synchronous mode. - * - * @param int $mode - * @return bool - */ - public function setSynchronous($mode) - { - return $this->connection->statement( - $this->grammar->compileSetSynchronous($mode) - ); - } - - /** - * Empty the database file. - * - * @return void - */ - public function refreshDatabaseFile() - { - file_put_contents($this->connection->getDatabaseName(), ''); - } -} diff --git a/vendor/illuminate/database/Schema/SchemaState.php b/vendor/illuminate/database/Schema/SchemaState.php deleted file mode 100644 index d720850..0000000 --- a/vendor/illuminate/database/Schema/SchemaState.php +++ /dev/null @@ -1,142 +0,0 @@ -connection = $connection; - - $this->files = $files ?: new Filesystem; - - $this->processFactory = $processFactory ?: function (...$arguments) { - return Process::fromShellCommandline(...$arguments)->setTimeout(null); - }; - - $this->handleOutputUsing(function () { - // - }); - } - - /** - * Dump the database's schema into a file. - * - * @param \Illuminate\Database\Connection $connection - * @param string $path - * @return void - */ - abstract public function dump(Connection $connection, $path); - - /** - * Load the given schema file into the database. - * - * @param string $path - * @return void - */ - abstract public function load($path); - - /** - * Create a new process instance. - * - * @param mixed ...$arguments - * @return \Symfony\Component\Process\Process - */ - public function makeProcess(...$arguments) - { - return call_user_func($this->processFactory, ...$arguments); - } - - /** - * Determine if the current connection has a migration table. - * - * @return bool - */ - public function hasMigrationTable(): bool - { - return $this->connection->getSchemaBuilder()->hasTable($this->migrationTable); - } - - /** - * Get the name of the application's migration table. - * - * @return string - */ - protected function getMigrationTable(): string - { - return $this->connection->getTablePrefix().$this->migrationTable; - } - - /** - * Specify the name of the application's migration table. - * - * @param string $table - * @return $this - */ - public function withMigrationTable(string $table) - { - $this->migrationTable = $table; - - return $this; - } - - /** - * Specify the callback that should be used to handle process output. - * - * @param callable $output - * @return $this - */ - public function handleOutputUsing(callable $output) - { - $this->output = $output; - - return $this; - } -} diff --git a/vendor/illuminate/database/Schema/SqlServerBuilder.php b/vendor/illuminate/database/Schema/SqlServerBuilder.php deleted file mode 100644 index 9b59ccc..0000000 --- a/vendor/illuminate/database/Schema/SqlServerBuilder.php +++ /dev/null @@ -1,178 +0,0 @@ -connection->statement( - $this->grammar->compileCreateDatabase($name, $this->connection) - ); - } - - /** - * Drop a database from the schema if the database exists. - * - * @param string $name - * @return bool - */ - public function dropDatabaseIfExists($name) - { - return $this->connection->statement( - $this->grammar->compileDropDatabaseIfExists($name) - ); - } - - /** - * Determine if the given table exists. - * - * @param string $table - * @return bool - */ - public function hasTable($table) - { - [$schema, $table] = $this->parseSchemaAndTable($table); - - $table = $this->connection->getTablePrefix().$table; - - return (bool) $this->connection->scalar( - $this->grammar->compileTableExists($schema, $table) - ); - } - - /** - * Determine if the given view exists. - * - * @param string $view - * @return bool - */ - public function hasView($view) - { - [$schema, $view] = $this->parseSchemaAndTable($view); - - $schema ??= $this->getDefaultSchema(); - $view = $this->connection->getTablePrefix().$view; - - foreach ($this->getViews() as $value) { - if (strtolower($view) === strtolower($value['name']) - && strtolower($schema) === strtolower($value['schema'])) { - return true; - } - } - - return false; - } - - /** - * Drop all tables from the database. - * - * @return void - */ - public function dropAllTables() - { - $this->connection->statement($this->grammar->compileDropAllForeignKeys()); - - $this->connection->statement($this->grammar->compileDropAllTables()); - } - - /** - * Drop all views from the database. - * - * @return void - */ - public function dropAllViews() - { - $this->connection->statement($this->grammar->compileDropAllViews()); - } - - /** - * Get the columns for a given table. - * - * @param string $table - * @return array - */ - public function getColumns($table) - { - [$schema, $table] = $this->parseSchemaAndTable($table); - - $table = $this->connection->getTablePrefix().$table; - - $results = $this->connection->selectFromWriteConnection( - $this->grammar->compileColumns($schema, $table) - ); - - return $this->connection->getPostProcessor()->processColumns($results); - } - - /** - * Get the indexes for a given table. - * - * @param string $table - * @return array - */ - public function getIndexes($table) - { - [$schema, $table] = $this->parseSchemaAndTable($table); - - $table = $this->connection->getTablePrefix().$table; - - return $this->connection->getPostProcessor()->processIndexes( - $this->connection->selectFromWriteConnection($this->grammar->compileIndexes($schema, $table)) - ); - } - - /** - * Get the foreign keys for a given table. - * - * @param string $table - * @return array - */ - public function getForeignKeys($table) - { - [$schema, $table] = $this->parseSchemaAndTable($table); - - $table = $this->connection->getTablePrefix().$table; - - return $this->connection->getPostProcessor()->processForeignKeys( - $this->connection->selectFromWriteConnection($this->grammar->compileForeignKeys($schema, $table)) - ); - } - - /** - * Get the default schema for the connection. - * - * @return string - */ - protected function getDefaultSchema() - { - return $this->connection->scalar($this->grammar->compileDefaultSchema()); - } - - /** - * Parse the database object reference and extract the schema and table. - * - * @param string $reference - * @return array - */ - protected function parseSchemaAndTable($reference) - { - $parts = array_pad(explode('.', $reference, 2), -2, null); - - if (str_contains($parts[1], '.')) { - $database = $parts[0]; - - throw new InvalidArgumentException("Using three-part reference is not supported, you may use `Schema::connection('$database')` instead."); - } - - return $parts; - } -} diff --git a/vendor/illuminate/database/Schema/SqliteSchemaState.php b/vendor/illuminate/database/Schema/SqliteSchemaState.php deleted file mode 100644 index bda420f..0000000 --- a/vendor/illuminate/database/Schema/SqliteSchemaState.php +++ /dev/null @@ -1,103 +0,0 @@ -makeProcess( - $this->baseCommand().' ".schema --indent"' - ))->setTimeout(null)->mustRun(null, array_merge($this->baseVariables($this->connection->getConfig()), [ - // - ])); - - $migrations = preg_replace('/CREATE TABLE sqlite_.+?\);[\r\n]+/is', '', $process->getOutput()); - - $this->files->put($path, $migrations.PHP_EOL); - - if ($this->hasMigrationTable()) { - $this->appendMigrationData($path); - } - } - - /** - * Append the migration data to the schema dump. - * - * @param string $path - * @return void - */ - protected function appendMigrationData(string $path) - { - with($process = $this->makeProcess( - $this->baseCommand().' ".dump \''.$this->getMigrationTable().'\'"' - ))->mustRun(null, array_merge($this->baseVariables($this->connection->getConfig()), [ - // - ])); - - $migrations = (new Collection(preg_split("/\r\n|\n|\r/", $process->getOutput()))) - ->filter(fn ($line) => preg_match('/^\s*(--|INSERT\s)/iu', $line) === 1 && strlen($line) > 0) - ->all(); - - $this->files->append($path, implode(PHP_EOL, $migrations).PHP_EOL); - } - - /** - * Load the given schema file into the database. - * - * @param string $path - * @return void - */ - public function load($path) - { - $database = $this->connection->getDatabaseName(); - - if ($database === ':memory:' || - str_contains($database, '?mode=memory') || - str_contains($database, '&mode=memory') - ) { - $this->connection->getPdo()->exec($this->files->get($path)); - - return; - } - - $process = $this->makeProcess($this->baseCommand().' < "${:LARAVEL_LOAD_PATH}"'); - - $process->mustRun(null, array_merge($this->baseVariables($this->connection->getConfig()), [ - 'LARAVEL_LOAD_PATH' => $path, - ])); - } - - /** - * Get the base sqlite command arguments as a string. - * - * @return string - */ - protected function baseCommand() - { - return 'sqlite3 "${:LARAVEL_LOAD_DATABASE}"'; - } - - /** - * Get the base variables for a dump / load command. - * - * @param array $config - * @return array - */ - protected function baseVariables(array $config) - { - return [ - 'LARAVEL_LOAD_DATABASE' => $config['database'], - ]; - } -} diff --git a/vendor/illuminate/database/Seeder.php b/vendor/illuminate/database/Seeder.php deleted file mode 100644 index bfb48ae..0000000 --- a/vendor/illuminate/database/Seeder.php +++ /dev/null @@ -1,195 +0,0 @@ -resolve($class); - - $name = get_class($seeder); - - if ($silent === false && isset($this->command)) { - with(new TwoColumnDetail($this->command->getOutput()))->render( - $name, - 'RUNNING' - ); - } - - $startTime = microtime(true); - - $seeder->__invoke($parameters); - - if ($silent === false && isset($this->command)) { - $runTime = number_format((microtime(true) - $startTime) * 1000); - - with(new TwoColumnDetail($this->command->getOutput()))->render( - $name, - "$runTime ms DONE" - ); - - $this->command->getOutput()->writeln(''); - } - - static::$called[] = $class; - } - - return $this; - } - - /** - * Run the given seeder class. - * - * @param array|string $class - * @param array $parameters - * @return void - */ - public function callWith($class, array $parameters = []) - { - $this->call($class, false, $parameters); - } - - /** - * Silently run the given seeder class. - * - * @param array|string $class - * @param array $parameters - * @return void - */ - public function callSilent($class, array $parameters = []) - { - $this->call($class, true, $parameters); - } - - /** - * Run the given seeder class once. - * - * @param array|string $class - * @param bool $silent - * @return void - */ - public function callOnce($class, $silent = false, array $parameters = []) - { - if (in_array($class, static::$called)) { - return; - } - - $this->call($class, $silent, $parameters); - } - - /** - * Resolve an instance of the given seeder class. - * - * @param string $class - * @return \Illuminate\Database\Seeder - */ - protected function resolve($class) - { - if (isset($this->container)) { - $instance = $this->container->make($class); - - $instance->setContainer($this->container); - } else { - $instance = new $class; - } - - if (isset($this->command)) { - $instance->setCommand($this->command); - } - - return $instance; - } - - /** - * Set the IoC container instance. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return $this - */ - public function setContainer(Container $container) - { - $this->container = $container; - - return $this; - } - - /** - * Set the console command instance. - * - * @param \Illuminate\Console\Command $command - * @return $this - */ - public function setCommand(Command $command) - { - $this->command = $command; - - return $this; - } - - /** - * Run the database seeds. - * - * @param array $parameters - * @return mixed - * - * @throws \InvalidArgumentException - */ - public function __invoke(array $parameters = []) - { - if (! method_exists($this, 'run')) { - throw new InvalidArgumentException('Method [run] missing from '.get_class($this)); - } - - $callback = fn () => isset($this->container) - ? $this->container->call([$this, 'run'], $parameters) - : $this->run(...$parameters); - - $uses = array_flip(class_uses_recursive(static::class)); - - if (isset($uses[WithoutModelEvents::class])) { - $callback = $this->withoutModelEvents($callback); - } - - return $callback(); - } -} diff --git a/vendor/illuminate/database/SqlServerConnection.php b/vendor/illuminate/database/SqlServerConnection.php deleted file mode 100644 index 19f7bb8..0000000 --- a/vendor/illuminate/database/SqlServerConnection.php +++ /dev/null @@ -1,149 +0,0 @@ -getDriverName() === 'sqlsrv') { - return parent::transaction($callback, $attempts); - } - - $this->getPdo()->exec('BEGIN TRAN'); - - // We'll simply execute the given callback within a try / catch block - // and if we catch any exception we can rollback the transaction - // so that none of the changes are persisted to the database. - try { - $result = $callback($this); - - $this->getPdo()->exec('COMMIT TRAN'); - } - - // If we catch an exception, we will rollback so nothing gets messed - // up in the database. Then we'll re-throw the exception so it can - // be handled how the developer sees fit for their applications. - catch (Throwable $e) { - $this->getPdo()->exec('ROLLBACK TRAN'); - - throw $e; - } - - return $result; - } - } - - /** - * Escape a binary value for safe SQL embedding. - * - * @param string $value - * @return string - */ - protected function escapeBinary($value) - { - $hex = bin2hex($value); - - return "0x{$hex}"; - } - - /** - * Determine if the given database exception was caused by a unique constraint violation. - * - * @param \Exception $exception - * @return bool - */ - protected function isUniqueConstraintError(Exception $exception) - { - return boolval(preg_match('#Cannot insert duplicate key row in object#i', $exception->getMessage())); - } - - /** - * Get the default query grammar instance. - * - * @return \Illuminate\Database\Query\Grammars\SqlServerGrammar - */ - protected function getDefaultQueryGrammar() - { - ($grammar = new QueryGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); - } - - /** - * Get a schema builder instance for the connection. - * - * @return \Illuminate\Database\Schema\SqlServerBuilder - */ - public function getSchemaBuilder() - { - if (is_null($this->schemaGrammar)) { - $this->useDefaultSchemaGrammar(); - } - - return new SqlServerBuilder($this); - } - - /** - * Get the default schema grammar instance. - * - * @return \Illuminate\Database\Schema\Grammars\SqlServerGrammar - */ - protected function getDefaultSchemaGrammar() - { - ($grammar = new SchemaGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); - } - - /** - * Get the schema state for the connection. - * - * @param \Illuminate\Filesystem\Filesystem|null $files - * @param callable|null $processFactory - * - * @throws \RuntimeException - */ - public function getSchemaState(?Filesystem $files = null, ?callable $processFactory = null) - { - throw new RuntimeException('Schema dumping is not supported when using SQL Server.'); - } - - /** - * Get the default post processor instance. - * - * @return \Illuminate\Database\Query\Processors\SqlServerProcessor - */ - protected function getDefaultPostProcessor() - { - return new SqlServerProcessor; - } -} diff --git a/vendor/illuminate/database/UniqueConstraintViolationException.php b/vendor/illuminate/database/UniqueConstraintViolationException.php deleted file mode 100644 index 13b705b..0000000 --- a/vendor/illuminate/database/UniqueConstraintViolationException.php +++ /dev/null @@ -1,7 +0,0 @@ -getMethods( - ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED - ); - - foreach ($methods as $method) { - if ($replace || ! static::hasMacro($method->name)) { - static::macro($method->name, $method->invoke($mixin)); - } - } - } - - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - */ - public static function hasMacro($name) - { - return isset(static::$macros[$name]); - } - - /** - * Flush the existing macros. - * - * @return void - */ - public static function flushMacros() - { - static::$macros = []; - } - - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * - * @throws \BadMethodCallException - */ - public static function __callStatic($method, $parameters) - { - if (! static::hasMacro($method)) { - throw new BadMethodCallException(sprintf( - 'Method %s::%s does not exist.', static::class, $method - )); - } - - $macro = static::$macros[$method]; - - if ($macro instanceof Closure) { - $macro = $macro->bindTo(null, static::class); - } - - return $macro(...$parameters); - } - - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * - * @throws \BadMethodCallException - */ - public function __call($method, $parameters) - { - if (! static::hasMacro($method)) { - throw new BadMethodCallException(sprintf( - 'Method %s::%s does not exist.', static::class, $method - )); - } - - $macro = static::$macros[$method]; - - if ($macro instanceof Closure) { - $macro = $macro->bindTo($this, static::class); - } - - return $macro(...$parameters); - } -} diff --git a/vendor/illuminate/macroable/composer.json b/vendor/illuminate/macroable/composer.json deleted file mode 100644 index 08417d0..0000000 --- a/vendor/illuminate/macroable/composer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "illuminate/macroable", - "description": "The Illuminate Macroable package.", - "license": "MIT", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "require": { - "php": "^8.2" - }, - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "config": { - "sort-packages": true - }, - "minimum-stability": "dev" -} diff --git a/vendor/illuminate/support/AggregateServiceProvider.php b/vendor/illuminate/support/AggregateServiceProvider.php deleted file mode 100644 index d7425c5..0000000 --- a/vendor/illuminate/support/AggregateServiceProvider.php +++ /dev/null @@ -1,52 +0,0 @@ -instances = []; - - foreach ($this->providers as $provider) { - $this->instances[] = $this->app->register($provider); - } - } - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() - { - $provides = []; - - foreach ($this->providers as $provider) { - $instance = $this->app->resolveProvider($provider); - - $provides = array_merge($provides, $instance->provides()); - } - - return $provides; - } -} diff --git a/vendor/illuminate/support/Benchmark.php b/vendor/illuminate/support/Benchmark.php deleted file mode 100644 index 8773482..0000000 --- a/vendor/illuminate/support/Benchmark.php +++ /dev/null @@ -1,69 +0,0 @@ -map(function ($callback) use ($iterations) { - return Collection::range(1, $iterations)->map(function () use ($callback) { - gc_collect_cycles(); - - $start = hrtime(true); - - $callback(); - - return (hrtime(true) - $start) / 1000000; - })->average(); - })->when( - $benchmarkables instanceof Closure, - fn ($c) => $c->first(), - fn ($c) => $c->all(), - ); - } - - /** - * Measure a callable once and return the duration and result. - * - * @template TReturn of mixed - * - * @param (callable(): TReturn) $callback - * @return array{0: TReturn, 1: float} - */ - public static function value(callable $callback): array - { - gc_collect_cycles(); - - $start = hrtime(true); - - $result = $callback(); - - return [$result, (hrtime(true) - $start) / 1000000]; - } - - /** - * Measure a callable or array of callables over the given number of iterations, then dump and die. - * - * @param \Closure|array $benchmarkables - * @param int $iterations - * @return never - */ - public static function dd(Closure|array $benchmarkables, int $iterations = 1): void - { - $result = (new Collection(static::measure(Arr::wrap($benchmarkables), $iterations))) - ->map(fn ($average) => number_format($average, 3).'ms') - ->when($benchmarkables instanceof Closure, fn ($c) => $c->first(), fn ($c) => $c->all()); - - dd($result); - } -} diff --git a/vendor/illuminate/support/Carbon.php b/vendor/illuminate/support/Carbon.php deleted file mode 100644 index bd56ad8..0000000 --- a/vendor/illuminate/support/Carbon.php +++ /dev/null @@ -1,36 +0,0 @@ -getDateTime()); - } -} diff --git a/vendor/illuminate/support/Composer.php b/vendor/illuminate/support/Composer.php deleted file mode 100644 index 860c886..0000000 --- a/vendor/illuminate/support/Composer.php +++ /dev/null @@ -1,255 +0,0 @@ -files = $files; - $this->workingPath = $workingPath; - } - - /** - * Determine if the given Composer package is installed. - * - * @param string $package - * @return bool - * - * @throw \RuntimeException - */ - protected function hasPackage($package) - { - $composer = json_decode(file_get_contents($this->findComposerFile()), true); - - return array_key_exists($package, $composer['require'] ?? []) - || array_key_exists($package, $composer['require-dev'] ?? []); - } - - /** - * Install the given Composer packages into the application. - * - * @param array $packages - * @param bool $dev - * @param \Closure|\Symfony\Component\Console\Output\OutputInterface|null $output - * @param string|null $composerBinary - * @return bool - */ - public function requirePackages(array $packages, bool $dev = false, Closure|OutputInterface|null $output = null, $composerBinary = null) - { - $command = (new Collection([ - ...$this->findComposer($composerBinary), - 'require', - ...$packages, - ])) - ->when($dev, function ($command) { - $command->push('--dev'); - })->all(); - - return 0 === $this->getProcess($command, ['COMPOSER_MEMORY_LIMIT' => '-1']) - ->run( - $output instanceof OutputInterface - ? function ($type, $line) use ($output) { - $output->write(' '.$line); - } : $output - ); - } - - /** - * Remove the given Composer packages from the application. - * - * @param array $packages - * @param bool $dev - * @param \Closure|\Symfony\Component\Console\Output\OutputInterface|null $output - * @param string|null $composerBinary - * @return bool - */ - public function removePackages(array $packages, bool $dev = false, Closure|OutputInterface|null $output = null, $composerBinary = null) - { - $command = (new Collection([ - ...$this->findComposer($composerBinary), - 'remove', - ...$packages, - ])) - ->when($dev, function ($command) { - $command->push('--dev'); - })->all(); - - return 0 === $this->getProcess($command, ['COMPOSER_MEMORY_LIMIT' => '-1']) - ->run( - $output instanceof OutputInterface - ? function ($type, $line) use ($output) { - $output->write(' '.$line); - } : $output - ); - } - - /** - * Modify the "composer.json" file contents using the given callback. - * - * @param callable(array):array $callback - * @return void - * - * @throw \RuntimeException - */ - public function modify(callable $callback) - { - $composerFile = $this->findComposerFile(); - - $composer = json_decode(file_get_contents($composerFile), true, 512, JSON_THROW_ON_ERROR); - - file_put_contents( - $composerFile, - json_encode( - call_user_func($callback, $composer), - JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE - ) - ); - } - - /** - * Regenerate the Composer autoloader files. - * - * @param string|array $extra - * @param string|null $composerBinary - * @return int - */ - public function dumpAutoloads($extra = '', $composerBinary = null) - { - $extra = $extra ? (array) $extra : []; - - $command = array_merge($this->findComposer($composerBinary), ['dump-autoload'], $extra); - - return $this->getProcess($command)->run(); - } - - /** - * Regenerate the optimized Composer autoloader files. - * - * @param string|null $composerBinary - * @return int - */ - public function dumpOptimized($composerBinary = null) - { - return $this->dumpAutoloads('--optimize', $composerBinary); - } - - /** - * Get the Composer binary / command for the environment. - * - * @param string|null $composerBinary - * @return array - */ - public function findComposer($composerBinary = null) - { - if (! is_null($composerBinary) && $this->files->exists($composerBinary)) { - return [$this->phpBinary(), $composerBinary]; - } elseif ($this->files->exists($this->workingPath.'/composer.phar')) { - return [$this->phpBinary(), 'composer.phar']; - } - - return ['composer']; - } - - /** - * Get the path to the "composer.json" file. - * - * @return string - * - * @throw \RuntimeException - */ - protected function findComposerFile() - { - $composerFile = "{$this->workingPath}/composer.json"; - - if (! file_exists($composerFile)) { - throw new RuntimeException("Unable to locate `composer.json` file at [{$this->workingPath}]."); - } - - return $composerFile; - } - - /** - * Get the PHP binary. - * - * @return string - */ - protected function phpBinary() - { - return php_binary(); - } - - /** - * Get a new Symfony process instance. - * - * @param array $command - * @param array $env - * @return \Symfony\Component\Process\Process - */ - protected function getProcess(array $command, array $env = []) - { - return (new Process($command, $this->workingPath, $env))->setTimeout(null); - } - - /** - * Set the working path used by the class. - * - * @param string $path - * @return $this - */ - public function setWorkingPath($path) - { - $this->workingPath = realpath($path); - - return $this; - } - - /** - * Get the version of Composer. - * - * @return string|null - */ - public function getVersion() - { - $command = array_merge($this->findComposer(), ['-V', '--no-ansi']); - - $process = $this->getProcess($command); - - $process->run(); - - $output = $process->getOutput(); - - if (preg_match('/(\d+(\.\d+){2})/', $output, $version)) { - return $version[1]; - } - - return explode(' ', $output)[2] ?? null; - } -} diff --git a/vendor/illuminate/support/ConfigurationUrlParser.php b/vendor/illuminate/support/ConfigurationUrlParser.php deleted file mode 100644 index a1b9337..0000000 --- a/vendor/illuminate/support/ConfigurationUrlParser.php +++ /dev/null @@ -1,191 +0,0 @@ - 'sqlsrv', - 'mysql2' => 'mysql', // RDS - 'postgres' => 'pgsql', - 'postgresql' => 'pgsql', - 'sqlite3' => 'sqlite', - 'redis' => 'tcp', - 'rediss' => 'tls', - ]; - - /** - * Parse the database configuration, hydrating options using a database configuration URL if possible. - * - * @param array|string $config - * @return array - */ - public function parseConfiguration($config) - { - if (is_string($config)) { - $config = ['url' => $config]; - } - - $url = Arr::pull($config, 'url'); - - if (! $url) { - return $config; - } - - $rawComponents = $this->parseUrl($url); - - $decodedComponents = $this->parseStringsToNativeTypes( - array_map('rawurldecode', $rawComponents) - ); - - return array_merge( - $config, - $this->getPrimaryOptions($decodedComponents), - $this->getQueryOptions($rawComponents) - ); - } - - /** - * Get the primary database connection options. - * - * @param array $url - * @return array - */ - protected function getPrimaryOptions($url) - { - return array_filter([ - 'driver' => $this->getDriver($url), - 'database' => $this->getDatabase($url), - 'host' => $url['host'] ?? null, - 'port' => $url['port'] ?? null, - 'username' => $url['user'] ?? null, - 'password' => $url['pass'] ?? null, - ], fn ($value) => ! is_null($value)); - } - - /** - * Get the database driver from the URL. - * - * @param array $url - * @return string|null - */ - protected function getDriver($url) - { - $alias = $url['scheme'] ?? null; - - if (! $alias) { - return; - } - - return static::$driverAliases[$alias] ?? $alias; - } - - /** - * Get the database name from the URL. - * - * @param array $url - * @return string|null - */ - protected function getDatabase($url) - { - $path = $url['path'] ?? null; - - return $path && $path !== '/' ? substr($path, 1) : null; - } - - /** - * Get all of the additional database options from the query string. - * - * @param array $url - * @return array - */ - protected function getQueryOptions($url) - { - $queryString = $url['query'] ?? null; - - if (! $queryString) { - return []; - } - - $query = []; - - parse_str($queryString, $query); - - return $this->parseStringsToNativeTypes($query); - } - - /** - * Parse the string URL to an array of components. - * - * @param string $url - * @return array - * - * @throws \InvalidArgumentException - */ - protected function parseUrl($url) - { - $url = preg_replace('#^(sqlite3?):///#', '$1://null/', $url); - - $parsedUrl = parse_url($url); - - if ($parsedUrl === false) { - throw new InvalidArgumentException('The database configuration URL is malformed.'); - } - - return $parsedUrl; - } - - /** - * Convert string casted values to their native types. - * - * @param mixed $value - * @return mixed - */ - protected function parseStringsToNativeTypes($value) - { - if (is_array($value)) { - return array_map([$this, 'parseStringsToNativeTypes'], $value); - } - - if (! is_string($value)) { - return $value; - } - - $parsedValue = json_decode($value, true); - - if (json_last_error() === JSON_ERROR_NONE) { - return $parsedValue; - } - - return $value; - } - - /** - * Get all of the current drivers' aliases. - * - * @return array - */ - public static function getDriverAliases() - { - return static::$driverAliases; - } - - /** - * Add the given driver alias to the driver aliases array. - * - * @param string $alias - * @param string $driver - * @return void - */ - public static function addDriverAlias($alias, $driver) - { - static::$driverAliases[$alias] = $driver; - } -} diff --git a/vendor/illuminate/support/DateFactory.php b/vendor/illuminate/support/DateFactory.php deleted file mode 100644 index 3d0cd04..0000000 --- a/vendor/illuminate/support/DateFactory.php +++ /dev/null @@ -1,231 +0,0 @@ -$method(...$parameters); - } - - $dateClass = static::$dateClass ?: $defaultClassName; - - // Check if the date can be created using the public class method... - if (method_exists($dateClass, $method) || - method_exists($dateClass, 'hasMacro') && $dateClass::hasMacro($method)) { - return $dateClass::$method(...$parameters); - } - - // If that fails, create the date with the default class... - $date = $defaultClassName::$method(...$parameters); - - // If the configured class has an "instance" method, we'll try to pass our date into there... - if (method_exists($dateClass, 'instance')) { - return $dateClass::instance($date); - } - - // Otherwise, assume the configured class has a DateTime compatible constructor... - return new $dateClass($date->format('Y-m-d H:i:s.u'), $date->getTimezone()); - } -} diff --git a/vendor/illuminate/support/DefaultProviders.php b/vendor/illuminate/support/DefaultProviders.php deleted file mode 100644 index 791e860..0000000 --- a/vendor/illuminate/support/DefaultProviders.php +++ /dev/null @@ -1,103 +0,0 @@ -providers = $providers ?: [ - \Illuminate\Auth\AuthServiceProvider::class, - \Illuminate\Broadcasting\BroadcastServiceProvider::class, - \Illuminate\Bus\BusServiceProvider::class, - \Illuminate\Cache\CacheServiceProvider::class, - \Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, - \Illuminate\Concurrency\ConcurrencyServiceProvider::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\Auth\Passwords\PasswordResetServiceProvider::class, - \Illuminate\Pipeline\PipelineServiceProvider::class, - \Illuminate\Queue\QueueServiceProvider::class, - \Illuminate\Redis\RedisServiceProvider::class, - \Illuminate\Session\SessionServiceProvider::class, - \Illuminate\Translation\TranslationServiceProvider::class, - \Illuminate\Validation\ValidationServiceProvider::class, - \Illuminate\View\ViewServiceProvider::class, - ]; - } - - /** - * Merge the given providers into the provider collection. - * - * @param array $providers - * @return static - */ - public function merge(array $providers) - { - $this->providers = array_merge($this->providers, $providers); - - return new static($this->providers); - } - - /** - * Replace the given providers with other providers. - * - * @param array $replacements - * @return static - */ - public function replace(array $replacements) - { - $current = new Collection($this->providers); - - foreach ($replacements as $from => $to) { - $key = $current->search($from); - - $current = is_int($key) ? $current->replace([$key => $to]) : $current; - } - - return new static($current->values()->toArray()); - } - - /** - * Disable the given providers. - * - * @param array $providers - * @return static - */ - public function except(array $providers) - { - return new static((new Collection($this->providers)) - ->reject(fn ($p) => in_array($p, $providers)) - ->values() - ->toArray()); - } - - /** - * Convert the provider collection to an array. - * - * @return array - */ - public function toArray() - { - return $this->providers; - } -} diff --git a/vendor/illuminate/support/Defer/DeferredCallback.php b/vendor/illuminate/support/Defer/DeferredCallback.php deleted file mode 100644 index 2bf6ad4..0000000 --- a/vendor/illuminate/support/Defer/DeferredCallback.php +++ /dev/null @@ -1,55 +0,0 @@ -name = $name ?? (string) Str::uuid(); - } - - /** - * Specify the name of the deferred callback so it can be cancelled later. - * - * @param string $name - * @return $this - */ - public function name(string $name): self - { - $this->name = $name; - - return $this; - } - - /** - * Indicate that the deferred callback should run even on unsuccessful requests and jobs. - * - * @param bool $always - * @return $this - */ - public function always(bool $always = true): self - { - $this->always = $always; - - return $this; - } - - /** - * Invoke the deferred callback. - * - * @return void - */ - public function __invoke(): void - { - call_user_func($this->callback); - } -} diff --git a/vendor/illuminate/support/Defer/DeferredCallbackCollection.php b/vendor/illuminate/support/Defer/DeferredCallbackCollection.php deleted file mode 100644 index 6acdd5a..0000000 --- a/vendor/illuminate/support/Defer/DeferredCallbackCollection.php +++ /dev/null @@ -1,157 +0,0 @@ -callbacks)[0]; - } - - /** - * Invoke the deferred callbacks. - * - * @return void - */ - public function invoke(): void - { - $this->invokeWhen(fn () => true); - } - - /** - * Invoke the deferred callbacks if the given truth test evaluates to true. - * - * @param \Closure|null $when - * @return void - */ - public function invokeWhen(?Closure $when = null): void - { - $when ??= fn () => true; - - $this->forgetDuplicates(); - - foreach ($this->callbacks as $index => $callback) { - if ($when($callback)) { - rescue($callback); - } - - unset($this->callbacks[$index]); - } - } - - /** - * Remove any deferred callbacks with the given name. - * - * @param string $name - * @return void - */ - public function forget(string $name): void - { - $this->callbacks = (new Collection($this->callbacks)) - ->reject(fn ($callback) => $callback->name === $name) - ->values() - ->all(); - } - - /** - * Remove any duplicate callbacks. - * - * @return $this - */ - protected function forgetDuplicates(): self - { - $this->callbacks = (new Collection($this->callbacks)) - ->reverse() - ->unique(fn ($c) => $c->name) - ->reverse() - ->values() - ->all(); - - return $this; - } - - /** - * Determine if the collection has a callback with the given key. - * - * @param mixed $offset - * @return bool - */ - public function offsetExists(mixed $offset): bool - { - $this->forgetDuplicates(); - - return isset($this->callbacks[$offset]); - } - - /** - * Get the callback with the given key. - * - * @param mixed $offset - * @return mixed - */ - public function offsetGet(mixed $offset): mixed - { - $this->forgetDuplicates(); - - return $this->callbacks[$offset]; - } - - /** - * Set the callback with the given key. - * - * @param mixed $offset - * @param mixed $value - * @return void - */ - public function offsetSet(mixed $offset, mixed $value): void - { - if (is_null($offset)) { - $this->callbacks[] = $value; - } else { - $this->callbacks[$offset] = $value; - } - } - - /** - * Remove the callback with the given key from the collection. - * - * @param mixed $offset - * @return void - */ - public function offsetUnset(mixed $offset): void - { - $this->forgetDuplicates(); - - unset($this->callbacks[$offset]); - } - - /** - * Determine how many callbacks are in the collection. - * - * @return int - */ - public function count(): int - { - $this->forgetDuplicates(); - - return count($this->callbacks); - } -} diff --git a/vendor/illuminate/support/Env.php b/vendor/illuminate/support/Env.php deleted file mode 100644 index 51ea918..0000000 --- a/vendor/illuminate/support/Env.php +++ /dev/null @@ -1,125 +0,0 @@ -addAdapter(PutenvAdapter::class); - } - - static::$repository = $builder->immutable()->make(); - } - - return static::$repository; - } - - /** - * Get the value of an environment variable. - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public static function get($key, $default = null) - { - return self::getOption($key)->getOrCall(fn () => value($default)); - } - - /** - * Get the value of a required environment variable. - * - * @param string $key - * @return mixed - * - * @throws \RuntimeException - */ - public static function getOrFail($key) - { - return self::getOption($key)->getOrThrow(new RuntimeException("Environment variable [$key] has no value.")); - } - - /** - * Get the possible option for this environment variable. - * - * @param string $key - * @return \PhpOption\Option|\PhpOption\Some - */ - protected static function getOption($key) - { - return Option::fromValue(static::getRepository()->get($key)) - ->map(function ($value) { - switch (strtolower($value)) { - case 'true': - case '(true)': - return true; - case 'false': - case '(false)': - return false; - case 'empty': - case '(empty)': - return ''; - case 'null': - case '(null)': - return; - } - - if (preg_match('/\A([\'"])(.*)\1\z/', $value, $matches)) { - return $matches[2]; - } - - return $value; - }); - } -} diff --git a/vendor/illuminate/support/Exceptions/MathException.php b/vendor/illuminate/support/Exceptions/MathException.php deleted file mode 100644 index 6f9158d..0000000 --- a/vendor/illuminate/support/Exceptions/MathException.php +++ /dev/null @@ -1,10 +0,0 @@ -providerIsLoaded(UiServiceProvider::class)) { - throw new RuntimeException('In order to use the Auth::routes() method, please install the laravel/ui package.'); - } - - static::$app->make('router')->auth($options); - } -} diff --git a/vendor/illuminate/support/Facades/Blade.php b/vendor/illuminate/support/Facades/Blade.php deleted file mode 100644 index 01dc7ae..0000000 --- a/vendor/illuminate/support/Facades/Blade.php +++ /dev/null @@ -1,62 +0,0 @@ -dispatcher - : static::getFacadeRoot(); - - return tap(new BusFake($actualDispatcher, $jobsToFake, $batchRepository), function ($fake) { - static::swap($fake); - }); - } - - /** - * Dispatch the given chain of jobs. - * - * @param array|mixed $jobs - * @return \Illuminate\Foundation\Bus\PendingDispatch - */ - public static function dispatchChain($jobs) - { - $jobs = is_array($jobs) ? $jobs : func_get_args(); - - return (new PendingChain(array_shift($jobs), $jobs)) - ->dispatch(); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return BusDispatcherContract::class; - } -} diff --git a/vendor/illuminate/support/Facades/Cache.php b/vendor/illuminate/support/Facades/Cache.php deleted file mode 100644 index 1463306..0000000 --- a/vendor/illuminate/support/Facades/Cache.php +++ /dev/null @@ -1,73 +0,0 @@ -cookie($key, null)); - } - - /** - * Retrieve a cookie from the request. - * - * @param string|null $key - * @param mixed $default - * @return string|array|null - */ - public static function get($key = null, $default = null) - { - return static::$app['request']->cookie($key, $default); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'cookie'; - } -} diff --git a/vendor/illuminate/support/Facades/Crypt.php b/vendor/illuminate/support/Facades/Crypt.php deleted file mode 100644 index 6d19716..0000000 --- a/vendor/illuminate/support/Facades/Crypt.php +++ /dev/null @@ -1,30 +0,0 @@ -dispatcher - : static::getFacadeRoot(); - - return tap(new EventFake($actualDispatcher, $eventsToFake), function ($fake) { - static::swap($fake); - - Model::setEventDispatcher($fake); - Cache::refreshEventDispatcher(); - }); - } - - /** - * Replace the bound instance with a fake that fakes all events except the given events. - * - * @param string[]|string $eventsToAllow - * @return \Illuminate\Support\Testing\Fakes\EventFake - */ - public static function fakeExcept($eventsToAllow) - { - return static::fake([ - function ($eventName) use ($eventsToAllow) { - return ! in_array($eventName, (array) $eventsToAllow); - }, - ]); - } - - /** - * Replace the bound instance with a fake during the given callable's execution. - * - * @param callable $callable - * @param array $eventsToFake - * @return mixed - */ - public static function fakeFor(callable $callable, array $eventsToFake = []) - { - $originalDispatcher = static::getFacadeRoot(); - - static::fake($eventsToFake); - - return tap($callable(), function () use ($originalDispatcher) { - static::swap($originalDispatcher); - - Model::setEventDispatcher($originalDispatcher); - Cache::refreshEventDispatcher(); - }); - } - - /** - * Replace the bound instance with a fake during the given callable's execution. - * - * @param callable $callable - * @param array $eventsToAllow - * @return mixed - */ - public static function fakeExceptFor(callable $callable, array $eventsToAllow = []) - { - $originalDispatcher = static::getFacadeRoot(); - - static::fakeExcept($eventsToAllow); - - return tap($callable(), function () use ($originalDispatcher) { - static::swap($originalDispatcher); - - Model::setEventDispatcher($originalDispatcher); - Cache::refreshEventDispatcher(); - }); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'events'; - } -} diff --git a/vendor/illuminate/support/Facades/Exceptions.php b/vendor/illuminate/support/Facades/Exceptions.php deleted file mode 100644 index 42015c0..0000000 --- a/vendor/illuminate/support/Facades/Exceptions.php +++ /dev/null @@ -1,68 +0,0 @@ ->|class-string<\Throwable> $exceptions - * @return \Illuminate\Support\Testing\Fakes\ExceptionHandlerFake - */ - public static function fake(array|string $exceptions = []) - { - $exceptionHandler = static::isFake() - ? static::getFacadeRoot()->handler() - : static::getFacadeRoot(); - - return tap(new ExceptionHandlerFake($exceptionHandler, Arr::wrap($exceptions)), function ($fake) { - static::swap($fake); - }); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return ExceptionHandler::class; - } -} diff --git a/vendor/illuminate/support/Facades/Facade.php b/vendor/illuminate/support/Facades/Facade.php deleted file mode 100644 index 8874954..0000000 --- a/vendor/illuminate/support/Facades/Facade.php +++ /dev/null @@ -1,363 +0,0 @@ -resolved($accessor) === true) { - $callback(static::getFacadeRoot(), static::$app); - } - - static::$app->afterResolving($accessor, function ($service, $app) use ($callback) { - $callback($service, $app); - }); - } - - /** - * Convert the facade into a Mockery spy. - * - * @return \Mockery\MockInterface - */ - public static function spy() - { - if (! static::isMock()) { - $class = static::getMockableClass(); - - return tap($class ? Mockery::spy($class) : Mockery::spy(), function ($spy) { - static::swap($spy); - }); - } - } - - /** - * Initiate a partial mock on the facade. - * - * @return \Mockery\MockInterface - */ - public static function partialMock() - { - $name = static::getFacadeAccessor(); - - $mock = static::isMock() - ? static::$resolvedInstance[$name] - : static::createFreshMockInstance(); - - return $mock->makePartial(); - } - - /** - * Initiate a mock expectation on the facade. - * - * @return \Mockery\Expectation - */ - public static function shouldReceive() - { - $name = static::getFacadeAccessor(); - - $mock = static::isMock() - ? static::$resolvedInstance[$name] - : static::createFreshMockInstance(); - - return $mock->shouldReceive(...func_get_args()); - } - - /** - * Initiate a mock expectation on the facade. - * - * @return \Mockery\Expectation - */ - public static function expects() - { - $name = static::getFacadeAccessor(); - - $mock = static::isMock() - ? static::$resolvedInstance[$name] - : static::createFreshMockInstance(); - - return $mock->expects(...func_get_args()); - } - - /** - * Create a fresh mock instance for the given class. - * - * @return \Mockery\MockInterface - */ - protected static function createFreshMockInstance() - { - return tap(static::createMock(), function ($mock) { - static::swap($mock); - - $mock->shouldAllowMockingProtectedMethods(); - }); - } - - /** - * Create a fresh mock instance for the given class. - * - * @return \Mockery\MockInterface - */ - protected static function createMock() - { - $class = static::getMockableClass(); - - return $class ? Mockery::mock($class) : Mockery::mock(); - } - - /** - * Determines whether a mock is set as the instance of the facade. - * - * @return bool - */ - protected static function isMock() - { - $name = static::getFacadeAccessor(); - - return isset(static::$resolvedInstance[$name]) && - static::$resolvedInstance[$name] instanceof LegacyMockInterface; - } - - /** - * Get the mockable class for the bound instance. - * - * @return string|null - */ - protected static function getMockableClass() - { - if ($root = static::getFacadeRoot()) { - return get_class($root); - } - } - - /** - * Hotswap the underlying instance behind the facade. - * - * @param mixed $instance - * @return void - */ - public static function swap($instance) - { - static::$resolvedInstance[static::getFacadeAccessor()] = $instance; - - if (isset(static::$app)) { - static::$app->instance(static::getFacadeAccessor(), $instance); - } - } - - /** - * Determines whether a "fake" has been set as the facade instance. - * - * @return bool - */ - public static function isFake() - { - $name = static::getFacadeAccessor(); - - return isset(static::$resolvedInstance[$name]) && - static::$resolvedInstance[$name] instanceof Fake; - } - - /** - * Get the root object behind the facade. - * - * @return mixed - */ - public static function getFacadeRoot() - { - return static::resolveFacadeInstance(static::getFacadeAccessor()); - } - - /** - * Get the registered name of the component. - * - * @return string - * - * @throws \RuntimeException - */ - protected static function getFacadeAccessor() - { - throw new RuntimeException('Facade does not implement getFacadeAccessor method.'); - } - - /** - * Resolve the facade root instance from the container. - * - * @param string $name - * @return mixed - */ - protected static function resolveFacadeInstance($name) - { - if (isset(static::$resolvedInstance[$name])) { - return static::$resolvedInstance[$name]; - } - - if (static::$app) { - if (static::$cached) { - return static::$resolvedInstance[$name] = static::$app[$name]; - } - - return static::$app[$name]; - } - } - - /** - * Clear a resolved facade instance. - * - * @param string $name - * @return void - */ - public static function clearResolvedInstance($name) - { - unset(static::$resolvedInstance[$name]); - } - - /** - * Clear all of the resolved instances. - * - * @return void - */ - public static function clearResolvedInstances() - { - static::$resolvedInstance = []; - } - - /** - * Get the application default aliases. - * - * @return \Illuminate\Support\Collection - */ - public static function defaultAliases() - { - return new Collection([ - 'App' => App::class, - 'Arr' => Arr::class, - 'Artisan' => Artisan::class, - 'Auth' => Auth::class, - 'Blade' => Blade::class, - 'Broadcast' => Broadcast::class, - 'Bus' => Bus::class, - 'Cache' => Cache::class, - 'Concurrency' => Concurrency::class, - 'Config' => Config::class, - 'Context' => Context::class, - 'Cookie' => Cookie::class, - 'Crypt' => Crypt::class, - 'Date' => Date::class, - 'DB' => DB::class, - 'Eloquent' => Model::class, - 'Event' => Event::class, - 'File' => File::class, - 'Gate' => Gate::class, - 'Hash' => Hash::class, - 'Http' => Http::class, - 'Js' => Js::class, - 'Lang' => Lang::class, - 'Log' => Log::class, - 'Mail' => Mail::class, - 'Notification' => Notification::class, - 'Number' => Number::class, - 'Password' => Password::class, - 'Process' => Process::class, - 'Queue' => Queue::class, - 'RateLimiter' => RateLimiter::class, - 'Redirect' => Redirect::class, - 'Request' => Request::class, - 'Response' => Response::class, - 'Route' => Route::class, - 'Schedule' => Schedule::class, - 'Schema' => Schema::class, - 'Session' => Session::class, - 'Storage' => Storage::class, - 'Str' => Str::class, - 'URL' => URL::class, - 'Uri' => Uri::class, - 'Validator' => Validator::class, - 'View' => View::class, - 'Vite' => Vite::class, - ]); - } - - /** - * Get the application instance behind the facade. - * - * @return \Illuminate\Contracts\Foundation\Application|null - */ - public static function getFacadeApplication() - { - return static::$app; - } - - /** - * Set the application instance. - * - * @param \Illuminate\Contracts\Foundation\Application|null $app - * @return void - */ - public static function setFacadeApplication($app) - { - static::$app = $app; - } - - /** - * Handle dynamic, static calls to the object. - * - * @param string $method - * @param array $args - * @return mixed - * - * @throws \RuntimeException - */ - public static function __callStatic($method, $args) - { - $instance = static::getFacadeRoot(); - - if (! $instance) { - throw new RuntimeException('A facade root has not been set.'); - } - - return $instance->$method(...$args); - } -} diff --git a/vendor/illuminate/support/Facades/File.php b/vendor/illuminate/support/Facades/File.php deleted file mode 100644 index b28cc6c..0000000 --- a/vendor/illuminate/support/Facades/File.php +++ /dev/null @@ -1,72 +0,0 @@ -fake($callback)); - }); - } - - /** - * Register a response sequence for the given URL pattern. - * - * @param string $urlPattern - * @return \Illuminate\Http\Client\ResponseSequence - */ - public static function fakeSequence(string $urlPattern = '*') - { - $fake = tap(static::getFacadeRoot(), function ($fake) { - static::swap($fake); - }); - - return $fake->fakeSequence($urlPattern); - } - - /** - * Indicate that an exception should be thrown if any request is not faked. - * - * @param bool $prevent - * @return \Illuminate\Http\Client\Factory - */ - public static function preventStrayRequests($prevent = true) - { - return tap(static::getFacadeRoot(), function ($fake) use ($prevent) { - static::swap($fake->preventStrayRequests($prevent)); - }); - } - - /** - * Stub the given URL using the given callback. - * - * @param string $url - * @param \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface|callable $callback - * @return \Illuminate\Http\Client\Factory - */ - public static function stubUrl($url, $callback) - { - return tap(static::getFacadeRoot(), function ($fake) use ($url, $callback) { - static::swap($fake->stubUrl($url, $callback)); - }); - } -} diff --git a/vendor/illuminate/support/Facades/Lang.php b/vendor/illuminate/support/Facades/Lang.php deleted file mode 100644 index 7dc08da..0000000 --- a/vendor/illuminate/support/Facades/Lang.php +++ /dev/null @@ -1,48 +0,0 @@ -manager - : static::getFacadeRoot(); - - return tap(new MailFake($actualMailManager), function ($fake) { - static::swap($fake); - }); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'mail.manager'; - } -} diff --git a/vendor/illuminate/support/Facades/Notification.php b/vendor/illuminate/support/Facades/Notification.php deleted file mode 100644 index 8b30997..0000000 --- a/vendor/illuminate/support/Facades/Notification.php +++ /dev/null @@ -1,96 +0,0 @@ - $route) { - $notifiable->route($channel, $route); - } - - return $notifiable; - } - - /** - * Begin sending a notification to an anonymous notifiable. - * - * @param string $channel - * @param mixed $route - * @return \Illuminate\Notifications\AnonymousNotifiable - */ - public static function route($channel, $route) - { - return (new AnonymousNotifiable)->route($channel, $route); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return ChannelManager::class; - } -} diff --git a/vendor/illuminate/support/Facades/ParallelTesting.php b/vendor/illuminate/support/Facades/ParallelTesting.php deleted file mode 100644 index d91558c..0000000 --- a/vendor/illuminate/support/Facades/ParallelTesting.php +++ /dev/null @@ -1,34 +0,0 @@ -fake($callback)); - }); - } -} diff --git a/vendor/illuminate/support/Facades/Queue.php b/vendor/illuminate/support/Facades/Queue.php deleted file mode 100644 index 4201b72..0000000 --- a/vendor/illuminate/support/Facades/Queue.php +++ /dev/null @@ -1,102 +0,0 @@ -queue - : static::getFacadeRoot(); - - return tap(new QueueFake(static::getFacadeApplication(), $jobsToFake, $actualQueueManager), function ($fake) { - static::swap($fake); - }); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'queue'; - } -} diff --git a/vendor/illuminate/support/Facades/RateLimiter.php b/vendor/illuminate/support/Facades/RateLimiter.php deleted file mode 100644 index 376c3cc..0000000 --- a/vendor/illuminate/support/Facades/RateLimiter.php +++ /dev/null @@ -1,34 +0,0 @@ -') - * @method static \Symfony\Component\HttpFoundation\StreamedResponse stream(callable $callback, int $status = 200, array $headers = []) - * @method static \Symfony\Component\HttpFoundation\StreamedJsonResponse streamJson(array $data, int $status = 200, array $headers = [], int $encodingOptions = 15) - * @method static \Symfony\Component\HttpFoundation\StreamedResponse streamDownload(callable $callback, string|null $name = null, array $headers = [], string|null $disposition = 'attachment') - * @method static \Symfony\Component\HttpFoundation\BinaryFileResponse download(\SplFileInfo|string $file, string|null $name = null, array $headers = [], string|null $disposition = 'attachment') - * @method static \Symfony\Component\HttpFoundation\BinaryFileResponse file(\SplFileInfo|string $file, array $headers = []) - * @method static \Illuminate\Http\RedirectResponse redirectTo(string $path, int $status = 302, array $headers = [], bool|null $secure = null) - * @method static \Illuminate\Http\RedirectResponse redirectToRoute(\BackedEnum|string $route, mixed $parameters = [], int $status = 302, array $headers = []) - * @method static \Illuminate\Http\RedirectResponse redirectToAction(array|string $action, mixed $parameters = [], int $status = 302, array $headers = []) - * @method static \Illuminate\Http\RedirectResponse redirectGuest(string $path, int $status = 302, array $headers = [], bool|null $secure = null) - * @method static \Illuminate\Http\RedirectResponse redirectToIntended(string $default = '/', int $status = 302, array $headers = [], bool|null $secure = null) - * @method static void macro(string $name, object|callable $macro) - * @method static void mixin(object $mixin, bool $replace = true) - * @method static bool hasMacro(string $name) - * @method static void flushMacros() - * - * @see \Illuminate\Routing\ResponseFactory - */ -class Response extends Facade -{ - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return ResponseFactoryContract::class; - } -} diff --git a/vendor/illuminate/support/Facades/Route.php b/vendor/illuminate/support/Facades/Route.php deleted file mode 100644 index 187bd38..0000000 --- a/vendor/illuminate/support/Facades/Route.php +++ /dev/null @@ -1,118 +0,0 @@ -connection($name)->getSchemaBuilder(); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'db.schema'; - } -} diff --git a/vendor/illuminate/support/Facades/Session.php b/vendor/illuminate/support/Facades/Session.php deleted file mode 100644 index 64964ab..0000000 --- a/vendor/illuminate/support/Facades/Session.php +++ /dev/null @@ -1,87 +0,0 @@ -get('filesystems.default')); - - if ($token = ParallelTesting::token()) { - $root = "{$root}_test_{$token}"; - } - - (new Filesystem)->cleanDirectory($root); - - static::set($disk, $fake = static::createLocalDriver( - self::buildDiskConfiguration($disk, $config, root: $root) - )); - - return tap($fake)->buildTemporaryUrlsUsing(function ($path, $expiration) { - return URL::to($path.'?expiration='.$expiration->getTimestamp()); - }); - } - - /** - * Replace the given disk with a persistent local testing disk. - * - * @param string|null $disk - * @param array $config - * @return \Illuminate\Contracts\Filesystem\Filesystem - */ - public static function persistentFake($disk = null, array $config = []) - { - $disk = $disk ?: static::$app['config']->get('filesystems.default'); - - static::set($disk, $fake = static::createLocalDriver( - self::buildDiskConfiguration($disk, $config, root: self::getRootPath($disk)) - )); - - return $fake; - } - - /** - * Get the root path of the given disk. - * - * @param string $disk - * @return string - */ - protected static function getRootPath(string $disk): string - { - return storage_path('framework/testing/disks/'.$disk); - } - - /** - * Assemble the configuration of the given disk. - * - * @param string $disk - * @param array $config - * @param string $root - * @return array - */ - protected static function buildDiskConfiguration(string $disk, array $config, string $root): array - { - $originalConfig = static::$app['config']["filesystems.disks.{$disk}"] ?? []; - - return array_merge([ - 'throw' => $originalConfig['throw'] ?? false], - $config, - ['root' => $root] - ); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'filesystem'; - } -} diff --git a/vendor/illuminate/support/Facades/URL.php b/vendor/illuminate/support/Facades/URL.php deleted file mode 100644 index 6febb2c..0000000 --- a/vendor/illuminate/support/Facades/URL.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @implements \ArrayAccess - */ -class Fluent implements Arrayable, ArrayAccess, Jsonable, JsonSerializable -{ - use InteractsWithData, Macroable { - __call as macroCall; - } - - /** - * All of the attributes set on the fluent instance. - * - * @var array - */ - protected $attributes = []; - - /** - * Create a new fluent instance. - * - * @param iterable $attributes - * @return void - */ - public function __construct($attributes = []) - { - $this->fill($attributes); - } - - /** - * Get an attribute from the fluent instance using "dot" notation. - * - * @template TGetDefault - * - * @param TKey $key - * @param TGetDefault|(\Closure(): TGetDefault) $default - * @return TValue|TGetDefault - */ - public function get($key, $default = null) - { - return data_get($this->attributes, $key, $default); - } - - /** - * Set an attribute on the fluent instance using "dot" notation. - * - * @param TKey $key - * @param TValue $value - * @return $this - */ - public function set($key, $value) - { - data_set($this->attributes, $key, $value); - - return $this; - } - - /** - * Fill the fluent instance with an array of attributes. - * - * @param iterable $attributes - * @return $this - */ - public function fill($attributes) - { - foreach ($attributes as $key => $value) { - $this->attributes[$key] = $value; - } - - return $this; - } - - /** - * Get an attribute from the fluent instance. - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public function value($key, $default = null) - { - if (array_key_exists($key, $this->attributes)) { - return $this->attributes[$key]; - } - - return value($default); - } - - /** - * Get the value of the given key as a new Fluent instance. - * - * @param string $key - * @param mixed $default - * @return static - */ - public function scope($key, $default = null) - { - return new static( - (array) $this->get($key, $default) - ); - } - - /** - * Get all of the attributes from the fluent instance. - * - * @param array|mixed|null $keys - * @return array - */ - public function all($keys = null) - { - $data = $this->data(); - - if (! $keys) { - return $data; - } - - $results = []; - - foreach (is_array($keys) ? $keys : func_get_args() as $key) { - Arr::set($results, $key, Arr::get($data, $key)); - } - - return $results; - } - - /** - * Get data from the fluent instance. - * - * @param string $key - * @param mixed $default - * @return mixed - */ - protected function data($key = null, $default = null) - { - return $this->get($key, $default); - } - - /** - * Get the attributes from the fluent instance. - * - * @return array - */ - public function getAttributes() - { - return $this->attributes; - } - - /** - * Convert the fluent instance to an array. - * - * @return array - */ - public function toArray() - { - return $this->attributes; - } - - /** - * Convert the object into something JSON serializable. - * - * @return array - */ - public function jsonSerialize(): array - { - return $this->toArray(); - } - - /** - * Convert the fluent instance to JSON. - * - * @param int $options - * @return string - */ - public function toJson($options = 0) - { - return json_encode($this->jsonSerialize(), $options); - } - - /** - * Determine if the given offset exists. - * - * @param TKey $offset - * @return bool - */ - public function offsetExists($offset): bool - { - return isset($this->attributes[$offset]); - } - - /** - * Get the value for a given offset. - * - * @param TKey $offset - * @return TValue|null - */ - public function offsetGet($offset): mixed - { - return $this->value($offset); - } - - /** - * Set the value at the given offset. - * - * @param TKey $offset - * @param TValue $value - * @return void - */ - public function offsetSet($offset, $value): void - { - $this->attributes[$offset] = $value; - } - - /** - * Unset the value at the given offset. - * - * @param TKey $offset - * @return void - */ - public function offsetUnset($offset): void - { - unset($this->attributes[$offset]); - } - - /** - * Handle dynamic calls to the fluent instance to set attributes. - * - * @param TKey $method - * @param array{0: ?TValue} $parameters - * @return $this - */ - public function __call($method, $parameters) - { - if (static::hasMacro($method)) { - return $this->macroCall($method, $parameters); - } - - $this->attributes[$method] = count($parameters) > 0 ? reset($parameters) : true; - - return $this; - } - - /** - * Dynamically retrieve the value of an attribute. - * - * @param TKey $key - * @return TValue|null - */ - public function __get($key) - { - return $this->value($key); - } - - /** - * Dynamically set the value of an attribute. - * - * @param TKey $key - * @param TValue $value - * @return void - */ - public function __set($key, $value) - { - $this->offsetSet($key, $value); - } - - /** - * Dynamically check if an attribute is set. - * - * @param TKey $key - * @return bool - */ - public function __isset($key) - { - return $this->offsetExists($key); - } - - /** - * Dynamically unset an attribute. - * - * @param TKey $key - * @return void - */ - public function __unset($key) - { - $this->offsetUnset($key); - } -} diff --git a/vendor/illuminate/support/HigherOrderTapProxy.php b/vendor/illuminate/support/HigherOrderTapProxy.php deleted file mode 100644 index bbf9b2e..0000000 --- a/vendor/illuminate/support/HigherOrderTapProxy.php +++ /dev/null @@ -1,38 +0,0 @@ -target = $target; - } - - /** - * Dynamically pass method calls to the target. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - $this->target->{$method}(...$parameters); - - return $this->target; - } -} diff --git a/vendor/illuminate/support/HtmlString.php b/vendor/illuminate/support/HtmlString.php deleted file mode 100644 index a253111..0000000 --- a/vendor/illuminate/support/HtmlString.php +++ /dev/null @@ -1,67 +0,0 @@ -html = $html; - } - - /** - * Get the HTML string. - * - * @return string - */ - public function toHtml() - { - return $this->html; - } - - /** - * Determine if the given HTML string is empty. - * - * @return bool - */ - public function isEmpty() - { - return ($this->html ?? '') === ''; - } - - /** - * Determine if the given HTML string is not empty. - * - * @return bool - */ - public function isNotEmpty() - { - return ! $this->isEmpty(); - } - - /** - * Get the HTML string. - * - * @return string - */ - public function __toString() - { - return $this->toHtml() ?? ''; - } -} diff --git a/vendor/illuminate/support/InteractsWithTime.php b/vendor/illuminate/support/InteractsWithTime.php deleted file mode 100644 index 6a64f12..0000000 --- a/vendor/illuminate/support/InteractsWithTime.php +++ /dev/null @@ -1,83 +0,0 @@ -parseDateInterval($delay); - - return $delay instanceof DateTimeInterface - ? max(0, $delay->getTimestamp() - $this->currentTime()) - : (int) $delay; - } - - /** - * Get the "available at" UNIX timestamp. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @return int - */ - protected function availableAt($delay = 0) - { - $delay = $this->parseDateInterval($delay); - - return $delay instanceof DateTimeInterface - ? $delay->getTimestamp() - : Carbon::now()->addRealSeconds($delay)->getTimestamp(); - } - - /** - * If the given value is an interval, convert it to a DateTime instance. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @return \DateTimeInterface|int - */ - protected function parseDateInterval($delay) - { - if ($delay instanceof DateInterval) { - $delay = Carbon::now()->add($delay); - } - - return $delay; - } - - /** - * Get the current system time as a UNIX timestamp. - * - * @return int - */ - protected function currentTime() - { - return Carbon::now()->getTimestamp(); - } - - /** - * Given a start time, format the total run time for human readability. - * - * @param float $startTime - * @param float $endTime - * @return string - */ - protected function runTimeForHumans($startTime, $endTime = null) - { - $endTime ??= microtime(true); - - $runTime = ($endTime - $startTime) * 1000; - - return $runTime > 1000 - ? CarbonInterval::milliseconds($runTime)->cascade()->forHumans(short: true) - : number_format($runTime, 2).'ms'; - } -} diff --git a/vendor/illuminate/support/Js.php b/vendor/illuminate/support/Js.php deleted file mode 100644 index aeb6766..0000000 --- a/vendor/illuminate/support/Js.php +++ /dev/null @@ -1,151 +0,0 @@ -js = $this->convertDataToJavaScriptExpression($data, $flags, $depth); - } - - /** - * Create a new JavaScript string from the given data. - * - * @param mixed $data - * @param int $flags - * @param int $depth - * @return static - * - * @throws \JsonException - */ - public static function from($data, $flags = 0, $depth = 512) - { - return new static($data, $flags, $depth); - } - - /** - * Convert the given data to a JavaScript expression. - * - * @param mixed $data - * @param int $flags - * @param int $depth - * @return string - * - * @throws \JsonException - */ - protected function convertDataToJavaScriptExpression($data, $flags = 0, $depth = 512) - { - if ($data instanceof self) { - return $data->toHtml(); - } - - if ($data instanceof UnitEnum) { - $data = enum_value($data); - } - - $json = static::encode($data, $flags, $depth); - - if (is_string($data)) { - return "'".substr($json, 1, -1)."'"; - } - - return $this->convertJsonToJavaScriptExpression($json, $flags); - } - - /** - * Encode the given data as JSON. - * - * @param mixed $data - * @param int $flags - * @param int $depth - * @return string - * - * @throws \JsonException - */ - public static function encode($data, $flags = 0, $depth = 512) - { - if ($data instanceof Jsonable) { - return $data->toJson($flags | static::REQUIRED_FLAGS); - } - - if ($data instanceof Arrayable && ! ($data instanceof JsonSerializable)) { - $data = $data->toArray(); - } - - return json_encode($data, $flags | static::REQUIRED_FLAGS, $depth); - } - - /** - * Convert the given JSON to a JavaScript expression. - * - * @param string $json - * @param int $flags - * @return string - * - * @throws \JsonException - */ - protected function convertJsonToJavaScriptExpression($json, $flags = 0) - { - if ($json === '[]' || $json === '{}') { - return $json; - } - - if (Str::startsWith($json, ['"', '{', '['])) { - return "JSON.parse('".substr(json_encode($json, $flags | static::REQUIRED_FLAGS), 1, -1)."')"; - } - - return $json; - } - - /** - * Get the string representation of the data for use in HTML. - * - * @return string - */ - public function toHtml() - { - return $this->js; - } - - /** - * Get the string representation of the data for use in HTML. - * - * @return string - */ - public function __toString() - { - return $this->toHtml(); - } -} diff --git a/vendor/illuminate/support/LICENSE.md b/vendor/illuminate/support/LICENSE.md deleted file mode 100644 index 79810c8..0000000 --- a/vendor/illuminate/support/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Taylor Otwell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/illuminate/support/Lottery.php b/vendor/illuminate/support/Lottery.php deleted file mode 100644 index d6de350..0000000 --- a/vendor/illuminate/support/Lottery.php +++ /dev/null @@ -1,281 +0,0 @@ - 1) { - throw new RuntimeException('Float must not be greater than 1.'); - } - - $this->chances = $chances; - - $this->outOf = $outOf; - } - - /** - * Create a new Lottery instance. - * - * @param int|float $chances - * @param int|null $outOf - * @return static - */ - public static function odds($chances, $outOf = null) - { - return new static($chances, $outOf); - } - - /** - * Set the winner callback. - * - * @param callable $callback - * @return $this - */ - public function winner($callback) - { - $this->winner = $callback; - - return $this; - } - - /** - * Set the loser callback. - * - * @param callable $callback - * @return $this - */ - public function loser($callback) - { - $this->loser = $callback; - - return $this; - } - - /** - * Run the lottery. - * - * @param mixed ...$args - * @return mixed - */ - public function __invoke(...$args) - { - return $this->runCallback(...$args); - } - - /** - * Run the lottery. - * - * @param null|int $times - * @return mixed - */ - public function choose($times = null) - { - if ($times === null) { - return $this->runCallback(); - } - - $results = []; - - for ($i = 0; $i < $times; $i++) { - $results[] = $this->runCallback(); - } - - return $results; - } - - /** - * Run the winner or loser callback, randomly. - * - * @param mixed ...$args - * @return callable - */ - protected function runCallback(...$args) - { - return $this->wins() - ? ($this->winner ?? fn () => true)(...$args) - : ($this->loser ?? fn () => false)(...$args); - } - - /** - * Determine if the lottery "wins" or "loses". - * - * @return bool - */ - protected function wins() - { - return static::resultFactory()($this->chances, $this->outOf); - } - - /** - * The factory that determines the lottery result. - * - * @return callable - */ - protected static function resultFactory() - { - return static::$resultFactory ?? fn ($chances, $outOf) => $outOf === null - ? random_int(0, PHP_INT_MAX) / PHP_INT_MAX <= $chances - : random_int(1, $outOf) <= $chances; - } - - /** - * Force the lottery to always result in a win. - * - * @param callable|null $callback - * @return void - */ - public static function alwaysWin($callback = null) - { - self::setResultFactory(fn () => true); - - if ($callback === null) { - return; - } - - $callback(); - - static::determineResultNormally(); - } - - /** - * Force the lottery to always result in a lose. - * - * @param callable|null $callback - * @return void - */ - public static function alwaysLose($callback = null) - { - self::setResultFactory(fn () => false); - - if ($callback === null) { - return; - } - - $callback(); - - static::determineResultNormally(); - } - - /** - * Set the sequence that will be used to determine lottery results. - * - * @param array $sequence - * @param callable|null $whenMissing - * @return void - */ - public static function fix($sequence, $whenMissing = null) - { - static::forceResultWithSequence($sequence, $whenMissing); - } - - /** - * Set the sequence that will be used to determine lottery results. - * - * @param array $sequence - * @param callable|null $whenMissing - * @return void - */ - public static function forceResultWithSequence($sequence, $whenMissing = null) - { - $next = 0; - - $whenMissing ??= function ($chances, $outOf) use (&$next) { - $factoryCache = static::$resultFactory; - - static::$resultFactory = null; - - $result = static::resultFactory()($chances, $outOf); - - static::$resultFactory = $factoryCache; - - $next++; - - return $result; - }; - - static::setResultFactory(function ($chances, $outOf) use (&$next, $sequence, $whenMissing) { - if (array_key_exists($next, $sequence)) { - return $sequence[$next++]; - } - - return $whenMissing($chances, $outOf); - }); - } - - /** - * Indicate that the lottery results should be determined normally. - * - * @return void - */ - public static function determineResultsNormally() - { - static::determineResultNormally(); - } - - /** - * Indicate that the lottery results should be determined normally. - * - * @return void - */ - public static function determineResultNormally() - { - static::$resultFactory = null; - } - - /** - * Set the factory that should be used to determine the lottery results. - * - * @param callable $factory - * @return void - */ - public static function setResultFactory($factory) - { - self::$resultFactory = $factory; - } -} diff --git a/vendor/illuminate/support/Manager.php b/vendor/illuminate/support/Manager.php deleted file mode 100644 index dac4731..0000000 --- a/vendor/illuminate/support/Manager.php +++ /dev/null @@ -1,193 +0,0 @@ -container = $container; - $this->config = $container->make('config'); - } - - /** - * Get the default driver name. - * - * @return string - */ - abstract public function getDefaultDriver(); - - /** - * Get a driver instance. - * - * @param string|null $driver - * @return mixed - * - * @throws \InvalidArgumentException - */ - public function driver($driver = null) - { - $driver = $driver ?: $this->getDefaultDriver(); - - if (is_null($driver)) { - throw new InvalidArgumentException(sprintf( - 'Unable to resolve NULL driver for [%s].', static::class - )); - } - - // If the given driver has not been created before, we will create the instances - // here and cache it so we can return it next time very quickly. If there is - // already a driver created by this name, we'll just return that instance. - if (! isset($this->drivers[$driver])) { - $this->drivers[$driver] = $this->createDriver($driver); - } - - return $this->drivers[$driver]; - } - - /** - * Create a new driver instance. - * - * @param string $driver - * @return mixed - * - * @throws \InvalidArgumentException - */ - protected function createDriver($driver) - { - // First, we will determine if a custom driver creator exists for the given driver and - // if it does not we will check for a creator method for the driver. Custom creator - // callbacks allow developers to build their own "drivers" easily using Closures. - if (isset($this->customCreators[$driver])) { - return $this->callCustomCreator($driver); - } - - $method = 'create'.Str::studly($driver).'Driver'; - - if (method_exists($this, $method)) { - return $this->$method(); - } - - throw new InvalidArgumentException("Driver [$driver] not supported."); - } - - /** - * Call a custom driver creator. - * - * @param string $driver - * @return mixed - */ - protected function callCustomCreator($driver) - { - return $this->customCreators[$driver]($this->container); - } - - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return $this - */ - public function extend($driver, Closure $callback) - { - $this->customCreators[$driver] = $callback; - - return $this; - } - - /** - * Get all of the created "drivers". - * - * @return array - */ - public function getDrivers() - { - return $this->drivers; - } - - /** - * Get the container instance used by the manager. - * - * @return \Illuminate\Contracts\Container\Container - */ - public function getContainer() - { - return $this->container; - } - - /** - * Set the container instance used by the manager. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return $this - */ - public function setContainer(Container $container) - { - $this->container = $container; - - return $this; - } - - /** - * Forget all of the resolved driver instances. - * - * @return $this - */ - public function forgetDrivers() - { - $this->drivers = []; - - return $this; - } - - /** - * Dynamically call the default driver instance. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->driver()->$method(...$parameters); - } -} diff --git a/vendor/illuminate/support/MessageBag.php b/vendor/illuminate/support/MessageBag.php deleted file mode 100644 index 5b4e6a6..0000000 --- a/vendor/illuminate/support/MessageBag.php +++ /dev/null @@ -1,444 +0,0 @@ - $value) { - $value = $value instanceof Arrayable ? $value->toArray() : (array) $value; - - $this->messages[$key] = array_unique($value); - } - } - - /** - * Get the keys present in the message bag. - * - * @return array - */ - public function keys() - { - return array_keys($this->messages); - } - - /** - * Add a message to the message bag. - * - * @param string $key - * @param string $message - * @return $this - */ - public function add($key, $message) - { - if ($this->isUnique($key, $message)) { - $this->messages[$key][] = $message; - } - - return $this; - } - - /** - * Add a message to the message bag if the given conditional is "true". - * - * @param bool $boolean - * @param string $key - * @param string $message - * @return $this - */ - public function addIf($boolean, $key, $message) - { - return $boolean ? $this->add($key, $message) : $this; - } - - /** - * Determine if a key and message combination already exists. - * - * @param string $key - * @param string $message - * @return bool - */ - protected function isUnique($key, $message) - { - $messages = (array) $this->messages; - - return ! isset($messages[$key]) || ! in_array($message, $messages[$key]); - } - - /** - * Merge a new array of messages into the message bag. - * - * @param \Illuminate\Contracts\Support\MessageProvider|array $messages - * @return $this - */ - public function merge($messages) - { - if ($messages instanceof MessageProvider) { - $messages = $messages->getMessageBag()->getMessages(); - } - - $this->messages = array_merge_recursive($this->messages, $messages); - - return $this; - } - - /** - * Determine if messages exist for all of the given keys. - * - * @param array|string|null $key - * @return bool - */ - public function has($key) - { - if ($this->isEmpty()) { - return false; - } - - if (is_null($key)) { - return $this->any(); - } - - $keys = is_array($key) ? $key : func_get_args(); - - foreach ($keys as $key) { - if ($this->first($key) === '') { - return false; - } - } - - return true; - } - - /** - * Determine if messages exist for any of the given keys. - * - * @param array|string|null $keys - * @return bool - */ - public function hasAny($keys = []) - { - if ($this->isEmpty()) { - return false; - } - - $keys = is_array($keys) ? $keys : func_get_args(); - - foreach ($keys as $key) { - if ($this->has($key)) { - return true; - } - } - - return false; - } - - /** - * Determine if messages don't exist for all of the given keys. - * - * @param array|string|null $key - * @return bool - */ - public function missing($key) - { - $keys = is_array($key) ? $key : func_get_args(); - - return ! $this->hasAny($keys); - } - - /** - * Get the first message from the message bag for a given key. - * - * @param string|null $key - * @param string|null $format - * @return string - */ - public function first($key = null, $format = null) - { - $messages = is_null($key) ? $this->all($format) : $this->get($key, $format); - - $firstMessage = Arr::first($messages, null, ''); - - return is_array($firstMessage) ? Arr::first($firstMessage) : $firstMessage; - } - - /** - * Get all of the messages from the message bag for a given key. - * - * @param string $key - * @param string|null $format - * @return array - */ - public function get($key, $format = null) - { - // If the message exists in the message bag, we will transform it and return - // the message. Otherwise, we will check if the key is implicit & collect - // all the messages that match the given key and output it as an array. - if (array_key_exists($key, $this->messages)) { - return $this->transform( - $this->messages[$key], $this->checkFormat($format), $key - ); - } - - if (str_contains($key, '*')) { - return $this->getMessagesForWildcardKey($key, $format); - } - - return []; - } - - /** - * Get the messages for a wildcard key. - * - * @param string $key - * @param string|null $format - * @return array - */ - protected function getMessagesForWildcardKey($key, $format) - { - return (new Collection($this->messages)) - ->filter(fn ($messages, $messageKey) => Str::is($key, $messageKey)) - ->map(function ($messages, $messageKey) use ($format) { - return $this->transform($messages, $this->checkFormat($format), $messageKey); - }) - ->all(); - } - - /** - * Get all of the messages for every key in the message bag. - * - * @param string|null $format - * @return array - */ - public function all($format = null) - { - $format = $this->checkFormat($format); - - $all = []; - - foreach ($this->messages as $key => $messages) { - $all = array_merge($all, $this->transform($messages, $format, $key)); - } - - return $all; - } - - /** - * Get all of the unique messages for every key in the message bag. - * - * @param string|null $format - * @return array - */ - public function unique($format = null) - { - return array_unique($this->all($format)); - } - - /** - * Remove a message from the message bag. - * - * @param string $key - * @return $this - */ - public function forget($key) - { - unset($this->messages[$key]); - - return $this; - } - - /** - * Format an array of messages. - * - * @param array $messages - * @param string $format - * @param string $messageKey - * @return array - */ - protected function transform($messages, $format, $messageKey) - { - if ($format == ':message') { - return (array) $messages; - } - - return (new Collection((array) $messages)) - ->map(function ($message) use ($format, $messageKey) { - // We will simply spin through the given messages and transform each one - // replacing the :message place holder with the real message allowing - // the messages to be easily formatted to each developer's desires. - return str_replace([':message', ':key'], [$message, $messageKey], $format); - })->all(); - } - - /** - * Get the appropriate format based on the given format. - * - * @param string $format - * @return string - */ - protected function checkFormat($format) - { - return $format ?: $this->format; - } - - /** - * Get the raw messages in the message bag. - * - * @return array - */ - public function messages() - { - return $this->messages; - } - - /** - * Get the raw messages in the message bag. - * - * @return array - */ - public function getMessages() - { - return $this->messages(); - } - - /** - * Get the messages for the instance. - * - * @return \Illuminate\Support\MessageBag - */ - public function getMessageBag() - { - return $this; - } - - /** - * Get the default message format. - * - * @return string - */ - public function getFormat() - { - return $this->format; - } - - /** - * Set the default message format. - * - * @param string $format - * @return \Illuminate\Support\MessageBag - */ - public function setFormat($format = ':message') - { - $this->format = $format; - - return $this; - } - - /** - * Determine if the message bag has any messages. - * - * @return bool - */ - public function isEmpty() - { - return ! $this->any(); - } - - /** - * Determine if the message bag has any messages. - * - * @return bool - */ - public function isNotEmpty() - { - return $this->any(); - } - - /** - * Determine if the message bag has any messages. - * - * @return bool - */ - public function any() - { - return $this->count() > 0; - } - - /** - * Get the number of messages in the message bag. - * - * @return int - */ - public function count(): int - { - return count($this->messages, COUNT_RECURSIVE) - count($this->messages); - } - - /** - * Get the instance as an array. - * - * @return array - */ - public function toArray() - { - return $this->getMessages(); - } - - /** - * Convert the object into something JSON serializable. - * - * @return array - */ - public function jsonSerialize(): array - { - return $this->toArray(); - } - - /** - * Convert the object to its JSON representation. - * - * @param int $options - * @return string - */ - public function toJson($options = 0) - { - return json_encode($this->jsonSerialize(), $options); - } - - /** - * Convert the message bag to its string representation. - * - * @return string - */ - public function __toString() - { - return $this->toJson(); - } -} diff --git a/vendor/illuminate/support/MultipleInstanceManager.php b/vendor/illuminate/support/MultipleInstanceManager.php deleted file mode 100644 index 05a8c23..0000000 --- a/vendor/illuminate/support/MultipleInstanceManager.php +++ /dev/null @@ -1,228 +0,0 @@ -app = $app; - $this->config = $app->make('config'); - } - - /** - * Get the default instance name. - * - * @return string - */ - abstract public function getDefaultInstance(); - - /** - * Set the default instance name. - * - * @param string $name - * @return void - */ - abstract public function setDefaultInstance($name); - - /** - * Get the instance specific configuration. - * - * @param string $name - * @return array - */ - abstract public function getInstanceConfig($name); - - /** - * Get an instance by name. - * - * @param string|null $name - * @return mixed - */ - public function instance($name = null) - { - $name = $name ?: $this->getDefaultInstance(); - - return $this->instances[$name] = $this->get($name); - } - - /** - * Attempt to get an instance from the local cache. - * - * @param string $name - * @return mixed - */ - protected function get($name) - { - return $this->instances[$name] ?? $this->resolve($name); - } - - /** - * Resolve the given instance. - * - * @param string $name - * @return mixed - * - * @throws \InvalidArgumentException - * @throws \RuntimeException - */ - protected function resolve($name) - { - $config = $this->getInstanceConfig($name); - - if (is_null($config)) { - throw new InvalidArgumentException("Instance [{$name}] is not defined."); - } - - if (! array_key_exists($this->driverKey, $config)) { - throw new RuntimeException("Instance [{$name}] does not specify a {$this->driverKey}."); - } - - $driverName = $config[$this->driverKey]; - - if (isset($this->customCreators[$driverName])) { - return $this->callCustomCreator($config); - } else { - $createMethod = 'create'.ucfirst($driverName).ucfirst($this->driverKey); - - if (method_exists($this, $createMethod)) { - return $this->{$createMethod}($config); - } - - $createMethod = 'create'.Str::studly($driverName).ucfirst($this->driverKey); - - if (method_exists($this, $createMethod)) { - return $this->{$createMethod}($config); - } - - throw new InvalidArgumentException("Instance {$this->driverKey} [{$config[$this->driverKey]}] is not supported."); - } - } - - /** - * Call a custom instance creator. - * - * @param array $config - * @return mixed - */ - protected function callCustomCreator(array $config) - { - return $this->customCreators[$config[$this->driverKey]]($this->app, $config); - } - - /** - * Unset the given instances. - * - * @param array|string|null $name - * @return $this - */ - public function forgetInstance($name = null) - { - $name ??= $this->getDefaultInstance(); - - foreach ((array) $name as $instanceName) { - if (isset($this->instances[$instanceName])) { - unset($this->instances[$instanceName]); - } - } - - return $this; - } - - /** - * Disconnect the given instance and remove from local cache. - * - * @param string|null $name - * @return void - */ - public function purge($name = null) - { - $name ??= $this->getDefaultInstance(); - - unset($this->instances[$name]); - } - - /** - * Register a custom instance creator Closure. - * - * @param string $name - * @param \Closure $callback - * @return $this - */ - public function extend($name, Closure $callback) - { - $this->customCreators[$name] = $callback->bindTo($this, $this); - - return $this; - } - - /** - * Set the application instance used by the manager. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return $this - */ - public function setApplication($app) - { - $this->app = $app; - - return $this; - } - - /** - * Dynamically call the default instance. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->instance()->$method(...$parameters); - } -} diff --git a/vendor/illuminate/support/NamespacedItemResolver.php b/vendor/illuminate/support/NamespacedItemResolver.php deleted file mode 100644 index a059c6d..0000000 --- a/vendor/illuminate/support/NamespacedItemResolver.php +++ /dev/null @@ -1,112 +0,0 @@ -parsed[$key])) { - return $this->parsed[$key]; - } - - // If the key does not contain a double colon, it means the key is not in a - // namespace, and is just a regular configuration item. Namespaces are a - // tool for organizing configuration items for things such as modules. - if (! str_contains($key, '::')) { - $segments = explode('.', $key); - - $parsed = $this->parseBasicSegments($segments); - } else { - $parsed = $this->parseNamespacedSegments($key); - } - - // Once we have the parsed array of this key's elements, such as its groups - // and namespace, we will cache each array inside a simple list that has - // the key and the parsed array for quick look-ups for later requests. - return $this->parsed[$key] = $parsed; - } - - /** - * Parse an array of basic segments. - * - * @param array $segments - * @return array - */ - protected function parseBasicSegments(array $segments) - { - // The first segment in a basic array will always be the group, so we can go - // ahead and grab that segment. If there is only one total segment we are - // just pulling an entire group out of the array and not a single item. - $group = $segments[0]; - - // If there is more than one segment in this group, it means we are pulling - // a specific item out of a group and will need to return this item name - // as well as the group so we know which item to pull from the arrays. - $item = count($segments) === 1 - ? null - : implode('.', array_slice($segments, 1)); - - return [null, $group, $item]; - } - - /** - * Parse an array of namespaced segments. - * - * @param string $key - * @return array - */ - protected function parseNamespacedSegments($key) - { - [$namespace, $item] = explode('::', $key); - - // First we'll just explode the first segment to get the namespace and group - // since the item should be in the remaining segments. Once we have these - // two pieces of data we can proceed with parsing out the item's value. - $itemSegments = explode('.', $item); - - $groupAndItem = array_slice( - $this->parseBasicSegments($itemSegments), 1 - ); - - return array_merge([$namespace], $groupAndItem); - } - - /** - * Set the parsed value of a key. - * - * @param string $key - * @param array $parsed - * @return void - */ - public function setParsedKey($key, $parsed) - { - $this->parsed[$key] = $parsed; - } - - /** - * Flush the cache of parsed keys. - * - * @return void - */ - public function flushParsedKeys() - { - $this->parsed = []; - } -} diff --git a/vendor/illuminate/support/Number.php b/vendor/illuminate/support/Number.php deleted file mode 100644 index d27a717..0000000 --- a/vendor/illuminate/support/Number.php +++ /dev/null @@ -1,388 +0,0 @@ -setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $maxPrecision); - } elseif (! is_null($precision)) { - $formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, $precision); - } - - return $formatter->format($number); - } - - /** - * Spell out the given number in the given locale. - * - * @param int|float $number - * @param string|null $locale - * @param int|null $after - * @param int|null $until - * @return string - */ - public static function spell(int|float $number, ?string $locale = null, ?int $after = null, ?int $until = null) - { - static::ensureIntlExtensionIsInstalled(); - - if (! is_null($after) && $number <= $after) { - return static::format($number, locale: $locale); - } - - if (! is_null($until) && $number >= $until) { - return static::format($number, locale: $locale); - } - - $formatter = new NumberFormatter($locale ?? static::$locale, NumberFormatter::SPELLOUT); - - return $formatter->format($number); - } - - /** - * Convert the given number to ordinal form. - * - * @param int|float $number - * @param string|null $locale - * @return string - */ - public static function ordinal(int|float $number, ?string $locale = null) - { - static::ensureIntlExtensionIsInstalled(); - - $formatter = new NumberFormatter($locale ?? static::$locale, NumberFormatter::ORDINAL); - - return $formatter->format($number); - } - - /** - * Spell out the given number in the given locale in ordinal form. - * - * @param int|float $number - * @param string|null $locale - * @return string - */ - public static function spellOrdinal(int|float $number, ?string $locale = null) - { - static::ensureIntlExtensionIsInstalled(); - - $formatter = new NumberFormatter($locale ?? static::$locale, NumberFormatter::SPELLOUT); - - $formatter->setTextAttribute(NumberFormatter::DEFAULT_RULESET, '%spellout-ordinal'); - - return $formatter->format($number); - } - - /** - * Convert the given number to its percentage equivalent. - * - * @param int|float $number - * @param int $precision - * @param int|null $maxPrecision - * @param string|null $locale - * @return string|false - */ - public static function percentage(int|float $number, int $precision = 0, ?int $maxPrecision = null, ?string $locale = null) - { - static::ensureIntlExtensionIsInstalled(); - - $formatter = new NumberFormatter($locale ?? static::$locale, NumberFormatter::PERCENT); - - if (! is_null($maxPrecision)) { - $formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $maxPrecision); - } else { - $formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, $precision); - } - - return $formatter->format($number / 100); - } - - /** - * Convert the given number to its currency equivalent. - * - * @param int|float $number - * @param string $in - * @param string|null $locale - * @param int|null $precision - * @return string|false - */ - public static function currency(int|float $number, string $in = '', ?string $locale = null, ?int $precision = null) - { - static::ensureIntlExtensionIsInstalled(); - - $formatter = new NumberFormatter($locale ?? static::$locale, NumberFormatter::CURRENCY); - - if (! is_null($precision)) { - $formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, $precision); - } - - return $formatter->formatCurrency($number, ! empty($in) ? $in : static::$currency); - } - - /** - * Convert the given number to its file size equivalent. - * - * @param int|float $bytes - * @param int $precision - * @param int|null $maxPrecision - * @return string - */ - public static function fileSize(int|float $bytes, int $precision = 0, ?int $maxPrecision = null) - { - $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; - - for ($i = 0; ($bytes / 1024) > 0.9 && ($i < count($units) - 1); $i++) { - $bytes /= 1024; - } - - return sprintf('%s %s', static::format($bytes, $precision, $maxPrecision), $units[$i]); - } - - /** - * Convert the number to its human-readable equivalent. - * - * @param int|float $number - * @param int $precision - * @param int|null $maxPrecision - * @return bool|string - */ - public static function abbreviate(int|float $number, int $precision = 0, ?int $maxPrecision = null) - { - return static::forHumans($number, $precision, $maxPrecision, abbreviate: true); - } - - /** - * Convert the number to its human-readable equivalent. - * - * @param int|float $number - * @param int $precision - * @param int|null $maxPrecision - * @param bool $abbreviate - * @return false|string - */ - public static function forHumans(int|float $number, int $precision = 0, ?int $maxPrecision = null, bool $abbreviate = false) - { - return static::summarize($number, $precision, $maxPrecision, $abbreviate ? [ - 3 => 'K', - 6 => 'M', - 9 => 'B', - 12 => 'T', - 15 => 'Q', - ] : [ - 3 => ' thousand', - 6 => ' million', - 9 => ' billion', - 12 => ' trillion', - 15 => ' quadrillion', - ]); - } - - /** - * Convert the number to its human-readable equivalent. - * - * @param int|float $number - * @param int $precision - * @param int|null $maxPrecision - * @param array $units - * @return string|false - */ - protected static function summarize(int|float $number, int $precision = 0, ?int $maxPrecision = null, array $units = []) - { - if (empty($units)) { - $units = [ - 3 => 'K', - 6 => 'M', - 9 => 'B', - 12 => 'T', - 15 => 'Q', - ]; - } - - switch (true) { - case floatval($number) === 0.0: - return $precision > 0 ? static::format(0, $precision, $maxPrecision) : '0'; - case $number < 0: - return sprintf('-%s', static::summarize(abs($number), $precision, $maxPrecision, $units)); - case $number >= 1e15: - return sprintf('%s'.end($units), static::summarize($number / 1e15, $precision, $maxPrecision, $units)); - } - - $numberExponent = floor(log10($number)); - $displayExponent = $numberExponent - ($numberExponent % 3); - $number /= pow(10, $displayExponent); - - return trim(sprintf('%s%s', static::format($number, $precision, $maxPrecision), $units[$displayExponent] ?? '')); - } - - /** - * Clamp the given number between the given minimum and maximum. - * - * @param int|float $number - * @param int|float $min - * @param int|float $max - * @return int|float - */ - public static function clamp(int|float $number, int|float $min, int|float $max) - { - return min(max($number, $min), $max); - } - - /** - * Split the given number into pairs of min/max values. - * - * @param int|float $to - * @param int|float $by - * @param int|float $offset - * @return array - */ - public static function pairs(int|float $to, int|float $by, int|float $offset = 1) - { - $output = []; - - for ($lower = 0; $lower < $to; $lower += $by) { - $upper = $lower + $by; - - if ($upper > $to) { - $upper = $to; - } - - $output[] = [$lower + $offset, $upper]; - } - - return $output; - } - - /** - * Remove any trailing zero digits after the decimal point of the given number. - * - * @param int|float $number - * @return int|float - */ - public static function trim(int|float $number) - { - return json_decode(json_encode($number)); - } - - /** - * Execute the given callback using the given locale. - * - * @param string $locale - * @param callable $callback - * @return mixed - */ - public static function withLocale(string $locale, callable $callback) - { - $previousLocale = static::$locale; - - static::useLocale($locale); - - return tap($callback(), fn () => static::useLocale($previousLocale)); - } - - /** - * Execute the given callback using the given currency. - * - * @param string $currency - * @param callable $callback - * @return mixed - */ - public static function withCurrency(string $currency, callable $callback) - { - $previousCurrency = static::$currency; - - static::useCurrency($currency); - - return tap($callback(), fn () => static::useCurrency($previousCurrency)); - } - - /** - * Set the default locale. - * - * @param string $locale - * @return void - */ - public static function useLocale(string $locale) - { - static::$locale = $locale; - } - - /** - * Set the default currency. - * - * @param string $currency - * @return void - */ - public static function useCurrency(string $currency) - { - static::$currency = $currency; - } - - /** - * Get the default locale. - * - * @return string - */ - public static function defaultLocale() - { - return static::$locale; - } - - /** - * Get the default currency. - * - * @return string - */ - public static function defaultCurrency() - { - return static::$currency; - } - - /** - * Ensure the "intl" PHP extension is installed. - * - * @return void - */ - protected static function ensureIntlExtensionIsInstalled() - { - if (! extension_loaded('intl')) { - $method = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function']; - - throw new RuntimeException('The "intl" PHP extension is required to use the ['.$method.'] method.'); - } - } -} diff --git a/vendor/illuminate/support/Once.php b/vendor/illuminate/support/Once.php deleted file mode 100644 index 0b1741f..0000000 --- a/vendor/illuminate/support/Once.php +++ /dev/null @@ -1,100 +0,0 @@ -> $values - * @return void - */ - protected function __construct(protected WeakMap $values) - { - // - } - - /** - * Create a new once instance. - * - * @return static - */ - public static function instance() - { - return static::$instance ??= new static(new WeakMap); - } - - /** - * Get the value of the given onceable. - * - * @param Onceable $onceable - * @return mixed - */ - public function value(Onceable $onceable) - { - if (! static::$enabled) { - return call_user_func($onceable->callable); - } - - $object = $onceable->object ?: $this; - - $hash = $onceable->hash; - - if (! isset($this->values[$object])) { - $this->values[$object] = []; - } - - if (array_key_exists($hash, $this->values[$object])) { - return $this->values[$object][$hash]; - } - - return $this->values[$object][$hash] = call_user_func($onceable->callable); - } - - /** - * Re-enable the once instance if it was disabled. - * - * @return void - */ - public static function enable() - { - static::$enabled = true; - } - - /** - * Disable the once instance. - * - * @return void - */ - public static function disable() - { - static::$enabled = false; - } - - /** - * Flush the once instance. - * - * @return void - */ - public static function flush() - { - static::$instance = null; - } -} diff --git a/vendor/illuminate/support/Onceable.php b/vendor/illuminate/support/Onceable.php deleted file mode 100644 index 51a3aa0..0000000 --- a/vendor/illuminate/support/Onceable.php +++ /dev/null @@ -1,78 +0,0 @@ -> $trace - * @return static|null - */ - public static function tryFromTrace(array $trace, callable $callable) - { - if (! is_null($hash = static::hashFromTrace($trace, $callable))) { - $object = static::objectFromTrace($trace); - - return new static($hash, $object, $callable); - } - } - - /** - * Computes the object of the onceable from the given trace, if any. - * - * @param array> $trace - * @return object|null - */ - protected static function objectFromTrace(array $trace) - { - return $trace[1]['object'] ?? null; - } - - /** - * Computes the hash of the onceable from the given trace. - * - * @param array> $trace - * @return string|null - */ - protected static function hashFromTrace(array $trace, callable $callable) - { - if (str_contains($trace[0]['file'] ?? '', 'eval()\'d code')) { - return null; - } - - $uses = array_map( - fn (mixed $argument) => is_object($argument) ? spl_object_hash($argument) : $argument, - $callable instanceof Closure ? (new ReflectionClosure($callable))->getClosureUsedVariables() : [], - ); - - return md5(sprintf( - '%s@%s%s:%s (%s)', - $trace[0]['file'], - isset($trace[1]['class']) ? ($trace[1]['class'].'@') : '', - $trace[1]['function'], - $trace[0]['line'], - serialize($uses), - )); - } -} diff --git a/vendor/illuminate/support/Optional.php b/vendor/illuminate/support/Optional.php deleted file mode 100644 index ba84a2c..0000000 --- a/vendor/illuminate/support/Optional.php +++ /dev/null @@ -1,131 +0,0 @@ -value = $value; - } - - /** - * Dynamically access a property on the underlying object. - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - if (is_object($this->value)) { - return $this->value->{$key} ?? null; - } - } - - /** - * Dynamically check a property exists on the underlying object. - * - * @param mixed $name - * @return bool - */ - public function __isset($name) - { - if (is_object($this->value)) { - return isset($this->value->{$name}); - } - - if (is_array($this->value) || $this->value instanceof ArrayObject) { - return isset($this->value[$name]); - } - - return false; - } - - /** - * Determine if an item exists at an offset. - * - * @param mixed $key - * @return bool - */ - public function offsetExists($key): bool - { - return Arr::accessible($this->value) && Arr::exists($this->value, $key); - } - - /** - * Get an item at a given offset. - * - * @param mixed $key - * @return mixed - */ - public function offsetGet($key): mixed - { - return Arr::get($this->value, $key); - } - - /** - * Set the item at a given offset. - * - * @param mixed $key - * @param mixed $value - * @return void - */ - public function offsetSet($key, $value): void - { - if (Arr::accessible($this->value)) { - $this->value[$key] = $value; - } - } - - /** - * Unset the item at a given offset. - * - * @param string $key - * @return void - */ - public function offsetUnset($key): void - { - if (Arr::accessible($this->value)) { - unset($this->value[$key]); - } - } - - /** - * Dynamically pass a method to the underlying object. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - if (static::hasMacro($method)) { - return $this->macroCall($method, $parameters); - } - - if (is_object($this->value)) { - return $this->value->{$method}(...$parameters); - } - } -} diff --git a/vendor/illuminate/support/Pluralizer.php b/vendor/illuminate/support/Pluralizer.php deleted file mode 100644 index 0d909de..0000000 --- a/vendor/illuminate/support/Pluralizer.php +++ /dev/null @@ -1,127 +0,0 @@ -pluralize($value); - - return static::matchCase($plural, $value); - } - - /** - * Get the singular form of an English word. - * - * @param string $value - * @return string - */ - public static function singular($value) - { - $singular = static::inflector()->singularize($value); - - return static::matchCase($singular, $value); - } - - /** - * Determine if the given value is uncountable. - * - * @param string $value - * @return bool - */ - protected static function uncountable($value) - { - return in_array(strtolower($value), static::$uncountable); - } - - /** - * Attempt to match the case on two strings. - * - * @param string $value - * @param string $comparison - * @return string - */ - protected static function matchCase($value, $comparison) - { - $functions = ['mb_strtolower', 'mb_strtoupper', 'ucfirst', 'ucwords']; - - foreach ($functions as $function) { - if ($function($comparison) === $comparison) { - return $function($value); - } - } - - return $value; - } - - /** - * Get the inflector instance. - * - * @return \Doctrine\Inflector\Inflector - */ - public static function inflector() - { - if (is_null(static::$inflector)) { - static::$inflector = InflectorFactory::createForLanguage(static::$language)->build(); - } - - return static::$inflector; - } - - /** - * Specify the language that should be used by the inflector. - * - * @param string $language - * @return void - */ - public static function useLanguage(string $language) - { - static::$language = $language; - - static::$inflector = null; - } -} diff --git a/vendor/illuminate/support/Process/PhpExecutableFinder.php b/vendor/illuminate/support/Process/PhpExecutableFinder.php deleted file mode 100644 index e1b4cff..0000000 --- a/vendor/illuminate/support/Process/PhpExecutableFinder.php +++ /dev/null @@ -1,22 +0,0 @@ -find('php', false, [implode(DIRECTORY_SEPARATOR, [$herdPath, 'bin'])]); - } - - return parent::find($includeArgs); - } -} diff --git a/vendor/illuminate/support/ProcessUtils.php b/vendor/illuminate/support/ProcessUtils.php deleted file mode 100644 index 165e751..0000000 --- a/vendor/illuminate/support/ProcessUtils.php +++ /dev/null @@ -1,69 +0,0 @@ - 2 && $char === $arg[0] && $char === $arg[strlen($arg) - 1]; - } -} diff --git a/vendor/illuminate/support/Reflector.php b/vendor/illuminate/support/Reflector.php deleted file mode 100644 index a767d5e..0000000 --- a/vendor/illuminate/support/Reflector.php +++ /dev/null @@ -1,170 +0,0 @@ -isPublic(); - } - - if (is_object($var[0]) && method_exists($class, '__call')) { - return (new ReflectionMethod($class, '__call'))->isPublic(); - } - - if (! is_object($var[0]) && method_exists($class, '__callStatic')) { - return (new ReflectionMethod($class, '__callStatic'))->isPublic(); - } - - return false; - } - - /** - * Get the class name of the given parameter's type, if possible. - * - * @param \ReflectionParameter $parameter - * @return string|null - */ - public static function getParameterClassName($parameter) - { - $type = $parameter->getType(); - - if (! $type instanceof ReflectionNamedType || $type->isBuiltin()) { - return; - } - - return static::getTypeName($parameter, $type); - } - - /** - * Get the class names of the given parameter's type, including union types. - * - * @param \ReflectionParameter $parameter - * @return array - */ - public static function getParameterClassNames($parameter) - { - $type = $parameter->getType(); - - if (! $type instanceof ReflectionUnionType) { - return array_filter([static::getParameterClassName($parameter)]); - } - - $unionTypes = []; - - foreach ($type->getTypes() as $listedType) { - if (! $listedType instanceof ReflectionNamedType || $listedType->isBuiltin()) { - continue; - } - - $unionTypes[] = static::getTypeName($parameter, $listedType); - } - - return array_filter($unionTypes); - } - - /** - * Get the given type's class name. - * - * @param \ReflectionParameter $parameter - * @param \ReflectionNamedType $type - * @return string - */ - protected static function getTypeName($parameter, $type) - { - $name = $type->getName(); - - if (! is_null($class = $parameter->getDeclaringClass())) { - if ($name === 'self') { - return $class->getName(); - } - - if ($name === 'parent' && $parent = $class->getParentClass()) { - return $parent->getName(); - } - } - - return $name; - } - - /** - * Determine if the parameter's type is a subclass of the given type. - * - * @param \ReflectionParameter $parameter - * @param string $className - * @return bool - */ - public static function isParameterSubclassOf($parameter, $className) - { - $paramClassName = static::getParameterClassName($parameter); - - return $paramClassName - && (class_exists($paramClassName) || interface_exists($paramClassName)) - && (new ReflectionClass($paramClassName))->isSubclassOf($className); - } - - /** - * Determine if the parameter's type is a Backed Enum with a string backing type. - * - * @param \ReflectionParameter $parameter - * @return bool - */ - public static function isParameterBackedEnumWithStringBackingType($parameter) - { - if (! $parameter->getType() instanceof ReflectionNamedType) { - return false; - } - - $backedEnumClass = $parameter->getType()?->getName(); - - if (is_null($backedEnumClass)) { - return false; - } - - if (enum_exists($backedEnumClass)) { - $reflectionBackedEnum = new ReflectionEnum($backedEnumClass); - - return $reflectionBackedEnum->isBacked() - && $reflectionBackedEnum->getBackingType()->getName() == 'string'; - } - - return false; - } -} diff --git a/vendor/illuminate/support/ServiceProvider.php b/vendor/illuminate/support/ServiceProvider.php deleted file mode 100644 index 3db60f9..0000000 --- a/vendor/illuminate/support/ServiceProvider.php +++ /dev/null @@ -1,584 +0,0 @@ - $bindings All of the container bindings that should be registered. - * @property array $singletons All of the singletons that should be registered. - */ -abstract class ServiceProvider -{ - /** - * The application instance. - * - * @var \Illuminate\Contracts\Foundation\Application - */ - protected $app; - - /** - * All of the registered booting callbacks. - * - * @var array - */ - protected $bootingCallbacks = []; - - /** - * All of the registered booted callbacks. - * - * @var array - */ - protected $bootedCallbacks = []; - - /** - * The paths that should be published. - * - * @var array - */ - public static $publishes = []; - - /** - * The paths that should be published by group. - * - * @var array - */ - public static $publishGroups = []; - - /** - * The migration paths available for publishing. - * - * @var array - */ - protected static $publishableMigrationPaths = []; - - /** - * Commands that should be run during the "optimize" command. - * - * @var array - */ - public static array $optimizeCommands = []; - - /** - * Commands that should be run during the "optimize:clear" command. - * - * @var array - */ - public static array $optimizeClearCommands = []; - - /** - * Create a new service provider instance. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return void - */ - public function __construct($app) - { - $this->app = $app; - } - - /** - * Register any application services. - * - * @return void - */ - public function register() - { - // - } - - /** - * Register a booting callback to be run before the "boot" method is called. - * - * @param \Closure $callback - * @return void - */ - public function booting(Closure $callback) - { - $this->bootingCallbacks[] = $callback; - } - - /** - * Register a booted callback to be run after the "boot" method is called. - * - * @param \Closure $callback - * @return void - */ - public function booted(Closure $callback) - { - $this->bootedCallbacks[] = $callback; - } - - /** - * Call the registered booting callbacks. - * - * @return void - */ - public function callBootingCallbacks() - { - $index = 0; - - while ($index < count($this->bootingCallbacks)) { - $this->app->call($this->bootingCallbacks[$index]); - - $index++; - } - } - - /** - * Call the registered booted callbacks. - * - * @return void - */ - public function callBootedCallbacks() - { - $index = 0; - - while ($index < count($this->bootedCallbacks)) { - $this->app->call($this->bootedCallbacks[$index]); - - $index++; - } - } - - /** - * Merge the given configuration with the existing configuration. - * - * @param string $path - * @param string $key - * @return void - */ - protected function mergeConfigFrom($path, $key) - { - if (! ($this->app instanceof CachesConfiguration && $this->app->configurationIsCached())) { - $config = $this->app->make('config'); - - $config->set($key, array_merge( - require $path, $config->get($key, []) - )); - } - } - - /** - * Replace the given configuration with the existing configuration recursively. - * - * @param string $path - * @param string $key - * @return void - */ - protected function replaceConfigRecursivelyFrom($path, $key) - { - if (! ($this->app instanceof CachesConfiguration && $this->app->configurationIsCached())) { - $config = $this->app->make('config'); - - $config->set($key, array_replace_recursive( - require $path, $config->get($key, []) - )); - } - } - - /** - * Load the given routes file if routes are not already cached. - * - * @param string $path - * @return void - */ - protected function loadRoutesFrom($path) - { - if (! ($this->app instanceof CachesRoutes && $this->app->routesAreCached())) { - require $path; - } - } - - /** - * Register a view file namespace. - * - * @param string|array $path - * @param string $namespace - * @return void - */ - protected function loadViewsFrom($path, $namespace) - { - $this->callAfterResolving('view', function ($view) use ($path, $namespace) { - if (isset($this->app->config['view']['paths']) && - is_array($this->app->config['view']['paths'])) { - foreach ($this->app->config['view']['paths'] as $viewPath) { - if (is_dir($appPath = $viewPath.'/vendor/'.$namespace)) { - $view->addNamespace($namespace, $appPath); - } - } - } - - $view->addNamespace($namespace, $path); - }); - } - - /** - * Register the given view components with a custom prefix. - * - * @param string $prefix - * @param array $components - * @return void - */ - protected function loadViewComponentsAs($prefix, array $components) - { - $this->callAfterResolving(BladeCompiler::class, function ($blade) use ($prefix, $components) { - foreach ($components as $alias => $component) { - $blade->component($component, is_string($alias) ? $alias : null, $prefix); - } - }); - } - - /** - * Register a translation file namespace or path. - * - * @param string $path - * @param string|null $namespace - * @return void - */ - protected function loadTranslationsFrom($path, $namespace = null) - { - $this->callAfterResolving('translator', fn ($translator) => is_null($namespace) - ? $translator->addPath($path) - : $translator->addNamespace($namespace, $path)); - } - - /** - * Register a JSON translation file path. - * - * @param string $path - * @return void - */ - protected function loadJsonTranslationsFrom($path) - { - $this->callAfterResolving('translator', function ($translator) use ($path) { - $translator->addJsonPath($path); - }); - } - - /** - * Register database migration paths. - * - * @param array|string $paths - * @return void - */ - protected function loadMigrationsFrom($paths) - { - $this->callAfterResolving('migrator', function ($migrator) use ($paths) { - foreach ((array) $paths as $path) { - $migrator->path($path); - } - }); - } - - /** - * Register Eloquent model factory paths. - * - * @deprecated Will be removed in a future Laravel version. - * - * @param array|string $paths - * @return void - */ - protected function loadFactoriesFrom($paths) - { - $this->callAfterResolving(ModelFactory::class, function ($factory) use ($paths) { - foreach ((array) $paths as $path) { - $factory->load($path); - } - }); - } - - /** - * Setup an after resolving listener, or fire immediately if already resolved. - * - * @param string $name - * @param callable $callback - * @return void - */ - protected function callAfterResolving($name, $callback) - { - $this->app->afterResolving($name, $callback); - - if ($this->app->resolved($name)) { - $callback($this->app->make($name), $this->app); - } - } - - /** - * Register migration paths to be published by the publish command. - * - * @param array $paths - * @param mixed $groups - * @return void - */ - protected function publishesMigrations(array $paths, $groups = null) - { - $this->publishes($paths, $groups); - - if ($this->app->config->get('database.migrations.update_date_on_publish', false)) { - static::$publishableMigrationPaths = array_unique(array_merge(static::$publishableMigrationPaths, array_keys($paths))); - } - } - - /** - * Register paths to be published by the publish command. - * - * @param array $paths - * @param mixed $groups - * @return void - */ - protected function publishes(array $paths, $groups = null) - { - $this->ensurePublishArrayInitialized($class = static::class); - - static::$publishes[$class] = array_merge(static::$publishes[$class], $paths); - - foreach ((array) $groups as $group) { - $this->addPublishGroup($group, $paths); - } - } - - /** - * Ensure the publish array for the service provider is initialized. - * - * @param string $class - * @return void - */ - protected function ensurePublishArrayInitialized($class) - { - if (! array_key_exists($class, static::$publishes)) { - static::$publishes[$class] = []; - } - } - - /** - * Add a publish group / tag to the service provider. - * - * @param string $group - * @param array $paths - * @return void - */ - protected function addPublishGroup($group, $paths) - { - if (! array_key_exists($group, static::$publishGroups)) { - static::$publishGroups[$group] = []; - } - - static::$publishGroups[$group] = array_merge( - static::$publishGroups[$group], $paths - ); - } - - /** - * Get the paths to publish. - * - * @param string|null $provider - * @param string|null $group - * @return array - */ - public static function pathsToPublish($provider = null, $group = null) - { - if (! is_null($paths = static::pathsForProviderOrGroup($provider, $group))) { - return $paths; - } - - return (new Collection(static::$publishes))->reduce(function ($paths, $p) { - return array_merge($paths, $p); - }, []); - } - - /** - * Get the paths for the provider or group (or both). - * - * @param string|null $provider - * @param string|null $group - * @return array - */ - protected static function pathsForProviderOrGroup($provider, $group) - { - if ($provider && $group) { - return static::pathsForProviderAndGroup($provider, $group); - } elseif ($group && array_key_exists($group, static::$publishGroups)) { - return static::$publishGroups[$group]; - } elseif ($provider && array_key_exists($provider, static::$publishes)) { - return static::$publishes[$provider]; - } elseif ($group || $provider) { - return []; - } - } - - /** - * Get the paths for the provider and group. - * - * @param string $provider - * @param string $group - * @return array - */ - protected static function pathsForProviderAndGroup($provider, $group) - { - if (! empty(static::$publishes[$provider]) && ! empty(static::$publishGroups[$group])) { - return array_intersect_key(static::$publishes[$provider], static::$publishGroups[$group]); - } - - return []; - } - - /** - * Get the service providers available for publishing. - * - * @return array - */ - public static function publishableProviders() - { - return array_keys(static::$publishes); - } - - /** - * Get the migration paths available for publishing. - * - * @return array - */ - public static function publishableMigrationPaths() - { - return static::$publishableMigrationPaths; - } - - /** - * Get the groups available for publishing. - * - * @return array - */ - public static function publishableGroups() - { - return array_keys(static::$publishGroups); - } - - /** - * Register the package's custom Artisan commands. - * - * @param array|mixed $commands - * @return void - */ - public function commands($commands) - { - $commands = is_array($commands) ? $commands : func_get_args(); - - Artisan::starting(function ($artisan) use ($commands) { - $artisan->resolveCommands($commands); - }); - } - - /** - * Register commands that should run on "optimize" or "optimize:clear". - * - * @param string|null $optimize - * @param string|null $clear - * @param string|null $key - * @return void - */ - protected function optimizes(?string $optimize = null, ?string $clear = null, ?string $key = null) - { - $key ??= (string) Str::of(get_class($this)) - ->classBasename() - ->before('ServiceProvider') - ->kebab() - ->lower() - ->trim(); - - if (empty($key)) { - $key = class_basename(get_class($this)); - } - - if ($optimize) { - static::$optimizeCommands[$key] = $optimize; - } - - if ($clear) { - static::$optimizeClearCommands[$key] = $clear; - } - } - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() - { - return []; - } - - /** - * Get the events that trigger this service provider to register. - * - * @return array - */ - public function when() - { - return []; - } - - /** - * Determine if the provider is deferred. - * - * @return bool - */ - public function isDeferred() - { - return $this instanceof DeferrableProvider; - } - - /** - * Get the default providers for a Laravel application. - * - * @return \Illuminate\Support\DefaultProviders - */ - public static function defaultProviders() - { - return new DefaultProviders; - } - - /** - * Add the given provider to the application's provider bootstrap file. - * - * @param string $provider - * @param string $path - * @return bool - */ - public static function addProviderToBootstrapFile(string $provider, ?string $path = null) - { - $path ??= app()->getBootstrapProvidersPath(); - - if (! file_exists($path)) { - return false; - } - - if (function_exists('opcache_invalidate')) { - opcache_invalidate($path, true); - } - - $providers = (new Collection(require $path)) - ->merge([$provider]) - ->unique() - ->sort() - ->values() - ->map(fn ($p) => ' '.$p.'::class,') - ->implode(PHP_EOL); - - $content = ' - */ - protected static $sequence = []; - - /** - * Indicates if the instance should sleep. - * - * @var bool - */ - protected $shouldSleep = true; - - /** - * Indicates if the instance already slept via `then()`. - * - * @var bool - */ - protected $alreadySlept = false; - - /** - * Create a new class instance. - * - * @param int|float|\DateInterval $duration - * @return void - */ - public function __construct($duration) - { - $this->duration($duration); - } - - /** - * Sleep for the given duration. - * - * @param \DateInterval|int|float $duration - * @return static - */ - public static function for($duration) - { - return new static($duration); - } - - /** - * Sleep until the given timestamp. - * - * @param \DateTimeInterface|int|float|numeric-string $timestamp - * @return static - */ - public static function until($timestamp) - { - if (is_numeric($timestamp)) { - $timestamp = Carbon::createFromTimestamp($timestamp, date_default_timezone_get()); - } - - return new static(Carbon::now()->diff($timestamp)); - } - - /** - * Sleep for the given number of microseconds. - * - * @param int $duration - * @return static - */ - public static function usleep($duration) - { - return (new static($duration))->microseconds(); - } - - /** - * Sleep for the given number of seconds. - * - * @param int|float $duration - * @return static - */ - public static function sleep($duration) - { - return (new static($duration))->seconds(); - } - - /** - * Sleep for the given duration. Replaces any previously defined duration. - * - * @param \DateInterval|int|float $duration - * @return $this - */ - protected function duration($duration) - { - if (! $duration instanceof DateInterval) { - $this->duration = CarbonInterval::microsecond(0); - - $this->pending = $duration; - } else { - $duration = CarbonInterval::instance($duration); - - if ($duration->totalMicroseconds < 0) { - $duration = CarbonInterval::seconds(0); - } - - $this->duration = $duration; - $this->pending = null; - } - - return $this; - } - - /** - * Sleep for the given number of minutes. - * - * @return $this - */ - public function minutes() - { - $this->duration->add('minutes', $this->pullPending()); - - return $this; - } - - /** - * Sleep for one minute. - * - * @return $this - */ - public function minute() - { - return $this->minutes(); - } - - /** - * Sleep for the given number of seconds. - * - * @return $this - */ - public function seconds() - { - $this->duration->add('seconds', $this->pullPending()); - - return $this; - } - - /** - * Sleep for one second. - * - * @return $this - */ - public function second() - { - return $this->seconds(); - } - - /** - * Sleep for the given number of milliseconds. - * - * @return $this - */ - public function milliseconds() - { - $this->duration->add('milliseconds', $this->pullPending()); - - return $this; - } - - /** - * Sleep for one millisecond. - * - * @return $this - */ - public function millisecond() - { - return $this->milliseconds(); - } - - /** - * Sleep for the given number of microseconds. - * - * @return $this - */ - public function microseconds() - { - $this->duration->add('microseconds', $this->pullPending()); - - return $this; - } - - /** - * Sleep for on microsecond. - * - * @return $this - */ - public function microsecond() - { - return $this->microseconds(); - } - - /** - * Add additional time to sleep for. - * - * @param int|float $duration - * @return $this - */ - public function and($duration) - { - $this->pending = $duration; - - return $this; - } - - /** - * Sleep while a given callback returns "true". - * - * @param \Closure $callback - * @return $this - */ - public function while(Closure $callback) - { - $this->while = $callback; - - return $this; - } - - /** - * Specify a callback that should be executed after sleeping. - * - * @param callable $then - * @return mixed - */ - public function then(callable $then) - { - $this->goodnight(); - - $this->alreadySlept = true; - - return $then(); - } - - /** - * Handle the object's destruction. - * - * @return void - */ - public function __destruct() - { - $this->goodnight(); - } - - /** - * Handle the object's destruction. - * - * @return void - */ - protected function goodnight() - { - if ($this->alreadySlept || ! $this->shouldSleep) { - return; - } - - if ($this->pending !== null) { - throw new RuntimeException('Unknown duration unit.'); - } - - if (static::$fake) { - static::$sequence[] = $this->duration; - - if (static::$syncWithCarbon) { - Carbon::setTestNow(Carbon::now()->add($this->duration)); - } - - foreach (static::$fakeSleepCallbacks as $callback) { - $callback($this->duration); - } - - return; - } - - $remaining = $this->duration->copy(); - - $seconds = (int) $remaining->totalSeconds; - - $while = $this->while ?: function () { - static $return = [true, false]; - - return array_shift($return); - }; - - while ($while()) { - if ($seconds > 0) { - sleep($seconds); - - $remaining = $remaining->subSeconds($seconds); - } - - $microseconds = (int) $remaining->totalMicroseconds; - - if ($microseconds > 0) { - usleep($microseconds); - } - } - } - - /** - * Resolve the pending duration. - * - * @return int|float - */ - protected function pullPending() - { - if ($this->pending === null) { - $this->shouldNotSleep(); - - throw new RuntimeException('No duration specified.'); - } - - if ($this->pending < 0) { - $this->pending = 0; - } - - return tap($this->pending, function () { - $this->pending = null; - }); - } - - /** - * Stay awake and capture any attempts to sleep. - * - * @param bool $value - * @param bool $syncWithCarbon - * @return void - */ - public static function fake($value = true, $syncWithCarbon = false) - { - static::$fake = $value; - - static::$sequence = []; - static::$fakeSleepCallbacks = []; - static::$syncWithCarbon = $syncWithCarbon; - } - - /** - * Assert a given amount of sleeping occurred a specific number of times. - * - * @param \Closure $expected - * @param int $times - * @return void - */ - public static function assertSlept($expected, $times = 1) - { - $count = (new Collection(static::$sequence))->filter($expected)->count(); - - PHPUnit::assertSame( - $times, - $count, - "The expected sleep was found [{$count}] times instead of [{$times}]." - ); - } - - /** - * Assert sleeping occurred a given number of times. - * - * @param int $expected - * @return void - */ - public static function assertSleptTimes($expected) - { - PHPUnit::assertSame($expected, $count = count(static::$sequence), "Expected [{$expected}] sleeps but found [{$count}]."); - } - - /** - * Assert the given sleep sequence was encountered. - * - * @param array $sequence - * @return void - */ - public static function assertSequence($sequence) - { - static::assertSleptTimes(count($sequence)); - - (new Collection($sequence)) - ->zip(static::$sequence) - ->eachSpread(function (?Sleep $expected, CarbonInterval $actual) { - if ($expected === null) { - return; - } - - PHPUnit::assertTrue( - $expected->shouldNotSleep()->duration->equalTo($actual), - vsprintf('Expected sleep duration of [%s] but actually slept for [%s].', [ - $expected->duration->cascade()->forHumans([ - 'options' => 0, - 'minimumUnit' => 'microsecond', - ]), - $actual->cascade()->forHumans([ - 'options' => 0, - 'minimumUnit' => 'microsecond', - ]), - ]) - ); - }); - } - - /** - * Assert that no sleeping occurred. - * - * @return void - */ - public static function assertNeverSlept() - { - static::assertSleptTimes(0); - } - - /** - * Assert that no sleeping occurred. - * - * @return void - */ - public static function assertInsomniac() - { - if (static::$sequence === []) { - PHPUnit::assertTrue(true); - } - - foreach (static::$sequence as $duration) { - PHPUnit::assertSame(0, (int) $duration->totalMicroseconds, vsprintf('Unexpected sleep duration of [%s] found.', [ - $duration->cascade()->forHumans([ - 'options' => 0, - 'minimumUnit' => 'microsecond', - ]), - ])); - } - } - - /** - * Indicate that the instance should not sleep. - * - * @return $this - */ - protected function shouldNotSleep() - { - $this->shouldSleep = false; - - return $this; - } - - /** - * Only sleep when the given condition is true. - * - * @param (\Closure($this): bool)|bool $condition - * @return $this - */ - public function when($condition) - { - $this->shouldSleep = (bool) value($condition, $this); - - return $this; - } - - /** - * Don't sleep when the given condition is true. - * - * @param (\Closure($this): bool)|bool $condition - * @return $this - */ - public function unless($condition) - { - return $this->when(! value($condition, $this)); - } - - /** - * Specify a callback that should be invoked when faking sleep within a test. - * - * @param callable $callback - * @return void - */ - public static function whenFakingSleep($callback) - { - static::$fakeSleepCallbacks[] = $callback; - } - - /** - * Indicate that Carbon's "now" should be kept in sync when sleeping. - * - * @return void - */ - public static function syncWithCarbon($value = true) - { - static::$syncWithCarbon = $value; - } -} diff --git a/vendor/illuminate/support/Str.php b/vendor/illuminate/support/Str.php deleted file mode 100644 index 5acd665..0000000 --- a/vendor/illuminate/support/Str.php +++ /dev/null @@ -1,2048 +0,0 @@ - $length - 1) { - return false; - } - - return mb_substr($subject, $index, 1); - } - - /** - * Remove the given string(s) if it exists at the start of the haystack. - * - * @param string $subject - * @param string|array $needle - * @return string - */ - public static function chopStart($subject, $needle) - { - foreach ((array) $needle as $n) { - if (str_starts_with($subject, $n)) { - return substr($subject, strlen($n)); - } - } - - return $subject; - } - - /** - * Remove the given string(s) if it exists at the end of the haystack. - * - * @param string $subject - * @param string|array $needle - * @return string - */ - public static function chopEnd($subject, $needle) - { - foreach ((array) $needle as $n) { - if (str_ends_with($subject, $n)) { - return substr($subject, 0, -strlen($n)); - } - } - - return $subject; - } - - /** - * Determine if a given string contains a given substring. - * - * @param string $haystack - * @param string|iterable $needles - * @param bool $ignoreCase - * @return bool - */ - public static function contains($haystack, $needles, $ignoreCase = false) - { - if ($ignoreCase) { - $haystack = mb_strtolower($haystack); - } - - if (! is_iterable($needles)) { - $needles = (array) $needles; - } - - foreach ($needles as $needle) { - if ($ignoreCase) { - $needle = mb_strtolower($needle); - } - - if ($needle !== '' && str_contains($haystack, $needle)) { - return true; - } - } - - return false; - } - - /** - * Determine if a given string contains all array values. - * - * @param string $haystack - * @param iterable $needles - * @param bool $ignoreCase - * @return bool - */ - public static function containsAll($haystack, $needles, $ignoreCase = false) - { - foreach ($needles as $needle) { - if (! static::contains($haystack, $needle, $ignoreCase)) { - return false; - } - } - - return true; - } - - /** - * Determine if a given string doesn't contain a given substring. - * - * @param string $haystack - * @param string|iterable $needles - * @param bool $ignoreCase - * @return bool - */ - public static function doesntContain($haystack, $needles, $ignoreCase = false) - { - return ! static::contains($haystack, $needles, $ignoreCase); - } - - /** - * Convert the case of a string. - * - * @param string $string - * @param int $mode - * @param string|null $encoding - * @return string - */ - public static function convertCase(string $string, int $mode = MB_CASE_FOLD, ?string $encoding = 'UTF-8') - { - return mb_convert_case($string, $mode, $encoding); - } - - /** - * Replace consecutive instances of a given character with a single character in the given string. - * - * @param string $string - * @param string $character - * @return string - */ - public static function deduplicate(string $string, string $character = ' ') - { - return preg_replace('/'.preg_quote($character, '/').'+/u', $character, $string); - } - - /** - * Determine if a given string ends with a given substring. - * - * @param string $haystack - * @param string|iterable $needles - * @return bool - */ - public static function endsWith($haystack, $needles) - { - if (! is_iterable($needles)) { - $needles = (array) $needles; - } - - if (is_null($haystack)) { - return false; - } - - foreach ($needles as $needle) { - if ((string) $needle !== '' && str_ends_with($haystack, $needle)) { - return true; - } - } - - return false; - } - - /** - * Extracts an excerpt from text that matches the first instance of a phrase. - * - * @param string $text - * @param string $phrase - * @param array $options - * @return string|null - */ - public static function excerpt($text, $phrase = '', $options = []) - { - $radius = $options['radius'] ?? 100; - $omission = $options['omission'] ?? '...'; - - preg_match('/^(.*?)('.preg_quote((string) $phrase, '/').')(.*)$/iu', (string) $text, $matches); - - if (empty($matches)) { - return null; - } - - $start = ltrim($matches[1]); - - $start = Str::of(mb_substr($start, max(mb_strlen($start, 'UTF-8') - $radius, 0), $radius, 'UTF-8'))->ltrim()->unless( - fn ($startWithRadius) => $startWithRadius->exactly($start), - fn ($startWithRadius) => $startWithRadius->prepend($omission), - ); - - $end = rtrim($matches[3]); - - $end = Str::of(mb_substr($end, 0, $radius, 'UTF-8'))->rtrim()->unless( - fn ($endWithRadius) => $endWithRadius->exactly($end), - fn ($endWithRadius) => $endWithRadius->append($omission), - ); - - return $start->append($matches[2], $end)->toString(); - } - - /** - * Cap a string with a single instance of a given value. - * - * @param string $value - * @param string $cap - * @return string - */ - public static function finish($value, $cap) - { - $quoted = preg_quote($cap, '/'); - - return preg_replace('/(?:'.$quoted.')+$/u', '', $value).$cap; - } - - /** - * Wrap the string with the given strings. - * - * @param string $value - * @param string $before - * @param string|null $after - * @return string - */ - public static function wrap($value, $before, $after = null) - { - return $before.$value.($after ??= $before); - } - - /** - * Unwrap the string with the given strings. - * - * @param string $value - * @param string $before - * @param string|null $after - * @return string - */ - public static function unwrap($value, $before, $after = null) - { - if (static::startsWith($value, $before)) { - $value = static::substr($value, static::length($before)); - } - - if (static::endsWith($value, $after ??= $before)) { - $value = static::substr($value, 0, -static::length($after)); - } - - return $value; - } - - /** - * Determine if a given string matches a given pattern. - * - * @param string|iterable $pattern - * @param string $value - * @param bool $ignoreCase - * @return bool - */ - public static function is($pattern, $value, $ignoreCase = false) - { - $value = (string) $value; - - if (! is_iterable($pattern)) { - $pattern = [$pattern]; - } - - foreach ($pattern as $pattern) { - $pattern = (string) $pattern; - - // If the given value is an exact match we can of course return true right - // from the beginning. Otherwise, we will translate asterisks and do an - // actual pattern match against the two strings to see if they match. - if ($pattern === $value) { - return true; - } - - if ($ignoreCase && mb_strtolower($pattern) === mb_strtolower($value)) { - return true; - } - - $pattern = preg_quote($pattern, '#'); - - // Asterisks are translated into zero-or-more regular expression wildcards - // to make it convenient to check if the strings starts with the given - // pattern such as "library/*", making any string check convenient. - $pattern = str_replace('\*', '.*', $pattern); - - if (preg_match('#^'.$pattern.'\z#'.($ignoreCase ? 'iu' : 'u'), $value) === 1) { - return true; - } - } - - return false; - } - - /** - * Determine if a given string is 7 bit ASCII. - * - * @param string $value - * @return bool - */ - public static function isAscii($value) - { - return ASCII::is_ascii((string) $value); - } - - /** - * Determine if a given value is valid JSON. - * - * @param mixed $value - * @return bool - */ - public static function isJson($value) - { - if (! is_string($value)) { - return false; - } - - if (function_exists('json_validate')) { - return json_validate($value, 512); - } - - try { - json_decode($value, true, 512, JSON_THROW_ON_ERROR); - } catch (JsonException) { - return false; - } - - return true; - } - - /** - * Determine if a given value is a valid URL. - * - * @param mixed $value - * @param array $protocols - * @return bool - */ - public static function isUrl($value, array $protocols = []) - { - if (! is_string($value)) { - return false; - } - - $protocolList = empty($protocols) - ? 'aaa|aaas|about|acap|acct|acd|acr|adiumxtra|adt|afp|afs|aim|amss|android|appdata|apt|ark|attachment|aw|barion|beshare|bitcoin|bitcoincash|blob|bolo|browserext|calculator|callto|cap|cast|casts|chrome|chrome-extension|cid|coap|coap\+tcp|coap\+ws|coaps|coaps\+tcp|coaps\+ws|com-eventbrite-attendee|content|conti|crid|cvs|dab|data|dav|diaspora|dict|did|dis|dlna-playcontainer|dlna-playsingle|dns|dntp|dpp|drm|drop|dtn|dvb|ed2k|elsi|example|facetime|fax|feed|feedready|file|filesystem|finger|first-run-pen-experience|fish|fm|ftp|fuchsia-pkg|geo|gg|git|gizmoproject|go|gopher|graph|gtalk|h323|ham|hcap|hcp|http|https|hxxp|hxxps|hydrazone|iax|icap|icon|im|imap|info|iotdisco|ipn|ipp|ipps|irc|irc6|ircs|iris|iris\.beep|iris\.lwz|iris\.xpc|iris\.xpcs|isostore|itms|jabber|jar|jms|keyparc|lastfm|ldap|ldaps|leaptofrogans|lorawan|lvlt|magnet|mailserver|mailto|maps|market|message|mid|mms|modem|mongodb|moz|ms-access|ms-browser-extension|ms-calculator|ms-drive-to|ms-enrollment|ms-excel|ms-eyecontrolspeech|ms-gamebarservices|ms-gamingoverlay|ms-getoffice|ms-help|ms-infopath|ms-inputapp|ms-lockscreencomponent-config|ms-media-stream-id|ms-mixedrealitycapture|ms-mobileplans|ms-officeapp|ms-people|ms-project|ms-powerpoint|ms-publisher|ms-restoretabcompanion|ms-screenclip|ms-screensketch|ms-search|ms-search-repair|ms-secondary-screen-controller|ms-secondary-screen-setup|ms-settings|ms-settings-airplanemode|ms-settings-bluetooth|ms-settings-camera|ms-settings-cellular|ms-settings-cloudstorage|ms-settings-connectabledevices|ms-settings-displays-topology|ms-settings-emailandaccounts|ms-settings-language|ms-settings-location|ms-settings-lock|ms-settings-nfctransactions|ms-settings-notifications|ms-settings-power|ms-settings-privacy|ms-settings-proximity|ms-settings-screenrotation|ms-settings-wifi|ms-settings-workplace|ms-spd|ms-sttoverlay|ms-transit-to|ms-useractivityset|ms-virtualtouchpad|ms-visio|ms-walk-to|ms-whiteboard|ms-whiteboard-cmd|ms-word|msnim|msrp|msrps|mss|mtqp|mumble|mupdate|mvn|news|nfs|ni|nih|nntp|notes|ocf|oid|onenote|onenote-cmd|opaquelocktoken|openpgp4fpr|pack|palm|paparazzi|payto|pkcs11|platform|pop|pres|prospero|proxy|pwid|psyc|pttp|qb|query|redis|rediss|reload|res|resource|rmi|rsync|rtmfp|rtmp|rtsp|rtsps|rtspu|s3|secondlife|service|session|sftp|sgn|shttp|sieve|simpleledger|sip|sips|skype|smb|sms|smtp|snews|snmp|soap\.beep|soap\.beeps|soldat|spiffe|spotify|ssh|steam|stun|stuns|submit|svn|tag|teamspeak|tel|teliaeid|telnet|tftp|tg|things|thismessage|tip|tn3270|tool|ts3server|turn|turns|tv|udp|unreal|urn|ut2004|v-event|vemmi|ventrilo|videotex|vnc|view-source|wais|webcal|wpid|ws|wss|wtai|wyciwyg|xcon|xcon-userid|xfire|xmlrpc\.beep|xmlrpc\.beeps|xmpp|xri|ymsgr|z39\.50|z39\.50r|z39\.50s' - : implode('|', $protocols); - - /* - * This pattern is derived from Symfony\Component\Validator\Constraints\UrlValidator (5.0.7). - * - * (c) Fabien Potencier http://symfony.com - */ - $pattern = '~^ - (LARAVEL_PROTOCOLS):// # protocol - (((?:[\_\.\pL\pN-]|%[0-9A-Fa-f]{2})+:)?((?:[\_\.\pL\pN-]|%[0-9A-Fa-f]{2})+)@)? # basic auth - ( - ([\pL\pN\pS\-\_\.])+(\.?([\pL\pN]|xn\-\-[\pL\pN-]+)+\.?) # a domain name - | # or - \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # an IP address - | # or - \[ - (?:(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-f]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,1}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,2}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,3}(?:(?:[0-9a-f]{1,4})))?::(?:(?:[0-9a-f]{1,4})):)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,4}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,5}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,6}(?:(?:[0-9a-f]{1,4})))?::)))) - \] # an IPv6 address - ) - (:[0-9]+)? # a port (optional) - (?:/ (?:[\pL\pN\-._\~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})* )* # a path - (?:\? (?:[\pL\pN\-._\~!$&\'\[\]()*+,;=:@/?]|%[0-9A-Fa-f]{2})* )? # a query (optional) - (?:\# (?:[\pL\pN\-._\~!$&\'()*+,;=:@/?]|%[0-9A-Fa-f]{2})* )? # a fragment (optional) - $~ixu'; - - return preg_match(str_replace('LARAVEL_PROTOCOLS', $protocolList, $pattern), $value) > 0; - } - - /** - * Determine if a given value is a valid UUID. - * - * @param mixed $value - * @return bool - */ - public static function isUuid($value) - { - if (! is_string($value)) { - return false; - } - - return preg_match('/^[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}$/D', $value) > 0; - } - - /** - * Determine if a given value is a valid ULID. - * - * @param mixed $value - * @return bool - */ - public static function isUlid($value) - { - if (! is_string($value)) { - return false; - } - - return Ulid::isValid($value); - } - - /** - * Convert a string to kebab case. - * - * @param string $value - * @return string - */ - public static function kebab($value) - { - return static::snake($value, '-'); - } - - /** - * Return the length of the given string. - * - * @param string $value - * @param string|null $encoding - * @return int - */ - public static function length($value, $encoding = null) - { - return mb_strlen($value, $encoding); - } - - /** - * Limit the number of characters in a string. - * - * @param string $value - * @param int $limit - * @param string $end - * @param bool $preserveWords - * @return string - */ - public static function limit($value, $limit = 100, $end = '...', $preserveWords = false) - { - if (mb_strwidth($value, 'UTF-8') <= $limit) { - return $value; - } - - if (! $preserveWords) { - return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')).$end; - } - - $value = trim(preg_replace('/[\n\r]+/', ' ', strip_tags($value))); - - $trimmed = rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')); - - if (mb_substr($value, $limit, 1, 'UTF-8') === ' ') { - return $trimmed.$end; - } - - return preg_replace("/(.*)\s.*/", '$1', $trimmed).$end; - } - - /** - * Convert the given string to lower-case. - * - * @param string $value - * @return string - */ - public static function lower($value) - { - return mb_strtolower($value, 'UTF-8'); - } - - /** - * Limit the number of words in a string. - * - * @param string $value - * @param int $words - * @param string $end - * @return string - */ - public static function words($value, $words = 100, $end = '...') - { - preg_match('/^\s*+(?:\S++\s*+){1,'.$words.'}/u', $value, $matches); - - if (! isset($matches[0]) || static::length($value) === static::length($matches[0])) { - return $value; - } - - return rtrim($matches[0]).$end; - } - - /** - * Converts GitHub flavored Markdown into HTML. - * - * @param string $string - * @param array $options - * @param array $extensions - * @return string - */ - public static function markdown($string, array $options = [], array $extensions = []) - { - $converter = new GithubFlavoredMarkdownConverter($options); - - $environment = $converter->getEnvironment(); - - foreach ($extensions as $extension) { - $environment->addExtension($extension); - } - - return (string) $converter->convert($string); - } - - /** - * Converts inline Markdown into HTML. - * - * @param string $string - * @param array $options - * @param array $extensions - * @return string - */ - public static function inlineMarkdown($string, array $options = [], array $extensions = []) - { - $environment = new Environment($options); - - $environment->addExtension(new GithubFlavoredMarkdownExtension()); - $environment->addExtension(new InlinesOnlyExtension()); - - foreach ($extensions as $extension) { - $environment->addExtension($extension); - } - - $converter = new MarkdownConverter($environment); - - return (string) $converter->convert($string); - } - - /** - * Masks a portion of a string with a repeated character. - * - * @param string $string - * @param string $character - * @param int $index - * @param int|null $length - * @param string $encoding - * @return string - */ - public static function mask($string, $character, $index, $length = null, $encoding = 'UTF-8') - { - if ($character === '') { - return $string; - } - - $segment = mb_substr($string, $index, $length, $encoding); - - if ($segment === '') { - return $string; - } - - $strlen = mb_strlen($string, $encoding); - $startIndex = $index; - - if ($index < 0) { - $startIndex = $index < -$strlen ? 0 : $strlen + $index; - } - - $start = mb_substr($string, 0, $startIndex, $encoding); - $segmentLen = mb_strlen($segment, $encoding); - $end = mb_substr($string, $startIndex + $segmentLen); - - return $start.str_repeat(mb_substr($character, 0, 1, $encoding), $segmentLen).$end; - } - - /** - * Get the string matching the given pattern. - * - * @param string $pattern - * @param string $subject - * @return string - */ - public static function match($pattern, $subject) - { - preg_match($pattern, $subject, $matches); - - if (! $matches) { - return ''; - } - - return $matches[1] ?? $matches[0]; - } - - /** - * Determine if a given string matches a given pattern. - * - * @param string|iterable $pattern - * @param string $value - * @return bool - */ - public static function isMatch($pattern, $value) - { - $value = (string) $value; - - if (! is_iterable($pattern)) { - $pattern = [$pattern]; - } - - foreach ($pattern as $pattern) { - $pattern = (string) $pattern; - - if (preg_match($pattern, $value) === 1) { - return true; - } - } - - return false; - } - - /** - * Get the string matching the given pattern. - * - * @param string $pattern - * @param string $subject - * @return \Illuminate\Support\Collection - */ - public static function matchAll($pattern, $subject) - { - preg_match_all($pattern, $subject, $matches); - - if (empty($matches[0])) { - return new Collection; - } - - return new Collection($matches[1] ?? $matches[0]); - } - - /** - * Remove all non-numeric characters from a string. - * - * @param string $value - * @return string - */ - public static function numbers($value) - { - return preg_replace('/[^0-9]/', '', $value); - } - - /** - * Pad both sides of a string with another. - * - * @param string $value - * @param int $length - * @param string $pad - * @return string - */ - public static function padBoth($value, $length, $pad = ' ') - { - if (function_exists('mb_str_pad')) { - return mb_str_pad($value, $length, $pad, STR_PAD_BOTH); - } - - $short = max(0, $length - mb_strlen($value)); - $shortLeft = floor($short / 2); - $shortRight = ceil($short / 2); - - return mb_substr(str_repeat($pad, $shortLeft), 0, $shortLeft). - $value. - mb_substr(str_repeat($pad, $shortRight), 0, $shortRight); - } - - /** - * Pad the left side of a string with another. - * - * @param string $value - * @param int $length - * @param string $pad - * @return string - */ - public static function padLeft($value, $length, $pad = ' ') - { - if (function_exists('mb_str_pad')) { - return mb_str_pad($value, $length, $pad, STR_PAD_LEFT); - } - - $short = max(0, $length - mb_strlen($value)); - - return mb_substr(str_repeat($pad, $short), 0, $short).$value; - } - - /** - * Pad the right side of a string with another. - * - * @param string $value - * @param int $length - * @param string $pad - * @return string - */ - public static function padRight($value, $length, $pad = ' ') - { - if (function_exists('mb_str_pad')) { - return mb_str_pad($value, $length, $pad, STR_PAD_RIGHT); - } - - $short = max(0, $length - mb_strlen($value)); - - return $value.mb_substr(str_repeat($pad, $short), 0, $short); - } - - /** - * Parse a Class[@]method style callback into class and method. - * - * @param string $callback - * @param string|null $default - * @return array - */ - public static function parseCallback($callback, $default = null) - { - if (static::contains($callback, "@anonymous\0")) { - if (static::substrCount($callback, '@') > 1) { - return [ - static::beforeLast($callback, '@'), - static::afterLast($callback, '@'), - ]; - } - - return [$callback, $default]; - } - - return static::contains($callback, '@') ? explode('@', $callback, 2) : [$callback, $default]; - } - - /** - * Get the plural form of an English word. - * - * @param string $value - * @param int|array|\Countable $count - * @return string - */ - public static function plural($value, $count = 2) - { - return Pluralizer::plural($value, $count); - } - - /** - * Pluralize the last word of an English, studly caps case string. - * - * @param string $value - * @param int|array|\Countable $count - * @return string - */ - public static function pluralStudly($value, $count = 2) - { - $parts = preg_split('/(.)(?=[A-Z])/u', $value, -1, PREG_SPLIT_DELIM_CAPTURE); - - $lastWord = array_pop($parts); - - return implode('', $parts).self::plural($lastWord, $count); - } - - /** - * Pluralize the last word of an English, Pascal caps case string. - * - * @param string $value - * @param int|array|\Countable $count - * @return string - */ - public static function pluralPascal($value, $count = 2) - { - return static::pluralStudly($value, $count); - } - - /** - * Generate a random, secure password. - * - * @param int $length - * @param bool $letters - * @param bool $numbers - * @param bool $symbols - * @param bool $spaces - * @return string - */ - public static function password($length = 32, $letters = true, $numbers = true, $symbols = true, $spaces = false) - { - $password = new Collection(); - - $options = (new Collection([ - 'letters' => $letters === true ? [ - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', - 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', - 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - ] : null, - 'numbers' => $numbers === true ? [ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - ] : null, - 'symbols' => $symbols === true ? [ - '~', '!', '#', '$', '%', '^', '&', '*', '(', ')', '-', - '_', '.', ',', '<', '>', '?', '/', '\\', '{', '}', '[', - ']', '|', ':', ';', - ] : null, - 'spaces' => $spaces === true ? [' '] : null, - ]))->filter()->each(fn ($c) => $password->push($c[random_int(0, count($c) - 1)]) - )->flatten(); - - $length = $length - $password->count(); - - return $password->merge($options->pipe( - fn ($c) => Collection::times($length, fn () => $c[random_int(0, $c->count() - 1)]) - ))->shuffle()->implode(''); - } - - /** - * Find the multi-byte safe position of the first occurrence of a given substring in a string. - * - * @param string $haystack - * @param string $needle - * @param int $offset - * @param string|null $encoding - * @return int|false - */ - public static function position($haystack, $needle, $offset = 0, $encoding = null) - { - return mb_strpos($haystack, (string) $needle, $offset, $encoding); - } - - /** - * Generate a more truly "random" alpha-numeric string. - * - * @param int $length - * @return string - */ - public static function random($length = 16) - { - return (static::$randomStringFactory ?? function ($length) { - $string = ''; - - while (($len = strlen($string)) < $length) { - $size = $length - $len; - - $bytesSize = (int) ceil($size / 3) * 3; - - $bytes = random_bytes($bytesSize); - - $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size); - } - - return $string; - })($length); - } - - /** - * Set the callable that will be used to generate random strings. - * - * @param callable|null $factory - * @return void - */ - public static function createRandomStringsUsing(?callable $factory = null) - { - static::$randomStringFactory = $factory; - } - - /** - * Set the sequence that will be used to generate random strings. - * - * @param array $sequence - * @param callable|null $whenMissing - * @return void - */ - public static function createRandomStringsUsingSequence(array $sequence, $whenMissing = null) - { - $next = 0; - - $whenMissing ??= function ($length) use (&$next) { - $factoryCache = static::$randomStringFactory; - - static::$randomStringFactory = null; - - $randomString = static::random($length); - - static::$randomStringFactory = $factoryCache; - - $next++; - - return $randomString; - }; - - static::createRandomStringsUsing(function ($length) use (&$next, $sequence, $whenMissing) { - if (array_key_exists($next, $sequence)) { - return $sequence[$next++]; - } - - return $whenMissing($length); - }); - } - - /** - * Indicate that random strings should be created normally and not using a custom factory. - * - * @return void - */ - public static function createRandomStringsNormally() - { - static::$randomStringFactory = null; - } - - /** - * Repeat the given string. - * - * @param string $string - * @param int $times - * @return string - */ - public static function repeat(string $string, int $times) - { - return str_repeat($string, $times); - } - - /** - * Replace a given value in the string sequentially with an array. - * - * @param string $search - * @param iterable $replace - * @param string $subject - * @return string - */ - public static function replaceArray($search, $replace, $subject) - { - if ($replace instanceof Traversable) { - $replace = (new Collection($replace))->all(); - } - - $segments = explode($search, $subject); - - $result = array_shift($segments); - - foreach ($segments as $segment) { - $result .= self::toStringOr(array_shift($replace) ?? $search, $search).$segment; - } - - return $result; - } - - /** - * Convert the given value to a string or return the given fallback on failure. - * - * @param mixed $value - * @param string $fallback - * @return string - */ - private static function toStringOr($value, $fallback) - { - try { - return (string) $value; - } catch (Throwable $e) { - return $fallback; - } - } - - /** - * Replace the given value in the given string. - * - * @param string|iterable $search - * @param string|iterable $replace - * @param string|iterable $subject - * @param bool $caseSensitive - * @return string|string[] - */ - public static function replace($search, $replace, $subject, $caseSensitive = true) - { - if ($search instanceof Traversable) { - $search = (new Collection($search))->all(); - } - - if ($replace instanceof Traversable) { - $replace = (new Collection($replace))->all(); - } - - if ($subject instanceof Traversable) { - $subject = (new Collection($subject))->all(); - } - - return $caseSensitive - ? str_replace($search, $replace, $subject) - : str_ireplace($search, $replace, $subject); - } - - /** - * Replace the first occurrence of a given value in the string. - * - * @param string $search - * @param string $replace - * @param string $subject - * @return string - */ - public static function replaceFirst($search, $replace, $subject) - { - $search = (string) $search; - - if ($search === '') { - return $subject; - } - - $position = strpos($subject, $search); - - if ($position !== false) { - return substr_replace($subject, $replace, $position, strlen($search)); - } - - return $subject; - } - - /** - * Replace the first occurrence of the given value if it appears at the start of the string. - * - * @param string $search - * @param string $replace - * @param string $subject - * @return string - */ - public static function replaceStart($search, $replace, $subject) - { - $search = (string) $search; - - if ($search === '') { - return $subject; - } - - if (static::startsWith($subject, $search)) { - return static::replaceFirst($search, $replace, $subject); - } - - return $subject; - } - - /** - * Replace the last occurrence of a given value in the string. - * - * @param string $search - * @param string $replace - * @param string $subject - * @return string - */ - public static function replaceLast($search, $replace, $subject) - { - $search = (string) $search; - - if ($search === '') { - return $subject; - } - - $position = strrpos($subject, $search); - - if ($position !== false) { - return substr_replace($subject, $replace, $position, strlen($search)); - } - - return $subject; - } - - /** - * Replace the last occurrence of a given value if it appears at the end of the string. - * - * @param string $search - * @param string $replace - * @param string $subject - * @return string - */ - public static function replaceEnd($search, $replace, $subject) - { - $search = (string) $search; - - if ($search === '') { - return $subject; - } - - if (static::endsWith($subject, $search)) { - return static::replaceLast($search, $replace, $subject); - } - - return $subject; - } - - /** - * Replace the patterns matching the given regular expression. - * - * @param array|string $pattern - * @param \Closure|string[]|string $replace - * @param array|string $subject - * @param int $limit - * @return string|string[]|null - */ - public static function replaceMatches($pattern, $replace, $subject, $limit = -1) - { - if ($replace instanceof Closure) { - return preg_replace_callback($pattern, $replace, $subject, $limit); - } - - return preg_replace($pattern, $replace, $subject, $limit); - } - - /** - * Remove any occurrence of the given string in the subject. - * - * @param string|iterable $search - * @param string|iterable $subject - * @param bool $caseSensitive - * @return string - */ - public static function remove($search, $subject, $caseSensitive = true) - { - if ($search instanceof Traversable) { - $search = (new Collection($search))->all(); - } - - return $caseSensitive - ? str_replace($search, '', $subject) - : str_ireplace($search, '', $subject); - } - - /** - * Reverse the given string. - * - * @param string $value - * @return string - */ - public static function reverse(string $value) - { - return implode(array_reverse(mb_str_split($value))); - } - - /** - * Begin a string with a single instance of a given value. - * - * @param string $value - * @param string $prefix - * @return string - */ - public static function start($value, $prefix) - { - $quoted = preg_quote($prefix, '/'); - - return $prefix.preg_replace('/^(?:'.$quoted.')+/u', '', $value); - } - - /** - * Convert the given string to upper-case. - * - * @param string $value - * @return string - */ - public static function upper($value) - { - return mb_strtoupper($value, 'UTF-8'); - } - - /** - * Convert the given string to proper case. - * - * @param string $value - * @return string - */ - public static function title($value) - { - return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8'); - } - - /** - * Convert the given string to proper case for each word. - * - * @param string $value - * @return string - */ - public static function headline($value) - { - $parts = explode(' ', $value); - - $parts = count($parts) > 1 - ? array_map([static::class, 'title'], $parts) - : array_map([static::class, 'title'], static::ucsplit(implode('_', $parts))); - - $collapsed = static::replace(['-', '_', ' '], '_', implode('_', $parts)); - - return implode(' ', array_filter(explode('_', $collapsed))); - } - - /** - * Convert the given string to APA-style title case. - * - * See: https://apastyle.apa.org/style-grammar-guidelines/capitalization/title-case - * - * @param string $value - * @return string - */ - public static function apa($value) - { - if (trim($value) === '') { - return $value; - } - - $minorWords = [ - 'and', 'as', 'but', 'for', 'if', 'nor', 'or', 'so', 'yet', 'a', 'an', - 'the', 'at', 'by', 'for', 'in', 'of', 'off', 'on', 'per', 'to', 'up', 'via', - 'et', 'ou', 'un', 'une', 'la', 'le', 'les', 'de', 'du', 'des', 'par', 'à', - ]; - - $endPunctuation = ['.', '!', '?', ':', '—', ',']; - - $words = preg_split('/\s+/', $value, -1, PREG_SPLIT_NO_EMPTY); - - for ($i = 0; $i < count($words); $i++) { - $lowercaseWord = mb_strtolower($words[$i]); - - if (str_contains($lowercaseWord, '-')) { - $hyphenatedWords = explode('-', $lowercaseWord); - - $hyphenatedWords = array_map(function ($part) use ($minorWords) { - return (in_array($part, $minorWords) && mb_strlen($part) <= 3) - ? $part - : mb_strtoupper(mb_substr($part, 0, 1)).mb_substr($part, 1); - }, $hyphenatedWords); - - $words[$i] = implode('-', $hyphenatedWords); - } else { - if (in_array($lowercaseWord, $minorWords) && - mb_strlen($lowercaseWord) <= 3 && - ! ($i === 0 || in_array(mb_substr($words[$i - 1], -1), $endPunctuation))) { - $words[$i] = $lowercaseWord; - } else { - $words[$i] = mb_strtoupper(mb_substr($lowercaseWord, 0, 1)).mb_substr($lowercaseWord, 1); - } - } - } - - return implode(' ', $words); - } - - /** - * Get the singular form of an English word. - * - * @param string $value - * @return string - */ - public static function singular($value) - { - return Pluralizer::singular($value); - } - - /** - * Generate a URL friendly "slug" from a given string. - * - * @param string $title - * @param string $separator - * @param string|null $language - * @param array $dictionary - * @return string - */ - public static function slug($title, $separator = '-', $language = 'en', $dictionary = ['@' => 'at']) - { - $title = $language ? static::ascii($title, $language) : $title; - - // Convert all dashes/underscores into separator - $flip = $separator === '-' ? '_' : '-'; - - $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title); - - // Replace dictionary words - foreach ($dictionary as $key => $value) { - $dictionary[$key] = $separator.$value.$separator; - } - - $title = str_replace(array_keys($dictionary), array_values($dictionary), $title); - - // Remove all characters that are not the separator, letters, numbers, or whitespace - $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', static::lower($title)); - - // Replace all separator characters and whitespace by a single separator - $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title); - - return trim($title, $separator); - } - - /** - * Convert a string to snake case. - * - * @param string $value - * @param string $delimiter - * @return string - */ - public static function snake($value, $delimiter = '_') - { - $key = $value; - - if (isset(static::$snakeCache[$key][$delimiter])) { - return static::$snakeCache[$key][$delimiter]; - } - - if (! ctype_lower($value)) { - $value = preg_replace('/\s+/u', '', ucwords($value)); - - $value = static::lower(preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value)); - } - - return static::$snakeCache[$key][$delimiter] = $value; - } - - /** - * Remove all whitespace from both ends of a string. - * - * @param string $value - * @param string|null $charlist - * @return string - */ - public static function trim($value, $charlist = null) - { - if ($charlist === null) { - $trimDefaultCharacters = " \n\r\t\v\0"; - - return preg_replace('~^[\s\x{FEFF}\x{200B}\x{200E}'.$trimDefaultCharacters.']+|[\s\x{FEFF}\x{200B}\x{200E}'.$trimDefaultCharacters.']+$~u', '', $value) ?? trim($value); - } - - return trim($value, $charlist); - } - - /** - * Remove all whitespace from the beginning of a string. - * - * @param string $value - * @param string|null $charlist - * @return string - */ - public static function ltrim($value, $charlist = null) - { - if ($charlist === null) { - $ltrimDefaultCharacters = " \n\r\t\v\0"; - - return preg_replace('~^[\s\x{FEFF}\x{200B}\x{200E}'.$ltrimDefaultCharacters.']+~u', '', $value) ?? ltrim($value); - } - - return ltrim($value, $charlist); - } - - /** - * Remove all whitespace from the end of a string. - * - * @param string $value - * @param string|null $charlist - * @return string - */ - public static function rtrim($value, $charlist = null) - { - if ($charlist === null) { - $rtrimDefaultCharacters = " \n\r\t\v\0"; - - return preg_replace('~[\s\x{FEFF}\x{200B}\x{200E}'.$rtrimDefaultCharacters.']+$~u', '', $value) ?? rtrim($value); - } - - return rtrim($value, $charlist); - } - - /** - * Remove all "extra" blank space from the given string. - * - * @param string $value - * @return string - */ - public static function squish($value) - { - return preg_replace('~(\s|\x{3164}|\x{1160})+~u', ' ', static::trim($value)); - } - - /** - * Determine if a given string starts with a given substring. - * - * @param string $haystack - * @param string|iterable $needles - * @return bool - */ - public static function startsWith($haystack, $needles) - { - if (! is_iterable($needles)) { - $needles = [$needles]; - } - - if (is_null($haystack)) { - return false; - } - - foreach ($needles as $needle) { - if ((string) $needle !== '' && str_starts_with($haystack, $needle)) { - return true; - } - } - - return false; - } - - /** - * Convert a value to studly caps case. - * - * @param string $value - * @return string - */ - public static function studly($value) - { - $key = $value; - - if (isset(static::$studlyCache[$key])) { - return static::$studlyCache[$key]; - } - - $words = explode(' ', static::replace(['-', '_'], ' ', $value)); - - $studlyWords = array_map(fn ($word) => static::ucfirst($word), $words); - - return static::$studlyCache[$key] = implode($studlyWords); - } - - /** - * Convert a value to Pascal case. - * - * @param string $value - * @return string - */ - public static function pascal($value) - { - return static::studly($value); - } - - /** - * Returns the portion of the string specified by the start and length parameters. - * - * @param string $string - * @param int $start - * @param int|null $length - * @param string $encoding - * @return string - */ - public static function substr($string, $start, $length = null, $encoding = 'UTF-8') - { - return mb_substr($string, $start, $length, $encoding); - } - - /** - * Returns the number of substring occurrences. - * - * @param string $haystack - * @param string $needle - * @param int $offset - * @param int|null $length - * @return int - */ - public static function substrCount($haystack, $needle, $offset = 0, $length = null) - { - if (! is_null($length)) { - return substr_count($haystack, $needle, $offset, $length); - } - - return substr_count($haystack, $needle, $offset); - } - - /** - * Replace text within a portion of a string. - * - * @param string|string[] $string - * @param string|string[] $replace - * @param int|int[] $offset - * @param int|int[]|null $length - * @return string|string[] - */ - public static function substrReplace($string, $replace, $offset = 0, $length = null) - { - if ($length === null) { - $length = strlen($string); - } - - return substr_replace($string, $replace, $offset, $length); - } - - /** - * Swap multiple keywords in a string with other keywords. - * - * @param array $map - * @param string $subject - * @return string - */ - public static function swap(array $map, $subject) - { - return strtr($subject, $map); - } - - /** - * Take the first or last {$limit} characters of a string. - * - * @param string $string - * @param int $limit - * @return string - */ - public static function take($string, int $limit): string - { - if ($limit < 0) { - return static::substr($string, $limit); - } - - return static::substr($string, 0, $limit); - } - - /** - * Convert the given string to Base64 encoding. - * - * @param string $string - * @return string - */ - public static function toBase64($string): string - { - return base64_encode($string); - } - - /** - * Decode the given Base64 encoded string. - * - * @param string $string - * @param bool $strict - * @return string|false - */ - public static function fromBase64($string, $strict = false) - { - return base64_decode($string, $strict); - } - - /** - * Make a string's first character lowercase. - * - * @param string $string - * @return string - */ - public static function lcfirst($string) - { - return static::lower(static::substr($string, 0, 1)).static::substr($string, 1); - } - - /** - * Make a string's first character uppercase. - * - * @param string $string - * @return string - */ - public static function ucfirst($string) - { - return static::upper(static::substr($string, 0, 1)).static::substr($string, 1); - } - - /** - * Split a string into pieces by uppercase characters. - * - * @param string $string - * @return string[] - */ - public static function ucsplit($string) - { - return preg_split('/(?=\p{Lu})/u', $string, -1, PREG_SPLIT_NO_EMPTY); - } - - /** - * Get the number of words a string contains. - * - * @param string $string - * @param string|null $characters - * @return int - */ - public static function wordCount($string, $characters = null) - { - return str_word_count($string, 0, $characters); - } - - /** - * Wrap a string to a given number of characters. - * - * @param string $string - * @param int $characters - * @param string $break - * @param bool $cutLongWords - * @return string - */ - public static function wordWrap($string, $characters = 75, $break = "\n", $cutLongWords = false) - { - return wordwrap($string, $characters, $break, $cutLongWords); - } - - /** - * Generate a UUID (version 4). - * - * @return \Ramsey\Uuid\UuidInterface - */ - public static function uuid() - { - return static::$uuidFactory - ? call_user_func(static::$uuidFactory) - : Uuid::uuid4(); - } - - /** - * Generate a UUID (version 7). - * - * @param \DateTimeInterface|null $time - * @return \Ramsey\Uuid\UuidInterface - */ - public static function uuid7($time = null) - { - return static::$uuidFactory - ? call_user_func(static::$uuidFactory) - : Uuid::uuid7($time); - } - - /** - * Generate a time-ordered UUID. - * - * @return \Ramsey\Uuid\UuidInterface - */ - public static function orderedUuid() - { - if (static::$uuidFactory) { - return call_user_func(static::$uuidFactory); - } - - $factory = new UuidFactory; - - $factory->setRandomGenerator(new CombGenerator( - $factory->getRandomGenerator(), - $factory->getNumberConverter() - )); - - $factory->setCodec(new TimestampFirstCombCodec( - $factory->getUuidBuilder() - )); - - return $factory->uuid4(); - } - - /** - * Set the callable that will be used to generate UUIDs. - * - * @param callable|null $factory - * @return void - */ - public static function createUuidsUsing(?callable $factory = null) - { - static::$uuidFactory = $factory; - } - - /** - * Set the sequence that will be used to generate UUIDs. - * - * @param array $sequence - * @param callable|null $whenMissing - * @return void - */ - public static function createUuidsUsingSequence(array $sequence, $whenMissing = null) - { - $next = 0; - - $whenMissing ??= function () use (&$next) { - $factoryCache = static::$uuidFactory; - - static::$uuidFactory = null; - - $uuid = static::uuid(); - - static::$uuidFactory = $factoryCache; - - $next++; - - return $uuid; - }; - - static::createUuidsUsing(function () use (&$next, $sequence, $whenMissing) { - if (array_key_exists($next, $sequence)) { - return $sequence[$next++]; - } - - return $whenMissing(); - }); - } - - /** - * Always return the same UUID when generating new UUIDs. - * - * @param \Closure|null $callback - * @return \Ramsey\Uuid\UuidInterface - */ - public static function freezeUuids(?Closure $callback = null) - { - $uuid = Str::uuid(); - - Str::createUuidsUsing(fn () => $uuid); - - if ($callback !== null) { - try { - $callback($uuid); - } finally { - Str::createUuidsNormally(); - } - } - - return $uuid; - } - - /** - * Indicate that UUIDs should be created normally and not using a custom factory. - * - * @return void - */ - public static function createUuidsNormally() - { - static::$uuidFactory = null; - } - - /** - * Generate a ULID. - * - * @param \DateTimeInterface|null $time - * @return \Symfony\Component\Uid\Ulid - */ - public static function ulid($time = null) - { - if (static::$ulidFactory) { - return call_user_func(static::$ulidFactory); - } - - if ($time === null) { - return new Ulid(); - } - - return new Ulid(Ulid::generate($time)); - } - - /** - * Indicate that ULIDs should be created normally and not using a custom factory. - * - * @return void - */ - public static function createUlidsNormally() - { - static::$ulidFactory = null; - } - - /** - * Set the callable that will be used to generate ULIDs. - * - * @param callable|null $factory - * @return void - */ - public static function createUlidsUsing(?callable $factory = null) - { - static::$ulidFactory = $factory; - } - - /** - * Set the sequence that will be used to generate ULIDs. - * - * @param array $sequence - * @param callable|null $whenMissing - * @return void - */ - public static function createUlidsUsingSequence(array $sequence, $whenMissing = null) - { - $next = 0; - - $whenMissing ??= function () use (&$next) { - $factoryCache = static::$ulidFactory; - - static::$ulidFactory = null; - - $ulid = static::ulid(); - - static::$ulidFactory = $factoryCache; - - $next++; - - return $ulid; - }; - - static::createUlidsUsing(function () use (&$next, $sequence, $whenMissing) { - if (array_key_exists($next, $sequence)) { - return $sequence[$next++]; - } - - return $whenMissing(); - }); - } - - /** - * Always return the same ULID when generating new ULIDs. - * - * @param Closure|null $callback - * @return Ulid - */ - public static function freezeUlids(?Closure $callback = null) - { - $ulid = Str::ulid(); - - Str::createUlidsUsing(fn () => $ulid); - - if ($callback !== null) { - try { - $callback($ulid); - } finally { - Str::createUlidsNormally(); - } - } - - return $ulid; - } - - /** - * Remove all strings from the casing caches. - * - * @return void - */ - public static function flushCache() - { - static::$snakeCache = []; - static::$camelCache = []; - static::$studlyCache = []; - } -} diff --git a/vendor/illuminate/support/Stringable.php b/vendor/illuminate/support/Stringable.php deleted file mode 100644 index 797ffbc..0000000 --- a/vendor/illuminate/support/Stringable.php +++ /dev/null @@ -1,1497 +0,0 @@ -value = (string) $value; - } - - /** - * Return the remainder of a string after the first occurrence of a given value. - * - * @param string $search - * @return static - */ - public function after($search) - { - return new static(Str::after($this->value, $search)); - } - - /** - * Return the remainder of a string after the last occurrence of a given value. - * - * @param string $search - * @return static - */ - public function afterLast($search) - { - return new static(Str::afterLast($this->value, $search)); - } - - /** - * Append the given values to the string. - * - * @param array|string ...$values - * @return static - */ - public function append(...$values) - { - return new static($this->value.implode('', $values)); - } - - /** - * Append a new line to the string. - * - * @param int $count - * @return $this - */ - public function newLine($count = 1) - { - return $this->append(str_repeat(PHP_EOL, $count)); - } - - /** - * Transliterate a UTF-8 value to ASCII. - * - * @param string $language - * @return static - */ - public function ascii($language = 'en') - { - return new static(Str::ascii($this->value, $language)); - } - - /** - * Get the trailing name component of the path. - * - * @param string $suffix - * @return static - */ - public function basename($suffix = '') - { - return new static(basename($this->value, $suffix)); - } - - /** - * Get the character at the specified index. - * - * @param int $index - * @return string|false - */ - public function charAt($index) - { - return Str::charAt($this->value, $index); - } - - /** - * Remove the given string if it exists at the start of the current string. - * - * @param string|array $needle - * @return static - */ - public function chopStart($needle) - { - return new static(Str::chopStart($this->value, $needle)); - } - - /** - * Remove the given string if it exists at the end of the current string. - * - * @param string|array $needle - * @return static - */ - public function chopEnd($needle) - { - return new static(Str::chopEnd($this->value, $needle)); - } - - /** - * Get the basename of the class path. - * - * @return static - */ - public function classBasename() - { - return new static(class_basename($this->value)); - } - - /** - * Get the portion of a string before the first occurrence of a given value. - * - * @param string $search - * @return static - */ - public function before($search) - { - return new static(Str::before($this->value, $search)); - } - - /** - * Get the portion of a string before the last occurrence of a given value. - * - * @param string $search - * @return static - */ - public function beforeLast($search) - { - return new static(Str::beforeLast($this->value, $search)); - } - - /** - * Get the portion of a string between two given values. - * - * @param string $from - * @param string $to - * @return static - */ - public function between($from, $to) - { - return new static(Str::between($this->value, $from, $to)); - } - - /** - * Get the smallest possible portion of a string between two given values. - * - * @param string $from - * @param string $to - * @return static - */ - public function betweenFirst($from, $to) - { - return new static(Str::betweenFirst($this->value, $from, $to)); - } - - /** - * Convert a value to camel case. - * - * @return static - */ - public function camel() - { - return new static(Str::camel($this->value)); - } - - /** - * Determine if a given string contains a given substring. - * - * @param string|iterable $needles - * @param bool $ignoreCase - * @return bool - */ - public function contains($needles, $ignoreCase = false) - { - return Str::contains($this->value, $needles, $ignoreCase); - } - - /** - * Determine if a given string contains all array values. - * - * @param iterable $needles - * @param bool $ignoreCase - * @return bool - */ - public function containsAll($needles, $ignoreCase = false) - { - return Str::containsAll($this->value, $needles, $ignoreCase); - } - - /** - * Convert the case of a string. - * - * @param int $mode - * @param string|null $encoding - * @return static - */ - public function convertCase(int $mode = MB_CASE_FOLD, ?string $encoding = 'UTF-8') - { - return new static(Str::convertCase($this->value, $mode, $encoding)); - } - - /** - * Replace consecutive instances of a given character with a single character. - * - * @param string $character - * @return static - */ - public function deduplicate(string $character = ' ') - { - return new static(Str::deduplicate($this->value, $character)); - } - - /** - * Get the parent directory's path. - * - * @param int $levels - * @return static - */ - public function dirname($levels = 1) - { - return new static(dirname($this->value, $levels)); - } - - /** - * Determine if a given string ends with a given substring. - * - * @param string|iterable $needles - * @return bool - */ - public function endsWith($needles) - { - return Str::endsWith($this->value, $needles); - } - - /** - * Determine if the string is an exact match with the given value. - * - * @param \Illuminate\Support\Stringable|string $value - * @return bool - */ - public function exactly($value) - { - if ($value instanceof Stringable) { - $value = $value->toString(); - } - - return $this->value === $value; - } - - /** - * Extracts an excerpt from text that matches the first instance of a phrase. - * - * @param string $phrase - * @param array $options - * @return string|null - */ - public function excerpt($phrase = '', $options = []) - { - return Str::excerpt($this->value, $phrase, $options); - } - - /** - * Explode the string into a collection. - * - * @param string $delimiter - * @param int $limit - * @return \Illuminate\Support\Collection - */ - public function explode($delimiter, $limit = PHP_INT_MAX) - { - return new Collection(explode($delimiter, $this->value, $limit)); - } - - /** - * Split a string using a regular expression or by length. - * - * @param string|int $pattern - * @param int $limit - * @param int $flags - * @return \Illuminate\Support\Collection - */ - public function split($pattern, $limit = -1, $flags = 0) - { - if (filter_var($pattern, FILTER_VALIDATE_INT) !== false) { - return new Collection(mb_str_split($this->value, $pattern)); - } - - $segments = preg_split($pattern, $this->value, $limit, $flags); - - return ! empty($segments) ? new Collection($segments) : new Collection; - } - - /** - * Cap a string with a single instance of a given value. - * - * @param string $cap - * @return static - */ - public function finish($cap) - { - return new static(Str::finish($this->value, $cap)); - } - - /** - * Determine if a given string matches a given pattern. - * - * @param string|iterable $pattern - * @param bool $ignoreCase - * @return bool - */ - public function is($pattern, $ignoreCase = false) - { - return Str::is($pattern, $this->value, $ignoreCase); - } - - /** - * Determine if a given string is 7 bit ASCII. - * - * @return bool - */ - public function isAscii() - { - return Str::isAscii($this->value); - } - - /** - * Determine if a given string is valid JSON. - * - * @return bool - */ - public function isJson() - { - return Str::isJson($this->value); - } - - /** - * Determine if a given value is a valid URL. - * - * @return bool - */ - public function isUrl() - { - return Str::isUrl($this->value); - } - - /** - * Determine if a given string is a valid UUID. - * - * @return bool - */ - public function isUuid() - { - return Str::isUuid($this->value); - } - - /** - * Determine if a given string is a valid ULID. - * - * @return bool - */ - public function isUlid() - { - return Str::isUlid($this->value); - } - - /** - * Determine if the given string is empty. - * - * @return bool - */ - public function isEmpty() - { - return $this->value === ''; - } - - /** - * Determine if the given string is not empty. - * - * @return bool - */ - public function isNotEmpty() - { - return ! $this->isEmpty(); - } - - /** - * Convert a string to kebab case. - * - * @return static - */ - public function kebab() - { - return new static(Str::kebab($this->value)); - } - - /** - * Return the length of the given string. - * - * @param string|null $encoding - * @return int - */ - public function length($encoding = null) - { - return Str::length($this->value, $encoding); - } - - /** - * Limit the number of characters in a string. - * - * @param int $limit - * @param string $end - * @param bool $preserveWords - * @return static - */ - public function limit($limit = 100, $end = '...', $preserveWords = false) - { - return new static(Str::limit($this->value, $limit, $end, $preserveWords)); - } - - /** - * Convert the given string to lower-case. - * - * @return static - */ - public function lower() - { - return new static(Str::lower($this->value)); - } - - /** - * Convert GitHub flavored Markdown into HTML. - * - * @param array $options - * @param array $extensions - * @return static - */ - public function markdown(array $options = [], array $extensions = []) - { - return new static(Str::markdown($this->value, $options, $extensions)); - } - - /** - * Convert inline Markdown into HTML. - * - * @param array $options - * @param array $extensions - * @return static - */ - public function inlineMarkdown(array $options = [], array $extensions = []) - { - return new static(Str::inlineMarkdown($this->value, $options, $extensions)); - } - - /** - * Masks a portion of a string with a repeated character. - * - * @param string $character - * @param int $index - * @param int|null $length - * @param string $encoding - * @return static - */ - public function mask($character, $index, $length = null, $encoding = 'UTF-8') - { - return new static(Str::mask($this->value, $character, $index, $length, $encoding)); - } - - /** - * Get the string matching the given pattern. - * - * @param string $pattern - * @return static - */ - public function match($pattern) - { - return new static(Str::match($pattern, $this->value)); - } - - /** - * Determine if a given string matches a given pattern. - * - * @param string|iterable $pattern - * @return bool - */ - public function isMatch($pattern) - { - return Str::isMatch($pattern, $this->value); - } - - /** - * Get the string matching the given pattern. - * - * @param string $pattern - * @return \Illuminate\Support\Collection - */ - public function matchAll($pattern) - { - return Str::matchAll($pattern, $this->value); - } - - /** - * Determine if the string matches the given pattern. - * - * @param string $pattern - * @return bool - */ - public function test($pattern) - { - return $this->isMatch($pattern); - } - - /** - * Remove all non-numeric characters from a string. - * - * @return static - */ - public function numbers() - { - return new static(Str::numbers($this->value)); - } - - /** - * Pad both sides of the string with another. - * - * @param int $length - * @param string $pad - * @return static - */ - public function padBoth($length, $pad = ' ') - { - return new static(Str::padBoth($this->value, $length, $pad)); - } - - /** - * Pad the left side of the string with another. - * - * @param int $length - * @param string $pad - * @return static - */ - public function padLeft($length, $pad = ' ') - { - return new static(Str::padLeft($this->value, $length, $pad)); - } - - /** - * Pad the right side of the string with another. - * - * @param int $length - * @param string $pad - * @return static - */ - public function padRight($length, $pad = ' ') - { - return new static(Str::padRight($this->value, $length, $pad)); - } - - /** - * Parse a Class@method style callback into class and method. - * - * @param string|null $default - * @return array - */ - public function parseCallback($default = null) - { - return Str::parseCallback($this->value, $default); - } - - /** - * Call the given callback and return a new string. - * - * @param callable $callback - * @return static - */ - public function pipe(callable $callback) - { - return new static($callback($this)); - } - - /** - * Get the plural form of an English word. - * - * @param int|array|\Countable $count - * @return static - */ - public function plural($count = 2) - { - return new static(Str::plural($this->value, $count)); - } - - /** - * Pluralize the last word of an English, studly caps case string. - * - * @param int|array|\Countable $count - * @return static - */ - public function pluralStudly($count = 2) - { - return new static(Str::pluralStudly($this->value, $count)); - } - - /** - * Pluralize the last word of an English, Pascal caps case string. - * - * @param int|array|\Countable $count - * @return static - */ - public function pluralPascal($count = 2) - { - return new static(Str::pluralStudly($this->value, $count)); - } - - /** - * Find the multi-byte safe position of the first occurrence of the given substring. - * - * @param string $needle - * @param int $offset - * @param string|null $encoding - * @return int|false - */ - public function position($needle, $offset = 0, $encoding = null) - { - return Str::position($this->value, $needle, $offset, $encoding); - } - - /** - * Prepend the given values to the string. - * - * @param string ...$values - * @return static - */ - public function prepend(...$values) - { - return new static(implode('', $values).$this->value); - } - - /** - * Remove any occurrence of the given string in the subject. - * - * @param string|iterable $search - * @param bool $caseSensitive - * @return static - */ - public function remove($search, $caseSensitive = true) - { - return new static(Str::remove($search, $this->value, $caseSensitive)); - } - - /** - * Reverse the string. - * - * @return static - */ - public function reverse() - { - return new static(Str::reverse($this->value)); - } - - /** - * Repeat the string. - * - * @param int $times - * @return static - */ - public function repeat(int $times) - { - return new static(str_repeat($this->value, $times)); - } - - /** - * Replace the given value in the given string. - * - * @param string|iterable $search - * @param string|iterable $replace - * @param bool $caseSensitive - * @return static - */ - public function replace($search, $replace, $caseSensitive = true) - { - return new static(Str::replace($search, $replace, $this->value, $caseSensitive)); - } - - /** - * Replace a given value in the string sequentially with an array. - * - * @param string $search - * @param iterable $replace - * @return static - */ - public function replaceArray($search, $replace) - { - return new static(Str::replaceArray($search, $replace, $this->value)); - } - - /** - * Replace the first occurrence of a given value in the string. - * - * @param string $search - * @param string $replace - * @return static - */ - public function replaceFirst($search, $replace) - { - return new static(Str::replaceFirst($search, $replace, $this->value)); - } - - /** - * Replace the first occurrence of the given value if it appears at the start of the string. - * - * @param string $search - * @param string $replace - * @return static - */ - public function replaceStart($search, $replace) - { - return new static(Str::replaceStart($search, $replace, $this->value)); - } - - /** - * Replace the last occurrence of a given value in the string. - * - * @param string $search - * @param string $replace - * @return static - */ - public function replaceLast($search, $replace) - { - return new static(Str::replaceLast($search, $replace, $this->value)); - } - - /** - * Replace the last occurrence of a given value if it appears at the end of the string. - * - * @param string $search - * @param string $replace - * @return static - */ - public function replaceEnd($search, $replace) - { - return new static(Str::replaceEnd($search, $replace, $this->value)); - } - - /** - * Replace the patterns matching the given regular expression. - * - * @param array|string $pattern - * @param \Closure|string[]|string $replace - * @param int $limit - * @return static - */ - public function replaceMatches($pattern, $replace, $limit = -1) - { - if ($replace instanceof Closure) { - return new static(preg_replace_callback($pattern, $replace, $this->value, $limit)); - } - - return new static(preg_replace($pattern, $replace, $this->value, $limit)); - } - - /** - * Parse input from a string to a collection, according to a format. - * - * @param string $format - * @return \Illuminate\Support\Collection - */ - public function scan($format) - { - return new Collection(sscanf($this->value, $format)); - } - - /** - * Remove all "extra" blank space from the given string. - * - * @return static - */ - public function squish() - { - return new static(Str::squish($this->value)); - } - - /** - * Begin a string with a single instance of a given value. - * - * @param string $prefix - * @return static - */ - public function start($prefix) - { - return new static(Str::start($this->value, $prefix)); - } - - /** - * Strip HTML and PHP tags from the given string. - * - * @param string[]|string|null $allowedTags - * @return static - */ - public function stripTags($allowedTags = null) - { - return new static(strip_tags($this->value, $allowedTags)); - } - - /** - * Convert the given string to upper-case. - * - * @return static - */ - public function upper() - { - return new static(Str::upper($this->value)); - } - - /** - * Convert the given string to proper case. - * - * @return static - */ - public function title() - { - return new static(Str::title($this->value)); - } - - /** - * Convert the given string to proper case for each word. - * - * @return static - */ - public function headline() - { - return new static(Str::headline($this->value)); - } - - /** - * Convert the given string to APA-style title case. - * - * @return static - */ - public function apa() - { - return new static(Str::apa($this->value)); - } - - /** - * Transliterate a string to its closest ASCII representation. - * - * @param string|null $unknown - * @param bool|null $strict - * @return static - */ - public function transliterate($unknown = '?', $strict = false) - { - return new static(Str::transliterate($this->value, $unknown, $strict)); - } - - /** - * Get the singular form of an English word. - * - * @return static - */ - public function singular() - { - return new static(Str::singular($this->value)); - } - - /** - * Generate a URL friendly "slug" from a given string. - * - * @param string $separator - * @param string|null $language - * @param array $dictionary - * @return static - */ - public function slug($separator = '-', $language = 'en', $dictionary = ['@' => 'at']) - { - return new static(Str::slug($this->value, $separator, $language, $dictionary)); - } - - /** - * Convert a string to snake case. - * - * @param string $delimiter - * @return static - */ - public function snake($delimiter = '_') - { - return new static(Str::snake($this->value, $delimiter)); - } - - /** - * Determine if a given string starts with a given substring. - * - * @param string|iterable $needles - * @return bool - */ - public function startsWith($needles) - { - return Str::startsWith($this->value, $needles); - } - - /** - * Convert a value to studly caps case. - * - * @return static - */ - public function studly() - { - return new static(Str::studly($this->value)); - } - - /** - * Convert the string to Pascal case. - * - * @return static - */ - public function pascal() - { - return new static(Str::pascal($this->value)); - } - - /** - * Returns the portion of the string specified by the start and length parameters. - * - * @param int $start - * @param int|null $length - * @param string $encoding - * @return static - */ - public function substr($start, $length = null, $encoding = 'UTF-8') - { - return new static(Str::substr($this->value, $start, $length, $encoding)); - } - - /** - * Returns the number of substring occurrences. - * - * @param string $needle - * @param int $offset - * @param int|null $length - * @return int - */ - public function substrCount($needle, $offset = 0, $length = null) - { - return Str::substrCount($this->value, $needle, $offset, $length); - } - - /** - * Replace text within a portion of a string. - * - * @param string|string[] $replace - * @param int|int[] $offset - * @param int|int[]|null $length - * @return static - */ - public function substrReplace($replace, $offset = 0, $length = null) - { - return new static(Str::substrReplace($this->value, $replace, $offset, $length)); - } - - /** - * Swap multiple keywords in a string with other keywords. - * - * @param array $map - * @return static - */ - public function swap(array $map) - { - return new static(strtr($this->value, $map)); - } - - /** - * Take the first or last {$limit} characters. - * - * @param int $limit - * @return static - */ - public function take(int $limit) - { - if ($limit < 0) { - return $this->substr($limit); - } - - return $this->substr(0, $limit); - } - - /** - * Trim the string of the given characters. - * - * @param string $characters - * @return static - */ - public function trim($characters = null) - { - return new static(Str::trim(...array_merge([$this->value], func_get_args()))); - } - - /** - * Left trim the string of the given characters. - * - * @param string $characters - * @return static - */ - public function ltrim($characters = null) - { - return new static(Str::ltrim(...array_merge([$this->value], func_get_args()))); - } - - /** - * Right trim the string of the given characters. - * - * @param string $characters - * @return static - */ - public function rtrim($characters = null) - { - return new static(Str::rtrim(...array_merge([$this->value], func_get_args()))); - } - - /** - * Make a string's first character lowercase. - * - * @return static - */ - public function lcfirst() - { - return new static(Str::lcfirst($this->value)); - } - - /** - * Make a string's first character uppercase. - * - * @return static - */ - public function ucfirst() - { - return new static(Str::ucfirst($this->value)); - } - - /** - * Split a string by uppercase characters. - * - * @return \Illuminate\Support\Collection - */ - public function ucsplit() - { - return new Collection(Str::ucsplit($this->value)); - } - - /** - * Execute the given callback if the string contains a given substring. - * - * @param string|iterable $needles - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenContains($needles, $callback, $default = null) - { - return $this->when($this->contains($needles), $callback, $default); - } - - /** - * Execute the given callback if the string contains all array values. - * - * @param iterable $needles - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenContainsAll(array $needles, $callback, $default = null) - { - return $this->when($this->containsAll($needles), $callback, $default); - } - - /** - * Execute the given callback if the string is empty. - * - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenEmpty($callback, $default = null) - { - return $this->when($this->isEmpty(), $callback, $default); - } - - /** - * Execute the given callback if the string is not empty. - * - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenNotEmpty($callback, $default = null) - { - return $this->when($this->isNotEmpty(), $callback, $default); - } - - /** - * Execute the given callback if the string ends with a given substring. - * - * @param string|iterable $needles - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenEndsWith($needles, $callback, $default = null) - { - return $this->when($this->endsWith($needles), $callback, $default); - } - - /** - * Execute the given callback if the string is an exact match with the given value. - * - * @param string $value - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenExactly($value, $callback, $default = null) - { - return $this->when($this->exactly($value), $callback, $default); - } - - /** - * Execute the given callback if the string is not an exact match with the given value. - * - * @param string $value - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenNotExactly($value, $callback, $default = null) - { - return $this->when(! $this->exactly($value), $callback, $default); - } - - /** - * Execute the given callback if the string matches a given pattern. - * - * @param string|iterable $pattern - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenIs($pattern, $callback, $default = null) - { - return $this->when($this->is($pattern), $callback, $default); - } - - /** - * Execute the given callback if the string is 7 bit ASCII. - * - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenIsAscii($callback, $default = null) - { - return $this->when($this->isAscii(), $callback, $default); - } - - /** - * Execute the given callback if the string is a valid UUID. - * - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenIsUuid($callback, $default = null) - { - return $this->when($this->isUuid(), $callback, $default); - } - - /** - * Execute the given callback if the string is a valid ULID. - * - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenIsUlid($callback, $default = null) - { - return $this->when($this->isUlid(), $callback, $default); - } - - /** - * Execute the given callback if the string starts with a given substring. - * - * @param string|iterable $needles - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenStartsWith($needles, $callback, $default = null) - { - return $this->when($this->startsWith($needles), $callback, $default); - } - - /** - * Execute the given callback if the string matches the given pattern. - * - * @param string $pattern - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenTest($pattern, $callback, $default = null) - { - return $this->when($this->test($pattern), $callback, $default); - } - - /** - * Limit the number of words in a string. - * - * @param int $words - * @param string $end - * @return static - */ - public function words($words = 100, $end = '...') - { - return new static(Str::words($this->value, $words, $end)); - } - - /** - * Get the number of words a string contains. - * - * @param string|null $characters - * @return int - */ - public function wordCount($characters = null) - { - return Str::wordCount($this->value, $characters); - } - - /** - * Wrap a string to a given number of characters. - * - * @param int $characters - * @param string $break - * @param bool $cutLongWords - * @return static - */ - public function wordWrap($characters = 75, $break = "\n", $cutLongWords = false) - { - return new static(Str::wordWrap($this->value, $characters, $break, $cutLongWords)); - } - - /** - * Wrap the string with the given strings. - * - * @param string $before - * @param string|null $after - * @return static - */ - public function wrap($before, $after = null) - { - return new static(Str::wrap($this->value, $before, $after)); - } - - /** - * Unwrap the string with the given strings. - * - * @param string $before - * @param string|null $after - * @return static - */ - public function unwrap($before, $after = null) - { - return new static(Str::unwrap($this->value, $before, $after)); - } - - /** - * Convert the string into a `HtmlString` instance. - * - * @return \Illuminate\Support\HtmlString - */ - public function toHtmlString() - { - return new HtmlString($this->value); - } - - /** - * Convert the string to Base64 encoding. - * - * @return static - */ - public function toBase64() - { - return new static(base64_encode($this->value)); - } - - /** - * Decode the Base64 encoded string. - * - * @param bool $strict - * @return static - */ - public function fromBase64($strict = false) - { - return new static(base64_decode($this->value, $strict)); - } - - /** - * Dump the string. - * - * @param mixed ...$args - * @return $this - */ - public function dump(...$args) - { - dump($this->value, ...$args); - - return $this; - } - - /** - * Get the underlying string value. - * - * @return string - */ - public function value() - { - return $this->toString(); - } - - /** - * Get the underlying string value. - * - * @return string - */ - public function toString() - { - return $this->value; - } - - /** - * Get the underlying string value as an integer. - * - * @param int $base - * @return int - */ - public function toInteger($base = 10) - { - return intval($this->value, $base); - } - - /** - * Get the underlying string value as a float. - * - * @return float - */ - public function toFloat() - { - return floatval($this->value); - } - - /** - * Get the underlying string value as a boolean. - * - * Returns true when value is "1", "true", "on", and "yes". Otherwise, returns false. - * - * @return bool - */ - public function toBoolean() - { - return filter_var($this->value, FILTER_VALIDATE_BOOLEAN); - } - - /** - * Get the underlying string value as a Carbon instance. - * - * @param string|null $format - * @param string|null $tz - * @return \Illuminate\Support\Carbon - * - * @throws \Carbon\Exceptions\InvalidFormatException - */ - public function toDate($format = null, $tz = null) - { - if (is_null($format)) { - return Date::parse($this->value, $tz); - } - - return Date::createFromFormat($format, $this->value, $tz); - } - - /** - * Convert the object to a string when JSON encoded. - * - * @return string - */ - public function jsonSerialize(): string - { - return $this->__toString(); - } - - /** - * Determine if the given offset exists. - * - * @param mixed $offset - * @return bool - */ - public function offsetExists(mixed $offset): bool - { - return isset($this->value[$offset]); - } - - /** - * Get the value at the given offset. - * - * @param mixed $offset - * @return string - */ - public function offsetGet(mixed $offset): string - { - return $this->value[$offset]; - } - - /** - * Set the value at the given offset. - * - * @param mixed $offset - * @return void - */ - public function offsetSet(mixed $offset, mixed $value): void - { - $this->value[$offset] = $value; - } - - /** - * Unset the value at the given offset. - * - * @param mixed $offset - * @return void - */ - public function offsetUnset(mixed $offset): void - { - unset($this->value[$offset]); - } - - /** - * Proxy dynamic properties onto methods. - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - return $this->{$key}(); - } - - /** - * Get the raw string value. - * - * @return string - */ - public function __toString() - { - return (string) $this->value; - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/BatchFake.php b/vendor/illuminate/support/Testing/Fakes/BatchFake.php deleted file mode 100644 index 57eb201..0000000 --- a/vendor/illuminate/support/Testing/Fakes/BatchFake.php +++ /dev/null @@ -1,169 +0,0 @@ -id = $id; - $this->name = $name; - $this->totalJobs = $totalJobs; - $this->pendingJobs = $pendingJobs; - $this->failedJobs = $failedJobs; - $this->failedJobIds = $failedJobIds; - $this->options = $options; - $this->createdAt = $createdAt; - $this->cancelledAt = $cancelledAt; - $this->finishedAt = $finishedAt; - } - - /** - * Get a fresh instance of the batch represented by this ID. - * - * @return self - */ - public function fresh() - { - return $this; - } - - /** - * Add additional jobs to the batch. - * - * @param \Illuminate\Support\Enumerable|object|array $jobs - * @return self - */ - public function add($jobs) - { - $jobs = Collection::wrap($jobs); - - foreach ($jobs as $job) { - $this->added[] = $job; - } - - $this->totalJobs += $jobs->count(); - - return $this; - } - - /** - * Record that a job within the batch finished successfully, executing any callbacks if necessary. - * - * @param string $jobId - * @return void - */ - public function recordSuccessfulJob(string $jobId) - { - // - } - - /** - * Decrement the pending jobs for the batch. - * - * @param string $jobId - * @return \Illuminate\Bus\UpdatedBatchJobCounts - */ - public function decrementPendingJobs(string $jobId) - { - // - } - - /** - * Record that a job within the batch failed to finish successfully, executing any callbacks if necessary. - * - * @param string $jobId - * @param \Throwable $e - * @return void - */ - public function recordFailedJob(string $jobId, $e) - { - // - } - - /** - * Increment the failed jobs for the batch. - * - * @param string $jobId - * @return \Illuminate\Bus\UpdatedBatchJobCounts - */ - public function incrementFailedJobs(string $jobId) - { - return new UpdatedBatchJobCounts; - } - - /** - * Cancel the batch. - * - * @return void - */ - public function cancel() - { - $this->cancelledAt = Carbon::now(); - } - - /** - * Delete the batch from storage. - * - * @return void - */ - public function delete() - { - $this->deleted = true; - } - - /** - * Determine if the batch has been deleted. - * - * @return bool - */ - public function deleted() - { - return $this->deleted; - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php b/vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php deleted file mode 100644 index 2afa4ab..0000000 --- a/vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php +++ /dev/null @@ -1,163 +0,0 @@ -batches; - } - - /** - * Retrieve information about an existing batch. - * - * @param string $batchId - * @return \Illuminate\Bus\Batch|null - */ - public function find(string $batchId) - { - return $this->batches[$batchId] ?? null; - } - - /** - * Store a new pending batch. - * - * @param \Illuminate\Bus\PendingBatch $batch - * @return \Illuminate\Bus\Batch - */ - public function store(PendingBatch $batch) - { - $id = (string) Str::orderedUuid(); - - $this->batches[$id] = new BatchFake( - $id, - $batch->name, - count($batch->jobs), - count($batch->jobs), - 0, - [], - $batch->options, - CarbonImmutable::now(), - null, - null - ); - - return $this->batches[$id]; - } - - /** - * Increment the total number of jobs within the batch. - * - * @param string $batchId - * @param int $amount - * @return void - */ - public function incrementTotalJobs(string $batchId, int $amount) - { - // - } - - /** - * Decrement the total number of pending jobs for the batch. - * - * @param string $batchId - * @param string $jobId - * @return \Illuminate\Bus\UpdatedBatchJobCounts - */ - public function decrementPendingJobs(string $batchId, string $jobId) - { - return new UpdatedBatchJobCounts; - } - - /** - * Increment the total number of failed jobs for the batch. - * - * @param string $batchId - * @param string $jobId - * @return \Illuminate\Bus\UpdatedBatchJobCounts - */ - public function incrementFailedJobs(string $batchId, string $jobId) - { - return new UpdatedBatchJobCounts; - } - - /** - * Mark the batch that has the given ID as finished. - * - * @param string $batchId - * @return void - */ - public function markAsFinished(string $batchId) - { - if (isset($this->batches[$batchId])) { - $this->batches[$batchId]->finishedAt = now(); - } - } - - /** - * Cancel the batch that has the given ID. - * - * @param string $batchId - * @return void - */ - public function cancel(string $batchId) - { - if (isset($this->batches[$batchId])) { - $this->batches[$batchId]->cancel(); - } - } - - /** - * Delete the batch that has the given ID. - * - * @param string $batchId - * @return void - */ - public function delete(string $batchId) - { - unset($this->batches[$batchId]); - } - - /** - * Execute the given Closure within a storage specific transaction. - * - * @param \Closure $callback - * @return mixed - */ - public function transaction(Closure $callback) - { - return $callback(); - } - - /** - * Rollback the last database transaction for the connection. - * - * @return void - */ - public function rollBack() - { - // - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/BusFake.php b/vendor/illuminate/support/Testing/Fakes/BusFake.php deleted file mode 100644 index 181fac0..0000000 --- a/vendor/illuminate/support/Testing/Fakes/BusFake.php +++ /dev/null @@ -1,901 +0,0 @@ -dispatcher = $dispatcher; - $this->jobsToFake = Arr::wrap($jobsToFake); - $this->batchRepository = $batchRepository ?: new BatchRepositoryFake; - } - - /** - * Specify the jobs that should be dispatched instead of faked. - * - * @param array|string $jobsToDispatch - * @return $this - */ - public function except($jobsToDispatch) - { - $this->jobsToDispatch = array_merge($this->jobsToDispatch, Arr::wrap($jobsToDispatch)); - - return $this; - } - - /** - * Assert if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|int|null $callback - * @return void - */ - public function assertDispatched($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - if (is_numeric($callback)) { - return $this->assertDispatchedTimes($command, $callback); - } - - PHPUnit::assertTrue( - $this->dispatched($command, $callback)->count() > 0 || - $this->dispatchedAfterResponse($command, $callback)->count() > 0 || - $this->dispatchedSync($command, $callback)->count() > 0, - "The expected [{$command}] job was not dispatched." - ); - } - - /** - * Assert if a job was pushed a number of times. - * - * @param string|\Closure $command - * @param int $times - * @return void - */ - public function assertDispatchedTimes($command, $times = 1) - { - $callback = null; - - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - $count = $this->dispatched($command, $callback)->count() + - $this->dispatchedAfterResponse($command, $callback)->count() + - $this->dispatchedSync($command, $callback)->count(); - - PHPUnit::assertSame( - $times, $count, - "The expected [{$command}] job was pushed {$count} times instead of {$times} times." - ); - } - - /** - * Determine if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - */ - public function assertNotDispatched($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - PHPUnit::assertTrue( - $this->dispatched($command, $callback)->count() === 0 && - $this->dispatchedAfterResponse($command, $callback)->count() === 0 && - $this->dispatchedSync($command, $callback)->count() === 0, - "The unexpected [{$command}] job was dispatched." - ); - } - - /** - * Assert that no jobs were dispatched. - * - * @return void - */ - public function assertNothingDispatched() - { - $commandNames = implode("\n- ", array_keys($this->commands)); - - PHPUnit::assertEmpty($this->commands, "The following jobs were dispatched unexpectedly:\n\n- $commandNames\n"); - } - - /** - * Assert if a job was explicitly dispatched synchronously based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|int|null $callback - * @return void - */ - public function assertDispatchedSync($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - if (is_numeric($callback)) { - return $this->assertDispatchedSyncTimes($command, $callback); - } - - PHPUnit::assertTrue( - $this->dispatchedSync($command, $callback)->count() > 0, - "The expected [{$command}] job was not dispatched synchronously." - ); - } - - /** - * Assert if a job was pushed synchronously a number of times. - * - * @param string|\Closure $command - * @param int $times - * @return void - */ - public function assertDispatchedSyncTimes($command, $times = 1) - { - $callback = null; - - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - $count = $this->dispatchedSync($command, $callback)->count(); - - PHPUnit::assertSame( - $times, $count, - "The expected [{$command}] job was synchronously pushed {$count} times instead of {$times} times." - ); - } - - /** - * Determine if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - */ - public function assertNotDispatchedSync($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - PHPUnit::assertCount( - 0, $this->dispatchedSync($command, $callback), - "The unexpected [{$command}] job was dispatched synchronously." - ); - } - - /** - * Assert if a job was dispatched after the response was sent based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|int|null $callback - * @return void - */ - public function assertDispatchedAfterResponse($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - if (is_numeric($callback)) { - return $this->assertDispatchedAfterResponseTimes($command, $callback); - } - - PHPUnit::assertTrue( - $this->dispatchedAfterResponse($command, $callback)->count() > 0, - "The expected [{$command}] job was not dispatched after sending the response." - ); - } - - /** - * Assert if a job was pushed after the response was sent a number of times. - * - * @param string|\Closure $command - * @param int $times - * @return void - */ - public function assertDispatchedAfterResponseTimes($command, $times = 1) - { - $callback = null; - - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - $count = $this->dispatchedAfterResponse($command, $callback)->count(); - - PHPUnit::assertSame( - $times, $count, - "The expected [{$command}] job was pushed {$count} times instead of {$times} times." - ); - } - - /** - * Determine if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - */ - public function assertNotDispatchedAfterResponse($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - PHPUnit::assertCount( - 0, $this->dispatchedAfterResponse($command, $callback), - "The unexpected [{$command}] job was dispatched after sending the response." - ); - } - - /** - * Assert if a chain of jobs was dispatched. - * - * @param array $expectedChain - * @return void - */ - public function assertChained(array $expectedChain) - { - $command = $expectedChain[0]; - - $expectedChain = array_slice($expectedChain, 1); - - $callback = null; - - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } elseif ($command instanceof ChainedBatchTruthTest) { - $instance = $command; - - $command = ChainedBatch::class; - - $callback = fn ($job) => $instance($job->toPendingBatch()); - } elseif (! is_string($command)) { - $instance = $command; - - $command = get_class($instance); - - $callback = function ($job) use ($instance) { - return serialize($this->resetChainPropertiesToDefaults($job)) === serialize($instance); - }; - } - - PHPUnit::assertTrue( - $this->dispatched($command, $callback)->isNotEmpty(), - "The expected [{$command}] job was not dispatched." - ); - - $this->assertDispatchedWithChainOfObjects($command, $expectedChain, $callback); - } - - /** - * Assert no chained jobs was dispatched. - * - * @return void - */ - public function assertNothingChained() - { - $this->assertNothingDispatched(); - } - - /** - * Reset the chain properties to their default values on the job. - * - * @param mixed $job - * @return mixed - */ - protected function resetChainPropertiesToDefaults($job) - { - return tap(clone $job, function ($job) { - $job->chainConnection = null; - $job->chainQueue = null; - $job->chainCatchCallbacks = null; - $job->chained = []; - }); - } - - /** - * Assert if a job was dispatched with an empty chain based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - */ - public function assertDispatchedWithoutChain($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - PHPUnit::assertTrue( - $this->dispatched($command, $callback)->isNotEmpty(), - "The expected [{$command}] job was not dispatched." - ); - - $this->assertDispatchedWithChainOfObjects($command, [], $callback); - } - - /** - * Assert if a job was dispatched with chained jobs based on a truth-test callback. - * - * @param string $command - * @param array $expectedChain - * @param callable|null $callback - * @return void - */ - protected function assertDispatchedWithChainOfObjects($command, $expectedChain, $callback) - { - $chain = $expectedChain; - - PHPUnit::assertTrue( - $this->dispatched($command, $callback)->filter(function ($job) use ($chain) { - if (count($chain) !== count($job->chained)) { - return false; - } - - foreach ($job->chained as $index => $serializedChainedJob) { - if ($chain[$index] instanceof ChainedBatchTruthTest) { - $chainedBatch = unserialize($serializedChainedJob); - - if (! $chainedBatch instanceof ChainedBatch || - ! $chain[$index]($chainedBatch->toPendingBatch())) { - return false; - } - } elseif ($chain[$index] instanceof Closure) { - [$expectedType, $callback] = [$this->firstClosureParameterType($chain[$index]), $chain[$index]]; - - $chainedJob = unserialize($serializedChainedJob); - - if (! $chainedJob instanceof $expectedType) { - throw new RuntimeException('The chained job was expected to be of type '.$expectedType.', '.$chainedJob::class.' chained.'); - } - - if (! $callback($chainedJob)) { - return false; - } - } elseif (is_string($chain[$index])) { - if ($chain[$index] != get_class(unserialize($serializedChainedJob))) { - return false; - } - } elseif (serialize($chain[$index]) != $serializedChainedJob) { - return false; - } - } - - return true; - })->isNotEmpty(), - 'The expected chain was not dispatched.' - ); - } - - /** - * Create a new assertion about a chained batch. - * - * @param \Closure $callback - * @return \Illuminate\Support\Testing\Fakes\ChainedBatchTruthTest - */ - public function chainedBatch(Closure $callback) - { - return new ChainedBatchTruthTest($callback); - } - - /** - * Assert if a batch was dispatched based on a truth-test callback. - * - * @param callable $callback - * @return void - */ - public function assertBatched(callable $callback) - { - PHPUnit::assertTrue( - $this->batched($callback)->count() > 0, - 'The expected batch was not dispatched.' - ); - } - - /** - * Assert the number of batches that have been dispatched. - * - * @param int $count - * @return void - */ - public function assertBatchCount($count) - { - PHPUnit::assertCount( - $count, $this->batches, - ); - } - - /** - * Assert that no batched jobs were dispatched. - * - * @return void - */ - public function assertNothingBatched() - { - $jobNames = (new Collection($this->batches)) - ->map(fn ($batch) => $batch->jobs->map(fn ($job) => get_class($job))) - ->flatten() - ->join("\n- "); - - PHPUnit::assertEmpty($this->batches, "The following batched jobs were dispatched unexpectedly:\n\n- $jobNames\n"); - } - - /** - * Assert that no jobs were dispatched, chained, or batched. - * - * @return void - */ - public function assertNothingPlaced() - { - $this->assertNothingDispatched(); - $this->assertNothingBatched(); - } - - /** - * Get all of the jobs matching a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function dispatched($command, $callback = null) - { - if (! $this->hasDispatched($command)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return (new Collection($this->commands[$command]))->filter(fn ($command) => $callback($command)); - } - - /** - * Get all of the jobs dispatched synchronously matching a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function dispatchedSync(string $command, $callback = null) - { - if (! $this->hasDispatchedSync($command)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return (new Collection($this->commandsSync[$command]))->filter(fn ($command) => $callback($command)); - } - - /** - * Get all of the jobs dispatched after the response was sent matching a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function dispatchedAfterResponse(string $command, $callback = null) - { - if (! $this->hasDispatchedAfterResponse($command)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return (new Collection($this->commandsAfterResponse[$command]))->filter(fn ($command) => $callback($command)); - } - - /** - * Get all of the pending batches matching a truth-test callback. - * - * @param callable $callback - * @return \Illuminate\Support\Collection - */ - public function batched(callable $callback) - { - if (empty($this->batches)) { - return new Collection; - } - - return (new Collection($this->batches))->filter(fn ($batch) => $callback($batch)); - } - - /** - * Determine if there are any stored commands for a given class. - * - * @param string $command - * @return bool - */ - public function hasDispatched($command) - { - return isset($this->commands[$command]) && ! empty($this->commands[$command]); - } - - /** - * Determine if there are any stored commands for a given class. - * - * @param string $command - * @return bool - */ - public function hasDispatchedSync($command) - { - return isset($this->commandsSync[$command]) && ! empty($this->commandsSync[$command]); - } - - /** - * Determine if there are any stored commands for a given class. - * - * @param string $command - * @return bool - */ - public function hasDispatchedAfterResponse($command) - { - return isset($this->commandsAfterResponse[$command]) && ! empty($this->commandsAfterResponse[$command]); - } - - /** - * Dispatch a command to its appropriate handler. - * - * @param mixed $command - * @return mixed - */ - public function dispatch($command) - { - if ($this->shouldFakeJob($command)) { - $this->commands[get_class($command)][] = $this->getCommandRepresentation($command); - } else { - return $this->dispatcher->dispatch($command); - } - } - - /** - * Dispatch a command to its appropriate handler in the current process. - * - * Queueable jobs will be dispatched to the "sync" queue. - * - * @param mixed $command - * @param mixed $handler - * @return mixed - */ - public function dispatchSync($command, $handler = null) - { - if ($this->shouldFakeJob($command)) { - $this->commandsSync[get_class($command)][] = $this->getCommandRepresentation($command); - } else { - return $this->dispatcher->dispatchSync($command, $handler); - } - } - - /** - * Dispatch a command to its appropriate handler in the current process. - * - * @param mixed $command - * @param mixed $handler - * @return mixed - */ - public function dispatchNow($command, $handler = null) - { - if ($this->shouldFakeJob($command)) { - $this->commands[get_class($command)][] = $this->getCommandRepresentation($command); - } else { - return $this->dispatcher->dispatchNow($command, $handler); - } - } - - /** - * Dispatch a command to its appropriate handler behind a queue. - * - * @param mixed $command - * @return mixed - */ - public function dispatchToQueue($command) - { - if ($this->shouldFakeJob($command)) { - $this->commands[get_class($command)][] = $this->getCommandRepresentation($command); - } else { - return $this->dispatcher->dispatchToQueue($command); - } - } - - /** - * Dispatch a command to its appropriate handler. - * - * @param mixed $command - * @return mixed - */ - public function dispatchAfterResponse($command) - { - if ($this->shouldFakeJob($command)) { - $this->commandsAfterResponse[get_class($command)][] = $this->getCommandRepresentation($command); - } else { - return $this->dispatcher->dispatch($command); - } - } - - /** - * Create a new chain of queueable jobs. - * - * @param \Illuminate\Support\Collection|array $jobs - * @return \Illuminate\Foundation\Bus\PendingChain - */ - public function chain($jobs) - { - $jobs = Collection::wrap($jobs); - $jobs = ChainedBatch::prepareNestedBatches($jobs); - - return new PendingChainFake($this, $jobs->shift(), $jobs->toArray()); - } - - /** - * Attempt to find the batch with the given ID. - * - * @param string $batchId - * @return \Illuminate\Bus\Batch|null - */ - public function findBatch(string $batchId) - { - return $this->batchRepository->find($batchId); - } - - /** - * Create a new batch of queueable jobs. - * - * @param \Illuminate\Support\Collection|array $jobs - * @return \Illuminate\Bus\PendingBatch - */ - public function batch($jobs) - { - return new PendingBatchFake($this, Collection::wrap($jobs)); - } - - /** - * Dispatch an empty job batch for testing. - * - * @param string $name - * @return \Illuminate\Bus\Batch - */ - public function dispatchFakeBatch($name = '') - { - return $this->batch([])->name($name)->dispatch(); - } - - /** - * Record the fake pending batch dispatch. - * - * @param \Illuminate\Bus\PendingBatch $pendingBatch - * @return \Illuminate\Bus\Batch - */ - public function recordPendingBatch(PendingBatch $pendingBatch) - { - $this->batches[] = $pendingBatch; - - return $this->batchRepository->store($pendingBatch); - } - - /** - * Determine if a command should be faked or actually dispatched. - * - * @param mixed $command - * @return bool - */ - protected function shouldFakeJob($command) - { - if ($this->shouldDispatchCommand($command)) { - return false; - } - - if (empty($this->jobsToFake)) { - return true; - } - - return (new Collection($this->jobsToFake)) - ->filter(function ($job) use ($command) { - return $job instanceof Closure - ? $job($command) - : $job === get_class($command); - })->isNotEmpty(); - } - - /** - * Determine if a command should be dispatched or not. - * - * @param mixed $command - * @return bool - */ - protected function shouldDispatchCommand($command) - { - return (new Collection($this->jobsToDispatch)) - ->filter(function ($job) use ($command) { - return $job instanceof Closure - ? $job($command) - : $job === get_class($command); - })->isNotEmpty(); - } - - /** - * Specify if commands should be serialized and restored when being batched. - * - * @param bool $serializeAndRestore - * @return $this - */ - public function serializeAndRestore(bool $serializeAndRestore = true) - { - $this->serializeAndRestore = $serializeAndRestore; - - return $this; - } - - /** - * Serialize and unserialize the command to simulate the queueing process. - * - * @param mixed $command - * @return mixed - */ - protected function serializeAndRestoreCommand($command) - { - return unserialize(serialize($command)); - } - - /** - * Return the command representation that should be stored. - * - * @param mixed $command - * @return mixed - */ - protected function getCommandRepresentation($command) - { - return $this->serializeAndRestore ? $this->serializeAndRestoreCommand($command) : $command; - } - - /** - * Set the pipes commands should be piped through before dispatching. - * - * @param array $pipes - * @return $this - */ - public function pipeThrough(array $pipes) - { - $this->dispatcher->pipeThrough($pipes); - - return $this; - } - - /** - * Determine if the given command has a handler. - * - * @param mixed $command - * @return bool - */ - public function hasCommandHandler($command) - { - return $this->dispatcher->hasCommandHandler($command); - } - - /** - * Retrieve the handler for a command. - * - * @param mixed $command - * @return mixed - */ - public function getCommandHandler($command) - { - return $this->dispatcher->getCommandHandler($command); - } - - /** - * Map a command to a handler. - * - * @param array $map - * @return $this - */ - public function map(array $map) - { - $this->dispatcher->map($map); - - return $this; - } - - /** - * Get the batches that have been dispatched. - * - * @return array - */ - public function dispatchedBatches() - { - return $this->batches; - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/ChainedBatchTruthTest.php b/vendor/illuminate/support/Testing/Fakes/ChainedBatchTruthTest.php deleted file mode 100644 index 4026ad2..0000000 --- a/vendor/illuminate/support/Testing/Fakes/ChainedBatchTruthTest.php +++ /dev/null @@ -1,37 +0,0 @@ -callback = $callback; - } - - /** - * Invoke the truth test with the given pending batch. - * - * @param \Illuminate\Bus\PendingBatch $pendingBatch - * @return bool - */ - public function __invoke($pendingBatch) - { - return call_user_func($this->callback, $pendingBatch); - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/EventFake.php b/vendor/illuminate/support/Testing/Fakes/EventFake.php deleted file mode 100644 index 7f226a7..0000000 --- a/vendor/illuminate/support/Testing/Fakes/EventFake.php +++ /dev/null @@ -1,438 +0,0 @@ -dispatcher = $dispatcher; - - $this->eventsToFake = Arr::wrap($eventsToFake); - } - - /** - * Specify the events that should be dispatched instead of faked. - * - * @param array|string $eventsToDispatch - * @return $this - */ - public function except($eventsToDispatch) - { - $this->eventsToDispatch = array_merge( - $this->eventsToDispatch, - Arr::wrap($eventsToDispatch) - ); - - return $this; - } - - /** - * Assert if an event has a listener attached to it. - * - * @param string $expectedEvent - * @param string|array $expectedListener - * @return void - */ - public function assertListening($expectedEvent, $expectedListener) - { - foreach ($this->dispatcher->getListeners($expectedEvent) as $listenerClosure) { - $actualListener = (new ReflectionFunction($listenerClosure)) - ->getStaticVariables()['listener']; - - $normalizedListener = $expectedListener; - - if (is_string($actualListener) && Str::contains($actualListener, '@')) { - $actualListener = Str::parseCallback($actualListener); - - if (is_string($expectedListener)) { - if (Str::contains($expectedListener, '@')) { - $normalizedListener = Str::parseCallback($expectedListener); - } else { - $normalizedListener = [ - $expectedListener, - method_exists($expectedListener, 'handle') ? 'handle' : '__invoke', - ]; - } - } - } - - if ($actualListener === $normalizedListener || - ($actualListener instanceof Closure && - $normalizedListener === Closure::class)) { - PHPUnit::assertTrue(true); - - return; - } - } - - PHPUnit::assertTrue( - false, - sprintf( - 'Event [%s] does not have the [%s] listener attached to it', - $expectedEvent, - print_r($expectedListener, true) - ) - ); - } - - /** - * Assert if an event was dispatched based on a truth-test callback. - * - * @param string|\Closure $event - * @param callable|int|null $callback - * @return void - */ - public function assertDispatched($event, $callback = null) - { - if ($event instanceof Closure) { - [$event, $callback] = [$this->firstClosureParameterType($event), $event]; - } - - if (is_int($callback)) { - return $this->assertDispatchedTimes($event, $callback); - } - - PHPUnit::assertTrue( - $this->dispatched($event, $callback)->count() > 0, - "The expected [{$event}] event was not dispatched." - ); - } - - /** - * Assert if an event was dispatched a number of times. - * - * @param string $event - * @param int $times - * @return void - */ - public function assertDispatchedTimes($event, $times = 1) - { - $count = $this->dispatched($event)->count(); - - PHPUnit::assertSame( - $times, $count, - "The expected [{$event}] event was dispatched {$count} times instead of {$times} times." - ); - } - - /** - * Determine if an event was dispatched based on a truth-test callback. - * - * @param string|\Closure $event - * @param callable|null $callback - * @return void - */ - public function assertNotDispatched($event, $callback = null) - { - if ($event instanceof Closure) { - [$event, $callback] = [$this->firstClosureParameterType($event), $event]; - } - - PHPUnit::assertCount( - 0, $this->dispatched($event, $callback), - "The unexpected [{$event}] event was dispatched." - ); - } - - /** - * Assert that no events were dispatched. - * - * @return void - */ - public function assertNothingDispatched() - { - $count = count(Arr::flatten($this->events)); - - $eventNames = (new Collection($this->events)) - ->map(fn ($events, $eventName) => sprintf( - '%s dispatched %s %s', - $eventName, - count($events), - Str::plural('time', count($events)), - )) - ->join("\n- "); - - PHPUnit::assertSame( - 0, $count, - "{$count} unexpected events were dispatched:\n\n- $eventNames\n" - ); - } - - /** - * Get all of the events matching a truth-test callback. - * - * @param string $event - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function dispatched($event, $callback = null) - { - if (! $this->hasDispatched($event)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return (new Collection($this->events[$event]))->filter( - fn ($arguments) => $callback(...$arguments) - ); - } - - /** - * Determine if the given event has been dispatched. - * - * @param string $event - * @return bool - */ - public function hasDispatched($event) - { - return isset($this->events[$event]) && ! empty($this->events[$event]); - } - - /** - * Register an event listener with the dispatcher. - * - * @param \Closure|string|array $events - * @param mixed $listener - * @return void - */ - public function listen($events, $listener = null) - { - $this->dispatcher->listen($events, $listener); - } - - /** - * Determine if a given event has listeners. - * - * @param string $eventName - * @return bool - */ - public function hasListeners($eventName) - { - return $this->dispatcher->hasListeners($eventName); - } - - /** - * Register an event and payload to be dispatched later. - * - * @param string $event - * @param array $payload - * @return void - */ - public function push($event, $payload = []) - { - // - } - - /** - * Register an event subscriber with the dispatcher. - * - * @param object|string $subscriber - * @return void - */ - public function subscribe($subscriber) - { - $this->dispatcher->subscribe($subscriber); - } - - /** - * Flush a set of pushed events. - * - * @param string $event - * @return void - */ - public function flush($event) - { - // - } - - /** - * Fire an event and call the listeners. - * - * @param string|object $event - * @param mixed $payload - * @param bool $halt - * @return array|null - */ - public function dispatch($event, $payload = [], $halt = false) - { - $name = is_object($event) ? get_class($event) : (string) $event; - - if ($this->shouldFakeEvent($name, $payload)) { - $this->fakeEvent($event, $name, func_get_args()); - } else { - return $this->dispatcher->dispatch($event, $payload, $halt); - } - } - - /** - * Determine if an event should be faked or actually dispatched. - * - * @param string $eventName - * @param mixed $payload - * @return bool - */ - protected function shouldFakeEvent($eventName, $payload) - { - if ($this->shouldDispatchEvent($eventName, $payload)) { - return false; - } - - if (empty($this->eventsToFake)) { - return true; - } - - return (new Collection($this->eventsToFake)) - ->filter(function ($event) use ($eventName, $payload) { - return $event instanceof Closure - ? $event($eventName, $payload) - : $event === $eventName; - }) - ->isNotEmpty(); - } - - /** - * Push the event onto the fake events array immediately or after the next database transaction. - * - * @param string|object $event - * @param string $name - * @param array $arguments - * @return void - */ - protected function fakeEvent($event, $name, $arguments) - { - if ($event instanceof ShouldDispatchAfterCommit && Container::getInstance()->bound('db.transactions')) { - return Container::getInstance()->make('db.transactions') - ->addCallback(fn () => $this->events[$name][] = $arguments); - } - - $this->events[$name][] = $arguments; - } - - /** - * Determine whether an event should be dispatched or not. - * - * @param string $eventName - * @param mixed $payload - * @return bool - */ - protected function shouldDispatchEvent($eventName, $payload) - { - if (empty($this->eventsToDispatch)) { - return false; - } - - return (new Collection($this->eventsToDispatch)) - ->filter(function ($event) use ($eventName, $payload) { - return $event instanceof Closure - ? $event($eventName, $payload) - : $event === $eventName; - }) - ->isNotEmpty(); - } - - /** - * Remove a set of listeners from the dispatcher. - * - * @param string $event - * @return void - */ - public function forget($event) - { - // - } - - /** - * Forget all of the queued listeners. - * - * @return void - */ - public function forgetPushed() - { - // - } - - /** - * Dispatch an event and call the listeners. - * - * @param string|object $event - * @param mixed $payload - * @return mixed - */ - public function until($event, $payload = []) - { - return $this->dispatch($event, $payload, true); - } - - /** - * Get the events that have been dispatched. - * - * @return array - */ - public function dispatchedEvents() - { - return $this->events; - } - - /** - * Handle dynamic method calls to the dispatcher. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->forwardCallTo($this->dispatcher, $method, $parameters); - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/ExceptionHandlerFake.php b/vendor/illuminate/support/Testing/Fakes/ExceptionHandlerFake.php deleted file mode 100644 index f70af6d..0000000 --- a/vendor/illuminate/support/Testing/Fakes/ExceptionHandlerFake.php +++ /dev/null @@ -1,276 +0,0 @@ - - */ - protected $reported = []; - - /** - * If the fake should throw exceptions when they are reported. - * - * @var bool - */ - protected $throwOnReport = false; - - /** - * Create a new exception handler fake. - * - * @param \Illuminate\Contracts\Debug\ExceptionHandler $handler - * @param list> $exceptions - * @return void - */ - public function __construct( - protected ExceptionHandler $handler, - protected array $exceptions = [], - ) { - // - } - - /** - * Get the underlying handler implementation. - * - * @return \Illuminate\Contracts\Debug\ExceptionHandler - */ - public function handler() - { - return $this->handler; - } - - /** - * Assert if an exception of the given type has been reported. - * - * @param (\Closure(\Throwable): bool)|class-string<\Throwable> $exception - * @return void - */ - public function assertReported(Closure|string $exception) - { - $message = sprintf( - 'The expected [%s] exception was not reported.', - is_string($exception) ? $exception : $this->firstClosureParameterType($exception) - ); - - if (is_string($exception)) { - Assert::assertTrue( - in_array($exception, array_map('get_class', $this->reported), true), - $message, - ); - - return; - } - - Assert::assertTrue( - (new Collection($this->reported))->contains( - fn (Throwable $e) => $this->firstClosureParameterType($exception) === get_class($e) - && $exception($e) === true, - ), $message, - ); - } - - /** - * Assert the number of exceptions that have been reported. - * - * @param int $count - * @return void - */ - public function assertReportedCount(int $count) - { - $total = (new Collection($this->reported))->count(); - - PHPUnit::assertSame( - $count, $total, - "The total number of exceptions reported was {$total} instead of {$count}." - ); - } - - /** - * Assert if an exception of the given type has not been reported. - * - * @param (\Closure(\Throwable): bool)|class-string<\Throwable> $exception - * @return void - */ - public function assertNotReported(Closure|string $exception) - { - try { - $this->assertReported($exception); - } catch (ExpectationFailedException $e) { - return; - } - - throw new ExpectationFailedException(sprintf( - 'The expected [%s] exception was reported.', - is_string($exception) ? $exception : $this->firstClosureParameterType($exception) - )); - } - - /** - * Assert nothing has been reported. - * - * @return void - */ - public function assertNothingReported() - { - Assert::assertEmpty( - $this->reported, - sprintf( - 'The following exceptions were reported: %s.', - implode(', ', array_map('get_class', $this->reported)), - ), - ); - } - - /** - * Report or log an exception. - * - * @param \Throwable $e - * @return void - */ - public function report($e) - { - if (! $this->isFakedException($e)) { - $this->handler->report($e); - - return; - } - - if (! $this->shouldReport($e)) { - return; - } - - $this->reported[] = $e; - - if ($this->throwOnReport) { - throw $e; - } - } - - /** - * Determine if the given exception is faked. - * - * @param \Throwable $e - * @return bool - */ - protected function isFakedException(Throwable $e) - { - return count($this->exceptions) === 0 || in_array(get_class($e), $this->exceptions, true); - } - - /** - * Determine if the exception should be reported. - * - * @param \Throwable $e - * @return bool - */ - public function shouldReport($e) - { - return $this->runningWithoutExceptionHandling() || $this->handler->shouldReport($e); - } - - /** - * Determine if the handler is running without exception handling. - * - * @return bool - */ - protected function runningWithoutExceptionHandling() - { - return $this->handler instanceof WithoutExceptionHandlingHandler; - } - - /** - * Render an exception into an HTTP response. - * - * @param \Illuminate\Http\Request $request - * @param \Throwable $e - * @return \Symfony\Component\HttpFoundation\Response - */ - public function render($request, $e) - { - return $this->handler->render($request, $e); - } - - /** - * Render an exception to the console. - * - * @param \Symfony\Component\Console\Output\OutputInterface $output - * @param \Throwable $e - * @return void - */ - public function renderForConsole($output, Throwable $e) - { - $this->handler->renderForConsole($output, $e); - } - - /** - * Throw exceptions when they are reported. - * - * @return $this - */ - public function throwOnReport() - { - $this->throwOnReport = true; - - return $this; - } - - /** - * Throw the first reported exception. - * - * @return $this - * - * @throws \Throwable - */ - public function throwFirstReported() - { - foreach ($this->reported as $e) { - throw $e; - } - - return $this; - } - - /** - * Set the "original" handler that should be used by the fake. - * - * @param \Illuminate\Contracts\Debug\ExceptionHandler $handler - * @return $this - */ - public function setHandler(ExceptionHandler $handler) - { - $this->handler = $handler; - - return $this; - } - - /** - * Handle dynamic method calls to the handler. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call(string $method, array $parameters) - { - return $this->forwardCallTo($this->handler, $method, $parameters); - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/Fake.php b/vendor/illuminate/support/Testing/Fakes/Fake.php deleted file mode 100644 index 4a243c4..0000000 --- a/vendor/illuminate/support/Testing/Fakes/Fake.php +++ /dev/null @@ -1,8 +0,0 @@ -manager = $manager; - } - - /** - * Assert if a mailable was sent based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|array|string|int|null $callback - * @return void - */ - public function assertSent($mailable, $callback = null) - { - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - if (is_numeric($callback)) { - return $this->assertSentTimes($mailable, $callback); - } - - $suggestion = count($this->queuedMailables) ? ' Did you mean to use assertQueued() instead?' : ''; - - if (is_array($callback) || is_string($callback)) { - foreach (Arr::wrap($callback) as $address) { - $callback = fn ($mail) => $mail->hasTo($address); - - PHPUnit::assertTrue( - $this->sent($mailable, $callback)->count() > 0, - "The expected [{$mailable}] mailable was not sent to address [{$address}].".$suggestion - ); - } - - return; - } - - PHPUnit::assertTrue( - $this->sent($mailable, $callback)->count() > 0, - "The expected [{$mailable}] mailable was not sent.".$suggestion - ); - } - - /** - * Assert if a mailable was sent a number of times. - * - * @param string $mailable - * @param int $times - * @return void - */ - protected function assertSentTimes($mailable, $times = 1) - { - $count = $this->sent($mailable)->count(); - - PHPUnit::assertSame( - $times, $count, - "The expected [{$mailable}] mailable was sent {$count} times instead of {$times} times." - ); - } - - /** - * Determine if a mailable was not sent or queued to be sent based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return void - */ - public function assertNotOutgoing($mailable, $callback = null) - { - $this->assertNotSent($mailable, $callback); - $this->assertNotQueued($mailable, $callback); - } - - /** - * Determine if a mailable was not sent based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|array|string|null $callback - * @return void - */ - public function assertNotSent($mailable, $callback = null) - { - if (is_string($callback) || is_array($callback)) { - foreach (Arr::wrap($callback) as $address) { - $callback = fn ($mail) => $mail->hasTo($address); - - PHPUnit::assertCount( - 0, $this->sent($mailable, $callback), - "The unexpected [{$mailable}] mailable was sent to address [{$address}]." - ); - } - - return; - } - - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - PHPUnit::assertCount( - 0, $this->sent($mailable, $callback), - "The unexpected [{$mailable}] mailable was sent." - ); - } - - /** - * Assert that no mailables were sent or queued to be sent. - * - * @return void - */ - public function assertNothingOutgoing() - { - $this->assertNothingSent(); - $this->assertNothingQueued(); - } - - /** - * Assert that no mailables were sent. - * - * @return void - */ - public function assertNothingSent() - { - $mailableNames = (new Collection($this->mailables))->map( - fn ($mailable) => get_class($mailable) - )->join("\n- "); - - PHPUnit::assertEmpty($this->mailables, "The following mailables were sent unexpectedly:\n\n- $mailableNames\n"); - } - - /** - * Assert if a mailable was queued based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|array|string|int|null $callback - * @return void - */ - public function assertQueued($mailable, $callback = null) - { - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - if (is_numeric($callback)) { - return $this->assertQueuedTimes($mailable, $callback); - } - - if (is_string($callback) || is_array($callback)) { - foreach (Arr::wrap($callback) as $address) { - $callback = fn ($mail) => $mail->hasTo($address); - - PHPUnit::assertTrue( - $this->queued($mailable, $callback)->count() > 0, - "The expected [{$mailable}] mailable was not queued to address [{$address}]." - ); - } - - return; - } - - PHPUnit::assertTrue( - $this->queued($mailable, $callback)->count() > 0, - "The expected [{$mailable}] mailable was not queued." - ); - } - - /** - * Assert if a mailable was queued a number of times. - * - * @param string $mailable - * @param int $times - * @return void - */ - protected function assertQueuedTimes($mailable, $times = 1) - { - $count = $this->queued($mailable)->count(); - - PHPUnit::assertSame( - $times, $count, - "The expected [{$mailable}] mailable was queued {$count} times instead of {$times} times." - ); - } - - /** - * Determine if a mailable was not queued based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|array|string|null $callback - * @return void - */ - public function assertNotQueued($mailable, $callback = null) - { - if (is_string($callback) || is_array($callback)) { - foreach (Arr::wrap($callback) as $address) { - $callback = fn ($mail) => $mail->hasTo($address); - - PHPUnit::assertCount( - 0, $this->queued($mailable, $callback), - "The unexpected [{$mailable}] mailable was queued to address [{$address}]." - ); - } - - return; - } - - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - PHPUnit::assertCount( - 0, $this->queued($mailable, $callback), - "The unexpected [{$mailable}] mailable was queued." - ); - } - - /** - * Assert that no mailables were queued. - * - * @return void - */ - public function assertNothingQueued() - { - $mailableNames = (new Collection($this->queuedMailables))->map( - fn ($mailable) => get_class($mailable) - )->join("\n- "); - - PHPUnit::assertEmpty($this->queuedMailables, "The following mailables were queued unexpectedly:\n\n- $mailableNames\n"); - } - - /** - * Assert the total number of mailables that were sent. - * - * @param int $count - * @return void - */ - public function assertSentCount($count) - { - $total = (new Collection($this->mailables))->count(); - - PHPUnit::assertSame( - $count, $total, - "The total number of mailables sent was {$total} instead of {$count}." - ); - } - - /** - * Assert the total number of mailables that were queued. - * - * @param int $count - * @return void - */ - public function assertQueuedCount($count) - { - $total = (new Collection($this->queuedMailables))->count(); - - PHPUnit::assertSame( - $count, $total, - "The total number of mailables queued was {$total} instead of {$count}." - ); - } - - /** - * Assert the total number of mailables that were sent or queued. - * - * @param int $count - * @return void - */ - public function assertOutgoingCount($count) - { - $total = (new Collection($this->mailables)) - ->concat($this->queuedMailables) - ->count(); - - PHPUnit::assertSame( - $count, $total, - "The total number of outgoing mailables was {$total} instead of {$count}." - ); - } - - /** - * Get all of the mailables matching a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function sent($mailable, $callback = null) - { - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - if (! $this->hasSent($mailable)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return $this->mailablesOf($mailable)->filter(fn ($mailable) => $callback($mailable)); - } - - /** - * Determine if the given mailable has been sent. - * - * @param string $mailable - * @return bool - */ - public function hasSent($mailable) - { - return $this->mailablesOf($mailable)->count() > 0; - } - - /** - * Get all of the queued mailables matching a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function queued($mailable, $callback = null) - { - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - if (! $this->hasQueued($mailable)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return $this->queuedMailablesOf($mailable)->filter(fn ($mailable) => $callback($mailable)); - } - - /** - * Determine if the given mailable has been queued. - * - * @param string $mailable - * @return bool - */ - public function hasQueued($mailable) - { - return $this->queuedMailablesOf($mailable)->count() > 0; - } - - /** - * Get all of the mailed mailables for a given type. - * - * @param string $type - * @return \Illuminate\Support\Collection - */ - protected function mailablesOf($type) - { - return (new Collection($this->mailables))->filter(fn ($mailable) => $mailable instanceof $type); - } - - /** - * Get all of the mailed mailables for a given type. - * - * @param string $type - * @return \Illuminate\Support\Collection - */ - protected function queuedMailablesOf($type) - { - return (new Collection($this->queuedMailables))->filter(fn ($mailable) => $mailable instanceof $type); - } - - /** - * Get a mailer instance by name. - * - * @param string|null $name - * @return \Illuminate\Contracts\Mail\Mailer - */ - public function mailer($name = null) - { - $this->currentMailer = $name; - - return $this; - } - - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - */ - public function to($users) - { - return (new PendingMailFake($this))->to($users); - } - - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - */ - public function cc($users) - { - return (new PendingMailFake($this))->cc($users); - } - - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - */ - public function bcc($users) - { - return (new PendingMailFake($this))->bcc($users); - } - - /** - * Send a new message with only a raw text part. - * - * @param string $text - * @param \Closure|string $callback - * @return void - */ - public function raw($text, $callback) - { - // - } - - /** - * Send a new message using a view. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param array $data - * @param \Closure|string|null $callback - * @return mixed|void - */ - public function send($view, array $data = [], $callback = null) - { - return $this->sendMail($view, $view instanceof ShouldQueue); - } - - /** - * Send a new message synchronously using a view. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $mailable - * @param array $data - * @param \Closure|string|null $callback - * @return void - */ - public function sendNow($mailable, array $data = [], $callback = null) - { - $this->sendMail($mailable, shouldQueue: false); - } - - /** - * Send a new message using a view. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param bool $shouldQueue - * @return mixed|void - */ - protected function sendMail($view, $shouldQueue = false) - { - if (! $view instanceof Mailable) { - return; - } - - $view->mailer($this->currentMailer); - - if ($shouldQueue) { - return $this->queue($view); - } - - $this->currentMailer = null; - - $this->mailables[] = $view; - } - - /** - * Queue a new message for sending. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param string|null $queue - * @return mixed - */ - public function queue($view, $queue = null) - { - if (! $view instanceof Mailable) { - return; - } - - $view->mailer($this->currentMailer); - - $this->currentMailer = null; - - $this->queuedMailables[] = $view; - } - - /** - * Queue a new e-mail message for sending after (n) seconds. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param string|null $queue - * @return mixed - */ - public function later($delay, $view, $queue = null) - { - $this->queue($view, $queue); - } - - /** - * Infer mailable class using reflection if a typehinted closure is passed to assertion. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return array - */ - protected function prepareMailableAndCallback($mailable, $callback) - { - if ($mailable instanceof Closure) { - return [$this->firstClosureParameterType($mailable), $mailable]; - } - - return [$mailable, $callback]; - } - - /** - * Forget all of the resolved mailer instances. - * - * @return $this - */ - public function forgetMailers() - { - $this->currentMailer = null; - - return $this; - } - - /** - * Handle dynamic method calls to the mailer. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->forwardCallTo($this->manager, $method, $parameters); - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/NotificationFake.php b/vendor/illuminate/support/Testing/Fakes/NotificationFake.php deleted file mode 100644 index bc3f16c..0000000 --- a/vendor/illuminate/support/Testing/Fakes/NotificationFake.php +++ /dev/null @@ -1,401 +0,0 @@ -assertSentTo(new AnonymousNotifiable, $notification, $callback); - } - - /** - * Assert if a notification was sent based on a truth-test callback. - * - * @param mixed $notifiable - * @param string|\Closure $notification - * @param callable|null $callback - * @return void - * - * @throws \Exception - */ - public function assertSentTo($notifiable, $notification, $callback = null) - { - if (is_array($notifiable) || $notifiable instanceof Collection) { - if (count($notifiable) === 0) { - throw new Exception('No notifiable given.'); - } - - foreach ($notifiable as $singleNotifiable) { - $this->assertSentTo($singleNotifiable, $notification, $callback); - } - - return; - } - - if ($notification instanceof Closure) { - [$notification, $callback] = [$this->firstClosureParameterType($notification), $notification]; - } - - if (is_numeric($callback)) { - return $this->assertSentToTimes($notifiable, $notification, $callback); - } - - PHPUnit::assertTrue( - $this->sent($notifiable, $notification, $callback)->count() > 0, - "The expected [{$notification}] notification was not sent." - ); - } - - /** - * Assert if a notification was sent on-demand a number of times. - * - * @param string $notification - * @param int $times - * @return void - */ - public function assertSentOnDemandTimes($notification, $times = 1) - { - $this->assertSentToTimes(new AnonymousNotifiable, $notification, $times); - } - - /** - * Assert if a notification was sent a number of times. - * - * @param mixed $notifiable - * @param string $notification - * @param int $times - * @return void - */ - public function assertSentToTimes($notifiable, $notification, $times = 1) - { - $count = $this->sent($notifiable, $notification)->count(); - - PHPUnit::assertSame( - $times, $count, - "Expected [{$notification}] to be sent {$times} times, but was sent {$count} times." - ); - } - - /** - * Determine if a notification was sent based on a truth-test callback. - * - * @param mixed $notifiable - * @param string|\Closure $notification - * @param callable|null $callback - * @return void - * - * @throws \Exception - */ - public function assertNotSentTo($notifiable, $notification, $callback = null) - { - if (is_array($notifiable) || $notifiable instanceof Collection) { - if (count($notifiable) === 0) { - throw new Exception('No notifiable given.'); - } - - foreach ($notifiable as $singleNotifiable) { - $this->assertNotSentTo($singleNotifiable, $notification, $callback); - } - - return; - } - - if ($notification instanceof Closure) { - [$notification, $callback] = [$this->firstClosureParameterType($notification), $notification]; - } - - PHPUnit::assertCount( - 0, $this->sent($notifiable, $notification, $callback), - "The unexpected [{$notification}] notification was sent." - ); - } - - /** - * Assert that no notifications were sent. - * - * @return void - */ - public function assertNothingSent() - { - $notificationNames = (new Collection($this->notifications)) - ->map(fn ($notifiableModels) => (new Collection($notifiableModels)) - ->map(fn ($notifiables) => (new Collection($notifiables))->keys()) - ) - ->flatten()->join("\n- "); - - PHPUnit::assertEmpty($this->notifications, "The following notifications were sent unexpectedly:\n\n- $notificationNames\n"); - } - - /** - * Assert that no notifications were sent to the given notifiable. - * - * @param mixed $notifiable - * @return void - * - * @throws \Exception - */ - public function assertNothingSentTo($notifiable) - { - if (is_array($notifiable) || $notifiable instanceof Collection) { - if (count($notifiable) === 0) { - throw new Exception('No notifiable given.'); - } - - foreach ($notifiable as $singleNotifiable) { - $this->assertNothingSentTo($singleNotifiable); - } - - return; - } - - PHPUnit::assertEmpty( - $this->notifications[get_class($notifiable)][$notifiable->getKey()] ?? [], - 'Notifications were sent unexpectedly.', - ); - } - - /** - * Assert the total amount of times a notification was sent. - * - * @param string $notification - * @param int $expectedCount - * @return void - */ - public function assertSentTimes($notification, $expectedCount) - { - $actualCount = (new Collection($this->notifications)) - ->flatten(1) - ->reduce(fn ($count, $sent) => $count + count($sent[$notification] ?? []), 0); - - PHPUnit::assertSame( - $expectedCount, $actualCount, - "Expected [{$notification}] to be sent {$expectedCount} times, but was sent {$actualCount} times." - ); - } - - /** - * Assert the total count of notification that were sent. - * - * @param int $expectedCount - * @return void - */ - public function assertCount($expectedCount) - { - $actualCount = (new Collection($this->notifications))->flatten(3)->count(); - - PHPUnit::assertSame( - $expectedCount, $actualCount, - "Expected {$expectedCount} notifications to be sent, but {$actualCount} were sent." - ); - } - - /** - * Get all of the notifications matching a truth-test callback. - * - * @param mixed $notifiable - * @param string $notification - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function sent($notifiable, $notification, $callback = null) - { - if (! $this->hasSent($notifiable, $notification)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - $notifications = new Collection($this->notificationsFor($notifiable, $notification)); - - return $notifications->filter( - fn ($arguments) => $callback(...array_values($arguments)) - )->pluck('notification'); - } - - /** - * Determine if there are more notifications left to inspect. - * - * @param mixed $notifiable - * @param string $notification - * @return bool - */ - public function hasSent($notifiable, $notification) - { - return ! empty($this->notificationsFor($notifiable, $notification)); - } - - /** - * Get all of the notifications for a notifiable entity by type. - * - * @param mixed $notifiable - * @param string $notification - * @return array - */ - protected function notificationsFor($notifiable, $notification) - { - return $this->notifications[get_class($notifiable)][$notifiable->getKey()][$notification] ?? []; - } - - /** - * Send the given notification to the given notifiable entities. - * - * @param \Illuminate\Support\Collection|array|mixed $notifiables - * @param mixed $notification - * @return void - */ - public function send($notifiables, $notification) - { - $this->sendNow($notifiables, $notification); - } - - /** - * Send the given notification immediately. - * - * @param \Illuminate\Support\Collection|array|mixed $notifiables - * @param mixed $notification - * @param array|null $channels - * @return void - */ - public function sendNow($notifiables, $notification, ?array $channels = null) - { - if (! $notifiables instanceof Collection && ! is_array($notifiables)) { - $notifiables = [$notifiables]; - } - - foreach ($notifiables as $notifiable) { - if (! $notification->id) { - $notification->id = Str::uuid()->toString(); - } - - $notifiableChannels = $channels ?: $notification->via($notifiable); - - if (method_exists($notification, 'shouldSend')) { - $notifiableChannels = array_filter( - $notifiableChannels, - fn ($channel) => $notification->shouldSend($notifiable, $channel) !== false - ); - } - - if (empty($notifiableChannels)) { - continue; - } - - $this->notifications[get_class($notifiable)][$notifiable->getKey()][get_class($notification)][] = [ - 'notification' => $this->serializeAndRestore && $notification instanceof ShouldQueue - ? $this->serializeAndRestoreNotification($notification) - : $notification, - 'channels' => $notifiableChannels, - 'notifiable' => $notifiable, - 'locale' => $notification->locale ?? $this->locale ?? value(function () use ($notifiable) { - if ($notifiable instanceof HasLocalePreference) { - return $notifiable->preferredLocale(); - } - }), - ]; - } - } - - /** - * Get a channel instance by name. - * - * @param string|null $name - * @return mixed - */ - public function channel($name = null) - { - // - } - - /** - * Set the locale of notifications. - * - * @param string $locale - * @return $this - */ - public function locale($locale) - { - $this->locale = $locale; - - return $this; - } - - /** - * Specify if notification should be serialized and restored when being "pushed" to the queue. - * - * @param bool $serializeAndRestore - * @return $this - */ - public function serializeAndRestore(bool $serializeAndRestore = true) - { - $this->serializeAndRestore = $serializeAndRestore; - - return $this; - } - - /** - * Serialize and unserialize the notification to simulate the queueing process. - * - * @param mixed $notification - * @return mixed - */ - protected function serializeAndRestoreNotification($notification) - { - return unserialize(serialize($notification)); - } - - /** - * Get the notifications that have been sent. - * - * @return array - */ - public function sentNotifications() - { - return $this->notifications; - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php b/vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php deleted file mode 100644 index 3d0f499..0000000 --- a/vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php +++ /dev/null @@ -1,49 +0,0 @@ -bus = $bus; - $this->jobs = $jobs; - } - - /** - * Dispatch the batch. - * - * @return \Illuminate\Bus\Batch - */ - public function dispatch() - { - return $this->bus->recordPendingBatch($this); - } - - /** - * Dispatch the batch after the response is sent to the browser. - * - * @return \Illuminate\Bus\Batch - */ - public function dispatchAfterResponse() - { - return $this->bus->recordPendingBatch($this); - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/PendingChainFake.php b/vendor/illuminate/support/Testing/Fakes/PendingChainFake.php deleted file mode 100644 index 533c649..0000000 --- a/vendor/illuminate/support/Testing/Fakes/PendingChainFake.php +++ /dev/null @@ -1,56 +0,0 @@ -bus = $bus; - $this->job = $job; - $this->chain = $chain; - } - - /** - * Dispatch the job with the given arguments. - * - * @return \Illuminate\Foundation\Bus\PendingDispatch - */ - public function dispatch() - { - if (is_string($this->job)) { - $firstJob = new $this->job(...func_get_args()); - } elseif ($this->job instanceof Closure) { - $firstJob = CallQueuedClosure::create($this->job); - } else { - $firstJob = $this->job; - } - - $firstJob->allOnConnection($this->connection); - $firstJob->allOnQueue($this->queue); - $firstJob->chain($this->chain); - $firstJob->delay($this->delay); - $firstJob->chainCatchCallbacks = $this->catchCallbacks(); - - return $this->bus->dispatch($firstJob); - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/PendingMailFake.php b/vendor/illuminate/support/Testing/Fakes/PendingMailFake.php deleted file mode 100644 index 37c797d..0000000 --- a/vendor/illuminate/support/Testing/Fakes/PendingMailFake.php +++ /dev/null @@ -1,53 +0,0 @@ -mailer = $mailer; - } - - /** - * Send a new mailable message instance. - * - * @param \Illuminate\Contracts\Mail\Mailable $mailable - * @return void - */ - public function send(Mailable $mailable) - { - $this->mailer->send($this->fill($mailable)); - } - - /** - * Send a new mailable message instance synchronously. - * - * @param \Illuminate\Contracts\Mail\Mailable $mailable - * @return void - */ - public function sendNow(Mailable $mailable) - { - $this->mailer->sendNow($this->fill($mailable)); - } - - /** - * Push the given mailable onto the queue. - * - * @param \Illuminate\Contracts\Mail\Mailable $mailable - * @return mixed - */ - public function queue(Mailable $mailable) - { - return $this->mailer->queue($this->fill($mailable)); - } -} diff --git a/vendor/illuminate/support/Testing/Fakes/QueueFake.php b/vendor/illuminate/support/Testing/Fakes/QueueFake.php deleted file mode 100644 index 7772666..0000000 --- a/vendor/illuminate/support/Testing/Fakes/QueueFake.php +++ /dev/null @@ -1,616 +0,0 @@ -} - */ -class QueueFake extends QueueManager implements Fake, Queue -{ - use ReflectsClosures; - - /** - * The original queue manager. - * - * @var \Illuminate\Contracts\Queue\Queue - */ - public $queue; - - /** - * The job types that should be intercepted instead of pushed to the queue. - * - * @var \Illuminate\Support\Collection - */ - protected $jobsToFake; - - /** - * The job types that should be pushed to the queue and not intercepted. - * - * @var \Illuminate\Support\Collection - */ - protected $jobsToBeQueued; - - /** - * All of the jobs that have been pushed. - * - * @var array - */ - protected $jobs = []; - - /** - * All of the payloads that have been raw pushed. - * - * @var list - */ - protected $rawPushes = []; - - /** - * Indicates if items should be serialized and restored when pushed to the queue. - * - * @var bool - */ - protected bool $serializeAndRestore = false; - - /** - * Create a new fake queue instance. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @param array $jobsToFake - * @param \Illuminate\Queue\QueueManager|null $queue - * @return void - */ - public function __construct($app, $jobsToFake = [], $queue = null) - { - parent::__construct($app); - - $this->jobsToFake = Collection::wrap($jobsToFake); - $this->jobsToBeQueued = new Collection; - $this->queue = $queue; - } - - /** - * Specify the jobs that should be queued instead of faked. - * - * @param array|string $jobsToBeQueued - * @return $this - */ - public function except($jobsToBeQueued) - { - $this->jobsToBeQueued = Collection::wrap($jobsToBeQueued)->merge($this->jobsToBeQueued); - - return $this; - } - - /** - * Assert if a job was pushed based on a truth-test callback. - * - * @param string|\Closure $job - * @param callable|int|null $callback - * @return void - */ - public function assertPushed($job, $callback = null) - { - if ($job instanceof Closure) { - [$job, $callback] = [$this->firstClosureParameterType($job), $job]; - } - - if (is_numeric($callback)) { - return $this->assertPushedTimes($job, $callback); - } - - PHPUnit::assertTrue( - $this->pushed($job, $callback)->count() > 0, - "The expected [{$job}] job was not pushed." - ); - } - - /** - * Assert if a job was pushed a number of times. - * - * @param string $job - * @param int $times - * @return void - */ - protected function assertPushedTimes($job, $times = 1) - { - $count = $this->pushed($job)->count(); - - PHPUnit::assertSame( - $times, $count, - "The expected [{$job}] job was pushed {$count} times instead of {$times} times." - ); - } - - /** - * Assert if a job was pushed based on a truth-test callback. - * - * @param string $queue - * @param string|\Closure $job - * @param callable|null $callback - * @return void - */ - public function assertPushedOn($queue, $job, $callback = null) - { - if ($job instanceof Closure) { - [$job, $callback] = [$this->firstClosureParameterType($job), $job]; - } - - $this->assertPushed($job, function ($job, $pushedQueue) use ($callback, $queue) { - if ($pushedQueue !== $queue) { - return false; - } - - return $callback ? $callback(...func_get_args()) : true; - }); - } - - /** - * Assert if a job was pushed with chained jobs based on a truth-test callback. - * - * @param string $job - * @param array $expectedChain - * @param callable|null $callback - * @return void - */ - public function assertPushedWithChain($job, $expectedChain = [], $callback = null) - { - PHPUnit::assertTrue( - $this->pushed($job, $callback)->isNotEmpty(), - "The expected [{$job}] job was not pushed." - ); - - PHPUnit::assertTrue( - (new Collection($expectedChain))->isNotEmpty(), - 'The expected chain can not be empty.' - ); - - $this->isChainOfObjects($expectedChain) - ? $this->assertPushedWithChainOfObjects($job, $expectedChain, $callback) - : $this->assertPushedWithChainOfClasses($job, $expectedChain, $callback); - } - - /** - * Assert if a job was pushed with an empty chain based on a truth-test callback. - * - * @param string $job - * @param callable|null $callback - * @return void - */ - public function assertPushedWithoutChain($job, $callback = null) - { - PHPUnit::assertTrue( - $this->pushed($job, $callback)->isNotEmpty(), - "The expected [{$job}] job was not pushed." - ); - - $this->assertPushedWithChainOfClasses($job, [], $callback); - } - - /** - * Assert if a job was pushed with chained jobs based on a truth-test callback. - * - * @param string $job - * @param array $expectedChain - * @param callable|null $callback - * @return void - */ - protected function assertPushedWithChainOfObjects($job, $expectedChain, $callback) - { - $chain = (new Collection($expectedChain))->map(fn ($job) => serialize($job))->all(); - - PHPUnit::assertTrue( - $this->pushed($job, $callback)->filter(fn ($job) => $job->chained == $chain)->isNotEmpty(), - 'The expected chain was not pushed.' - ); - } - - /** - * Assert if a job was pushed with chained jobs based on a truth-test callback. - * - * @param string $job - * @param array $expectedChain - * @param callable|null $callback - * @return void - */ - protected function assertPushedWithChainOfClasses($job, $expectedChain, $callback) - { - $matching = $this->pushed($job, $callback)->map->chained->map(function ($chain) { - return (new Collection($chain))->map(function ($job) { - return get_class(unserialize($job)); - }); - })->filter(function ($chain) use ($expectedChain) { - return $chain->all() === $expectedChain; - }); - - PHPUnit::assertTrue( - $matching->isNotEmpty(), 'The expected chain was not pushed.' - ); - } - - /** - * Assert if a closure was pushed based on a truth-test callback. - * - * @param callable|int|null $callback - * @return void - */ - public function assertClosurePushed($callback = null) - { - $this->assertPushed(CallQueuedClosure::class, $callback); - } - - /** - * Assert that a closure was not pushed based on a truth-test callback. - * - * @param callable|null $callback - * @return void - */ - public function assertClosureNotPushed($callback = null) - { - $this->assertNotPushed(CallQueuedClosure::class, $callback); - } - - /** - * Determine if the given chain is entirely composed of objects. - * - * @param array $chain - * @return bool - */ - protected function isChainOfObjects($chain) - { - return ! (new Collection($chain))->contains(fn ($job) => ! is_object($job)); - } - - /** - * Determine if a job was pushed based on a truth-test callback. - * - * @param string|\Closure $job - * @param callable|null $callback - * @return void - */ - public function assertNotPushed($job, $callback = null) - { - if ($job instanceof Closure) { - [$job, $callback] = [$this->firstClosureParameterType($job), $job]; - } - - PHPUnit::assertCount( - 0, $this->pushed($job, $callback), - "The unexpected [{$job}] job was pushed." - ); - } - - /** - * Assert the total count of jobs that were pushed. - * - * @param int $expectedCount - * @return void - */ - public function assertCount($expectedCount) - { - $actualCount = (new Collection($this->jobs))->flatten(1)->count(); - - PHPUnit::assertSame( - $expectedCount, $actualCount, - "Expected {$expectedCount} jobs to be pushed, but found {$actualCount} instead." - ); - } - - /** - * Assert that no jobs were pushed. - * - * @return void - */ - public function assertNothingPushed() - { - $pushedJobs = implode("\n- ", array_keys($this->jobs)); - - PHPUnit::assertEmpty($this->jobs, "The following jobs were pushed unexpectedly:\n\n- $pushedJobs\n"); - } - - /** - * Get all of the jobs matching a truth-test callback. - * - * @param string $job - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function pushed($job, $callback = null) - { - if (! $this->hasPushed($job)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return (new Collection($this->jobs[$job]))->filter( - fn ($data) => $callback($data['job'], $data['queue'], $data['data']) - )->pluck('job'); - } - - /** - * Get all of the raw pushes matching a truth-test callback. - * - * @param null|\Closure(string, ?string, array): bool $callback - * @return \Illuminate\Support\Collection - */ - public function pushedRaw($callback = null) - { - $callback ??= static fn () => true; - - return (new Collection($this->rawPushes))->filter(fn ($data) => $callback($data['payload'], $data['queue'], $data['options'])); - } - - /** - * Determine if there are any stored jobs for a given class. - * - * @param string $job - * @return bool - */ - public function hasPushed($job) - { - return isset($this->jobs[$job]) && ! empty($this->jobs[$job]); - } - - /** - * Resolve a queue connection instance. - * - * @param mixed $value - * @return \Illuminate\Contracts\Queue\Queue - */ - public function connection($value = null) - { - return $this; - } - - /** - * Get the size of the queue. - * - * @param string|null $queue - * @return int - */ - public function size($queue = null) - { - return (new Collection($this->jobs))->flatten(1)->filter( - fn ($job) => $job['queue'] === $queue - )->count(); - } - - /** - * Push a new job onto the queue. - * - * @param string|object $job - * @param mixed $data - * @param string|null $queue - * @return mixed - */ - public function push($job, $data = '', $queue = null) - { - if ($this->shouldFakeJob($job)) { - if ($job instanceof Closure) { - $job = CallQueuedClosure::create($job); - } - - $this->jobs[is_object($job) ? get_class($job) : $job][] = [ - 'job' => $this->serializeAndRestore ? $this->serializeAndRestoreJob($job) : $job, - 'queue' => $queue, - 'data' => $data, - ]; - } else { - is_object($job) && isset($job->connection) - ? $this->queue->connection($job->connection)->push($job, $data, $queue) - : $this->queue->push($job, $data, $queue); - } - } - - /** - * Determine if a job should be faked or actually dispatched. - * - * @param object $job - * @return bool - */ - public function shouldFakeJob($job) - { - if ($this->shouldDispatchJob($job)) { - return false; - } - - if ($this->jobsToFake->isEmpty()) { - return true; - } - - return $this->jobsToFake->contains( - fn ($jobToFake) => $job instanceof ((string) $jobToFake) || $job === (string) $jobToFake - ); - } - - /** - * Determine if a job should be pushed to the queue instead of faked. - * - * @param object $job - * @return bool - */ - protected function shouldDispatchJob($job) - { - if ($this->jobsToBeQueued->isEmpty()) { - return false; - } - - return $this->jobsToBeQueued->contains( - fn ($jobToQueue) => $job instanceof ((string) $jobToQueue) - ); - } - - /** - * Push a raw payload onto the queue. - * - * @param string $payload - * @param string|null $queue - * @param array $options - * @return mixed - */ - public function pushRaw($payload, $queue = null, array $options = []) - { - $this->rawPushes[] = [ - 'payload' => $payload, - 'queue' => $queue, - 'options' => $options, - ]; - } - - /** - * Push a new job onto the queue after (n) seconds. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @param string|object $job - * @param mixed $data - * @param string|null $queue - * @return mixed - */ - public function later($delay, $job, $data = '', $queue = null) - { - return $this->push($job, $data, $queue); - } - - /** - * Push a new job onto the queue. - * - * @param string $queue - * @param string|object $job - * @param mixed $data - * @return mixed - */ - public function pushOn($queue, $job, $data = '') - { - return $this->push($job, $data, $queue); - } - - /** - * Push a new job onto a specific queue after (n) seconds. - * - * @param string $queue - * @param \DateTimeInterface|\DateInterval|int $delay - * @param string|object $job - * @param mixed $data - * @return mixed - */ - public function laterOn($queue, $delay, $job, $data = '') - { - return $this->push($job, $data, $queue); - } - - /** - * Pop the next job off of the queue. - * - * @param string|null $queue - * @return \Illuminate\Contracts\Queue\Job|null - */ - public function pop($queue = null) - { - // - } - - /** - * Push an array of jobs onto the queue. - * - * @param array $jobs - * @param mixed $data - * @param string|null $queue - * @return mixed - */ - public function bulk($jobs, $data = '', $queue = null) - { - foreach ($jobs as $job) { - $this->push($job, $data, $queue); - } - } - - /** - * Get the jobs that have been pushed. - * - * @return array - */ - public function pushedJobs() - { - return $this->jobs; - } - - /** - * Get the payloads that were pushed raw. - * - * @return list - */ - public function rawPushes() - { - return $this->rawPushes; - } - - /** - * Specify if jobs should be serialized and restored when being "pushed" to the queue. - * - * @param bool $serializeAndRestore - * @return $this - */ - public function serializeAndRestore(bool $serializeAndRestore = true) - { - $this->serializeAndRestore = $serializeAndRestore; - - return $this; - } - - /** - * Serialize and unserialize the job to simulate the queueing process. - * - * @param mixed $job - * @return mixed - */ - protected function serializeAndRestoreJob($job) - { - return unserialize(serialize($job)); - } - - /** - * Get the connection name for the queue. - * - * @return string - */ - public function getConnectionName() - { - // - } - - /** - * Set the connection name for the queue. - * - * @param string $name - * @return $this - */ - public function setConnectionName($name) - { - return $this; - } - - /** - * Override the QueueManager to prevent circular dependency. - * - * @param string $method - * @param array $parameters - * @return mixed - * - * @throws \BadMethodCallException - */ - public function __call($method, $parameters) - { - throw new BadMethodCallException(sprintf( - 'Call to undefined method %s::%s()', static::class, $method - )); - } -} diff --git a/vendor/illuminate/support/Timebox.php b/vendor/illuminate/support/Timebox.php deleted file mode 100644 index 586a575..0000000 --- a/vendor/illuminate/support/Timebox.php +++ /dev/null @@ -1,86 +0,0 @@ -earlyReturn && $remainder > 0) { - $this->usleep($remainder); - } - - if ($exception) { - throw $exception; - } - - return $result; - } - - /** - * Indicate that the timebox can return early. - * - * @return $this - */ - public function returnEarly() - { - $this->earlyReturn = true; - - return $this; - } - - /** - * Indicate that the timebox cannot return early. - * - * @return $this - */ - public function dontReturnEarly() - { - $this->earlyReturn = false; - - return $this; - } - - /** - * Sleep for the specified number of microseconds. - * - * @param int $microseconds - * @return void - */ - protected function usleep(int $microseconds) - { - Sleep::usleep($microseconds); - } -} diff --git a/vendor/illuminate/support/Traits/CapsuleManagerTrait.php b/vendor/illuminate/support/Traits/CapsuleManagerTrait.php deleted file mode 100644 index 0532755..0000000 --- a/vendor/illuminate/support/Traits/CapsuleManagerTrait.php +++ /dev/null @@ -1,69 +0,0 @@ -container = $container; - - if (! $this->container->bound('config')) { - $this->container->instance('config', new Fluent); - } - } - - /** - * Make this capsule instance available globally. - * - * @return void - */ - public function setAsGlobal() - { - static::$instance = $this; - } - - /** - * Get the IoC container instance. - * - * @return \Illuminate\Contracts\Container\Container - */ - public function getContainer() - { - return $this->container; - } - - /** - * Set the IoC container instance. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return void - */ - public function setContainer(Container $container) - { - $this->container = $container; - } -} diff --git a/vendor/illuminate/support/Traits/Dumpable.php b/vendor/illuminate/support/Traits/Dumpable.php deleted file mode 100644 index 44ad14d..0000000 --- a/vendor/illuminate/support/Traits/Dumpable.php +++ /dev/null @@ -1,30 +0,0 @@ -{$method}(...$parameters); - } catch (Error|BadMethodCallException $e) { - $pattern = '~^Call to undefined method (?P[^:]+)::(?P[^\(]+)\(\)$~'; - - if (! preg_match($pattern, $e->getMessage(), $matches)) { - throw $e; - } - - if ($matches['class'] != get_class($object) || - $matches['method'] != $method) { - throw $e; - } - - static::throwBadMethodCallException($method); - } - } - - /** - * Forward a method call to the given object, returning $this if the forwarded call returned itself. - * - * @param mixed $object - * @param string $method - * @param array $parameters - * @return mixed - * - * @throws \BadMethodCallException - */ - protected function forwardDecoratedCallTo($object, $method, $parameters) - { - $result = $this->forwardCallTo($object, $method, $parameters); - - return $result === $object ? $this : $result; - } - - /** - * Throw a bad method call exception for the given method. - * - * @param string $method - * @return never - * - * @throws \BadMethodCallException - */ - protected static function throwBadMethodCallException($method) - { - throw new BadMethodCallException(sprintf( - 'Call to undefined method %s::%s()', static::class, $method - )); - } -} diff --git a/vendor/illuminate/support/Traits/InteractsWithData.php b/vendor/illuminate/support/Traits/InteractsWithData.php deleted file mode 100644 index 722478e..0000000 --- a/vendor/illuminate/support/Traits/InteractsWithData.php +++ /dev/null @@ -1,420 +0,0 @@ -has($key); - } - - /** - * Determine if the data contains a given key. - * - * @param string|array $key - * @return bool - */ - public function has($key) - { - $keys = is_array($key) ? $key : func_get_args(); - - $data = $this->all(); - - foreach ($keys as $value) { - if (! Arr::has($data, $value)) { - return false; - } - } - - return true; - } - - /** - * Determine if the instance contains any of the given keys. - * - * @param string|array $keys - * @return bool - */ - public function hasAny($keys) - { - $keys = is_array($keys) ? $keys : func_get_args(); - - $data = $this->all(); - - return Arr::hasAny($data, $keys); - } - - /** - * Apply the callback if the instance contains the given key. - * - * @param string $key - * @param callable $callback - * @param callable|null $default - * @return $this|mixed - */ - public function whenHas($key, callable $callback, ?callable $default = null) - { - if ($this->has($key)) { - return $callback(data_get($this->all(), $key)) ?: $this; - } - - if ($default) { - return $default(); - } - - return $this; - } - - /** - * Determine if the instance contains a non-empty value for the given key. - * - * @param string|array $key - * @return bool - */ - public function filled($key) - { - $keys = is_array($key) ? $key : func_get_args(); - - foreach ($keys as $value) { - if ($this->isEmptyString($value)) { - return false; - } - } - - return true; - } - - /** - * Determine if the instance contains an empty value for the given key. - * - * @param string|array $key - * @return bool - */ - public function isNotFilled($key) - { - $keys = is_array($key) ? $key : func_get_args(); - - foreach ($keys as $value) { - if (! $this->isEmptyString($value)) { - return false; - } - } - - return true; - } - - /** - * Determine if the instance contains a non-empty value for any of the given keys. - * - * @param string|array $keys - * @return bool - */ - public function anyFilled($keys) - { - $keys = is_array($keys) ? $keys : func_get_args(); - - foreach ($keys as $key) { - if ($this->filled($key)) { - return true; - } - } - - return false; - } - - /** - * Apply the callback if the instance contains a non-empty value for the given key. - * - * @param string $key - * @param callable $callback - * @param callable|null $default - * @return $this|mixed - */ - public function whenFilled($key, callable $callback, ?callable $default = null) - { - if ($this->filled($key)) { - return $callback(data_get($this->all(), $key)) ?: $this; - } - - if ($default) { - return $default(); - } - - return $this; - } - - /** - * Determine if the instance is missing a given key. - * - * @param string|array $key - * @return bool - */ - public function missing($key) - { - $keys = is_array($key) ? $key : func_get_args(); - - return ! $this->has($keys); - } - - /** - * Apply the callback if the instance is missing the given key. - * - * @param string $key - * @param callable $callback - * @param callable|null $default - * @return $this|mixed - */ - public function whenMissing($key, callable $callback, ?callable $default = null) - { - if ($this->missing($key)) { - return $callback(data_get($this->all(), $key)) ?: $this; - } - - if ($default) { - return $default(); - } - - return $this; - } - - /** - * Determine if the given key is an empty string for "filled". - * - * @param string $key - * @return bool - */ - protected function isEmptyString($key) - { - $value = $this->data($key); - - return ! is_bool($value) && ! is_array($value) && trim((string) $value) === ''; - } - - /** - * Retrieve data from the instance as a Stringable instance. - * - * @param string $key - * @param mixed $default - * @return \Illuminate\Support\Stringable - */ - public function str($key, $default = null) - { - return $this->string($key, $default); - } - - /** - * Retrieve data from the instance as a Stringable instance. - * - * @param string $key - * @param mixed $default - * @return \Illuminate\Support\Stringable - */ - public function string($key, $default = null) - { - return Str::of($this->data($key, $default)); - } - - /** - * Retrieve data as a boolean value. - * - * Returns true when value is "1", "true", "on", and "yes". Otherwise, returns false. - * - * @param string|null $key - * @param bool $default - * @return bool - */ - public function boolean($key = null, $default = false) - { - return filter_var($this->data($key, $default), FILTER_VALIDATE_BOOLEAN); - } - - /** - * Retrieve data as an integer value. - * - * @param string $key - * @param int $default - * @return int - */ - public function integer($key, $default = 0) - { - return intval($this->data($key, $default)); - } - - /** - * Retrieve data as a float value. - * - * @param string $key - * @param float $default - * @return float - */ - public function float($key, $default = 0.0) - { - return floatval($this->data($key, $default)); - } - - /** - * Retrieve data from the instance as a Carbon instance. - * - * @param string $key - * @param string|null $format - * @param string|null $tz - * @return \Illuminate\Support\Carbon|null - * - * @throws \Carbon\Exceptions\InvalidFormatException - */ - public function date($key, $format = null, $tz = null) - { - if ($this->isNotFilled($key)) { - return null; - } - - if (is_null($format)) { - return Date::parse($this->data($key), $tz); - } - - return Date::createFromFormat($format, $this->data($key), $tz); - } - - /** - * Retrieve data from the instance as an enum. - * - * @template TEnum of \BackedEnum - * - * @param string $key - * @param class-string $enumClass - * @return TEnum|null - */ - public function enum($key, $enumClass) - { - if ($this->isNotFilled($key) || ! $this->isBackedEnum($enumClass)) { - return null; - } - - return $enumClass::tryFrom($this->data($key)); - } - - /** - * Retrieve data from the instance as an array of enums. - * - * @template TEnum of \BackedEnum - * - * @param string $key - * @param class-string $enumClass - * @return TEnum[] - */ - public function enums($key, $enumClass) - { - if ($this->isNotFilled($key) || ! $this->isBackedEnum($enumClass)) { - return []; - } - - return $this->collect($key)->map(function ($value) use ($enumClass) { - return $enumClass::tryFrom($value); - })->filter()->all(); - } - - /** - * Determine if the given enum class is backed. - * - * @param class-string $enumClass - * @return bool - */ - protected function isBackedEnum($enumClass) - { - return enum_exists($enumClass) && method_exists($enumClass, 'tryFrom'); - } - - /** - * Retrieve data from the instance as an array. - * - * @param array|string|null $key - * @return array - */ - public function array($key = null) - { - return (array) (is_array($key) ? $this->only($key) : $this->data($key)); - } - - /** - * Retrieve data from the instance as a collection. - * - * @param array|string|null $key - * @return \Illuminate\Support\Collection - */ - public function collect($key = null) - { - return new Collection(is_array($key) ? $this->only($key) : $this->data($key)); - } - - /** - * Get a subset containing the provided keys with values from the instance data. - * - * @param array|mixed $keys - * @return array - */ - public function only($keys) - { - $results = []; - - $data = $this->all(); - - $placeholder = new stdClass; - - foreach (is_array($keys) ? $keys : func_get_args() as $key) { - $value = data_get($data, $key, $placeholder); - - if ($value !== $placeholder) { - Arr::set($results, $key, $value); - } - } - - return $results; - } - - /** - * Get all of the data except for a specified array of items. - * - * @param array|mixed $keys - * @return array - */ - public function except($keys) - { - $keys = is_array($keys) ? $keys : func_get_args(); - - $results = $this->all(); - - Arr::forget($results, $keys); - - return $results; - } -} diff --git a/vendor/illuminate/support/Traits/Localizable.php b/vendor/illuminate/support/Traits/Localizable.php deleted file mode 100644 index 1e9fa58..0000000 --- a/vendor/illuminate/support/Traits/Localizable.php +++ /dev/null @@ -1,34 +0,0 @@ -getLocale(); - - try { - $app->setLocale($locale); - - return $callback(); - } finally { - $app->setLocale($original); - } - } -} diff --git a/vendor/illuminate/support/Traits/ReflectsClosures.php b/vendor/illuminate/support/Traits/ReflectsClosures.php deleted file mode 100644 index 34f3ec8..0000000 --- a/vendor/illuminate/support/Traits/ReflectsClosures.php +++ /dev/null @@ -1,89 +0,0 @@ -closureParameterTypes($closure)); - - if (! $types) { - throw new RuntimeException('The given Closure has no parameters.'); - } - - if ($types[0] === null) { - throw new RuntimeException('The first parameter of the given Closure is missing a type hint.'); - } - - return $types[0]; - } - - /** - * Get the class names of the first parameter of the given Closure, including union types. - * - * @param \Closure $closure - * @return array - * - * @throws \ReflectionException - * @throws \RuntimeException - */ - protected function firstClosureParameterTypes(Closure $closure) - { - $reflection = new ReflectionFunction($closure); - - $types = (new Collection($reflection->getParameters()))->mapWithKeys(function ($parameter) { - if ($parameter->isVariadic()) { - return [$parameter->getName() => null]; - } - - return [$parameter->getName() => Reflector::getParameterClassNames($parameter)]; - })->filter()->values()->all(); - - if (empty($types)) { - throw new RuntimeException('The given Closure has no parameters.'); - } - - if (isset($types[0]) && empty($types[0])) { - throw new RuntimeException('The first parameter of the given Closure is missing a type hint.'); - } - - return $types[0]; - } - - /** - * Get the class names / types of the parameters of the given Closure. - * - * @param \Closure $closure - * @return array - * - * @throws \ReflectionException - */ - protected function closureParameterTypes(Closure $closure) - { - $reflection = new ReflectionFunction($closure); - - return (new Collection($reflection->getParameters()))->mapWithKeys(function ($parameter) { - if ($parameter->isVariadic()) { - return [$parameter->getName() => null]; - } - - return [$parameter->getName() => Reflector::getParameterClassName($parameter)]; - })->all(); - } -} diff --git a/vendor/illuminate/support/Traits/Tappable.php b/vendor/illuminate/support/Traits/Tappable.php deleted file mode 100644 index 9369e9a..0000000 --- a/vendor/illuminate/support/Traits/Tappable.php +++ /dev/null @@ -1,17 +0,0 @@ -uri = $uri instanceof UriInterface ? $uri : LeagueUri::new((string) $uri); - } - - /** - * Create a new URI instance. - */ - public static function of(UriInterface|Stringable|string $uri = ''): static - { - return new static($uri); - } - - /** - * Get a URI instance of an absolute URL for the given path. - */ - public static function to(string $path): static - { - return new static(call_user_func(static::$urlGeneratorResolver)->to($path)); - } - - /** - * Get a URI instance for a named route. - * - * @param \BackedEnum|string $name - * @param mixed $parameters - * @param bool $absolute - * @return static - * - * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException|\InvalidArgumentException - */ - public static function route($name, $parameters = [], $absolute = true): static - { - return new static(call_user_func(static::$urlGeneratorResolver)->route($name, $parameters, $absolute)); - } - - /** - * Create a signed route URI instance for a named route. - * - * @param \BackedEnum|string $name - * @param mixed $parameters - * @param \DateTimeInterface|\DateInterval|int|null $expiration - * @param bool $absolute - * @return static - * - * @throws \InvalidArgumentException - */ - public static function signedRoute($name, $parameters = [], $expiration = null, $absolute = true): static - { - return new static(call_user_func(static::$urlGeneratorResolver)->signedRoute($name, $parameters, $expiration, $absolute)); - } - - /** - * Create a temporary signed route URI instance for a named route. - * - * @param \BackedEnum|string $name - * @param \DateTimeInterface|\DateInterval|int $expiration - * @param array $parameters - * @param bool $absolute - * @return static - */ - public static function temporarySignedRoute($name, $expiration, $parameters = [], $absolute = true): static - { - return static::signedRoute($name, $parameters, $expiration, $absolute); - } - - /** - * Get the URI's scheme. - */ - public function scheme(): ?string - { - return $this->uri->getScheme(); - } - - /** - * Get the user from the URI. - */ - public function user(bool $withPassword = false): ?string - { - return $withPassword - ? $this->uri->getUserInfo() - : $this->uri->getUsername(); - } - - /** - * Get the password from the URI. - */ - public function password(): ?string - { - return $this->uri->getPassword(); - } - - /** - * Get the URI's host. - */ - public function host(): ?string - { - return $this->uri->getHost(); - } - - /** - * Get the URI's port. - */ - public function port(): ?int - { - return $this->uri->getPort(); - } - - /** - * Get the URI's path. - * - * Empty or missing paths are returned as a single "/". - */ - public function path(): ?string - { - $path = trim((string) $this->uri->getPath(), '/'); - - return $path === '' ? '/' : $path; - } - - /** - * Get the URI's query string. - */ - public function query(): UriQueryString - { - return new UriQueryString($this); - } - - /** - * Get the URI's fragment. - */ - public function fragment(): ?string - { - return $this->uri->getFragment(); - } - - /** - * Specify the scheme of the URI. - */ - public function withScheme(Stringable|string $scheme): static - { - return new static($this->uri->withScheme($scheme)); - } - - /** - * Specify the user and password for the URI. - */ - public function withUser(Stringable|string|null $user, #[SensitiveParameter] Stringable|string|null $password = null): static - { - return new static($this->uri->withUserInfo($user, $password)); - } - - /** - * Specify the host of the URI. - */ - public function withHost(Stringable|string $host): static - { - return new static($this->uri->withHost($host)); - } - - /** - * Specify the port of the URI. - */ - public function withPort(int|null $port): static - { - return new static($this->uri->withPort($port)); - } - - /** - * Specify the path of the URI. - */ - public function withPath(Stringable|string $path): static - { - return new static($this->uri->withPath(Str::start((string) $path, '/'))); - } - - /** - * Merge new query parameters into the URI. - */ - public function withQuery(array $query, bool $merge = true): static - { - foreach ($query as $key => $value) { - if ($value instanceof UrlRoutable) { - $query[$key] = $value->getRouteKey(); - } - } - - if ($merge) { - $mergedQuery = $this->query()->all(); - - foreach ($query as $key => $value) { - data_set($mergedQuery, $key, $value); - } - - $newQuery = $mergedQuery; - } else { - $newQuery = []; - - foreach ($query as $key => $value) { - data_set($newQuery, $key, $value); - } - } - - return new static($this->uri->withQuery(Arr::query($newQuery))); - } - - /** - * Merge new query parameters into the URI if they are not already in the query string. - */ - public function withQueryIfMissing(array $query): static - { - $currentQuery = $this->query(); - - foreach ($query as $key => $value) { - if (! $currentQuery->missing($key)) { - Arr::forget($query, $key); - } - } - - return $this->withQuery($query); - } - - /** - * Push a value onto the end of a query string parameter that is a list. - */ - public function pushOntoQuery(string $key, mixed $value): static - { - $currentValue = data_get($this->query()->all(), $key); - - $values = Arr::wrap($value); - - return $this->withQuery([$key => match (true) { - is_array($currentValue) && array_is_list($currentValue) => array_values(array_unique([...$currentValue, ...$values])), - is_array($currentValue) => [...$currentValue, ...$values], - ! is_null($currentValue) => [$currentValue, ...$values], - default => $values, - }]); - } - - /** - * Remove the given query parameters from the URI. - */ - public function withoutQuery(array|string $keys): static - { - return $this->replaceQuery(Arr::except($this->query()->all(), $keys)); - } - - /** - * Specify new query parameters for the URI. - */ - public function replaceQuery(array $query): static - { - return $this->withQuery($query, merge: false); - } - - /** - * Specify the fragment of the URI. - */ - public function withFragment(string $fragment): static - { - return new static($this->uri->withFragment($fragment)); - } - - /** - * Create a redirect HTTP response for the given URI. - */ - public function redirect(int $status = 302, array $headers = []): RedirectResponse - { - return new RedirectResponse($this->value(), $status, $headers); - } - - /** - * Create an HTTP response that represents the object. - * - * @param \Illuminate\Http\Request $request - * @return \Symfony\Component\HttpFoundation\Response - */ - public function toResponse($request) - { - return new RedirectResponse($this->value()); - } - - /** - * Get content as a string of HTML. - * - * @return string - */ - public function toHtml() - { - return $this->value(); - } - - /** - * Get the decoded string representation of the URI. - */ - public function decode(): string - { - if (empty($this->query()->toArray())) { - return $this->value(); - } - - return Str::replace(Str::after($this->value(), '?'), $this->query()->decode(), $this->value()); - } - - /** - * Get the string representation of the URI. - */ - public function value(): string - { - return (string) $this; - } - - /** - * Determine if the URI is currently an empty string. - */ - public function isEmpty(): bool - { - return trim($this->value()) === ''; - } - - /** - * Dump the string representation of the URI. - * - * @param mixed ...$args - * @return $this - */ - public function dump(...$args) - { - dump($this->value(), ...$args); - - return $this; - } - - /** - * Set the URL generator resolver. - */ - public static function setUrlGeneratorResolver(Closure $urlGeneratorResolver): void - { - static::$urlGeneratorResolver = $urlGeneratorResolver; - } - - /** - * Get the underlying URI instance. - */ - public function getUri(): UriInterface - { - return $this->uri; - } - - /** - * Get the string representation of the URI. - */ - public function __toString(): string - { - return $this->uri->toString(); - } -} diff --git a/vendor/illuminate/support/UriQueryString.php b/vendor/illuminate/support/UriQueryString.php deleted file mode 100644 index 960bd75..0000000 --- a/vendor/illuminate/support/UriQueryString.php +++ /dev/null @@ -1,96 +0,0 @@ -toArray(); - - if (! $keys) { - return $query; - } - - $results = []; - - foreach (is_array($keys) ? $keys : func_get_args() as $key) { - Arr::set($results, $key, Arr::get($query, $key)); - } - - return $results; - } - - /** - * Retrieve data from the instance. - * - * @param string|null $key - * @param mixed $default - * @return mixed - */ - protected function data($key = null, $default = null) - { - return $this->get($key, $default); - } - - /** - * Get a query string parameter. - */ - public function get(?string $key = null, mixed $default = null): mixed - { - return data_get($this->toArray(), $key, $default); - } - - /** - * Get the URL decoded version of the query string. - */ - public function decode(): string - { - return rawurldecode((string) $this); - } - - /** - * Get the string representation of the query string. - */ - public function value(): string - { - return (string) $this; - } - - /** - * Convert the query string into an array. - */ - public function toArray() - { - return QueryString::extract($this->value()); - } - - /** - * Get the string representation of the query string. - */ - public function __toString(): string - { - return (string) $this->uri->getUri()->getQuery(); - } -} diff --git a/vendor/illuminate/support/ValidatedInput.php b/vendor/illuminate/support/ValidatedInput.php deleted file mode 100644 index f3ac30c..0000000 --- a/vendor/illuminate/support/ValidatedInput.php +++ /dev/null @@ -1,241 +0,0 @@ -input = $input; - } - - /** - * Merge the validated input with the given array of additional data. - * - * @param array $items - * @return static - */ - public function merge(array $items) - { - return new static(array_merge($this->all(), $items)); - } - - /** - * Get the raw, underlying input array. - * - * @param array|mixed|null $keys - * @return array - */ - public function all($keys = null) - { - if (! $keys) { - return $this->input; - } - - $input = []; - - foreach (is_array($keys) ? $keys : func_get_args() as $key) { - Arr::set($input, $key, Arr::get($this->input, $key)); - } - - return $input; - } - - /** - * Retrieve data from the instance. - * - * @param string|null $key - * @param mixed $default - * @return mixed - */ - protected function data($key = null, $default = null) - { - return $this->input($key, $default); - } - - /** - * Get the keys for all of the input. - * - * @return array - */ - public function keys() - { - return array_keys($this->input()); - } - - /** - * Retrieve an input item from the validated inputs. - * - * @param string|null $key - * @param mixed $default - * @return mixed - */ - public function input($key = null, $default = null) - { - return data_get( - $this->all(), $key, $default - ); - } - - /** - * Dump the validated inputs items and end the script. - * - * @param mixed ...$keys - * @return never - */ - public function dd(...$keys) - { - $this->dump(...$keys); - - exit(1); - } - - /** - * Dump the items. - * - * @param mixed $keys - * @return $this - */ - public function dump($keys = []) - { - $keys = is_array($keys) ? $keys : func_get_args(); - - VarDumper::dump(count($keys) > 0 ? $this->only($keys) : $this->all()); - - return $this; - } - - /** - * Get the instance as an array. - * - * @return array - */ - public function toArray() - { - return $this->all(); - } - - /** - * Dynamically access input data. - * - * @param string $name - * @return mixed - */ - public function __get($name) - { - return $this->input($name); - } - - /** - * Dynamically set input data. - * - * @param string $name - * @param mixed $value - * @return mixed - */ - public function __set($name, $value) - { - $this->input[$name] = $value; - } - - /** - * Determine if an input item is set. - * - * @return bool - */ - public function __isset($name) - { - return $this->exists($name); - } - - /** - * Remove an input item. - * - * @param string $name - * @return void - */ - public function __unset($name) - { - unset($this->input[$name]); - } - - /** - * Determine if an item exists at an offset. - * - * @param mixed $key - * @return bool - */ - public function offsetExists($key): bool - { - return $this->exists($key); - } - - /** - * Get an item at a given offset. - * - * @param mixed $key - * @return mixed - */ - public function offsetGet($key): mixed - { - return $this->input($key); - } - - /** - * Set the item at a given offset. - * - * @param mixed $key - * @param mixed $value - * @return void - */ - public function offsetSet($key, $value): void - { - if (is_null($key)) { - $this->input[] = $value; - } else { - $this->input[$key] = $value; - } - } - - /** - * Unset the item at a given offset. - * - * @param string $key - * @return void - */ - public function offsetUnset($key): void - { - unset($this->input[$key]); - } - - /** - * Get an iterator for the input. - * - * @return \ArrayIterator - */ - public function getIterator(): Traversable - { - return new ArrayIterator($this->input); - } -} diff --git a/vendor/illuminate/support/ViewErrorBag.php b/vendor/illuminate/support/ViewErrorBag.php deleted file mode 100644 index 2865fbf..0000000 --- a/vendor/illuminate/support/ViewErrorBag.php +++ /dev/null @@ -1,131 +0,0 @@ -bags[$key]); - } - - /** - * Get a MessageBag instance from the bags. - * - * @param string $key - * @return \Illuminate\Contracts\Support\MessageBag - */ - public function getBag($key) - { - return Arr::get($this->bags, $key) ?: new MessageBag; - } - - /** - * Get all the bags. - * - * @return array - */ - public function getBags() - { - return $this->bags; - } - - /** - * Add a new MessageBag instance to the bags. - * - * @param string $key - * @param \Illuminate\Contracts\Support\MessageBag $bag - * @return $this - */ - public function put($key, MessageBagContract $bag) - { - $this->bags[$key] = $bag; - - return $this; - } - - /** - * Determine if the default message bag has any messages. - * - * @return bool - */ - public function any() - { - return $this->count() > 0; - } - - /** - * Get the number of messages in the default bag. - * - * @return int - */ - public function count(): int - { - return $this->getBag('default')->count(); - } - - /** - * Dynamically call methods on the default bag. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->getBag('default')->$method(...$parameters); - } - - /** - * Dynamically access a view error bag. - * - * @param string $key - * @return \Illuminate\Contracts\Support\MessageBag - */ - public function __get($key) - { - return $this->getBag($key); - } - - /** - * Dynamically set a view error bag. - * - * @param string $key - * @param \Illuminate\Contracts\Support\MessageBag $value - * @return void - */ - public function __set($key, $value) - { - $this->put($key, $value); - } - - /** - * Convert the default bag to its string representation. - * - * @return string - */ - public function __toString() - { - return (string) $this->getBag('default'); - } -} diff --git a/vendor/illuminate/support/composer.json b/vendor/illuminate/support/composer.json deleted file mode 100644 index 286a90b..0000000 --- a/vendor/illuminate/support/composer.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "illuminate/support", - "description": "The Illuminate Support package.", - "license": "MIT", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "require": { - "php": "^8.2", - "ext-ctype": "*", - "ext-filter": "*", - "ext-mbstring": "*", - "doctrine/inflector": "^2.0", - "illuminate/collections": "^11.0", - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "nesbot/carbon": "^2.72.6|^3.8.4", - "voku/portable-ascii": "^2.0.2" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "spatie/once": "*" - }, - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - }, - "files": [ - "functions.php", - "helpers.php" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "suggest": { - "illuminate/filesystem": "Required to use the Composer class (^11.0).", - "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.6).", - "league/uri": "Required to use the Uri class (^7.5.1).", - "ramsey/uuid": "Required to use Str::uuid() (^4.7).", - "symfony/process": "Required to use the Composer class (^7.0).", - "symfony/uid": "Required to use Str::ulid() (^7.0).", - "symfony/var-dumper": "Required to use the dd function (^7.0).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." - }, - "config": { - "sort-packages": true - }, - "minimum-stability": "dev" -} diff --git a/vendor/illuminate/support/functions.php b/vendor/illuminate/support/functions.php deleted file mode 100644 index 95d98c9..0000000 --- a/vendor/illuminate/support/functions.php +++ /dev/null @@ -1,53 +0,0 @@ - app(DeferredCallbackCollection::class)[] = $deferred - ); - } -} - -if (! function_exists('Illuminate\Support\php_binary')) { - /** - * Determine the PHP Binary. - * - * @return string - */ - function php_binary() - { - return (new PhpExecutableFinder)->find(false) ?: 'php'; - } -} - -if (! function_exists('Illuminate\Support\artisan_binary')) { - /** - * Determine the proper Artisan executable. - * - * @return string - */ - function artisan_binary() - { - return defined('ARTISAN_BINARY') ? ARTISAN_BINARY : 'artisan'; - } -} diff --git a/vendor/illuminate/support/helpers.php b/vendor/illuminate/support/helpers.php deleted file mode 100644 index 8ecb1eb..0000000 --- a/vendor/illuminate/support/helpers.php +++ /dev/null @@ -1,528 +0,0 @@ - $value) { - if (is_numeric($key)) { - $start++; - - $array[$start] = Arr::pull($array, $key); - } - } - - return $array; - } -} - -if (! function_exists('blank')) { - /** - * Determine if the given value is "blank". - * - * @phpstan-assert-if-false !=null|'' $value - * - * @phpstan-assert-if-true !=numeric|bool $value - * - * @param mixed $value - * @return bool - */ - function blank($value) - { - if (is_null($value)) { - return true; - } - - if (is_string($value)) { - return trim($value) === ''; - } - - if (is_numeric($value) || is_bool($value)) { - return false; - } - - if ($value instanceof Model) { - return false; - } - - if ($value instanceof Countable) { - return count($value) === 0; - } - - if ($value instanceof Stringable) { - return trim((string) $value) === ''; - } - - return empty($value); - } -} - -if (! function_exists('class_basename')) { - /** - * Get the class "basename" of the given object / class. - * - * @param string|object $class - * @return string - */ - function class_basename($class) - { - $class = is_object($class) ? get_class($class) : $class; - - return basename(str_replace('\\', '/', $class)); - } -} - -if (! function_exists('class_uses_recursive')) { - /** - * Returns all traits used by a class, its parent classes and trait of their traits. - * - * @param object|string $class - * @return array - */ - function class_uses_recursive($class) - { - if (is_object($class)) { - $class = get_class($class); - } - - $results = []; - - foreach (array_reverse(class_parents($class) ?: []) + [$class => $class] as $class) { - $results += trait_uses_recursive($class); - } - - return array_unique($results); - } -} - -if (! function_exists('e')) { - /** - * Encode HTML special characters in a string. - * - * @param \Illuminate\Contracts\Support\DeferringDisplayableValue|\Illuminate\Contracts\Support\Htmlable|\BackedEnum|string|int|float|null $value - * @param bool $doubleEncode - * @return string - */ - function e($value, $doubleEncode = true) - { - if ($value instanceof DeferringDisplayableValue) { - $value = $value->resolveDisplayableValue(); - } - - if ($value instanceof Htmlable) { - return $value->toHtml(); - } - - if ($value instanceof BackedEnum) { - $value = $value->value; - } - - return htmlspecialchars($value ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', $doubleEncode); - } -} - -if (! function_exists('env')) { - /** - * Gets the value of an environment variable. - * - * @param string $key - * @param mixed $default - * @return mixed - */ - function env($key, $default = null) - { - return Env::get($key, $default); - } -} - -if (! function_exists('filled')) { - /** - * Determine if a value is "filled". - * - * @phpstan-assert-if-true !=null|'' $value - * - * @phpstan-assert-if-false !=numeric|bool $value - * - * @param mixed $value - * @return bool - */ - function filled($value) - { - return ! blank($value); - } -} - -if (! function_exists('fluent')) { - /** - * Create a Fluent object from the given value. - * - * @param object|array $value - * @return \Illuminate\Support\Fluent - */ - function fluent($value) - { - return new Fluent($value); - } -} - -if (! function_exists('literal')) { - /** - * Return a new literal or anonymous object using named arguments. - * - * @return \stdClass - */ - function literal(...$arguments) - { - if (count($arguments) === 1 && array_is_list($arguments)) { - return $arguments[0]; - } - - return (object) $arguments; - } -} - -if (! function_exists('object_get')) { - /** - * Get an item from an object using "dot" notation. - * - * @template TValue of object - * - * @param TValue $object - * @param string|null $key - * @param mixed $default - * @return ($key is empty ? TValue : mixed) - */ - function object_get($object, $key, $default = null) - { - if (is_null($key) || trim($key) === '') { - return $object; - } - - foreach (explode('.', $key) as $segment) { - if (! is_object($object) || ! isset($object->{$segment})) { - return value($default); - } - - $object = $object->{$segment}; - } - - return $object; - } -} - -if (! function_exists('laravel_cloud')) { - /** - * Determine if the application is running on Laravel Cloud. - * - * @return bool - */ - function laravel_cloud() - { - return ($_ENV['LARAVEL_CLOUD'] ?? false) === '1' || - ($_SERVER['LARAVEL_CLOUD'] ?? false) === '1'; - } -} - -if (! function_exists('once')) { - /** - * Ensures a callable is only called once, and returns the result on subsequent calls. - * - * @template TReturnType - * - * @param callable(): TReturnType $callback - * @return TReturnType - */ - function once(callable $callback) - { - $onceable = Onceable::tryFromTrace( - debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 2), - $callback, - ); - - return $onceable ? Once::instance()->value($onceable) : call_user_func($callback); - } -} - -if (! function_exists('optional')) { - /** - * Provide access to optional objects. - * - * @template TValue - * @template TReturn - * - * @param TValue $value - * @param (callable(TValue): TReturn)|null $callback - * @return ($callback is null ? \Illuminate\Support\Optional : ($value is null ? null : TReturn)) - */ - function optional($value = null, ?callable $callback = null) - { - if (is_null($callback)) { - return new Optional($value); - } elseif (! is_null($value)) { - return $callback($value); - } - } -} - -if (! function_exists('preg_replace_array')) { - /** - * Replace a given pattern with each value in the array in sequentially. - * - * @param string $pattern - * @param array $replacements - * @param string $subject - * @return string - */ - function preg_replace_array($pattern, array $replacements, $subject) - { - return preg_replace_callback($pattern, function () use (&$replacements) { - foreach ($replacements as $value) { - return array_shift($replacements); - } - }, $subject); - } -} - -if (! function_exists('retry')) { - /** - * Retry an operation a given number of times. - * - * @template TValue - * - * @param int|array $times - * @param callable(int): TValue $callback - * @param int|\Closure(int, \Throwable): int $sleepMilliseconds - * @param (callable(\Throwable): bool)|null $when - * @return TValue - * - * @throws \Throwable - */ - function retry($times, callable $callback, $sleepMilliseconds = 0, $when = null) - { - $attempts = 0; - - $backoff = []; - - if (is_array($times)) { - $backoff = $times; - - $times = count($times) + 1; - } - - beginning: - $attempts++; - $times--; - - try { - return $callback($attempts); - } catch (Throwable $e) { - if ($times < 1 || ($when && ! $when($e))) { - throw $e; - } - - $sleepMilliseconds = $backoff[$attempts - 1] ?? $sleepMilliseconds; - - if ($sleepMilliseconds) { - Sleep::usleep(value($sleepMilliseconds, $attempts, $e) * 1000); - } - - goto beginning; - } - } -} - -if (! function_exists('str')) { - /** - * Get a new stringable object from the given string. - * - * @param string|null $string - * @return ($string is null ? object : \Illuminate\Support\Stringable) - */ - function str($string = null) - { - if (func_num_args() === 0) { - return new class - { - public function __call($method, $parameters) - { - return Str::$method(...$parameters); - } - - public function __toString() - { - return ''; - } - }; - } - - return new SupportStringable($string); - } -} - -if (! function_exists('tap')) { - /** - * Call the given Closure with the given value then return the value. - * - * @template TValue - * - * @param TValue $value - * @param (callable(TValue): mixed)|null $callback - * @return ($callback is null ? \Illuminate\Support\HigherOrderTapProxy : TValue) - */ - function tap($value, $callback = null) - { - if (is_null($callback)) { - return new HigherOrderTapProxy($value); - } - - $callback($value); - - return $value; - } -} - -if (! function_exists('throw_if')) { - /** - * Throw the given exception if the given condition is true. - * - * @template TValue - * @template TException of \Throwable - * - * @param TValue $condition - * @param TException|class-string|string $exception - * @param mixed ...$parameters - * @return ($condition is true ? never : ($condition is non-empty-mixed ? never : TValue)) - * - * @throws TException - */ - function throw_if($condition, $exception = 'RuntimeException', ...$parameters) - { - if ($condition) { - if (is_string($exception) && class_exists($exception)) { - $exception = new $exception(...$parameters); - } - - throw is_string($exception) ? new RuntimeException($exception) : $exception; - } - - return $condition; - } -} - -if (! function_exists('throw_unless')) { - /** - * Throw the given exception unless the given condition is true. - * - * @template TValue - * @template TException of \Throwable - * - * @param TValue $condition - * @param TException|class-string|string $exception - * @param mixed ...$parameters - * @return ($condition is false ? never : ($condition is non-empty-mixed ? TValue : never)) - * - * @throws TException - */ - function throw_unless($condition, $exception = 'RuntimeException', ...$parameters) - { - throw_if(! $condition, $exception, ...$parameters); - - return $condition; - } -} - -if (! function_exists('trait_uses_recursive')) { - /** - * Returns all traits used by a trait and its traits. - * - * @param object|string $trait - * @return array - */ - function trait_uses_recursive($trait) - { - $traits = class_uses($trait) ?: []; - - foreach ($traits as $trait) { - $traits += trait_uses_recursive($trait); - } - - return $traits; - } -} - -if (! function_exists('transform')) { - /** - * Transform the given value if it is present. - * - * @template TValue - * @template TReturn - * @template TDefault - * - * @param TValue $value - * @param callable(TValue): TReturn $callback - * @param TDefault|callable(TValue): TDefault $default - * @return ($value is empty ? TDefault : TReturn) - */ - function transform($value, callable $callback, $default = null) - { - if (filled($value)) { - return $callback($value); - } - - if (is_callable($default)) { - return $default($value); - } - - return $default; - } -} - -if (! function_exists('windows_os')) { - /** - * Determine whether the current environment is Windows based. - * - * @return bool - */ - function windows_os() - { - return PHP_OS_FAMILY === 'Windows'; - } -} - -if (! function_exists('with')) { - /** - * Return the given value, optionally passed through the given callback. - * - * @template TValue - * @template TReturn - * - * @param TValue $value - * @param (callable(TValue): (TReturn))|null $callback - * @return ($callback is null ? TValue : TReturn) - */ - function with($value, ?callable $callback = null) - { - return is_null($callback) ? $value : $callback($value); - } -} diff --git a/vendor/laravel/serializable-closure/LICENSE.md b/vendor/laravel/serializable-closure/LICENSE.md deleted file mode 100644 index 79810c8..0000000 --- a/vendor/laravel/serializable-closure/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Taylor Otwell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/laravel/serializable-closure/README.md b/vendor/laravel/serializable-closure/README.md deleted file mode 100644 index ee0d01a..0000000 --- a/vendor/laravel/serializable-closure/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# Serializable Closure - - - Build Status - - - Total Downloads - - - Latest Stable Version - - - License - - -## Introduction - -> This project is a fork of the excellent [opis/closure: 3.x](https://github.com/opis/closure) package. At Laravel, we decided to fork this package as the upcoming version [4.x](https://github.com/opis/closure) is a complete rewrite on top of the [FFI extension](https://www.php.net/manual/en/book.ffi.php). As Laravel is a web framework, and FFI is not enabled by default in web requests, this fork allows us to keep using the `3.x` series while adding support for new PHP versions. - -Laravel Serializable Closure provides an easy and secure way to **serialize closures in PHP**. - -## Official Documentation - -### Installation - -> **Requires [PHP 7.4+](https://php.net/releases/)** - -First, install Laravel Serializable Closure via the [Composer](https://getcomposer.org/) package manager: - -```bash -composer require laravel/serializable-closure -``` - -### Usage - -You may serialize a closure this way: - -```php -use Laravel\SerializableClosure\SerializableClosure; - -$closure = fn () => 'james'; - -// Recommended -SerializableClosure::setSecretKey('secret'); - -$serialized = serialize(new SerializableClosure($closure)); -$closure = unserialize($serialized)->getClosure(); - -echo $closure(); // james; -``` - -### Caveats - -* Anonymous classes cannot be created within closures. -* Attributes cannot be used within closures. -* Serializing closures on REPL environments like Laravel Tinker is not supported. -* Serializing closures that reference objects with readonly properties is not supported. - -## Contributing - -Thank you for considering contributing to Serializable Closure! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). - -## Code of Conduct - -In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). - -## Security Vulnerabilities - -Please review [our security policy](https://github.com/laravel/serializable-closure/security/policy) on how to report security vulnerabilities. - -## License - -Serializable Closure is open-sourced software licensed under the [MIT license](LICENSE.md). diff --git a/vendor/laravel/serializable-closure/composer.json b/vendor/laravel/serializable-closure/composer.json deleted file mode 100644 index db744e9..0000000 --- a/vendor/laravel/serializable-closure/composer.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "laravel/serializable-closure", - "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", - "keywords": ["laravel", "Serializable", "closure"], - "license": "MIT", - "support": { - "issues": "https://github.com/laravel/serializable-closure/issues", - "source": "https://github.com/laravel/serializable-closure" - }, - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - }, - { - "name": "Nuno Maduro", - "email": "nuno@laravel.com" - } - ], - "require": { - "php": "^8.1" - }, - "require-dev": { - "illuminate/support": "^10.0|^11.0|^12.0", - "nesbot/carbon": "^2.67|^3.0", - "pestphp/pest": "^2.36|^3.0", - "phpstan/phpstan": "^2.0", - "symfony/var-dumper": "^6.2.0|^7.0.0" - }, - "autoload": { - "psr-4": { - "Laravel\\SerializableClosure\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "config": { - "sort-packages": true, - "allow-plugins": { - "pestphp/pest-plugin": true - } - }, - "minimum-stability": "dev", - "prefer-stable": true -} diff --git a/vendor/laravel/serializable-closure/src/Contracts/Serializable.php b/vendor/laravel/serializable-closure/src/Contracts/Serializable.php deleted file mode 100644 index 1a62922..0000000 --- a/vendor/laravel/serializable-closure/src/Contracts/Serializable.php +++ /dev/null @@ -1,20 +0,0 @@ -serializable = Serializers\Signed::$signer - ? new Serializers\Signed($closure) - : new Serializers\Native($closure); - } - - /** - * Resolve the closure with the given arguments. - * - * @return mixed - */ - public function __invoke() - { - return call_user_func_array($this->serializable, func_get_args()); - } - - /** - * Gets the closure. - * - * @return \Closure - */ - public function getClosure() - { - return $this->serializable->getClosure(); - } - - /** - * Create a new unsigned serializable closure instance. - * - * @param Closure $closure - * @return \Laravel\SerializableClosure\UnsignedSerializableClosure - */ - public static function unsigned(Closure $closure) - { - return new UnsignedSerializableClosure($closure); - } - - /** - * Sets the serializable closure secret key. - * - * @param string|null $secret - * @return void - */ - public static function setSecretKey($secret) - { - Serializers\Signed::$signer = $secret - ? new Hmac($secret) - : null; - } - - /** - * Sets the serializable closure secret key. - * - * @param \Closure|null $transformer - * @return void - */ - public static function transformUseVariablesUsing($transformer) - { - Serializers\Native::$transformUseVariables = $transformer; - } - - /** - * Sets the serializable closure secret key. - * - * @param \Closure|null $resolver - * @return void - */ - public static function resolveUseVariablesUsing($resolver) - { - Serializers\Native::$resolveUseVariables = $resolver; - } - - /** - * Get the serializable representation of the closure. - * - * @return array{serializable: \Laravel\SerializableClosure\Serializers\Signed|\Laravel\SerializableClosure\Contracts\Serializable} - */ - public function __serialize() - { - return [ - 'serializable' => $this->serializable, - ]; - } - - /** - * Restore the closure after serialization. - * - * @param array{serializable: \Laravel\SerializableClosure\Serializers\Signed|\Laravel\SerializableClosure\Contracts\Serializable} $data - * @return void - * - * @throws \Laravel\SerializableClosure\Exceptions\InvalidSignatureException - */ - public function __unserialize($data) - { - if (Signed::$signer && ! $data['serializable'] instanceof Signed) { - throw new InvalidSignatureException(); - } - - $this->serializable = $data['serializable']; - } -} diff --git a/vendor/laravel/serializable-closure/src/Serializers/Native.php b/vendor/laravel/serializable-closure/src/Serializers/Native.php deleted file mode 100644 index 6fe884b..0000000 --- a/vendor/laravel/serializable-closure/src/Serializers/Native.php +++ /dev/null @@ -1,526 +0,0 @@ -closure = $closure; - } - - /** - * Resolve the closure with the given arguments. - * - * @return mixed - */ - public function __invoke() - { - return call_user_func_array($this->closure, func_get_args()); - } - - /** - * Gets the closure. - * - * @return \Closure - */ - public function getClosure() - { - return $this->closure; - } - - /** - * Get the serializable representation of the closure. - * - * @return array - */ - public function __serialize() - { - if ($this->scope === null) { - $this->scope = new ClosureScope(); - $this->scope->toSerialize++; - } - - $this->scope->serializations++; - - $scope = $object = null; - $reflector = $this->getReflector(); - - if ($reflector->isBindingRequired()) { - $object = $reflector->getClosureThis(); - - static::wrapClosures($object, $this->scope); - } - - if ($scope = $reflector->getClosureScopeClass()) { - $scope = $scope->name; - } - - $this->reference = spl_object_hash($this->closure); - - $this->scope[$this->closure] = $this; - - $use = $reflector->getUseVariables(); - - if (static::$transformUseVariables) { - $use = call_user_func(static::$transformUseVariables, $reflector->getUseVariables()); - } - - $code = $reflector->getCode(); - - $this->mapByReference($use); - - $data = [ - 'use' => $use, - 'function' => $code, - 'scope' => $scope, - 'this' => $object, - 'self' => $this->reference, - ]; - - if (! --$this->scope->serializations && ! --$this->scope->toSerialize) { - $this->scope = null; - } - - return $data; - } - - /** - * Restore the closure after serialization. - * - * @param array $data - * @return void - */ - public function __unserialize($data) - { - ClosureStream::register(); - - $this->code = $data; - unset($data); - - $this->code['objects'] = []; - - if ($this->code['use']) { - $this->scope = new ClosureScope(); - - if (static::$resolveUseVariables) { - $this->code['use'] = call_user_func(static::$resolveUseVariables, $this->code['use']); - } - - $this->mapPointers($this->code['use']); - - extract($this->code['use'], EXTR_OVERWRITE | EXTR_REFS); - - $this->scope = null; - } - - $this->closure = include ClosureStream::STREAM_PROTO.'://'.$this->code['function']; - - if ($this->code['this'] === $this) { - $this->code['this'] = null; - } - - $this->closure = $this->closure->bindTo($this->code['this'], $this->code['scope']); - - if (! empty($this->code['objects'])) { - foreach ($this->code['objects'] as $item) { - $item['property']->setValue($item['instance'], $item['object']->getClosure()); - } - } - - $this->code = $this->code['function']; - } - - /** - * Ensures the given closures are serializable. - * - * @param mixed $data - * @param \Laravel\SerializableClosure\Support\ClosureScope $storage - * @return void - */ - public static function wrapClosures(&$data, $storage) - { - if ($data instanceof Closure) { - $data = new static($data); - } elseif (is_array($data)) { - if (isset($data[self::ARRAY_RECURSIVE_KEY])) { - return; - } - - $data[self::ARRAY_RECURSIVE_KEY] = true; - - foreach ($data as $key => &$value) { - if ($key === self::ARRAY_RECURSIVE_KEY) { - continue; - } - static::wrapClosures($value, $storage); - } - - unset($value); - unset($data[self::ARRAY_RECURSIVE_KEY]); - } elseif ($data instanceof \stdClass) { - if (isset($storage[$data])) { - $data = $storage[$data]; - - return; - } - - $data = $storage[$data] = clone $data; - - foreach ($data as &$value) { - static::wrapClosures($value, $storage); - } - - unset($value); - } elseif (is_object($data) && ! $data instanceof static && ! $data instanceof UnitEnum) { - if (isset($storage[$data])) { - $data = $storage[$data]; - - return; - } - - $instance = $data; - $reflection = new ReflectionObject($instance); - - if (! $reflection->isUserDefined()) { - $storage[$instance] = $data; - - return; - } - - $storage[$instance] = $data = $reflection->newInstanceWithoutConstructor(); - - do { - if (! $reflection->isUserDefined()) { - break; - } - - foreach ($reflection->getProperties() as $property) { - if ($property->isStatic() || ! $property->getDeclaringClass()->isUserDefined()) { - continue; - } - - $property->setAccessible(true); - - if (! $property->isInitialized($instance)) { - continue; - } - - $value = $property->getValue($instance); - - if (is_array($value) || is_object($value)) { - static::wrapClosures($value, $storage); - } - - $property->setValue($data, $value); - } - } while ($reflection = $reflection->getParentClass()); - } - } - - /** - * Gets the closure's reflector. - * - * @return \Laravel\SerializableClosure\Support\ReflectionClosure - */ - public function getReflector() - { - if ($this->reflector === null) { - $this->code = null; - $this->reflector = new ReflectionClosure($this->closure); - } - - return $this->reflector; - } - - /** - * Internal method used to map closure pointers. - * - * @param mixed $data - * @return void - */ - protected function mapPointers(&$data) - { - $scope = $this->scope; - - if ($data instanceof static) { - $data = &$data->closure; - } elseif (is_array($data)) { - if (isset($data[self::ARRAY_RECURSIVE_KEY])) { - return; - } - - $data[self::ARRAY_RECURSIVE_KEY] = true; - - foreach ($data as $key => &$value) { - if ($key === self::ARRAY_RECURSIVE_KEY) { - continue; - } elseif ($value instanceof static) { - $data[$key] = &$value->closure; - } elseif ($value instanceof SelfReference && $value->hash === $this->code['self']) { - $data[$key] = &$this->closure; - } else { - $this->mapPointers($value); - } - } - - unset($value); - unset($data[self::ARRAY_RECURSIVE_KEY]); - } elseif ($data instanceof \stdClass) { - if (isset($scope[$data])) { - return; - } - - $scope[$data] = true; - - foreach ($data as $key => &$value) { - if ($value instanceof SelfReference && $value->hash === $this->code['self']) { - $data->{$key} = &$this->closure; - } elseif (is_array($value) || is_object($value)) { - $this->mapPointers($value); - } - } - - unset($value); - } elseif (is_object($data) && ! ($data instanceof Closure)) { - if (isset($scope[$data])) { - return; - } - - $scope[$data] = true; - $reflection = new ReflectionObject($data); - - do { - if (! $reflection->isUserDefined()) { - break; - } - - foreach ($reflection->getProperties() as $property) { - if ($property->isStatic() || ! $property->getDeclaringClass()->isUserDefined()) { - continue; - } - - $property->setAccessible(true); - - if (! $property->isInitialized($data) || $property->isReadOnly()) { - continue; - } - - $item = $property->getValue($data); - - if ($item instanceof SerializableClosure || $item instanceof UnsignedSerializableClosure || ($item instanceof SelfReference && $item->hash === $this->code['self'])) { - $this->code['objects'][] = [ - 'instance' => $data, - 'property' => $property, - 'object' => $item instanceof SelfReference ? $this : $item, - ]; - } elseif (is_array($item) || is_object($item)) { - $this->mapPointers($item); - $property->setValue($data, $item); - } - } - } while ($reflection = $reflection->getParentClass()); - } - } - - /** - * Internal method used to map closures by reference. - * - * @param mixed $data - * @return void - */ - protected function mapByReference(&$data) - { - if ($data instanceof Closure) { - if ($data === $this->closure) { - $data = new SelfReference($this->reference); - - return; - } - - if (isset($this->scope[$data])) { - $data = $this->scope[$data]; - - return; - } - - $instance = new static($data); - - $instance->scope = $this->scope; - - $data = $this->scope[$data] = $instance; - } elseif (is_array($data)) { - if (isset($data[self::ARRAY_RECURSIVE_KEY])) { - return; - } - - $data[self::ARRAY_RECURSIVE_KEY] = true; - - foreach ($data as $key => &$value) { - if ($key === self::ARRAY_RECURSIVE_KEY) { - continue; - } - - $this->mapByReference($value); - } - - unset($value); - unset($data[self::ARRAY_RECURSIVE_KEY]); - } elseif ($data instanceof \stdClass) { - if (isset($this->scope[$data])) { - $data = $this->scope[$data]; - - return; - } - - $instance = $data; - $this->scope[$instance] = $data = clone $data; - - foreach ($data as &$value) { - $this->mapByReference($value); - } - - unset($value); - } elseif (is_object($data) && ! $data instanceof SerializableClosure && ! $data instanceof UnsignedSerializableClosure) { - if (isset($this->scope[$data])) { - $data = $this->scope[$data]; - - return; - } - - $instance = $data; - - if ($data instanceof DateTimeInterface) { - $this->scope[$instance] = $data; - - return; - } - - if ($data instanceof UnitEnum) { - $this->scope[$instance] = $data; - - return; - } - - $reflection = new ReflectionObject($data); - - if (! $reflection->isUserDefined()) { - $this->scope[$instance] = $data; - - return; - } - - $this->scope[$instance] = $data = $reflection->newInstanceWithoutConstructor(); - - do { - if (! $reflection->isUserDefined()) { - break; - } - - foreach ($reflection->getProperties() as $property) { - if ($property->isStatic() || ! $property->getDeclaringClass()->isUserDefined() || $this->isVirtualProperty($property)) { - continue; - } - - $property->setAccessible(true); - - if (! $property->isInitialized($instance) || ($property->isReadOnly() && $property->class !== $reflection->name)) { - continue; - } - - $value = $property->getValue($instance); - - if (is_array($value) || is_object($value)) { - $this->mapByReference($value); - } - - $property->setValue($data, $value); - } - } while ($reflection = $reflection->getParentClass()); - } - } - - /** - * Determine is virtual property. - * - * @param \ReflectionProperty $property - * @return bool - */ - protected function isVirtualProperty(ReflectionProperty $property): bool - { - return method_exists($property, 'isVirtual') && $property->isVirtual(); - } -} diff --git a/vendor/laravel/serializable-closure/src/Serializers/Signed.php b/vendor/laravel/serializable-closure/src/Serializers/Signed.php deleted file mode 100644 index 16f9593..0000000 --- a/vendor/laravel/serializable-closure/src/Serializers/Signed.php +++ /dev/null @@ -1,91 +0,0 @@ -closure = $closure; - } - - /** - * Resolve the closure with the given arguments. - * - * @return mixed - */ - public function __invoke() - { - return call_user_func_array($this->closure, func_get_args()); - } - - /** - * Gets the closure. - * - * @return \Closure - */ - public function getClosure() - { - return $this->closure; - } - - /** - * Get the serializable representation of the closure. - * - * @return array - */ - public function __serialize() - { - if (! static::$signer) { - throw new MissingSecretKeyException(); - } - - return static::$signer->sign( - serialize(new Native($this->closure)) - ); - } - - /** - * Restore the closure after serialization. - * - * @param array{serializable: string, hash: string} $signature - * @return void - * - * @throws \Laravel\SerializableClosure\Exceptions\InvalidSignatureException - */ - public function __unserialize($signature) - { - if (static::$signer && ! static::$signer->verify($signature)) { - throw new InvalidSignatureException(); - } - - /** @var \Laravel\SerializableClosure\Contracts\Serializable $serializable */ - $serializable = unserialize($signature['serializable']); - - $this->closure = $serializable->getClosure(); - } -} diff --git a/vendor/laravel/serializable-closure/src/Signers/Hmac.php b/vendor/laravel/serializable-closure/src/Signers/Hmac.php deleted file mode 100644 index 41ed01a..0000000 --- a/vendor/laravel/serializable-closure/src/Signers/Hmac.php +++ /dev/null @@ -1,53 +0,0 @@ -secret = $secret; - } - - /** - * Sign the given serializable. - * - * @param string $serialized - * @return array - */ - public function sign($serialized) - { - return [ - 'serializable' => $serialized, - 'hash' => base64_encode(hash_hmac('sha256', $serialized, $this->secret, true)), - ]; - } - - /** - * Verify the given signature. - * - * @param array{serializable: string, hash: string} $signature - * @return bool - */ - public function verify($signature) - { - return hash_equals(base64_encode( - hash_hmac('sha256', $signature['serializable'], $this->secret, true) - ), $signature['hash']); - } -} diff --git a/vendor/laravel/serializable-closure/src/Support/ClosureScope.php b/vendor/laravel/serializable-closure/src/Support/ClosureScope.php deleted file mode 100644 index 64ca19a..0000000 --- a/vendor/laravel/serializable-closure/src/Support/ClosureScope.php +++ /dev/null @@ -1,22 +0,0 @@ -content = "length = strlen($this->content); - - return true; - } - - /** - * Read from stream. - * - * @param int $count - * @return string - */ - public function stream_read($count) - { - $value = substr($this->content, $this->pointer, $count); - - $this->pointer += $count; - - return $value; - } - - /** - * Tests for end-of-file on a file pointer. - * - * @return bool - */ - public function stream_eof() - { - return $this->pointer >= $this->length; - } - - /** - * Change stream options. - * - * @param int $option - * @param int $arg1 - * @param int $arg2 - * @return bool - */ - public function stream_set_option($option, $arg1, $arg2) - { - return false; - } - - /** - * Retrieve information about a file resource. - * - * @return array|bool - */ - public function stream_stat() - { - $stat = stat(__FILE__); - // @phpstan-ignore-next-line - $stat[7] = $stat['size'] = $this->length; - - return $stat; - } - - /** - * Retrieve information about a file. - * - * @param string $path - * @param int $flags - * @return array|bool - */ - public function url_stat($path, $flags) - { - $stat = stat(__FILE__); - // @phpstan-ignore-next-line - $stat[7] = $stat['size'] = $this->length; - - return $stat; - } - - /** - * Seeks to specific location in a stream. - * - * @param int $offset - * @param int $whence - * @return bool - */ - public function stream_seek($offset, $whence = SEEK_SET) - { - $crt = $this->pointer; - - switch ($whence) { - case SEEK_SET: - $this->pointer = $offset; - break; - case SEEK_CUR: - $this->pointer += $offset; - break; - case SEEK_END: - $this->pointer = $this->length + $offset; - break; - } - - if ($this->pointer < 0 || $this->pointer >= $this->length) { - $this->pointer = $crt; - - return false; - } - - return true; - } - - /** - * Retrieve the current position of a stream. - * - * @return int - */ - public function stream_tell() - { - return $this->pointer; - } - - /** - * Registers the stream. - * - * @return void - */ - public static function register() - { - if (! static::$isRegistered) { - static::$isRegistered = stream_wrapper_register(static::STREAM_PROTO, __CLASS__); - } - } -} diff --git a/vendor/laravel/serializable-closure/src/Support/ReflectionClosure.php b/vendor/laravel/serializable-closure/src/Support/ReflectionClosure.php deleted file mode 100644 index 8bf13ac..0000000 --- a/vendor/laravel/serializable-closure/src/Support/ReflectionClosure.php +++ /dev/null @@ -1,1184 +0,0 @@ -isStaticClosure === null) { - $this->isStaticClosure = strtolower(substr($this->getCode(), 0, 6)) === 'static'; - } - - return $this->isStaticClosure; - } - - /** - * Checks if the closure is a "short closure". - * - * @return bool - */ - public function isShortClosure() - { - if ($this->isShortClosure === null) { - $code = $this->getCode(); - - if ($this->isStatic()) { - $code = substr($code, 6); - } - - $this->isShortClosure = strtolower(substr(trim($code), 0, 2)) === 'fn'; - } - - return $this->isShortClosure; - } - - /** - * Get the closure's code. - * - * @return string - */ - public function getCode() - { - if ($this->code !== null) { - return $this->code; - } - - $fileName = $this->getFileName(); - $line = $this->getStartLine() - 1; - - $className = null; - - if (null !== $className = $this->getClosureScopeClass()) { - $className = '\\'.trim($className->getName(), '\\'); - } - - $builtin_types = self::getBuiltinTypes(); - $class_keywords = ['self', 'static', 'parent']; - - $ns = $this->getClosureNamespaceName(); - $nsf = $ns == '' ? '' : ($ns[0] == '\\' ? $ns : '\\'.$ns); - - $_file = var_export($fileName, true); - $_dir = var_export(dirname($fileName), true); - $_namespace = var_export($ns, true); - $_class = var_export(trim($className ?: '', '\\'), true); - $_function = $ns.($ns == '' ? '' : '\\').'{closure}'; - $_method = ($className == '' ? '' : trim($className, '\\').'::').$_function; - $_function = var_export($_function, true); - $_method = var_export($_method, true); - $_trait = null; - - $tokens = $this->getTokens(); - $state = $lastState = 'start'; - $inside_structure = false; - $isFirstClassCallable = false; - $isShortClosure = false; - - $inside_structure_mark = 0; - $open = 0; - $code = ''; - $id_start = $id_start_ci = $id_name = $context = ''; - $classes = $functions = $constants = null; - $use = []; - $lineAdd = 0; - $isUsingScope = false; - $isUsingThisObject = false; - - for ($i = 0, $l = count($tokens); $i < $l; $i++) { - $token = $tokens[$i]; - - switch ($state) { - case 'start': - if ($token[0] === T_FUNCTION || $token[0] === T_STATIC) { - $code .= $token[1]; - - $state = $token[0] === T_FUNCTION ? 'function' : 'static'; - } elseif ($token[0] === T_FN) { - $isShortClosure = true; - $code .= $token[1]; - $state = 'closure_args'; - } elseif ($token[0] === T_PUBLIC || $token[0] === T_PROTECTED || $token[0] === T_PRIVATE) { - $code = ''; - $isFirstClassCallable = true; - } - break; - case 'static': - if ($token[0] === T_WHITESPACE || $token[0] === T_COMMENT || $token[0] === T_FUNCTION) { - $code .= $token[1]; - if ($token[0] === T_FUNCTION) { - $state = 'function'; - } - } elseif ($token[0] === T_FN) { - $isShortClosure = true; - $code .= $token[1]; - $state = 'closure_args'; - } else { - $code = ''; - $state = 'start'; - } - break; - case 'function': - switch ($token[0]) { - case T_STRING: - if ($isFirstClassCallable) { - $state = 'closure_args'; - break; - } - - $code = ''; - $state = 'named_function'; - break; - case '(': - $code .= '('; - $state = 'closure_args'; - break; - default: - $code .= is_array($token) ? $token[1] : $token; - } - break; - case 'named_function': - if ($token[0] === T_FUNCTION || $token[0] === T_STATIC) { - $code = $token[1]; - $state = $token[0] === T_FUNCTION ? 'function' : 'static'; - } elseif ($token[0] === T_FN) { - $isShortClosure = true; - $code .= $token[1]; - $state = 'closure_args'; - } - break; - case 'closure_args': - switch ($token[0]) { - case T_NAME_QUALIFIED: - [$id_start, $id_start_ci, $id_name] = $this->parseNameQualified($token[1]); - $context = 'args'; - $state = 'id_name'; - $lastState = 'closure_args'; - break; - case T_NS_SEPARATOR: - case T_STRING: - $id_start = $token[1]; - $id_start_ci = strtolower($id_start); - $id_name = ''; - $context = 'args'; - $state = 'id_name'; - $lastState = 'closure_args'; - break; - case T_USE: - $code .= $token[1]; - $state = 'use'; - break; - case T_DOUBLE_ARROW: - $code .= $token[1]; - if ($isShortClosure) { - $state = 'closure'; - } - break; - case ':': - $code .= ':'; - $state = 'return'; - break; - case '{': - $code .= '{'; - $state = 'closure'; - $open++; - break; - default: - $code .= is_array($token) ? $token[1] : $token; - } - break; - case 'use': - switch ($token[0]) { - case T_VARIABLE: - $use[] = substr($token[1], 1); - $code .= $token[1]; - break; - case '{': - $code .= '{'; - $state = 'closure'; - $open++; - break; - case ':': - $code .= ':'; - $state = 'return'; - break; - default: - $code .= is_array($token) ? $token[1] : $token; - break; - } - break; - case 'return': - switch ($token[0]) { - case T_WHITESPACE: - case T_COMMENT: - case T_DOC_COMMENT: - $code .= $token[1]; - break; - case T_NS_SEPARATOR: - case T_STRING: - $id_start = $token[1]; - $id_start_ci = strtolower($id_start); - $id_name = ''; - $context = 'return_type'; - $state = 'id_name'; - $lastState = 'return'; - break 2; - case T_NAME_QUALIFIED: - [$id_start, $id_start_ci, $id_name] = $this->parseNameQualified($token[1]); - $context = 'return_type'; - $state = 'id_name'; - $lastState = 'return'; - break 2; - case T_DOUBLE_ARROW: - $code .= $token[1]; - if ($isShortClosure) { - $state = 'closure'; - } - break; - case '{': - $code .= '{'; - $state = 'closure'; - $open++; - break; - default: - $code .= is_array($token) ? $token[1] : $token; - break; - } - break; - case 'closure': - switch ($token[0]) { - case T_CURLY_OPEN: - case T_DOLLAR_OPEN_CURLY_BRACES: - case '{': - $code .= is_array($token) ? $token[1] : $token; - $open++; - break; - case '}': - $code .= '}'; - if (--$open === 0 && ! $isShortClosure) { - break 3; - } elseif ($inside_structure) { - $inside_structure = ! ($open === $inside_structure_mark); - } - break; - case '(': - case '[': - $code .= $token[0]; - if ($isShortClosure) { - $open++; - } - break; - case ')': - case ']': - if ($isShortClosure) { - if ($open === 0) { - break 3; - } - $open--; - } - $code .= $token[0]; - break; - case ',': - case ';': - if ($isShortClosure && $open === 0) { - break 3; - } - $code .= $token[0]; - break; - case T_LINE: - $code .= $token[2] - $line + $lineAdd; - break; - case T_FILE: - $code .= $_file; - break; - case T_DIR: - $code .= $_dir; - break; - case T_NS_C: - $code .= $_namespace; - break; - case T_CLASS_C: - $code .= $inside_structure ? $token[1] : $_class; - break; - case T_FUNC_C: - $code .= $inside_structure ? $token[1] : $_function; - break; - case T_METHOD_C: - $code .= $inside_structure ? $token[1] : $_method; - break; - case T_COMMENT: - if (substr($token[1], 0, 8) === '#trackme') { - $timestamp = time(); - $code .= '/**'.PHP_EOL; - $code .= '* Date : '.date(DATE_W3C, $timestamp).PHP_EOL; - $code .= '* Timestamp : '.$timestamp.PHP_EOL; - $code .= '* Line : '.($line + 1).PHP_EOL; - $code .= '* File : '.$_file.PHP_EOL.'*/'.PHP_EOL; - $lineAdd += 5; - } else { - $code .= $token[1]; - } - break; - case T_VARIABLE: - if ($token[1] == '$this' && ! $inside_structure) { - $isUsingThisObject = true; - } - $code .= $token[1]; - break; - case T_STATIC: - case T_NS_SEPARATOR: - case T_STRING: - $id_start = $token[1]; - $id_start_ci = strtolower($id_start); - $id_name = ''; - $context = 'root'; - $state = 'id_name'; - $lastState = 'closure'; - break 2; - case T_NAME_QUALIFIED: - [$id_start, $id_start_ci, $id_name] = $this->parseNameQualified($token[1]); - $context = 'root'; - $state = 'id_name'; - $lastState = 'closure'; - break 2; - case T_NEW: - $code .= $token[1]; - $context = 'new'; - $state = 'id_start'; - $lastState = 'closure'; - break 2; - case T_USE: - $code .= $token[1]; - $context = 'use'; - $state = 'id_start'; - $lastState = 'closure'; - break; - case T_INSTANCEOF: - case T_INSTEADOF: - $code .= $token[1]; - $context = 'instanceof'; - $state = 'id_start'; - $lastState = 'closure'; - break; - case T_OBJECT_OPERATOR: - case T_NULLSAFE_OBJECT_OPERATOR: - case T_DOUBLE_COLON: - $code .= $token[1]; - $lastState = 'closure'; - $state = 'ignore_next'; - break; - case T_FUNCTION: - $code .= $token[1]; - $state = 'closure_args'; - if (! $inside_structure) { - $inside_structure = true; - $inside_structure_mark = $open; - } - break; - case T_TRAIT_C: - if ($_trait === null) { - $startLine = $this->getStartLine(); - $endLine = $this->getEndLine(); - $structures = $this->getStructures(); - - $_trait = ''; - - foreach ($structures as &$struct) { - if ($struct['type'] === 'trait' && - $struct['start'] <= $startLine && - $struct['end'] >= $endLine - ) { - $_trait = ($ns == '' ? '' : $ns.'\\').$struct['name']; - break; - } - } - - $_trait = var_export($_trait, true); - } - - $code .= $_trait; - break; - default: - $code .= is_array($token) ? $token[1] : $token; - } - break; - case 'ignore_next': - switch ($token[0]) { - case T_WHITESPACE: - case T_COMMENT: - case T_DOC_COMMENT: - $code .= $token[1]; - break; - case T_CLASS: - case T_NEW: - case T_STATIC: - case T_VARIABLE: - case T_STRING: - case T_CLASS_C: - case T_FILE: - case T_DIR: - case T_METHOD_C: - case T_FUNC_C: - case T_FUNCTION: - case T_INSTANCEOF: - case T_LINE: - case T_NS_C: - case T_TRAIT_C: - case T_USE: - $code .= $token[1]; - $state = $lastState; - break; - default: - $state = $lastState; - $i--; - } - break; - case 'id_start': - switch ($token[0]) { - case T_WHITESPACE: - case T_COMMENT: - case T_DOC_COMMENT: - $code .= $token[1]; - break; - case T_NS_SEPARATOR: - case T_NAME_FULLY_QUALIFIED: - case T_STRING: - case T_STATIC: - $id_start = $token[1]; - $id_start_ci = strtolower($id_start); - $id_name = ''; - $state = 'id_name'; - break 2; - case T_NAME_QUALIFIED: - [$id_start, $id_start_ci, $id_name] = $this->parseNameQualified($token[1]); - $state = 'id_name'; - break 2; - case T_VARIABLE: - $code .= $token[1]; - $state = $lastState; - break; - case T_CLASS: - $code .= $token[1]; - $state = 'anonymous'; - break; - default: - $i--; //reprocess last - $state = 'id_name'; - } - break; - case 'id_name': - switch ($token[0]) { - case $token[0] === ':' && ! in_array($context, ['instanceof', 'new'], true): - if ($lastState === 'closure' && $context === 'root') { - $state = 'closure'; - $code .= $id_start.$token; - } - - break; - case T_NAME_QUALIFIED: - case T_NS_SEPARATOR: - case T_STRING: - case T_WHITESPACE: - case T_COMMENT: - case T_DOC_COMMENT: - $id_name .= $token[1]; - break; - case '(': - if ($isShortClosure) { - $open++; - } - if ($context === 'new' || false !== strpos($id_name, '\\')) { - if ($id_start_ci === 'self' || $id_start_ci === 'static') { - if (! $inside_structure) { - $isUsingScope = true; - } - } elseif ($id_start !== '\\' && ! in_array($id_start_ci, $class_keywords)) { - if ($classes === null) { - $classes = $this->getClasses(); - } - if (isset($classes[$id_start_ci])) { - $id_start = $classes[$id_start_ci]; - } - if ($id_start[0] !== '\\') { - $id_start = $nsf.'\\'.$id_start; - } - } - } else { - if ($id_start !== '\\') { - if ($functions === null) { - $functions = $this->getFunctions(); - } - if (isset($functions[$id_start_ci])) { - $id_start = $functions[$id_start_ci]; - } elseif ($nsf !== '\\' && function_exists($nsf.'\\'.$id_start)) { - $id_start = $nsf.'\\'.$id_start; - // Cache it to functions array - $functions[$id_start_ci] = $id_start; - } - } - } - $code .= $id_start.$id_name.'('; - $state = $lastState; - break; - case T_VARIABLE: - case T_DOUBLE_COLON: - if ($id_start !== '\\') { - if ($id_start_ci === 'self' || $id_start_ci === 'parent') { - if (! $inside_structure) { - $isUsingScope = true; - } - } elseif ($id_start_ci === 'static') { - if (! $inside_structure) { - $isUsingScope = $token[0] === T_DOUBLE_COLON; - } - } elseif (! (\PHP_MAJOR_VERSION >= 7 && in_array($id_start_ci, $builtin_types))) { - if ($classes === null) { - $classes = $this->getClasses(); - } - if (isset($classes[$id_start_ci])) { - $id_start = $classes[$id_start_ci]; - } - if ($id_start[0] !== '\\') { - $id_start = $nsf.'\\'.$id_start; - } - } - } - - $code .= $id_start.$id_name.$token[1]; - $state = $token[0] === T_DOUBLE_COLON ? 'ignore_next' : $lastState; - break; - default: - if ($id_start !== '\\' && ! defined($id_start)) { - if ($constants === null) { - $constants = $this->getConstants(); - } - if (isset($constants[$id_start])) { - $id_start = $constants[$id_start]; - } elseif ($context === 'new') { - if (in_array($id_start_ci, $class_keywords)) { - if (! $inside_structure) { - $isUsingScope = true; - } - } else { - if ($classes === null) { - $classes = $this->getClasses(); - } - if (isset($classes[$id_start_ci])) { - $id_start = $classes[$id_start_ci]; - } - if ($id_start[0] !== '\\') { - $id_start = $nsf.'\\'.$id_start; - } - } - } elseif ($context === 'use' || - $context === 'instanceof' || - $context === 'args' || - $context === 'return_type' || - $context === 'extends' || - $context === 'root' - ) { - if (in_array($id_start_ci, $class_keywords)) { - if (! $inside_structure && ! $id_start_ci === 'static') { - $isUsingScope = true; - } - } elseif (! (\PHP_MAJOR_VERSION >= 7 && in_array($id_start_ci, $builtin_types))) { - if ($classes === null) { - $classes = $this->getClasses(); - } - if (isset($classes[$id_start_ci])) { - $id_start = $classes[$id_start_ci]; - } - if ($id_start[0] !== '\\') { - $id_start = $nsf.'\\'.$id_start; - } - } - } - } - $code .= $id_start.$id_name; - $state = $lastState; - $i--; //reprocess last token - } - break; - case 'anonymous': - switch ($token[0]) { - case T_NAME_QUALIFIED: - [$id_start, $id_start_ci, $id_name] = $this->parseNameQualified($token[1]); - $state = 'id_name'; - $lastState = 'anonymous'; - break 2; - case T_NS_SEPARATOR: - case T_STRING: - $id_start = $token[1]; - $id_start_ci = strtolower($id_start); - $id_name = ''; - $state = 'id_name'; - $context = 'extends'; - $lastState = 'anonymous'; - break; - case '{': - $state = 'closure'; - if (! $inside_structure) { - $inside_structure = true; - $inside_structure_mark = $open; - } - $i--; - break; - default: - $code .= is_array($token) ? $token[1] : $token; - } - break; - } - } - - if ($isShortClosure) { - $this->useVariables = $this->getStaticVariables(); - } else { - $this->useVariables = empty($use) ? $use : array_intersect_key($this->getStaticVariables(), array_flip($use)); - } - - $this->isShortClosure = $isShortClosure; - $this->isBindingRequired = $isUsingThisObject; - $this->isScopeRequired = $isUsingScope; - - $attributesCode = array_map(function ($attribute) { - $arguments = $attribute->getArguments(); - - $name = $attribute->getName(); - $arguments = implode(', ', array_map(function ($argument, $key) { - $argument = sprintf("'%s'", str_replace("'", "\\'", $argument)); - - if (is_string($key)) { - $argument = sprintf('%s: %s', $key, $argument); - } - - return $argument; - }, $arguments, array_keys($arguments))); - - return "#[$name($arguments)]"; - }, $this->getAttributes()); - - if (! empty($attributesCode)) { - $code = implode("\n", array_merge($attributesCode, [$code])); - } - - $this->code = $code; - - return $this->code; - } - - /** - * Get PHP native built in types. - * - * @return array - */ - protected static function getBuiltinTypes() - { - return ['array', 'callable', 'string', 'int', 'bool', 'float', 'iterable', 'void', 'object', 'mixed', 'false', 'null', 'never']; - } - - /** - * Gets the use variables by the closure. - * - * @return array - */ - public function getUseVariables() - { - if ($this->useVariables !== null) { - return $this->useVariables; - } - - $tokens = $this->getTokens(); - $use = []; - $state = 'start'; - - foreach ($tokens as &$token) { - $is_array = is_array($token); - - switch ($state) { - case 'start': - if ($is_array && $token[0] === T_USE) { - $state = 'use'; - } - break; - case 'use': - if ($is_array) { - if ($token[0] === T_VARIABLE) { - $use[] = substr($token[1], 1); - } - } elseif ($token == ')') { - break 2; - } - break; - } - } - - $this->useVariables = empty($use) ? $use : array_intersect_key($this->getStaticVariables(), array_flip($use)); - - return $this->useVariables; - } - - /** - * Checks if binding is required. - * - * @return bool - */ - public function isBindingRequired() - { - if ($this->isBindingRequired === null) { - $this->getCode(); - } - - return $this->isBindingRequired; - } - - /** - * Checks if access to the scope is required. - * - * @return bool - */ - public function isScopeRequired() - { - if ($this->isScopeRequired === null) { - $this->getCode(); - } - - return $this->isScopeRequired; - } - - /** - * The hash of the current file name. - * - * @return string - */ - protected function getHashedFileName() - { - if ($this->hashedName === null) { - $this->hashedName = sha1($this->getFileName()); - } - - return $this->hashedName; - } - - /** - * Get the file tokens. - * - * @return array - */ - protected function getFileTokens() - { - $key = $this->getHashedFileName(); - - if (! isset(static::$files[$key])) { - static::$files[$key] = token_get_all(file_get_contents($this->getFileName())); - } - - return static::$files[$key]; - } - - /** - * Get the tokens. - * - * @return array - */ - protected function getTokens() - { - if ($this->tokens === null) { - $tokens = $this->getFileTokens(); - $startLine = $this->getStartLine(); - $endLine = $this->getEndLine(); - $results = []; - $start = false; - - foreach ($tokens as &$token) { - if (! is_array($token)) { - if ($start) { - $results[] = $token; - } - - continue; - } - - $line = $token[2]; - - if ($line <= $endLine) { - if ($line >= $startLine) { - $start = true; - $results[] = $token; - } - - continue; - } - - break; - } - - $this->tokens = $results; - } - - return $this->tokens; - } - - /** - * Get the classes. - * - * @return array - */ - protected function getClasses() - { - $key = $this->getHashedFileName(); - - if (! isset(static::$classes[$key])) { - $this->fetchItems(); - } - - return static::$classes[$key]; - } - - /** - * Get the functions. - * - * @return array - */ - protected function getFunctions() - { - $key = $this->getHashedFileName(); - - if (! isset(static::$functions[$key])) { - $this->fetchItems(); - } - - return static::$functions[$key]; - } - - /** - * Gets the constants. - * - * @return array - */ - protected function getConstants() - { - $key = $this->getHashedFileName(); - - if (! isset(static::$constants[$key])) { - $this->fetchItems(); - } - - return static::$constants[$key]; - } - - /** - * Get the structures. - * - * @return array - */ - protected function getStructures() - { - $key = $this->getHashedFileName(); - - if (! isset(static::$structures[$key])) { - $this->fetchItems(); - } - - return static::$structures[$key]; - } - - /** - * Fetch the items. - * - * @return void. - */ - protected function fetchItems() - { - $key = $this->getHashedFileName(); - - $classes = []; - $functions = []; - $constants = []; - $structures = []; - $tokens = $this->getFileTokens(); - - $open = 0; - $state = 'start'; - $lastState = ''; - $prefix = ''; - $name = ''; - $alias = ''; - $isFunc = $isConst = false; - - $startLine = $endLine = 0; - $structType = $structName = ''; - $structIgnore = false; - - foreach ($tokens as $token) { - switch ($state) { - case 'start': - switch ($token[0]) { - case T_CLASS: - case T_INTERFACE: - case T_TRAIT: - $state = 'before_structure'; - $startLine = $token[2]; - $structType = $token[0] == T_CLASS - ? 'class' - : ($token[0] == T_INTERFACE ? 'interface' : 'trait'); - break; - case T_USE: - $state = 'use'; - $prefix = $name = $alias = ''; - $isFunc = $isConst = false; - break; - case T_FUNCTION: - $state = 'structure'; - $structIgnore = true; - break; - case T_NEW: - $state = 'new'; - break; - case T_OBJECT_OPERATOR: - case T_DOUBLE_COLON: - $state = 'invoke'; - break; - } - break; - case 'use': - switch ($token[0]) { - case T_FUNCTION: - $isFunc = true; - break; - case T_CONST: - $isConst = true; - break; - case T_NS_SEPARATOR: - $name .= $token[1]; - break; - case T_STRING: - $name .= $token[1]; - $alias = $token[1]; - break; - case T_NAME_QUALIFIED: - $name .= $token[1]; - $pieces = explode('\\', $token[1]); - $alias = end($pieces); - break; - case T_AS: - $lastState = 'use'; - $state = 'alias'; - break; - case '{': - $prefix = $name; - $name = $alias = ''; - $state = 'use-group'; - break; - case ',': - case ';': - if ($name === '' || $name[0] !== '\\') { - $name = '\\'.$name; - } - - if ($alias !== '') { - if ($isFunc) { - $functions[strtolower($alias)] = $name; - } elseif ($isConst) { - $constants[$alias] = $name; - } else { - $classes[strtolower($alias)] = $name; - } - } - $name = $alias = ''; - $state = $token === ';' ? 'start' : 'use'; - break; - } - break; - case 'use-group': - switch ($token[0]) { - case T_NS_SEPARATOR: - $name .= $token[1]; - break; - case T_NAME_QUALIFIED: - $name .= $token[1]; - $pieces = explode('\\', $token[1]); - $alias = end($pieces); - break; - case T_STRING: - $name .= $token[1]; - $alias = $token[1]; - break; - case T_AS: - $lastState = 'use-group'; - $state = 'alias'; - break; - case ',': - case '}': - - if ($prefix === '' || $prefix[0] !== '\\') { - $prefix = '\\'.$prefix; - } - - if ($alias !== '') { - if ($isFunc) { - $functions[strtolower($alias)] = $prefix.$name; - } elseif ($isConst) { - $constants[$alias] = $prefix.$name; - } else { - $classes[strtolower($alias)] = $prefix.$name; - } - } - $name = $alias = ''; - $state = $token === '}' ? 'use' : 'use-group'; - break; - } - break; - case 'alias': - if ($token[0] === T_STRING) { - $alias = $token[1]; - $state = $lastState; - } - break; - case 'new': - switch ($token[0]) { - case T_WHITESPACE: - case T_COMMENT: - case T_DOC_COMMENT: - break 2; - case T_CLASS: - $state = 'structure'; - $structIgnore = true; - break; - default: - $state = 'start'; - } - break; - case 'invoke': - switch ($token[0]) { - case T_WHITESPACE: - case T_COMMENT: - case T_DOC_COMMENT: - break 2; - default: - $state = 'start'; - } - break; - case 'before_structure': - if ($token[0] == T_STRING) { - $structName = $token[1]; - $state = 'structure'; - } - break; - case 'structure': - switch ($token[0]) { - case '{': - case T_CURLY_OPEN: - case T_DOLLAR_OPEN_CURLY_BRACES: - $open++; - break; - case '}': - if (--$open == 0) { - if (! $structIgnore) { - $structures[] = [ - 'type' => $structType, - 'name' => $structName, - 'start' => $startLine, - 'end' => $endLine, - ]; - } - $structIgnore = false; - $state = 'start'; - } - break; - default: - if (is_array($token)) { - $endLine = $token[2]; - } - } - break; - } - } - - static::$classes[$key] = $classes; - static::$functions[$key] = $functions; - static::$constants[$key] = $constants; - static::$structures[$key] = $structures; - } - - /** - * Returns the namespace associated to the closure. - * - * @return string - */ - protected function getClosureNamespaceName() - { - $ns = $this->getNamespaceName(); - - $name = $this->getName(); - - // First class callables... - if ($name !== '{closure}' - && ! str_contains($name, '{closure:/') - && ! str_contains($name, '{closure:\\') - && empty($ns) - && ! is_null($this->getClosureScopeClass())) { - $ns = $this->getClosureScopeClass()->getNamespaceName(); - } - - return $ns; - } - - /** - * Parse the given token. - * - * @param string $token - * @return array - */ - protected function parseNameQualified($token) - { - $pieces = explode('\\', $token); - - $id_start = array_shift($pieces); - - $id_start_ci = strtolower($id_start); - - $id_name = '\\'.implode('\\', $pieces); - - return [$id_start, $id_start_ci, $id_name]; - } -} diff --git a/vendor/laravel/serializable-closure/src/Support/SelfReference.php b/vendor/laravel/serializable-closure/src/Support/SelfReference.php deleted file mode 100644 index 5831950..0000000 --- a/vendor/laravel/serializable-closure/src/Support/SelfReference.php +++ /dev/null @@ -1,24 +0,0 @@ -hash = $hash; - } -} diff --git a/vendor/laravel/serializable-closure/src/UnsignedSerializableClosure.php b/vendor/laravel/serializable-closure/src/UnsignedSerializableClosure.php deleted file mode 100644 index afc2127..0000000 --- a/vendor/laravel/serializable-closure/src/UnsignedSerializableClosure.php +++ /dev/null @@ -1,69 +0,0 @@ -serializable = new Serializers\Native($closure); - } - - /** - * Resolve the closure with the given arguments. - * - * @return mixed - */ - public function __invoke() - { - return call_user_func_array($this->serializable, func_get_args()); - } - - /** - * Gets the closure. - * - * @return \Closure - */ - public function getClosure() - { - return $this->serializable->getClosure(); - } - - /** - * Get the serializable representation of the closure. - * - * @return array{serializable: \Laravel\SerializableClosure\Contracts\Serializable} - */ - public function __serialize() - { - return [ - 'serializable' => $this->serializable, - ]; - } - - /** - * Restore the closure after serialization. - * - * @param array{serializable: \Laravel\SerializableClosure\Contracts\Serializable} $data - * @return void - */ - public function __unserialize($data) - { - $this->serializable = $data['serializable']; - } -} diff --git a/vendor/nesbot/carbon/.phpstorm.meta.php b/vendor/nesbot/carbon/.phpstorm.meta.php deleted file mode 100644 index bd7c7e0..0000000 --- a/vendor/nesbot/carbon/.phpstorm.meta.php +++ /dev/null @@ -1,10 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\MessageFormatter; - -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; - -if (!class_exists(LazyMessageFormatter::class, false)) { - abstract class LazyMessageFormatter implements MessageFormatterInterface - { - public function format(string $message, string $locale, array $parameters = []): string - { - return $this->formatter->format( - $message, - $this->transformLocale($locale), - $parameters - ); - } - } -} diff --git a/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php b/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php deleted file mode 100644 index cbd890d..0000000 --- a/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\MessageFormatter; - -use Symfony\Component\Translation\Formatter\ChoiceMessageFormatterInterface; -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; - -if (!class_exists(LazyMessageFormatter::class, false)) { - abstract class LazyMessageFormatter implements MessageFormatterInterface, ChoiceMessageFormatterInterface - { - abstract protected function transformLocale(?string $locale): ?string; - - public function format($message, $locale, array $parameters = []) - { - return $this->formatter->format( - $message, - $this->transformLocale($locale), - $parameters - ); - } - - public function choiceFormat($message, $number, $locale, array $parameters = []) - { - return $this->formatter->choiceFormat($message, $number, $locale, $parameters); - } - } -} diff --git a/vendor/nesbot/carbon/lazy/Carbon/ProtectedDatePeriod.php b/vendor/nesbot/carbon/lazy/Carbon/ProtectedDatePeriod.php deleted file mode 100644 index 927e48d..0000000 --- a/vendor/nesbot/carbon/lazy/Carbon/ProtectedDatePeriod.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use DatePeriod; - -if (!class_exists(DatePeriodBase::class, false)) { - class DatePeriodBase extends DatePeriod - { - /** - * Period start in PHP < 8.2. - * - * @var CarbonInterface - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period start. - */ - protected $start; - - /** - * Period end in PHP < 8.2. - * - * @var CarbonInterface|null - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period end. - */ - protected $end; - - /** - * Period current iterated date in PHP < 8.2. - * - * @var CarbonInterface|null - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period current iterated date. - */ - protected $current; - - /** - * Period interval in PHP < 8.2. - * - * @var CarbonInterval|null - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period interval. - */ - protected $interval; - - /** - * Period recurrences in PHP < 8.2. - * - * @var int|float|null - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period recurrences. - */ - protected $recurrences; - - /** - * Period start included option in PHP < 8.2. - * - * @var bool - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period start included option. - */ - protected $include_start_date; - } -} diff --git a/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php b/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php deleted file mode 100644 index d35308a..0000000 --- a/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Symfony\Component\Translation\MessageCatalogueInterface; - -if (!class_exists(LazyTranslator::class, false)) { - class LazyTranslator extends AbstractTranslator implements TranslatorStrongTypeInterface - { - public function trans(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string - { - return $this->translate($id, $parameters, $domain, $locale); - } - - public function getFromCatalogue(MessageCatalogueInterface $catalogue, string $id, string $domain = 'messages') - { - $messages = $this->getPrivateProperty($catalogue, 'messages'); - - if (isset($messages[$domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX][$id])) { - return $messages[$domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX][$id]; - } - - if (isset($messages[$domain][$id])) { - return $messages[$domain][$id]; - } - - $fallbackCatalogue = $this->getPrivateProperty($catalogue, 'fallbackCatalogue'); - - if ($fallbackCatalogue !== null) { - return $this->getFromCatalogue($fallbackCatalogue, $id, $domain); - } - - return $id; - } - - private function getPrivateProperty($instance, string $field) - { - return (function (string $field) { - return $this->$field; - })->call($instance, $field); - } - } -} diff --git a/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php b/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php deleted file mode 100644 index 94dbdc3..0000000 --- a/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -if (!class_exists(LazyTranslator::class, false)) { - class LazyTranslator extends AbstractTranslator - { - /** - * Returns the translation. - * - * @param string|null $id - * @param array $parameters - * @param string|null $domain - * @param string|null $locale - * - * @return string - */ - public function trans($id, array $parameters = [], $domain = null, $locale = null) - { - return $this->translate($id, $parameters, $domain, $locale); - } - } -} diff --git a/vendor/nesbot/carbon/lazy/Carbon/UnprotectedDatePeriod.php b/vendor/nesbot/carbon/lazy/Carbon/UnprotectedDatePeriod.php deleted file mode 100644 index 2341be7..0000000 --- a/vendor/nesbot/carbon/lazy/Carbon/UnprotectedDatePeriod.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use DatePeriod; - -if (!class_exists(DatePeriodBase::class, false)) { - class DatePeriodBase extends DatePeriod - { - } -} diff --git a/vendor/nesbot/carbon/readme.md b/vendor/nesbot/carbon/readme.md deleted file mode 100644 index 86995d6..0000000 --- a/vendor/nesbot/carbon/readme.md +++ /dev/null @@ -1,190 +0,0 @@ -# Carbon - -[![Latest Stable Version](https://img.shields.io/packagist/v/nesbot/carbon.svg?style=flat-square)](https://packagist.org/packages/nesbot/carbon) -[![Total Downloads](https://img.shields.io/packagist/dt/nesbot/carbon.svg?style=flat-square)](https://packagist.org/packages/nesbot/carbon) -[![GitHub Actions](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FCarbonPHP%2Fcarbon%2Fbadge&style=flat-square&label=Build&logo=none)](https://github.com/CarbonPHP/carbon/actions) -[![codecov.io](https://img.shields.io/codecov/c/github/CarbonPHP/carbon.svg?style=flat-square)](https://codecov.io/github/CarbonPHP/carbon/actions?branch=master) - -An international PHP extension for DateTime. [https://carbon.nesbot.com](https://carbon.nesbot.com) - -> [!NOTE] -> We're migrating the repository from [briannesbitt/Carbon](https://github.com/briannesbitt/Carbon) to [CarbonPHP/carbon](https://github.com/CarbonPHP/carbon), -> which means if you're looking specific issues/pull-requests, you may have to search both. No other impact as code on both will be kept up to date. - -```php -toDateTimeString()); -printf("Right now in Vancouver is %s", Carbon::now('America/Vancouver')); //implicit __toString() -$tomorrow = Carbon::now()->addDay(); -$lastWeek = Carbon::now()->subWeek(); - -$officialDate = Carbon::now()->toRfc2822String(); - -$howOldAmI = Carbon::createFromDate(1975, 5, 21)->age; - -$noonTodayLondonTime = Carbon::createFromTime(12, 0, 0, 'Europe/London'); - -$internetWillBlowUpOn = Carbon::create(2038, 01, 19, 3, 14, 7, 'GMT'); - -// Don't really want this to happen so mock now -Carbon::setTestNow(Carbon::createFromDate(2000, 1, 1)); - -// comparisons are always done in UTC -if (Carbon::now()->gte($internetWillBlowUpOn)) { - die(); -} - -// Phew! Return to normal behaviour -Carbon::setTestNow(); - -if (Carbon::now()->isWeekend()) { - echo 'Party!'; -} -// Over 200 languages (and over 500 regional variants) supported: -echo Carbon::now()->subMinutes(2)->diffForHumans(); // '2 minutes ago' -echo Carbon::now()->subMinutes(2)->locale('zh_CN')->diffForHumans(); // '2分钟前' -echo Carbon::parse('2019-07-23 14:51')->isoFormat('LLLL'); // 'Tuesday, July 23, 2019 2:51 PM' -echo Carbon::parse('2019-07-23 14:51')->locale('fr_FR')->isoFormat('LLLL'); // 'mardi 23 juillet 2019 14:51' - -// ... but also does 'from now', 'after' and 'before' -// rolling up to seconds, minutes, hours, days, months, years - -$daysSinceEpoch = Carbon::createFromTimestamp(0)->diffInDays(); // something such as: - // 19817.6771 -$daysUntilInternetBlowUp = $internetWillBlowUpOn->diffInDays(); // Negative value since it's in the future: - // -5037.4560 - -// Without parameter, difference is calculated from now, but doing $a->diff($b) -// it will count time from $a to $b. -Carbon::createFromTimestamp(0)->diffInDays($internetWillBlowUpOn); // 24855.1348 -``` - -## Installation - -### With Composer - -``` -$ composer require nesbot/carbon -``` - -```json -{ - "require": { - "nesbot/carbon": "^3" - } -} -``` - -```php - - -### Translators - -[Thanks to people helping us to translate Carbon in so many languages](https://carbon.nesbot.com/contribute/translators/) - -### Sponsors - -Support this project by becoming a sponsor. Your logo will show up here with a link to your website. - - -Букмекер -Онлайн казино 777 -Best non Gamstop sites in the UK -Real Money Pokies -Non GamStop Bookies UK -CasinoHex Canada -Route4Me Route Planner -Onlinecasinosgr.com -Betking -WestNews онлайн казино Украины -Лучшие онлайн казино Украины на Sportarena -Онлайн казино та їхні бонуси y-k.com.ua -best non Gamstop casinos -inkedin -Онлайн казино України -OnlineCasinosSpelen -Guidebook.BetWinner -Онлайн казино casino.ua -PayIDGambler -UK casinos not on GamStop -Legal Casino -Probukmacher -Casino-portugal.pt -Sportsbook Reviews Online -FAVBET -Non-GamStop Bets UK -Tidelift -Slots City -Онлайн Казино Украины -Ігрові автомати -Pin-Up -Vegas -WildWinz -Non Gamstop Casinos -Slotozilla -casino non aams -Credit Zaim -R&D Tax Credits UK - -[[See all](https://carbon.nesbot.com/#sponsors)] -[[Become a sponsor via OpenCollective*](https://opencollective.com/Carbon#sponsor)] - - - -[[Become a sponsor via GitHub*](https://github.com/sponsors/kylekatarnls)] - -* This is a donation. No goods or services are expected in return. Any requests for refunds for those purposes will be rejected. - -### Backers - -Thank you to all our backers! 🙏 - - - -[[Become a backer](https://opencollective.com/Carbon#backer)] - -## Carbon for enterprise - -Available as part of the Tidelift Subscription. - -The maintainers of ``Carbon`` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/vendor/nesbot/carbon/sponsors.php b/vendor/nesbot/carbon/sponsors.php deleted file mode 100644 index 3cd982d..0000000 --- a/vendor/nesbot/carbon/sponsors.php +++ /dev/null @@ -1,234 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Carbon\CarbonImmutable; - -require_once __DIR__.'/vendor/autoload.php'; - -function getMaxHistoryMonthsByAmount($amount): int -{ - if ($amount >= 50) { - return 6; - } - - if ($amount >= 20) { - return 4; - } - - return 2; -} - -function getHtmlAttribute($rawValue): string -{ - return str_replace( - ['​', "\r"], - '', - trim(htmlspecialchars((string) $rawValue), "  \n\r\t\v\0"), - ); -} - -function getOpenCollectiveSponsors(): string -{ - $customSponsorOverride = [ - // For consistency and equity among sponsors, as of now, we kindly ask our sponsors - // to provide an image having a width/height ratio between 1/1 and 2/1. - // By default, we'll show the member picture from OpenCollective, and will resize it if bigger - 662698 => [ - // alt attribute - 'name' => 'Non Gamstop Casinos', - // title attribute - 'description' => 'Casinos not on Gamstop', - // src attribute - 'image' => 'https://lgcnews.com/wp-content/uploads/2018/01/LGC-logo-v8-temp.png', - // href attribute - 'website' => 'https://lgcnews.com/', - ], - 663069 => [ - // href attribute - 'website' => 'https://www.favbet.ua/uk/', - ], - ]; - - $members = json_decode(file_get_contents('https://opencollective.com/carbon/members/all.json'), true); - - foreach ($members as &$member) { - $member = array_merge($member, $customSponsorOverride[$member['MemberId']] ?? []); - } - - // Adding sponsors paying via other payment methods - $members[] = [ - 'MemberId' => 1, - 'createdAt' => '2019-01-01 02:00', - 'type' => 'ORGANIZATION', - 'role' => 'BACKER', - 'tier' => 'backer+', - 'isActive' => true, - 'totalAmountDonated' => 1000, - 'currency' => 'USD', - 'lastTransactionAt' => CarbonImmutable::now()->format('Y-m-d').' 02:00', - 'lastTransactionAmount' => 25, - 'profile' => 'https://tidelift.com/', - 'name' => 'Tidelift', - 'description' => 'Get professional support for Carbon', - 'image' => 'https://carbon.nesbot.com/docs/sponsors/tidelift-brand.png', - 'website' => 'https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=docs', - ]; - $members[] = [ - 'MemberId' => 2, - 'createdAt' => '2024-11-14 02:00', - 'type' => 'ORGANIZATION', - 'role' => 'BACKER', - 'tier' => 'backer+ yearly', - 'isActive' => true, - 'totalAmountDonated' => 170, - 'currency' => 'USD', - 'lastTransactionAt' => '2024-11-14 02:00', - 'lastTransactionAmount' => 170, - 'profile' => 'https://www.slotozilla.com/nz/free-spins', - 'name' => 'Slotozilla', - 'description' => 'Slotozilla website', - 'image' => 'https://carbon.nesbot.com/docs/sponsors/slotozilla.png', - 'website' => 'https://www.slotozilla.com/nz/free-spins', - ]; - - $list = array_filter($members, static fn (array $member): bool => $member['totalAmountDonated'] > 3 && $member['role'] !== 'HOST' && ( - $member['totalAmountDonated'] > 100 || - $member['lastTransactionAt'] > CarbonImmutable::now() - ->subMonthsNoOverflow(getMaxHistoryMonthsByAmount($member['lastTransactionAmount'])) - ->format('Y-m-d h:i') || - $member['isActive'] && $member['lastTransactionAmount'] >= 30 - )); - - $list = array_map(static function (array $member): array { - $createdAt = CarbonImmutable::parse($member['createdAt']); - $lastTransactionAt = CarbonImmutable::parse($member['lastTransactionAt']); - - if ($createdAt->format('d H:i:s.u') > $lastTransactionAt->format('d H:i:s.u')) { - $createdAt = $createdAt - ->setDay($lastTransactionAt->day) - ->modify($lastTransactionAt->format('H:i:s.u')); - } - - $isYearly = str_contains(strtolower($member['tier'] ?? ''), 'yearly'); - $monthlyContribution = (float) ( - ($isYearly && $lastTransactionAt > CarbonImmutable::parse('-1 year')) - ? ($member['lastTransactionAmount'] / 11.2) // 11.2 instead of 12 to include the discount for yearly subscription - : ($member['totalAmountDonated'] / ceil($createdAt->floatDiffInMonths())) - ); - - if (!$isYearly) { - if ( - $lastTransactionAt->isAfter('last month') && - $member['lastTransactionAmount'] > $monthlyContribution - ) { - $monthlyContribution = (float) $member['lastTransactionAmount']; - } - - if ($lastTransactionAt->isBefore('-75 days')) { - $days = min(120, $lastTransactionAt->diffInDays('now') - 70); - $monthlyContribution *= 1 - $days / 240; - } - } - - $yearlyContribution = (float) ( - $isYearly - ? (12 * $monthlyContribution) - : ($member['totalAmountDonated'] / max(1, $createdAt->floatDiffInYears())) - ); - $status = null; - $rank = 0; - - if ($monthlyContribution > 29 || $yearlyContribution > 700) { - $status = 'sponsor'; - $rank = 4; - } elseif ($monthlyContribution > 14.5 || $yearlyContribution > 500) { - $status = 'backerPlus'; - $rank = 3; - } elseif ($monthlyContribution > 4.5 || $yearlyContribution > 80) { - $status = 'backer'; - $rank = 2; - } elseif ($member['totalAmountDonated'] > 0) { - $status = 'helper'; - $rank = 1; - } - - return array_merge($member, [ - 'star' => ($monthlyContribution > 98 || $yearlyContribution > 800), - 'status' => $status, - 'rank' => $rank, - 'monthlyContribution' => $monthlyContribution, - 'yearlyContribution' => $yearlyContribution, - ]); - }, $list); - - usort($list, static function (array $a, array $b): int { - return ($b['star'] <=> $a['star']) - ?: ($b['rank'] <=> $a['rank']) - ?: ($b['monthlyContribution'] <=> $a['monthlyContribution']) - ?: ($b['totalAmountDonated'] <=> $a['totalAmountDonated']); - }); - - $membersByUrl = []; - $output = ''; - - foreach ($list as $member) { - $url = $member['website'] ?? $member['profile']; - - if (isset($membersByUrl[$url]) || !\in_array($member['status'], ['sponsor', 'backerPlus'], true)) { - continue; - } - - $membersByUrl[$url] = $member; - $href = htmlspecialchars($url); - $src = $customSponsorImages[$member['MemberId'] ?? ''] ?? $member['image'] ?? (strtr($member['profile'], ['https://opencollective.com/' => 'https://images.opencollective.com/']).'/avatar/256.png'); - [$x, $y] = @getimagesize($src) ?: [0, 0]; - $validImage = ($x && $y); - $src = $validImage ? htmlspecialchars($src) : 'https://opencollective.com/static/images/default-guest-logo.svg'; - $height = match ($member['status']) { - 'sponsor' => 64, - 'backerPlus' => 42, - 'backer' => 32, - default => 24, - }; - $rel = match ($member['status']) { - 'sponsor', 'backerPlus' => '', - default => ' rel="sponsored"', - }; - - $width = min($height * 2, $validImage ? round($x * $height / $y) : $height); - - if (!str_contains($href, 'utm_source') && !preg_match('/^https?:\/\/(?:www\.)?(?:onlinekasyno-polis\.pl|zonaminecraft\.net|slotozilla\.com)(\/.*)?/', $href)) { - $href .= (!str_contains($href, '?') ? '?' : '&').'utm_source=opencollective&utm_medium=github&utm_campaign=Carbon'; - } - - $title = getHtmlAttribute(($member['description'] ?? null) ?: $member['name']); - $alt = getHtmlAttribute($member['name']); - - if ($member['star']) { - $width *= 1.5; - $height *= 1.5; - } - - $output .= "\n".''. - ''.$alt.''. - ''; - } - - return $output; -} - -file_put_contents('readme.md', preg_replace_callback( - '/()[\s\S]+()/', - static function (array $match): string { - return $match[1].getOpenCollectiveSponsors().$match[2]; - }, - file_get_contents('readme.md'), -)); diff --git a/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php b/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php deleted file mode 100644 index 8dd47ae..0000000 --- a/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php +++ /dev/null @@ -1,411 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Carbon\MessageFormatter\MessageFormatterMapper; -use Closure; -use ReflectionException; -use ReflectionFunction; -use Symfony\Component\Translation; -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; -use Symfony\Component\Translation\Loader\ArrayLoader; - -abstract class AbstractTranslator extends Translation\Translator -{ - public const REGION_CODE_LENGTH = 2; - - /** - * Translator singletons for each language. - * - * @var array - */ - protected static array $singletons = []; - - /** - * List of custom localized messages. - * - * @var array - */ - protected array $messages = []; - - /** - * List of custom directories that contain translation files. - * - * @var string[] - */ - protected array $directories = []; - - /** - * Set to true while constructing. - */ - protected bool $initializing = false; - - /** - * List of locales aliases. - * - * @var array - */ - protected array $aliases = [ - 'me' => 'sr_Latn_ME', - 'scr' => 'sh', - ]; - - /** - * Return a singleton instance of Translator. - * - * @param string|null $locale optional initial locale ("en" - english by default) - * - * @return static - */ - public static function get(?string $locale = null): static - { - $locale = $locale ?: 'en'; - $key = static::class === Translator::class ? $locale : static::class.'|'.$locale; - $count = \count(static::$singletons); - - // Remember only the last 10 translators created - if ($count > 10) { - foreach (\array_slice(array_keys(static::$singletons), 0, $count - 10) as $index) { - unset(static::$singletons[$index]); - } - } - - static::$singletons[$key] ??= new static($locale); - - return static::$singletons[$key]; - } - - public function __construct($locale, ?MessageFormatterInterface $formatter = null, $cacheDir = null, $debug = false) - { - $this->initialize($locale, $formatter, $cacheDir, $debug); - } - - /** - * Returns the list of directories translation files are searched in. - */ - public function getDirectories(): array - { - return $this->directories; - } - - /** - * Set list of directories translation files are searched in. - * - * @param array $directories new directories list - * - * @return $this - */ - public function setDirectories(array $directories): static - { - $this->directories = $directories; - - return $this; - } - - /** - * Add a directory to the list translation files are searched in. - * - * @param string $directory new directory - * - * @return $this - */ - public function addDirectory(string $directory): static - { - $this->directories[] = $directory; - - return $this; - } - - /** - * Remove a directory from the list translation files are searched in. - * - * @param string $directory directory path - * - * @return $this - */ - public function removeDirectory(string $directory): static - { - $search = rtrim(strtr($directory, '\\', '/'), '/'); - - return $this->setDirectories(array_filter( - $this->getDirectories(), - static fn ($item) => rtrim(strtr($item, '\\', '/'), '/') !== $search, - )); - } - - /** - * Reset messages of a locale (all locale if no locale passed). - * Remove custom messages and reload initial messages from matching - * file in Lang directory. - */ - public function resetMessages(?string $locale = null): bool - { - if ($locale === null) { - $this->messages = []; - - return true; - } - - $this->assertValidLocale($locale); - - foreach ($this->getDirectories() as $directory) { - $data = @include \sprintf('%s/%s.php', rtrim($directory, '\\/'), $locale); - - if ($data !== false) { - $this->messages[$locale] = $data; - $this->addResource('array', $this->messages[$locale], $locale); - - return true; - } - } - - return false; - } - - /** - * Returns the list of files matching a given locale prefix (or all if empty). - * - * @param string $prefix prefix required to filter result - * - * @return array - */ - public function getLocalesFiles(string $prefix = ''): array - { - $files = []; - - foreach ($this->getDirectories() as $directory) { - $directory = rtrim($directory, '\\/'); - - foreach (glob("$directory/$prefix*.php") as $file) { - $files[] = $file; - } - } - - return array_unique($files); - } - - /** - * Returns the list of internally available locales and already loaded custom locales. - * (It will ignore custom translator dynamic loading.) - * - * @param string $prefix prefix required to filter result - * - * @return array - */ - public function getAvailableLocales(string $prefix = ''): array - { - $locales = []; - foreach ($this->getLocalesFiles($prefix) as $file) { - $locales[] = substr($file, strrpos($file, '/') + 1, -4); - } - - return array_unique(array_merge($locales, array_keys($this->messages))); - } - - protected function translate(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string - { - if ($domain === null) { - $domain = 'messages'; - } - - $catalogue = $this->getCatalogue($locale); - $format = $this instanceof TranslatorStrongTypeInterface - ? $this->getFromCatalogue($catalogue, (string) $id, $domain) - : $this->getCatalogue($locale)->get((string) $id, $domain); // @codeCoverageIgnore - - if ($format instanceof Closure) { - // @codeCoverageIgnoreStart - try { - $count = (new ReflectionFunction($format))->getNumberOfRequiredParameters(); - } catch (ReflectionException) { - $count = 0; - } - // @codeCoverageIgnoreEnd - - return $format( - ...array_values($parameters), - ...array_fill(0, max(0, $count - \count($parameters)), null) - ); - } - - return parent::trans($id, $parameters, $domain, $locale); - } - - /** - * Init messages language from matching file in Lang directory. - * - * @param string $locale - * - * @return bool - */ - protected function loadMessagesFromFile(string $locale): bool - { - return isset($this->messages[$locale]) || $this->resetMessages($locale); - } - - /** - * Set messages of a locale and take file first if present. - * - * @param string $locale - * @param array $messages - * - * @return $this - */ - public function setMessages(string $locale, array $messages): static - { - $this->loadMessagesFromFile($locale); - $this->addResource('array', $messages, $locale); - $this->messages[$locale] = array_merge( - $this->messages[$locale] ?? [], - $messages - ); - - return $this; - } - - /** - * Set messages of the current locale and take file first if present. - * - * @param array $messages - * - * @return $this - */ - public function setTranslations(array $messages): static - { - return $this->setMessages($this->getLocale(), $messages); - } - - /** - * Get messages of a locale, if none given, return all the - * languages. - */ - public function getMessages(?string $locale = null): array - { - return $locale === null ? $this->messages : $this->messages[$locale]; - } - - /** - * Set the current translator locale and indicate if the source locale file exists - * - * @param string $locale locale ex. en - */ - public function setLocale($locale): void - { - $locale = preg_replace_callback('/[-_]([a-z]{2,}|\d{2,})/', function ($matches) { - // _2-letters or YUE is a region, _3+-letters is a variant - $upper = strtoupper($matches[1]); - - if ($upper === 'YUE' || $upper === 'ISO' || \strlen($upper) <= static::REGION_CODE_LENGTH) { - return "_$upper"; - } - - return '_'.ucfirst($matches[1]); - }, strtolower($locale)); - - $previousLocale = $this->getLocale(); - - if ($previousLocale === $locale && isset($this->messages[$locale])) { - return; - } - - unset(static::$singletons[$previousLocale]); - - if ($locale === 'auto') { - $completeLocale = setlocale(LC_TIME, '0'); - $locale = preg_replace('/^([^_.-]+).*$/', '$1', $completeLocale); - $locales = $this->getAvailableLocales($locale); - - $completeLocaleChunks = preg_split('/[_.-]+/', $completeLocale); - - $getScore = static fn ($language) => self::compareChunkLists( - $completeLocaleChunks, - preg_split('/[_.-]+/', $language), - ); - - usort($locales, static fn ($first, $second) => $getScore($second) <=> $getScore($first)); - - $locale = $locales[0]; - } - - if (isset($this->aliases[$locale])) { - $locale = $this->aliases[$locale]; - } - - // If subtag (ex: en_CA) first load the macro (ex: en) to have a fallback - if (str_contains($locale, '_') && - $this->loadMessagesFromFile($macroLocale = preg_replace('/^([^_]+).*$/', '$1', $locale)) - ) { - parent::setLocale($macroLocale); - } - - if (!$this->loadMessagesFromFile($locale) && !$this->initializing) { - return; - } - - parent::setLocale($locale); - } - - /** - * Show locale on var_dump(). - * - * @return array - */ - public function __debugInfo() - { - return [ - 'locale' => $this->getLocale(), - ]; - } - - public function __serialize(): array - { - return [ - 'locale' => $this->getLocale(), - ]; - } - - public function __unserialize(array $data): void - { - $this->initialize($data['locale'] ?? 'en'); - } - - private function initialize($locale, ?MessageFormatterInterface $formatter = null, $cacheDir = null, $debug = false): void - { - parent::setLocale($locale); - $this->initializing = true; - $this->directories = [__DIR__.'/Lang']; - $this->addLoader('array', new ArrayLoader()); - parent::__construct($locale, new MessageFormatterMapper($formatter), $cacheDir, $debug); - $this->initializing = false; - } - - private static function compareChunkLists($referenceChunks, $chunks) - { - $score = 0; - - foreach ($referenceChunks as $index => $chunk) { - if (!isset($chunks[$index])) { - $score++; - - continue; - } - - if (strtolower($chunks[$index]) === strtolower($chunk)) { - $score += 10; - } - } - - return $score; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Callback.php b/vendor/nesbot/carbon/src/Carbon/Callback.php deleted file mode 100644 index c7456f1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Callback.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Closure; -use DateInterval; -use DatePeriod; -use DateTime; -use DateTimeInterface; -use DateTimeZone; -use ReflectionFunction; -use ReflectionNamedType; -use ReflectionType; - -final class Callback -{ - private ?ReflectionFunction $function; - - private function __construct(private readonly Closure $closure) - { - } - - public static function fromClosure(Closure $closure): self - { - return new self($closure); - } - - public static function parameter(mixed $closure, mixed $value, string|int $index = 0): mixed - { - if ($closure instanceof Closure) { - return self::fromClosure($closure)->prepareParameter($value, $index); - } - - return $value; - } - - public function getReflectionFunction(): ReflectionFunction - { - return $this->function ??= new ReflectionFunction($this->closure); - } - - public function prepareParameter(mixed $value, string|int $index = 0): mixed - { - $type = $this->getParameterType($index); - - if (!($type instanceof ReflectionNamedType)) { - return $value; - } - - $name = $type->getName(); - - if ($name === CarbonInterface::class) { - $name = $value instanceof DateTime ? Carbon::class : CarbonImmutable::class; - } - - if (!class_exists($name) || is_a($value, $name)) { - return $value; - } - - $class = $this->getPromotedClass($value); - - if ($class && is_a($name, $class, true)) { - return $name::instance($value); - } - - return $value; - } - - public function call(mixed ...$arguments): mixed - { - foreach ($arguments as $index => &$value) { - if ($this->getPromotedClass($value)) { - $value = $this->prepareParameter($value, $index); - } - } - - return ($this->closure)(...$arguments); - } - - private function getParameterType(string|int $index): ?ReflectionType - { - $parameters = $this->getReflectionFunction()->getParameters(); - - if (\is_int($index)) { - return ($parameters[$index] ?? null)?->getType(); - } - - foreach ($parameters as $parameter) { - if ($parameter->getName() === $index) { - return $parameter->getType(); - } - } - - return null; - } - - /** @return class-string|null */ - private function getPromotedClass(mixed $value): ?string - { - if ($value instanceof DateTimeInterface) { - return CarbonInterface::class; - } - - if ($value instanceof DateInterval) { - return CarbonInterval::class; - } - - if ($value instanceof DatePeriod) { - return CarbonPeriod::class; - } - - if ($value instanceof DateTimeZone) { - return CarbonTimeZone::class; - } - - return null; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Carbon.php b/vendor/nesbot/carbon/src/Carbon/Carbon.php deleted file mode 100644 index 8364e84..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Carbon.php +++ /dev/null @@ -1,847 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Carbon\Traits\Date; -use DateTime; -use DateTimeInterface; - -/** - * A simple API extension for DateTime. - * - * - * - * @property string $localeDayOfWeek the day of week in current locale - * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale - * @property string $localeMonth the month in current locale - * @property string $shortLocaleMonth the abbreviated month in current locale - * @property int $year - * @property int $yearIso - * @property int $month - * @property int $day - * @property int $hour - * @property int $minute - * @property int $second - * @property int $micro - * @property int $microsecond - * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English - * @property int $milliseconds - * @property int $millisecond - * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium - * @property int $dayOfCentury The value of the day starting from the beginning of the current century - * @property int $dayOfDecade The value of the day starting from the beginning of the current decade - * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium - * @property int $dayOfMonth The value of the day starting from the beginning of the current month - * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter - * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property int $dayOfYear 1 through 366 - * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century - * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium - * @property int $hourOfCentury The value of the hour starting from the beginning of the current century - * @property int $hourOfDay The value of the hour starting from the beginning of the current day - * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade - * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium - * @property int $hourOfMonth The value of the hour starting from the beginning of the current month - * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter - * @property int $hourOfWeek The value of the hour starting from the beginning of the current week - * @property int $hourOfYear The value of the hour starting from the beginning of the current year - * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century - * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day - * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade - * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour - * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium - * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond - * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute - * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month - * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter - * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second - * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week - * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year - * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century - * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day - * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade - * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour - * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium - * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute - * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month - * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter - * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second - * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week - * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year - * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century - * @property int $minuteOfDay The value of the minute starting from the beginning of the current day - * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade - * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour - * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium - * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month - * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter - * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week - * @property int $minuteOfYear The value of the minute starting from the beginning of the current year - * @property int $monthOfCentury The value of the month starting from the beginning of the current century - * @property int $monthOfDecade The value of the month starting from the beginning of the current decade - * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium - * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter - * @property int $monthOfYear The value of the month starting from the beginning of the current year - * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century - * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade - * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium - * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year - * @property int $secondOfCentury The value of the second starting from the beginning of the current century - * @property int $secondOfDay The value of the second starting from the beginning of the current day - * @property int $secondOfDecade The value of the second starting from the beginning of the current decade - * @property int $secondOfHour The value of the second starting from the beginning of the current hour - * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium - * @property int $secondOfMinute The value of the second starting from the beginning of the current minute - * @property int $secondOfMonth The value of the second starting from the beginning of the current month - * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter - * @property int $secondOfWeek The value of the second starting from the beginning of the current week - * @property int $secondOfYear The value of the second starting from the beginning of the current year - * @property int $weekOfCentury The value of the week starting from the beginning of the current century - * @property int $weekOfDecade The value of the week starting from the beginning of the current decade - * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium - * @property int $weekOfMonth 1 through 5 - * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter - * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property int $yearOfCentury The value of the year starting from the beginning of the current century - * @property int $yearOfDecade The value of the year starting from the beginning of the current decade - * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium - * @property-read int $daysInCentury The number of days contained in the current century - * @property-read int $daysInDecade The number of days contained in the current decade - * @property-read int $daysInMillennium The number of days contained in the current millennium - * @property-read int $daysInMonth number of days in the given month - * @property-read int $daysInQuarter The number of days contained in the current quarter - * @property-read int $daysInWeek The number of days contained in the current week - * @property-read int $daysInYear 365 or 366 - * @property-read int $decadesInCentury The number of decades contained in the current century - * @property-read int $decadesInMillennium The number of decades contained in the current millennium - * @property-read int $hoursInCentury The number of hours contained in the current century - * @property-read int $hoursInDay The number of hours contained in the current day - * @property-read int $hoursInDecade The number of hours contained in the current decade - * @property-read int $hoursInMillennium The number of hours contained in the current millennium - * @property-read int $hoursInMonth The number of hours contained in the current month - * @property-read int $hoursInQuarter The number of hours contained in the current quarter - * @property-read int $hoursInWeek The number of hours contained in the current week - * @property-read int $hoursInYear The number of hours contained in the current year - * @property-read int $microsecondsInCentury The number of microseconds contained in the current century - * @property-read int $microsecondsInDay The number of microseconds contained in the current day - * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade - * @property-read int $microsecondsInHour The number of microseconds contained in the current hour - * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium - * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond - * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute - * @property-read int $microsecondsInMonth The number of microseconds contained in the current month - * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter - * @property-read int $microsecondsInSecond The number of microseconds contained in the current second - * @property-read int $microsecondsInWeek The number of microseconds contained in the current week - * @property-read int $microsecondsInYear The number of microseconds contained in the current year - * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century - * @property-read int $millisecondsInDay The number of milliseconds contained in the current day - * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade - * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour - * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium - * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute - * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month - * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter - * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second - * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week - * @property-read int $millisecondsInYear The number of milliseconds contained in the current year - * @property-read int $minutesInCentury The number of minutes contained in the current century - * @property-read int $minutesInDay The number of minutes contained in the current day - * @property-read int $minutesInDecade The number of minutes contained in the current decade - * @property-read int $minutesInHour The number of minutes contained in the current hour - * @property-read int $minutesInMillennium The number of minutes contained in the current millennium - * @property-read int $minutesInMonth The number of minutes contained in the current month - * @property-read int $minutesInQuarter The number of minutes contained in the current quarter - * @property-read int $minutesInWeek The number of minutes contained in the current week - * @property-read int $minutesInYear The number of minutes contained in the current year - * @property-read int $monthsInCentury The number of months contained in the current century - * @property-read int $monthsInDecade The number of months contained in the current decade - * @property-read int $monthsInMillennium The number of months contained in the current millennium - * @property-read int $monthsInQuarter The number of months contained in the current quarter - * @property-read int $monthsInYear The number of months contained in the current year - * @property-read int $quartersInCentury The number of quarters contained in the current century - * @property-read int $quartersInDecade The number of quarters contained in the current decade - * @property-read int $quartersInMillennium The number of quarters contained in the current millennium - * @property-read int $quartersInYear The number of quarters contained in the current year - * @property-read int $secondsInCentury The number of seconds contained in the current century - * @property-read int $secondsInDay The number of seconds contained in the current day - * @property-read int $secondsInDecade The number of seconds contained in the current decade - * @property-read int $secondsInHour The number of seconds contained in the current hour - * @property-read int $secondsInMillennium The number of seconds contained in the current millennium - * @property-read int $secondsInMinute The number of seconds contained in the current minute - * @property-read int $secondsInMonth The number of seconds contained in the current month - * @property-read int $secondsInQuarter The number of seconds contained in the current quarter - * @property-read int $secondsInWeek The number of seconds contained in the current week - * @property-read int $secondsInYear The number of seconds contained in the current year - * @property-read int $weeksInCentury The number of weeks contained in the current century - * @property-read int $weeksInDecade The number of weeks contained in the current decade - * @property-read int $weeksInMillennium The number of weeks contained in the current millennium - * @property-read int $weeksInMonth The number of weeks contained in the current month - * @property-read int $weeksInQuarter The number of weeks contained in the current quarter - * @property-read int $weeksInYear 51 through 53 - * @property-read int $yearsInCentury The number of years contained in the current century - * @property-read int $yearsInDecade The number of years contained in the current decade - * @property-read int $yearsInMillennium The number of years contained in the current millennium - * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method $this years(int $value) Set current instance year to the given value. - * @method $this year(int $value) Set current instance year to the given value. - * @method $this setYears(int $value) Set current instance year to the given value. - * @method $this setYear(int $value) Set current instance year to the given value. - * @method $this months(Month|int $value) Set current instance month to the given value. - * @method $this month(Month|int $value) Set current instance month to the given value. - * @method $this setMonths(Month|int $value) Set current instance month to the given value. - * @method $this setMonth(Month|int $value) Set current instance month to the given value. - * @method $this days(int $value) Set current instance day to the given value. - * @method $this day(int $value) Set current instance day to the given value. - * @method $this setDays(int $value) Set current instance day to the given value. - * @method $this setDay(int $value) Set current instance day to the given value. - * @method $this hours(int $value) Set current instance hour to the given value. - * @method $this hour(int $value) Set current instance hour to the given value. - * @method $this setHours(int $value) Set current instance hour to the given value. - * @method $this setHour(int $value) Set current instance hour to the given value. - * @method $this minutes(int $value) Set current instance minute to the given value. - * @method $this minute(int $value) Set current instance minute to the given value. - * @method $this setMinutes(int $value) Set current instance minute to the given value. - * @method $this setMinute(int $value) Set current instance minute to the given value. - * @method $this seconds(int $value) Set current instance second to the given value. - * @method $this second(int $value) Set current instance second to the given value. - * @method $this setSeconds(int $value) Set current instance second to the given value. - * @method $this setSecond(int $value) Set current instance second to the given value. - * @method $this millis(int $value) Set current instance millisecond to the given value. - * @method $this milli(int $value) Set current instance millisecond to the given value. - * @method $this setMillis(int $value) Set current instance millisecond to the given value. - * @method $this setMilli(int $value) Set current instance millisecond to the given value. - * @method $this milliseconds(int $value) Set current instance millisecond to the given value. - * @method $this millisecond(int $value) Set current instance millisecond to the given value. - * @method $this setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method $this setMillisecond(int $value) Set current instance millisecond to the given value. - * @method $this micros(int $value) Set current instance microsecond to the given value. - * @method $this micro(int $value) Set current instance microsecond to the given value. - * @method $this setMicros(int $value) Set current instance microsecond to the given value. - * @method $this setMicro(int $value) Set current instance microsecond to the given value. - * @method $this microseconds(int $value) Set current instance microsecond to the given value. - * @method $this microsecond(int $value) Set current instance microsecond to the given value. - * @method $this setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method $this setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method $this addYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method $this addYear() Add one year to the instance (using date interval). - * @method $this subYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method $this subYear() Sub one year to the instance (using date interval). - * @method $this addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method $this subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method $this addYearsWithoutOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsWithoutOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearsWithNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsWithNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearsNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method $this addMonth() Add one month to the instance (using date interval). - * @method $this subMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method $this subMonth() Sub one month to the instance (using date interval). - * @method $this addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMonthsWithoutOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsWithoutOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthsWithNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsWithNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthsNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method $this addDay() Add one day to the instance (using date interval). - * @method $this subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method $this subDay() Sub one day to the instance (using date interval). - * @method $this addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method $this addHour() Add one hour to the instance (using date interval). - * @method $this subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method $this subHour() Sub one hour to the instance (using date interval). - * @method $this addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method $this addMinute() Add one minute to the instance (using date interval). - * @method $this subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method $this subMinute() Sub one minute to the instance (using date interval). - * @method $this addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method $this addSecond() Add one second to the instance (using date interval). - * @method $this subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method $this subSecond() Sub one second to the instance (using date interval). - * @method $this addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMilli() Add one millisecond to the instance (using date interval). - * @method $this subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMilli() Sub one millisecond to the instance (using date interval). - * @method $this addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMillisecond() Add one millisecond to the instance (using date interval). - * @method $this subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMillisecond() Sub one millisecond to the instance (using date interval). - * @method $this addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMicro() Add one microsecond to the instance (using date interval). - * @method $this subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMicro() Sub one microsecond to the instance (using date interval). - * @method $this addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMicrosecond() Add one microsecond to the instance (using date interval). - * @method $this subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method $this addMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method $this addMillennium() Add one millennium to the instance (using date interval). - * @method $this subMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method $this subMillennium() Sub one millennium to the instance (using date interval). - * @method $this addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMillenniaWithoutOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaWithoutOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniaWithNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaWithNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniaNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method $this addCentury() Add one century to the instance (using date interval). - * @method $this subCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method $this subCentury() Sub one century to the instance (using date interval). - * @method $this addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method $this subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method $this addCenturiesWithoutOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesWithoutOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturiesWithNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesWithNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturiesNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method $this addDecade() Add one decade to the instance (using date interval). - * @method $this subDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method $this subDecade() Sub one decade to the instance (using date interval). - * @method $this addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method $this subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method $this addDecadesWithoutOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesWithoutOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadesWithNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesWithNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadesNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method $this addQuarter() Add one quarter to the instance (using date interval). - * @method $this subQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method $this subQuarter() Sub one quarter to the instance (using date interval). - * @method $this addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method $this subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method $this addQuartersWithoutOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersWithoutOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuartersWithNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersWithNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuartersNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method $this addWeek() Add one week to the instance (using date interval). - * @method $this subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method $this subWeek() Sub one week to the instance (using date interval). - * @method $this addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method $this addWeekday() Add one weekday to the instance (using date interval). - * @method $this subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method $this subWeekday() Sub one weekday to the instance (using date interval). - * @method $this addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMicro() Add one microsecond to the instance (using timestamp). - * @method $this subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method $this addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMicrosecond() Add one microsecond to the instance (using timestamp). - * @method $this subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method $this addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMilli() Add one millisecond to the instance (using timestamp). - * @method $this subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method $this addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMillisecond() Add one millisecond to the instance (using timestamp). - * @method $this subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method $this addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCSecond() Add one second to the instance (using timestamp). - * @method $this subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. - * @method $this addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMinute() Add one minute to the instance (using timestamp). - * @method $this subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. - * @method $this addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCHour() Add one hour to the instance (using timestamp). - * @method $this subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. - * @method $this addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCDay() Add one day to the instance (using timestamp). - * @method $this subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. - * @method $this addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCWeek() Add one week to the instance (using timestamp). - * @method $this subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. - * @method $this addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMonth() Add one month to the instance (using timestamp). - * @method $this subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. - * @method $this addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCQuarter() Add one quarter to the instance (using timestamp). - * @method $this subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. - * @method $this addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCYear() Add one year to the instance (using timestamp). - * @method $this subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. - * @method $this addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCDecade() Add one decade to the instance (using timestamp). - * @method $this subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. - * @method $this addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCCentury() Add one century to the instance (using timestamp). - * @method $this subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. - * @method $this addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMillennium() Add one millennium to the instance (using timestamp). - * @method $this subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. - * @method $this roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method $this floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method $this ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method $this ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method $this roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method $this floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method $this ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method $this ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method $this roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method $this floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method $this ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method $this ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method $this roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method $this floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method $this ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method $this ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method $this roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method $this ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium - * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value - * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value - * @method int daysInCentury() Return the number of days contained in the current century - * @method int daysInDecade() Return the number of days contained in the current decade - * @method int daysInMillennium() Return the number of days contained in the current millennium - * @method int daysInMonth() Return the number of days contained in the current month - * @method int daysInQuarter() Return the number of days contained in the current quarter - * @method int daysInWeek() Return the number of days contained in the current week - * @method int daysInYear() Return the number of days contained in the current year - * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value - * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value - * @method int decadesInCentury() Return the number of decades contained in the current century - * @method int decadesInMillennium() Return the number of decades contained in the current millennium - * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value - * @method int hoursInCentury() Return the number of hours contained in the current century - * @method int hoursInDay() Return the number of hours contained in the current day - * @method int hoursInDecade() Return the number of hours contained in the current decade - * @method int hoursInMillennium() Return the number of hours contained in the current millennium - * @method int hoursInMonth() Return the number of hours contained in the current month - * @method int hoursInQuarter() Return the number of hours contained in the current quarter - * @method int hoursInWeek() Return the number of hours contained in the current week - * @method int hoursInYear() Return the number of hours contained in the current year - * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value - * @method int microsecondsInCentury() Return the number of microseconds contained in the current century - * @method int microsecondsInDay() Return the number of microseconds contained in the current day - * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade - * @method int microsecondsInHour() Return the number of microseconds contained in the current hour - * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium - * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond - * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute - * @method int microsecondsInMonth() Return the number of microseconds contained in the current month - * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter - * @method int microsecondsInSecond() Return the number of microseconds contained in the current second - * @method int microsecondsInWeek() Return the number of microseconds contained in the current week - * @method int microsecondsInYear() Return the number of microseconds contained in the current year - * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value - * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century - * @method int millisecondsInDay() Return the number of milliseconds contained in the current day - * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade - * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour - * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium - * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute - * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month - * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter - * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second - * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week - * @method int millisecondsInYear() Return the number of milliseconds contained in the current year - * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value - * @method int minutesInCentury() Return the number of minutes contained in the current century - * @method int minutesInDay() Return the number of minutes contained in the current day - * @method int minutesInDecade() Return the number of minutes contained in the current decade - * @method int minutesInHour() Return the number of minutes contained in the current hour - * @method int minutesInMillennium() Return the number of minutes contained in the current millennium - * @method int minutesInMonth() Return the number of minutes contained in the current month - * @method int minutesInQuarter() Return the number of minutes contained in the current quarter - * @method int minutesInWeek() Return the number of minutes contained in the current week - * @method int minutesInYear() Return the number of minutes contained in the current year - * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value - * @method int monthsInCentury() Return the number of months contained in the current century - * @method int monthsInDecade() Return the number of months contained in the current decade - * @method int monthsInMillennium() Return the number of months contained in the current millennium - * @method int monthsInQuarter() Return the number of months contained in the current quarter - * @method int monthsInYear() Return the number of months contained in the current year - * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value - * @method int quartersInCentury() Return the number of quarters contained in the current century - * @method int quartersInDecade() Return the number of quarters contained in the current decade - * @method int quartersInMillennium() Return the number of quarters contained in the current millennium - * @method int quartersInYear() Return the number of quarters contained in the current year - * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value - * @method int secondsInCentury() Return the number of seconds contained in the current century - * @method int secondsInDay() Return the number of seconds contained in the current day - * @method int secondsInDecade() Return the number of seconds contained in the current decade - * @method int secondsInHour() Return the number of seconds contained in the current hour - * @method int secondsInMillennium() Return the number of seconds contained in the current millennium - * @method int secondsInMinute() Return the number of seconds contained in the current minute - * @method int secondsInMonth() Return the number of seconds contained in the current month - * @method int secondsInQuarter() Return the number of seconds contained in the current quarter - * @method int secondsInWeek() Return the number of seconds contained in the current week - * @method int secondsInYear() Return the number of seconds contained in the current year - * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value - * @method int weeksInCentury() Return the number of weeks contained in the current century - * @method int weeksInDecade() Return the number of weeks contained in the current decade - * @method int weeksInMillennium() Return the number of weeks contained in the current millennium - * @method int weeksInMonth() Return the number of weeks contained in the current month - * @method int weeksInQuarter() Return the number of weeks contained in the current quarter - * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value - * @method int yearsInCentury() Return the number of years contained in the current century - * @method int yearsInDecade() Return the number of years contained in the current decade - * @method int yearsInMillennium() Return the number of years contained in the current millennium - * - * - */ -class Carbon extends DateTime implements CarbonInterface -{ - use Date; - - /** - * Returns true if the current class/instance is mutable. - */ - public static function isMutable(): bool - { - return true; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php b/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php deleted file mode 100644 index fd89bd7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use DateTimeInterface; - -interface CarbonConverterInterface -{ - public function convertDate(DateTimeInterface $dateTime, bool $negated = false): CarbonInterface; -} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php b/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php deleted file mode 100644 index ee8cb15..0000000 --- a/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php +++ /dev/null @@ -1,890 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Carbon\Traits\Date; -use DateTimeImmutable; -use DateTimeInterface; - -/** - * A simple API extension for DateTimeImmutable. - * - * - * - * @property string $localeDayOfWeek the day of week in current locale - * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale - * @property string $localeMonth the month in current locale - * @property string $shortLocaleMonth the abbreviated month in current locale - * @property int $year - * @property int $yearIso - * @property int $month - * @property int $day - * @property int $hour - * @property int $minute - * @property int $second - * @property int $micro - * @property int $microsecond - * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English - * @property int $milliseconds - * @property int $millisecond - * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium - * @property int $dayOfCentury The value of the day starting from the beginning of the current century - * @property int $dayOfDecade The value of the day starting from the beginning of the current decade - * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium - * @property int $dayOfMonth The value of the day starting from the beginning of the current month - * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter - * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property int $dayOfYear 1 through 366 - * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century - * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium - * @property int $hourOfCentury The value of the hour starting from the beginning of the current century - * @property int $hourOfDay The value of the hour starting from the beginning of the current day - * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade - * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium - * @property int $hourOfMonth The value of the hour starting from the beginning of the current month - * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter - * @property int $hourOfWeek The value of the hour starting from the beginning of the current week - * @property int $hourOfYear The value of the hour starting from the beginning of the current year - * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century - * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day - * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade - * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour - * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium - * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond - * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute - * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month - * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter - * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second - * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week - * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year - * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century - * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day - * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade - * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour - * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium - * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute - * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month - * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter - * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second - * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week - * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year - * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century - * @property int $minuteOfDay The value of the minute starting from the beginning of the current day - * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade - * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour - * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium - * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month - * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter - * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week - * @property int $minuteOfYear The value of the minute starting from the beginning of the current year - * @property int $monthOfCentury The value of the month starting from the beginning of the current century - * @property int $monthOfDecade The value of the month starting from the beginning of the current decade - * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium - * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter - * @property int $monthOfYear The value of the month starting from the beginning of the current year - * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century - * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade - * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium - * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year - * @property int $secondOfCentury The value of the second starting from the beginning of the current century - * @property int $secondOfDay The value of the second starting from the beginning of the current day - * @property int $secondOfDecade The value of the second starting from the beginning of the current decade - * @property int $secondOfHour The value of the second starting from the beginning of the current hour - * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium - * @property int $secondOfMinute The value of the second starting from the beginning of the current minute - * @property int $secondOfMonth The value of the second starting from the beginning of the current month - * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter - * @property int $secondOfWeek The value of the second starting from the beginning of the current week - * @property int $secondOfYear The value of the second starting from the beginning of the current year - * @property int $weekOfCentury The value of the week starting from the beginning of the current century - * @property int $weekOfDecade The value of the week starting from the beginning of the current decade - * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium - * @property int $weekOfMonth 1 through 5 - * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter - * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property int $yearOfCentury The value of the year starting from the beginning of the current century - * @property int $yearOfDecade The value of the year starting from the beginning of the current decade - * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium - * @property-read int $daysInCentury The number of days contained in the current century - * @property-read int $daysInDecade The number of days contained in the current decade - * @property-read int $daysInMillennium The number of days contained in the current millennium - * @property-read int $daysInMonth number of days in the given month - * @property-read int $daysInQuarter The number of days contained in the current quarter - * @property-read int $daysInWeek The number of days contained in the current week - * @property-read int $daysInYear 365 or 366 - * @property-read int $decadesInCentury The number of decades contained in the current century - * @property-read int $decadesInMillennium The number of decades contained in the current millennium - * @property-read int $hoursInCentury The number of hours contained in the current century - * @property-read int $hoursInDay The number of hours contained in the current day - * @property-read int $hoursInDecade The number of hours contained in the current decade - * @property-read int $hoursInMillennium The number of hours contained in the current millennium - * @property-read int $hoursInMonth The number of hours contained in the current month - * @property-read int $hoursInQuarter The number of hours contained in the current quarter - * @property-read int $hoursInWeek The number of hours contained in the current week - * @property-read int $hoursInYear The number of hours contained in the current year - * @property-read int $microsecondsInCentury The number of microseconds contained in the current century - * @property-read int $microsecondsInDay The number of microseconds contained in the current day - * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade - * @property-read int $microsecondsInHour The number of microseconds contained in the current hour - * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium - * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond - * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute - * @property-read int $microsecondsInMonth The number of microseconds contained in the current month - * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter - * @property-read int $microsecondsInSecond The number of microseconds contained in the current second - * @property-read int $microsecondsInWeek The number of microseconds contained in the current week - * @property-read int $microsecondsInYear The number of microseconds contained in the current year - * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century - * @property-read int $millisecondsInDay The number of milliseconds contained in the current day - * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade - * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour - * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium - * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute - * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month - * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter - * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second - * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week - * @property-read int $millisecondsInYear The number of milliseconds contained in the current year - * @property-read int $minutesInCentury The number of minutes contained in the current century - * @property-read int $minutesInDay The number of minutes contained in the current day - * @property-read int $minutesInDecade The number of minutes contained in the current decade - * @property-read int $minutesInHour The number of minutes contained in the current hour - * @property-read int $minutesInMillennium The number of minutes contained in the current millennium - * @property-read int $minutesInMonth The number of minutes contained in the current month - * @property-read int $minutesInQuarter The number of minutes contained in the current quarter - * @property-read int $minutesInWeek The number of minutes contained in the current week - * @property-read int $minutesInYear The number of minutes contained in the current year - * @property-read int $monthsInCentury The number of months contained in the current century - * @property-read int $monthsInDecade The number of months contained in the current decade - * @property-read int $monthsInMillennium The number of months contained in the current millennium - * @property-read int $monthsInQuarter The number of months contained in the current quarter - * @property-read int $monthsInYear The number of months contained in the current year - * @property-read int $quartersInCentury The number of quarters contained in the current century - * @property-read int $quartersInDecade The number of quarters contained in the current decade - * @property-read int $quartersInMillennium The number of quarters contained in the current millennium - * @property-read int $quartersInYear The number of quarters contained in the current year - * @property-read int $secondsInCentury The number of seconds contained in the current century - * @property-read int $secondsInDay The number of seconds contained in the current day - * @property-read int $secondsInDecade The number of seconds contained in the current decade - * @property-read int $secondsInHour The number of seconds contained in the current hour - * @property-read int $secondsInMillennium The number of seconds contained in the current millennium - * @property-read int $secondsInMinute The number of seconds contained in the current minute - * @property-read int $secondsInMonth The number of seconds contained in the current month - * @property-read int $secondsInQuarter The number of seconds contained in the current quarter - * @property-read int $secondsInWeek The number of seconds contained in the current week - * @property-read int $secondsInYear The number of seconds contained in the current year - * @property-read int $weeksInCentury The number of weeks contained in the current century - * @property-read int $weeksInDecade The number of weeks contained in the current decade - * @property-read int $weeksInMillennium The number of weeks contained in the current millennium - * @property-read int $weeksInMonth The number of weeks contained in the current month - * @property-read int $weeksInQuarter The number of weeks contained in the current quarter - * @property-read int $weeksInYear 51 through 53 - * @property-read int $yearsInCentury The number of years contained in the current century - * @property-read int $yearsInDecade The number of years contained in the current decade - * @property-read int $yearsInMillennium The number of years contained in the current millennium - * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method CarbonImmutable years(int $value) Set current instance year to the given value. - * @method CarbonImmutable year(int $value) Set current instance year to the given value. - * @method CarbonImmutable setYears(int $value) Set current instance year to the given value. - * @method CarbonImmutable setYear(int $value) Set current instance year to the given value. - * @method CarbonImmutable months(Month|int $value) Set current instance month to the given value. - * @method CarbonImmutable month(Month|int $value) Set current instance month to the given value. - * @method CarbonImmutable setMonths(Month|int $value) Set current instance month to the given value. - * @method CarbonImmutable setMonth(Month|int $value) Set current instance month to the given value. - * @method CarbonImmutable days(int $value) Set current instance day to the given value. - * @method CarbonImmutable day(int $value) Set current instance day to the given value. - * @method CarbonImmutable setDays(int $value) Set current instance day to the given value. - * @method CarbonImmutable setDay(int $value) Set current instance day to the given value. - * @method CarbonImmutable hours(int $value) Set current instance hour to the given value. - * @method CarbonImmutable hour(int $value) Set current instance hour to the given value. - * @method CarbonImmutable setHours(int $value) Set current instance hour to the given value. - * @method CarbonImmutable setHour(int $value) Set current instance hour to the given value. - * @method CarbonImmutable minutes(int $value) Set current instance minute to the given value. - * @method CarbonImmutable minute(int $value) Set current instance minute to the given value. - * @method CarbonImmutable setMinutes(int $value) Set current instance minute to the given value. - * @method CarbonImmutable setMinute(int $value) Set current instance minute to the given value. - * @method CarbonImmutable seconds(int $value) Set current instance second to the given value. - * @method CarbonImmutable second(int $value) Set current instance second to the given value. - * @method CarbonImmutable setSeconds(int $value) Set current instance second to the given value. - * @method CarbonImmutable setSecond(int $value) Set current instance second to the given value. - * @method CarbonImmutable millis(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable milli(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMillis(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMilli(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable milliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable millisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMillisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable micros(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable micro(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable setMicros(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable setMicro(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable microseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable microsecond(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable addYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addYear() Add one year to the instance (using date interval). - * @method CarbonImmutable subYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subYear() Sub one year to the instance (using date interval). - * @method CarbonImmutable addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addYearsWithoutOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearsWithoutOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearsWithNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearsWithNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearsNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearsNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMonth() Add one month to the instance (using date interval). - * @method CarbonImmutable subMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMonth() Sub one month to the instance (using date interval). - * @method CarbonImmutable addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMonthsWithoutOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthsWithoutOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthsWithNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthsWithNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthsNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthsNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addDay() Add one day to the instance (using date interval). - * @method CarbonImmutable subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subDay() Sub one day to the instance (using date interval). - * @method CarbonImmutable addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addHour() Add one hour to the instance (using date interval). - * @method CarbonImmutable subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subHour() Sub one hour to the instance (using date interval). - * @method CarbonImmutable addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMinute() Add one minute to the instance (using date interval). - * @method CarbonImmutable subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMinute() Sub one minute to the instance (using date interval). - * @method CarbonImmutable addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addSecond() Add one second to the instance (using date interval). - * @method CarbonImmutable subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subSecond() Sub one second to the instance (using date interval). - * @method CarbonImmutable addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMilli() Add one millisecond to the instance (using date interval). - * @method CarbonImmutable subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMilli() Sub one millisecond to the instance (using date interval). - * @method CarbonImmutable addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMillisecond() Add one millisecond to the instance (using date interval). - * @method CarbonImmutable subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMillisecond() Sub one millisecond to the instance (using date interval). - * @method CarbonImmutable addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMicro() Add one microsecond to the instance (using date interval). - * @method CarbonImmutable subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMicro() Sub one microsecond to the instance (using date interval). - * @method CarbonImmutable addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMicrosecond() Add one microsecond to the instance (using date interval). - * @method CarbonImmutable subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method CarbonImmutable addMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMillennium() Add one millennium to the instance (using date interval). - * @method CarbonImmutable subMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMillennium() Sub one millennium to the instance (using date interval). - * @method CarbonImmutable addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMillenniaWithoutOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniaWithoutOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniaWithNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniaWithNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniaNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniaNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addCentury() Add one century to the instance (using date interval). - * @method CarbonImmutable subCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subCentury() Sub one century to the instance (using date interval). - * @method CarbonImmutable addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addCenturiesWithoutOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturiesWithoutOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturiesWithNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturiesWithNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturiesNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturiesNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addDecade() Add one decade to the instance (using date interval). - * @method CarbonImmutable subDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subDecade() Sub one decade to the instance (using date interval). - * @method CarbonImmutable addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addDecadesWithoutOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadesWithoutOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadesWithNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadesWithNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadesNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadesNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addQuarter() Add one quarter to the instance (using date interval). - * @method CarbonImmutable subQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subQuarter() Sub one quarter to the instance (using date interval). - * @method CarbonImmutable addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addQuartersWithoutOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuartersWithoutOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuartersWithNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuartersWithNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuartersNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuartersNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addWeek() Add one week to the instance (using date interval). - * @method CarbonImmutable subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subWeek() Sub one week to the instance (using date interval). - * @method CarbonImmutable addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addWeekday() Add one weekday to the instance (using date interval). - * @method CarbonImmutable subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subWeekday() Sub one weekday to the instance (using date interval). - * @method CarbonImmutable addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMicro() Add one microsecond to the instance (using timestamp). - * @method CarbonImmutable subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonImmutable addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMicrosecond() Add one microsecond to the instance (using timestamp). - * @method CarbonImmutable subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonImmutable addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMilli() Add one millisecond to the instance (using timestamp). - * @method CarbonImmutable subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonImmutable addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMillisecond() Add one millisecond to the instance (using timestamp). - * @method CarbonImmutable subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonImmutable addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCSecond() Add one second to the instance (using timestamp). - * @method CarbonImmutable subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. - * @method CarbonImmutable addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMinute() Add one minute to the instance (using timestamp). - * @method CarbonImmutable subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. - * @method CarbonImmutable addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCHour() Add one hour to the instance (using timestamp). - * @method CarbonImmutable subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. - * @method CarbonImmutable addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCDay() Add one day to the instance (using timestamp). - * @method CarbonImmutable subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. - * @method CarbonImmutable addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCWeek() Add one week to the instance (using timestamp). - * @method CarbonImmutable subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. - * @method CarbonImmutable addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMonth() Add one month to the instance (using timestamp). - * @method CarbonImmutable subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. - * @method CarbonImmutable addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCQuarter() Add one quarter to the instance (using timestamp). - * @method CarbonImmutable subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. - * @method CarbonImmutable addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCYear() Add one year to the instance (using timestamp). - * @method CarbonImmutable subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. - * @method CarbonImmutable addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCDecade() Add one decade to the instance (using timestamp). - * @method CarbonImmutable subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. - * @method CarbonImmutable addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCCentury() Add one century to the instance (using timestamp). - * @method CarbonImmutable subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. - * @method CarbonImmutable addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMillennium() Add one millennium to the instance (using timestamp). - * @method CarbonImmutable subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. - * @method CarbonImmutable roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonImmutable roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonImmutable floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonImmutable floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonImmutable ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonImmutable ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonImmutable roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonImmutable roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonImmutable floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonImmutable floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonImmutable ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonImmutable ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonImmutable roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonImmutable roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonImmutable floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonImmutable floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonImmutable ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonImmutable ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonImmutable roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonImmutable roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonImmutable floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonImmutable floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonImmutable ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonImmutable ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonImmutable roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonImmutable roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonImmutable floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonImmutable floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonImmutable ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonImmutable ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonImmutable roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonImmutable roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonImmutable floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonImmutable floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonImmutable ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonImmutable ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonImmutable roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonImmutable roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonImmutable floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonImmutable floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonImmutable ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonImmutable ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonImmutable roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonImmutable roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonImmutable floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonImmutable floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonImmutable ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonImmutable ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonImmutable roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonImmutable roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonImmutable floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonImmutable floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonImmutable ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonImmutable ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonImmutable roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonImmutable roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonImmutable floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonImmutable floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonImmutable ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonImmutable ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonImmutable roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonImmutable roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonImmutable floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonImmutable floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonImmutable ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonImmutable ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonImmutable roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonImmutable roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonImmutable floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonImmutable floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonImmutable ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method CarbonImmutable ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium - * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value - * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value - * @method int daysInCentury() Return the number of days contained in the current century - * @method int daysInDecade() Return the number of days contained in the current decade - * @method int daysInMillennium() Return the number of days contained in the current millennium - * @method int daysInMonth() Return the number of days contained in the current month - * @method int daysInQuarter() Return the number of days contained in the current quarter - * @method int daysInWeek() Return the number of days contained in the current week - * @method int daysInYear() Return the number of days contained in the current year - * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value - * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value - * @method int decadesInCentury() Return the number of decades contained in the current century - * @method int decadesInMillennium() Return the number of decades contained in the current millennium - * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value - * @method int hoursInCentury() Return the number of hours contained in the current century - * @method int hoursInDay() Return the number of hours contained in the current day - * @method int hoursInDecade() Return the number of hours contained in the current decade - * @method int hoursInMillennium() Return the number of hours contained in the current millennium - * @method int hoursInMonth() Return the number of hours contained in the current month - * @method int hoursInQuarter() Return the number of hours contained in the current quarter - * @method int hoursInWeek() Return the number of hours contained in the current week - * @method int hoursInYear() Return the number of hours contained in the current year - * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value - * @method int microsecondsInCentury() Return the number of microseconds contained in the current century - * @method int microsecondsInDay() Return the number of microseconds contained in the current day - * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade - * @method int microsecondsInHour() Return the number of microseconds contained in the current hour - * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium - * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond - * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute - * @method int microsecondsInMonth() Return the number of microseconds contained in the current month - * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter - * @method int microsecondsInSecond() Return the number of microseconds contained in the current second - * @method int microsecondsInWeek() Return the number of microseconds contained in the current week - * @method int microsecondsInYear() Return the number of microseconds contained in the current year - * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value - * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century - * @method int millisecondsInDay() Return the number of milliseconds contained in the current day - * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade - * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour - * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium - * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute - * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month - * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter - * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second - * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week - * @method int millisecondsInYear() Return the number of milliseconds contained in the current year - * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value - * @method int minutesInCentury() Return the number of minutes contained in the current century - * @method int minutesInDay() Return the number of minutes contained in the current day - * @method int minutesInDecade() Return the number of minutes contained in the current decade - * @method int minutesInHour() Return the number of minutes contained in the current hour - * @method int minutesInMillennium() Return the number of minutes contained in the current millennium - * @method int minutesInMonth() Return the number of minutes contained in the current month - * @method int minutesInQuarter() Return the number of minutes contained in the current quarter - * @method int minutesInWeek() Return the number of minutes contained in the current week - * @method int minutesInYear() Return the number of minutes contained in the current year - * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value - * @method int monthsInCentury() Return the number of months contained in the current century - * @method int monthsInDecade() Return the number of months contained in the current decade - * @method int monthsInMillennium() Return the number of months contained in the current millennium - * @method int monthsInQuarter() Return the number of months contained in the current quarter - * @method int monthsInYear() Return the number of months contained in the current year - * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value - * @method int quartersInCentury() Return the number of quarters contained in the current century - * @method int quartersInDecade() Return the number of quarters contained in the current decade - * @method int quartersInMillennium() Return the number of quarters contained in the current millennium - * @method int quartersInYear() Return the number of quarters contained in the current year - * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value - * @method int secondsInCentury() Return the number of seconds contained in the current century - * @method int secondsInDay() Return the number of seconds contained in the current day - * @method int secondsInDecade() Return the number of seconds contained in the current decade - * @method int secondsInHour() Return the number of seconds contained in the current hour - * @method int secondsInMillennium() Return the number of seconds contained in the current millennium - * @method int secondsInMinute() Return the number of seconds contained in the current minute - * @method int secondsInMonth() Return the number of seconds contained in the current month - * @method int secondsInQuarter() Return the number of seconds contained in the current quarter - * @method int secondsInWeek() Return the number of seconds contained in the current week - * @method int secondsInYear() Return the number of seconds contained in the current year - * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value - * @method int weeksInCentury() Return the number of weeks contained in the current century - * @method int weeksInDecade() Return the number of weeks contained in the current decade - * @method int weeksInMillennium() Return the number of weeks contained in the current millennium - * @method int weeksInMonth() Return the number of weeks contained in the current month - * @method int weeksInQuarter() Return the number of weeks contained in the current quarter - * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value - * @method int yearsInCentury() Return the number of years contained in the current century - * @method int yearsInDecade() Return the number of years contained in the current decade - * @method int yearsInMillennium() Return the number of years contained in the current millennium - * - * - */ -class CarbonImmutable extends DateTimeImmutable implements CarbonInterface -{ - use Date { - __clone as dateTraitClone; - } - - public function __clone(): void - { - $this->dateTraitClone(); - $this->endOfTime = false; - $this->startOfTime = false; - } - - /** - * Create a very old date representing start of time. - * - * @return static - */ - public static function startOfTime(): static - { - $date = static::parse('0001-01-01')->years(self::getStartOfTimeYear()); - $date->startOfTime = true; - - return $date; - } - - /** - * Create a very far date representing end of time. - * - * @return static - */ - public static function endOfTime(): static - { - $date = static::parse('9999-12-31 23:59:59.999999')->years(self::getEndOfTimeYear()); - $date->endOfTime = true; - - return $date; - } - - /** - * @codeCoverageIgnore - */ - private static function getEndOfTimeYear(): int - { - return 1118290769066902787; // PHP_INT_MAX no longer work since PHP 8.1 - } - - /** - * @codeCoverageIgnore - */ - private static function getStartOfTimeYear(): int - { - return -1118290769066898816; // PHP_INT_MIN no longer work since PHP 8.1 - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php b/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php deleted file mode 100644 index 2d77269..0000000 --- a/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php +++ /dev/null @@ -1,4934 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use BadMethodCallException; -use Carbon\Exceptions\BadComparisonUnitException; -use Carbon\Exceptions\ImmutableException; -use Carbon\Exceptions\InvalidDateException; -use Carbon\Exceptions\InvalidFormatException; -use Carbon\Exceptions\UnknownGetterException; -use Carbon\Exceptions\UnknownMethodException; -use Carbon\Exceptions\UnknownSetterException; -use Closure; -use DateInterval; -use DateTime; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use JsonSerializable; -use ReflectionException; -use ReturnTypeWillChange; -use Symfony\Contracts\Translation\TranslatorInterface; -use Throwable; - -/** - * Common interface for Carbon and CarbonImmutable. - * - * - * - * @property string $localeDayOfWeek the day of week in current locale - * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale - * @property string $localeMonth the month in current locale - * @property string $shortLocaleMonth the abbreviated month in current locale - * @property int $year - * @property int $yearIso - * @property int $month - * @property int $day - * @property int $hour - * @property int $minute - * @property int $second - * @property int $micro - * @property int $microsecond - * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English - * @property int $milliseconds - * @property int $millisecond - * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium - * @property int $dayOfCentury The value of the day starting from the beginning of the current century - * @property int $dayOfDecade The value of the day starting from the beginning of the current decade - * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium - * @property int $dayOfMonth The value of the day starting from the beginning of the current month - * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter - * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property int $dayOfYear 1 through 366 - * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century - * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium - * @property int $hourOfCentury The value of the hour starting from the beginning of the current century - * @property int $hourOfDay The value of the hour starting from the beginning of the current day - * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade - * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium - * @property int $hourOfMonth The value of the hour starting from the beginning of the current month - * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter - * @property int $hourOfWeek The value of the hour starting from the beginning of the current week - * @property int $hourOfYear The value of the hour starting from the beginning of the current year - * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century - * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day - * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade - * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour - * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium - * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond - * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute - * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month - * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter - * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second - * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week - * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year - * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century - * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day - * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade - * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour - * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium - * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute - * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month - * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter - * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second - * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week - * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year - * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century - * @property int $minuteOfDay The value of the minute starting from the beginning of the current day - * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade - * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour - * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium - * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month - * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter - * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week - * @property int $minuteOfYear The value of the minute starting from the beginning of the current year - * @property int $monthOfCentury The value of the month starting from the beginning of the current century - * @property int $monthOfDecade The value of the month starting from the beginning of the current decade - * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium - * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter - * @property int $monthOfYear The value of the month starting from the beginning of the current year - * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century - * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade - * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium - * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year - * @property int $secondOfCentury The value of the second starting from the beginning of the current century - * @property int $secondOfDay The value of the second starting from the beginning of the current day - * @property int $secondOfDecade The value of the second starting from the beginning of the current decade - * @property int $secondOfHour The value of the second starting from the beginning of the current hour - * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium - * @property int $secondOfMinute The value of the second starting from the beginning of the current minute - * @property int $secondOfMonth The value of the second starting from the beginning of the current month - * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter - * @property int $secondOfWeek The value of the second starting from the beginning of the current week - * @property int $secondOfYear The value of the second starting from the beginning of the current year - * @property int $weekOfCentury The value of the week starting from the beginning of the current century - * @property int $weekOfDecade The value of the week starting from the beginning of the current decade - * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium - * @property int $weekOfMonth 1 through 5 - * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter - * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property int $yearOfCentury The value of the year starting from the beginning of the current century - * @property int $yearOfDecade The value of the year starting from the beginning of the current decade - * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium - * @property-read int $daysInCentury The number of days contained in the current century - * @property-read int $daysInDecade The number of days contained in the current decade - * @property-read int $daysInMillennium The number of days contained in the current millennium - * @property-read int $daysInMonth number of days in the given month - * @property-read int $daysInQuarter The number of days contained in the current quarter - * @property-read int $daysInWeek The number of days contained in the current week - * @property-read int $daysInYear 365 or 366 - * @property-read int $decadesInCentury The number of decades contained in the current century - * @property-read int $decadesInMillennium The number of decades contained in the current millennium - * @property-read int $hoursInCentury The number of hours contained in the current century - * @property-read int $hoursInDay The number of hours contained in the current day - * @property-read int $hoursInDecade The number of hours contained in the current decade - * @property-read int $hoursInMillennium The number of hours contained in the current millennium - * @property-read int $hoursInMonth The number of hours contained in the current month - * @property-read int $hoursInQuarter The number of hours contained in the current quarter - * @property-read int $hoursInWeek The number of hours contained in the current week - * @property-read int $hoursInYear The number of hours contained in the current year - * @property-read int $microsecondsInCentury The number of microseconds contained in the current century - * @property-read int $microsecondsInDay The number of microseconds contained in the current day - * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade - * @property-read int $microsecondsInHour The number of microseconds contained in the current hour - * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium - * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond - * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute - * @property-read int $microsecondsInMonth The number of microseconds contained in the current month - * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter - * @property-read int $microsecondsInSecond The number of microseconds contained in the current second - * @property-read int $microsecondsInWeek The number of microseconds contained in the current week - * @property-read int $microsecondsInYear The number of microseconds contained in the current year - * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century - * @property-read int $millisecondsInDay The number of milliseconds contained in the current day - * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade - * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour - * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium - * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute - * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month - * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter - * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second - * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week - * @property-read int $millisecondsInYear The number of milliseconds contained in the current year - * @property-read int $minutesInCentury The number of minutes contained in the current century - * @property-read int $minutesInDay The number of minutes contained in the current day - * @property-read int $minutesInDecade The number of minutes contained in the current decade - * @property-read int $minutesInHour The number of minutes contained in the current hour - * @property-read int $minutesInMillennium The number of minutes contained in the current millennium - * @property-read int $minutesInMonth The number of minutes contained in the current month - * @property-read int $minutesInQuarter The number of minutes contained in the current quarter - * @property-read int $minutesInWeek The number of minutes contained in the current week - * @property-read int $minutesInYear The number of minutes contained in the current year - * @property-read int $monthsInCentury The number of months contained in the current century - * @property-read int $monthsInDecade The number of months contained in the current decade - * @property-read int $monthsInMillennium The number of months contained in the current millennium - * @property-read int $monthsInQuarter The number of months contained in the current quarter - * @property-read int $monthsInYear The number of months contained in the current year - * @property-read int $quartersInCentury The number of quarters contained in the current century - * @property-read int $quartersInDecade The number of quarters contained in the current decade - * @property-read int $quartersInMillennium The number of quarters contained in the current millennium - * @property-read int $quartersInYear The number of quarters contained in the current year - * @property-read int $secondsInCentury The number of seconds contained in the current century - * @property-read int $secondsInDay The number of seconds contained in the current day - * @property-read int $secondsInDecade The number of seconds contained in the current decade - * @property-read int $secondsInHour The number of seconds contained in the current hour - * @property-read int $secondsInMillennium The number of seconds contained in the current millennium - * @property-read int $secondsInMinute The number of seconds contained in the current minute - * @property-read int $secondsInMonth The number of seconds contained in the current month - * @property-read int $secondsInQuarter The number of seconds contained in the current quarter - * @property-read int $secondsInWeek The number of seconds contained in the current week - * @property-read int $secondsInYear The number of seconds contained in the current year - * @property-read int $weeksInCentury The number of weeks contained in the current century - * @property-read int $weeksInDecade The number of weeks contained in the current decade - * @property-read int $weeksInMillennium The number of weeks contained in the current millennium - * @property-read int $weeksInMonth The number of weeks contained in the current month - * @property-read int $weeksInQuarter The number of weeks contained in the current quarter - * @property-read int $weeksInYear 51 through 53 - * @property-read int $yearsInCentury The number of years contained in the current century - * @property-read int $yearsInDecade The number of years contained in the current decade - * @property-read int $yearsInMillennium The number of years contained in the current millennium - * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method CarbonInterface years(int $value) Set current instance year to the given value. - * @method CarbonInterface year(int $value) Set current instance year to the given value. - * @method CarbonInterface setYears(int $value) Set current instance year to the given value. - * @method CarbonInterface setYear(int $value) Set current instance year to the given value. - * @method CarbonInterface months(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface month(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface setMonths(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface setMonth(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface days(int $value) Set current instance day to the given value. - * @method CarbonInterface day(int $value) Set current instance day to the given value. - * @method CarbonInterface setDays(int $value) Set current instance day to the given value. - * @method CarbonInterface setDay(int $value) Set current instance day to the given value. - * @method CarbonInterface hours(int $value) Set current instance hour to the given value. - * @method CarbonInterface hour(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHours(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHour(int $value) Set current instance hour to the given value. - * @method CarbonInterface minutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface minute(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinute(int $value) Set current instance minute to the given value. - * @method CarbonInterface seconds(int $value) Set current instance second to the given value. - * @method CarbonInterface second(int $value) Set current instance second to the given value. - * @method CarbonInterface setSeconds(int $value) Set current instance second to the given value. - * @method CarbonInterface setSecond(int $value) Set current instance second to the given value. - * @method CarbonInterface millis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface millisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface micros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface micro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microsecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface addYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addYear() Add one year to the instance (using date interval). - * @method CarbonInterface subYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subYear() Sub one year to the instance (using date interval). - * @method CarbonInterface addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearsWithoutOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithoutOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsWithNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMonth() Add one month to the instance (using date interval). - * @method CarbonInterface subMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMonth() Sub one month to the instance (using date interval). - * @method CarbonInterface addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthsWithoutOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithoutOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsWithNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDay() Add one day to the instance (using date interval). - * @method CarbonInterface subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDay() Sub one day to the instance (using date interval). - * @method CarbonInterface addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addHour() Add one hour to the instance (using date interval). - * @method CarbonInterface subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subHour() Sub one hour to the instance (using date interval). - * @method CarbonInterface addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMinute() Add one minute to the instance (using date interval). - * @method CarbonInterface subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMinute() Sub one minute to the instance (using date interval). - * @method CarbonInterface addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addSecond() Add one second to the instance (using date interval). - * @method CarbonInterface subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subSecond() Sub one second to the instance (using date interval). - * @method CarbonInterface addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMilli() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMilli() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillisecond() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillisecond() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicro() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicro() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicrosecond() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillennium() Add one millennium to the instance (using date interval). - * @method CarbonInterface subMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillennium() Sub one millennium to the instance (using date interval). - * @method CarbonInterface addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniaWithoutOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithoutOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaWithNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addCentury() Add one century to the instance (using date interval). - * @method CarbonInterface subCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subCentury() Sub one century to the instance (using date interval). - * @method CarbonInterface addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturiesWithoutOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithoutOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesWithNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDecade() Add one decade to the instance (using date interval). - * @method CarbonInterface subDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDecade() Sub one decade to the instance (using date interval). - * @method CarbonInterface addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadesWithoutOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithoutOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesWithNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addQuarter() Add one quarter to the instance (using date interval). - * @method CarbonInterface subQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subQuarter() Sub one quarter to the instance (using date interval). - * @method CarbonInterface addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuartersWithoutOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithoutOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersWithNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeek() Add one week to the instance (using date interval). - * @method CarbonInterface subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeek() Sub one week to the instance (using date interval). - * @method CarbonInterface addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeekday() Add one weekday to the instance (using date interval). - * @method CarbonInterface subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeekday() Sub one weekday to the instance (using date interval). - * @method CarbonInterface addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMicro() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonInterface addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMicrosecond() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonInterface addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMilli() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonInterface addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMillisecond() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonInterface addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCSecond() Add one second to the instance (using timestamp). - * @method CarbonInterface subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. - * @method CarbonInterface addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMinute() Add one minute to the instance (using timestamp). - * @method CarbonInterface subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. - * @method CarbonInterface addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCHour() Add one hour to the instance (using timestamp). - * @method CarbonInterface subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. - * @method CarbonInterface addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCDay() Add one day to the instance (using timestamp). - * @method CarbonInterface subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. - * @method CarbonInterface addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCWeek() Add one week to the instance (using timestamp). - * @method CarbonInterface subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. - * @method CarbonInterface addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMonth() Add one month to the instance (using timestamp). - * @method CarbonInterface subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. - * @method CarbonInterface addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCQuarter() Add one quarter to the instance (using timestamp). - * @method CarbonInterface subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. - * @method CarbonInterface addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCYear() Add one year to the instance (using timestamp). - * @method CarbonInterface subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. - * @method CarbonInterface addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCDecade() Add one decade to the instance (using timestamp). - * @method CarbonInterface subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. - * @method CarbonInterface addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCCentury() Add one century to the instance (using timestamp). - * @method CarbonInterface subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. - * @method CarbonInterface addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMillennium() Add one millennium to the instance (using timestamp). - * @method CarbonInterface subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. - * @method CarbonInterface roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method CarbonInterface ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium - * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value - * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value - * @method int daysInCentury() Return the number of days contained in the current century - * @method int daysInDecade() Return the number of days contained in the current decade - * @method int daysInMillennium() Return the number of days contained in the current millennium - * @method int daysInMonth() Return the number of days contained in the current month - * @method int daysInQuarter() Return the number of days contained in the current quarter - * @method int daysInWeek() Return the number of days contained in the current week - * @method int daysInYear() Return the number of days contained in the current year - * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value - * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value - * @method int decadesInCentury() Return the number of decades contained in the current century - * @method int decadesInMillennium() Return the number of decades contained in the current millennium - * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value - * @method int hoursInCentury() Return the number of hours contained in the current century - * @method int hoursInDay() Return the number of hours contained in the current day - * @method int hoursInDecade() Return the number of hours contained in the current decade - * @method int hoursInMillennium() Return the number of hours contained in the current millennium - * @method int hoursInMonth() Return the number of hours contained in the current month - * @method int hoursInQuarter() Return the number of hours contained in the current quarter - * @method int hoursInWeek() Return the number of hours contained in the current week - * @method int hoursInYear() Return the number of hours contained in the current year - * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value - * @method int microsecondsInCentury() Return the number of microseconds contained in the current century - * @method int microsecondsInDay() Return the number of microseconds contained in the current day - * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade - * @method int microsecondsInHour() Return the number of microseconds contained in the current hour - * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium - * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond - * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute - * @method int microsecondsInMonth() Return the number of microseconds contained in the current month - * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter - * @method int microsecondsInSecond() Return the number of microseconds contained in the current second - * @method int microsecondsInWeek() Return the number of microseconds contained in the current week - * @method int microsecondsInYear() Return the number of microseconds contained in the current year - * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value - * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century - * @method int millisecondsInDay() Return the number of milliseconds contained in the current day - * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade - * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour - * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium - * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute - * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month - * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter - * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second - * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week - * @method int millisecondsInYear() Return the number of milliseconds contained in the current year - * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value - * @method int minutesInCentury() Return the number of minutes contained in the current century - * @method int minutesInDay() Return the number of minutes contained in the current day - * @method int minutesInDecade() Return the number of minutes contained in the current decade - * @method int minutesInHour() Return the number of minutes contained in the current hour - * @method int minutesInMillennium() Return the number of minutes contained in the current millennium - * @method int minutesInMonth() Return the number of minutes contained in the current month - * @method int minutesInQuarter() Return the number of minutes contained in the current quarter - * @method int minutesInWeek() Return the number of minutes contained in the current week - * @method int minutesInYear() Return the number of minutes contained in the current year - * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value - * @method int monthsInCentury() Return the number of months contained in the current century - * @method int monthsInDecade() Return the number of months contained in the current decade - * @method int monthsInMillennium() Return the number of months contained in the current millennium - * @method int monthsInQuarter() Return the number of months contained in the current quarter - * @method int monthsInYear() Return the number of months contained in the current year - * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value - * @method int quartersInCentury() Return the number of quarters contained in the current century - * @method int quartersInDecade() Return the number of quarters contained in the current decade - * @method int quartersInMillennium() Return the number of quarters contained in the current millennium - * @method int quartersInYear() Return the number of quarters contained in the current year - * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value - * @method int secondsInCentury() Return the number of seconds contained in the current century - * @method int secondsInDay() Return the number of seconds contained in the current day - * @method int secondsInDecade() Return the number of seconds contained in the current decade - * @method int secondsInHour() Return the number of seconds contained in the current hour - * @method int secondsInMillennium() Return the number of seconds contained in the current millennium - * @method int secondsInMinute() Return the number of seconds contained in the current minute - * @method int secondsInMonth() Return the number of seconds contained in the current month - * @method int secondsInQuarter() Return the number of seconds contained in the current quarter - * @method int secondsInWeek() Return the number of seconds contained in the current week - * @method int secondsInYear() Return the number of seconds contained in the current year - * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value - * @method int weeksInCentury() Return the number of weeks contained in the current century - * @method int weeksInDecade() Return the number of weeks contained in the current decade - * @method int weeksInMillennium() Return the number of weeks contained in the current millennium - * @method int weeksInMonth() Return the number of weeks contained in the current month - * @method int weeksInQuarter() Return the number of weeks contained in the current quarter - * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value - * @method int yearsInCentury() Return the number of years contained in the current century - * @method int yearsInDecade() Return the number of years contained in the current decade - * @method int yearsInMillennium() Return the number of years contained in the current millennium - * - * - * - * @codeCoverageIgnore - */ -interface CarbonInterface extends DateTimeInterface, JsonSerializable -{ - /** - * Diff wording options(expressed in octal). - */ - public const NO_ZERO_DIFF = 01; - public const JUST_NOW = 02; - public const ONE_DAY_WORDS = 04; - public const TWO_DAY_WORDS = 010; - public const SEQUENTIAL_PARTS_ONLY = 020; - public const ROUND = 040; - public const FLOOR = 0100; - public const CEIL = 0200; - - /** - * Diff syntax options. - */ - public const DIFF_ABSOLUTE = 1; // backward compatibility with true - public const DIFF_RELATIVE_AUTO = 0; // backward compatibility with false - public const DIFF_RELATIVE_TO_NOW = 2; - public const DIFF_RELATIVE_TO_OTHER = 3; - - /** - * Translate string options. - */ - public const TRANSLATE_MONTHS = 1; - public const TRANSLATE_DAYS = 2; - public const TRANSLATE_UNITS = 4; - public const TRANSLATE_MERIDIEM = 8; - public const TRANSLATE_DIFF = 0x10; - public const TRANSLATE_ALL = self::TRANSLATE_MONTHS | self::TRANSLATE_DAYS | self::TRANSLATE_UNITS | self::TRANSLATE_MERIDIEM | self::TRANSLATE_DIFF; - - /** - * The day constants. - */ - public const SUNDAY = 0; - public const MONDAY = 1; - public const TUESDAY = 2; - public const WEDNESDAY = 3; - public const THURSDAY = 4; - public const FRIDAY = 5; - public const SATURDAY = 6; - - /** - * The month constants. - * These aren't used by Carbon itself but exist for - * convenience sake alone. - */ - public const JANUARY = 1; - public const FEBRUARY = 2; - public const MARCH = 3; - public const APRIL = 4; - public const MAY = 5; - public const JUNE = 6; - public const JULY = 7; - public const AUGUST = 8; - public const SEPTEMBER = 9; - public const OCTOBER = 10; - public const NOVEMBER = 11; - public const DECEMBER = 12; - - /** - * Number of X in Y. - */ - public const YEARS_PER_MILLENNIUM = 1_000; - public const YEARS_PER_CENTURY = 100; - public const YEARS_PER_DECADE = 10; - public const MONTHS_PER_YEAR = 12; - public const MONTHS_PER_QUARTER = 3; - public const QUARTERS_PER_YEAR = 4; - public const WEEKS_PER_YEAR = 52; - public const WEEKS_PER_MONTH = 4; - public const DAYS_PER_YEAR = 365; - public const DAYS_PER_WEEK = 7; - public const HOURS_PER_DAY = 24; - public const MINUTES_PER_HOUR = 60; - public const SECONDS_PER_MINUTE = 60; - public const MILLISECONDS_PER_SECOND = 1_000; - public const MICROSECONDS_PER_MILLISECOND = 1_000; - public const MICROSECONDS_PER_SECOND = 1_000_000; - - /** - * Special settings to get the start of week from current locale culture. - */ - public const WEEK_DAY_AUTO = 'auto'; - - /** - * RFC7231 DateTime format. - * - * @var string - */ - public const RFC7231_FORMAT = 'D, d M Y H:i:s \G\M\T'; - - /** - * Default format to use for __toString method when type juggling occurs. - * - * @var string - */ - public const DEFAULT_TO_STRING_FORMAT = 'Y-m-d H:i:s'; - - /** - * Format for converting mocked time, includes microseconds. - * - * @var string - */ - public const MOCK_DATETIME_FORMAT = 'Y-m-d H:i:s.u'; - - /** - * Pattern detection for ->isoFormat and ::createFromIsoFormat. - * - * @var string - */ - public const ISO_FORMAT_REGEXP = '(O[YMDHhms]|[Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY?|g{1,5}|G{1,5}|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?)'; - - /** - * Default locale (language and region). - * - * @var string - */ - public const DEFAULT_LOCALE = 'en'; - - // - - /** - * Dynamically handle calls to the class. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @throws UnknownMethodException|BadMethodCallException|ReflectionException|Throwable - */ - public function __call(string $method, array $parameters): mixed; - - /** - * Dynamically handle calls to the class. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @throws BadMethodCallException - */ - public static function __callStatic(string $method, array $parameters): mixed; - - /** - * Update constructedObjectId on cloned. - */ - public function __clone(): void; - - /** - * Create a new Carbon instance. - * - * Please see the testing aids section (specifically static::setTestNow()) - * for more on the possibility of this constructor returning a test instance. - * - * @throws InvalidFormatException - */ - public function __construct(DateTimeInterface|WeekDay|Month|string|int|float|null $time = null, DateTimeZone|string|int|null $timezone = null); - - /** - * Show truthy properties on var_dump(). - */ - public function __debugInfo(): array; - - /** - * Get a part of the Carbon object. - * - * @throws UnknownGetterException - * - * @return string|int|bool|DateTimeZone|null - */ - public function __get(string $name): mixed; - - /** - * Check if an attribute exists on the object - * - * @param string $name - * - * @return bool - */ - public function __isset($name); - - /** - * Set a part of the Carbon object - * - * @param string $name - * @param string|int|DateTimeZone $value - * - * @throws UnknownSetterException|ReflectionException - * - * @return void - */ - public function __set($name, $value); - - /** - * The __set_state handler. - * - * @param string|array $dump - * - * @return static - */ - #[ReturnTypeWillChange] - public static function __set_state($dump): static; - - /** - * Returns the list of properties to dump on serialize() called on. - * - * Only used by PHP < 7.4. - * - * @return array - */ - public function __sleep(); - - /** - * Format the instance as a string using the set format - * - * @example - * ``` - * echo Carbon::now(); // Carbon instances can be cast to string - * ``` - */ - public function __toString(); - - /** - * Add given units or interval to the current instance. - * - * @example $date->add('hour', 3) - * @example $date->add(15, 'days') - * @example $date->add(CarbonInterval::days(4)) - * - * @param Unit|string|DateInterval|Closure|CarbonConverterInterface $unit - * @param int|float $value - * @param bool|null $overflow - * - * @return static - */ - #[ReturnTypeWillChange] - public function add($unit, $value = 1, ?bool $overflow = null): static; - - /** - * @deprecated Prefer to use add addUTCUnit() which more accurately defines what it's doing. - * - * Add seconds to the instance using timestamp. Positive $value travels - * forward while negative $value travels into the past. - * - * @param string $unit - * @param int|float|null $value - * - * @return static - */ - public function addRealUnit(string $unit, $value = 1): static; - - /** - * Add seconds to the instance using timestamp. Positive $value travels - * forward while negative $value travels into the past. - * - * @param string $unit - * @param int|float|null $value - * - * @return static - */ - public function addUTCUnit(string $unit, $value = 1): static; - - /** - * Add given units to the current instance. - */ - public function addUnit(Unit|string $unit, $value = 1, ?bool $overflow = null): static; - - /** - * Add any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value amount to add to the input unit - * @param string $overflowUnit unit name to not overflow - */ - public function addUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static; - - /** - * Get the difference in a human readable format in the current locale from an other - * instance given to now - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single part) - * @param int $options human diff options - * - * @return string - */ - public function ago($syntax = null, $short = false, $parts = 1, $options = null); - - /** - * Modify the current instance to the average of a given instance (default now) and the current instance - * (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|null $date - * - * @return static - */ - public function average($date = null); - - /** - * Clone the current instance if it's mutable. - * - * This method is convenient to ensure you don't mutate the initial object - * but avoid to make a useless copy of it if it's already immutable. - * - * @return static - */ - public function avoidMutation(): static; - - /** - * Determines if the instance is between two others. - * - * The third argument allow you to specify if bounds are included or not (true by default) - * but for when you including/excluding bounds may produce different results in your application, - * we recommend to use the explicit methods ->betweenIncluded() or ->betweenExcluded() instead. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->between('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->between('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01', false); // false - * ``` - * - * @param bool $equal Indicates if an equal to comparison should be done - */ - public function between(DateTimeInterface|string $date1, DateTimeInterface|string $date2, bool $equal = true): bool; - - /** - * Determines if the instance is between two others, bounds excluded. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->betweenExcluded('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-25', '2018-08-01'); // false - * ``` - */ - public function betweenExcluded(DateTimeInterface|string $date1, DateTimeInterface|string $date2): bool; - - /** - * Determines if the instance is between two others, bounds included. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->betweenIncluded('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-25', '2018-08-01'); // true - * ``` - */ - public function betweenIncluded(DateTimeInterface|string $date1, DateTimeInterface|string $date2): bool; - - /** - * Returns either day of week + time (e.g. "Last Friday at 3:30 PM") if reference time is within 7 days, - * or a calendar date (e.g. "10/29/2017") otherwise. - * - * Language, date and time formats will change according to the current locale. - * - * @param Carbon|\DateTimeInterface|string|null $referenceTime - * @param array $formats - * - * @return string - */ - public function calendar($referenceTime = null, array $formats = []); - - /** - * Checks if the (date)time string is in a given format and valid to create a - * new instance. - * - * @example - * ``` - * Carbon::canBeCreatedFromFormat('11:12:45', 'h:i:s'); // true - * Carbon::canBeCreatedFromFormat('13:12:45', 'h:i:s'); // false - * ``` - */ - public static function canBeCreatedFromFormat(?string $date, string $format): bool; - - /** - * Return the Carbon instance passed through, a now instance in the same timezone - * if null given or parse the input if string given. - * - * @param Carbon|\Carbon\CarbonPeriod|\Carbon\CarbonInterval|\DateInterval|\DatePeriod|DateTimeInterface|string|null $date - * - * @return static - */ - public function carbonize($date = null); - - /** - * Cast the current instance into the given class. - * - * @template T - * - * @param class-string $className The $className::instance() method will be called to cast the current object. - * - * @return T - */ - public function cast(string $className): mixed; - - /** - * Ceil the current instance second with given precision if specified. - */ - public function ceil(DateInterval|string|int|float $precision = 1): static; - - /** - * Ceil the current instance at the given unit with given precision if specified. - */ - public function ceilUnit(string $unit, DateInterval|string|int|float $precision = 1): static; - - /** - * Ceil the current instance week. - * - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week - */ - public function ceilWeek(WeekDay|int|null $weekStartsAt = null): static; - - /** - * Similar to native modify() method of DateTime but can handle more grammars. - * - * @example - * ``` - * echo Carbon::now()->change('next 2pm'); - * ``` - * - * @link https://php.net/manual/en/datetime.modify.php - * - * @param string $modifier - * - * @return static - */ - public function change($modifier); - - /** - * Cleanup properties attached to the public scope of DateTime when a dump of the date is requested. - * foreach ($date as $_) {} - * serializer($date) - * var_export($date) - * get_object_vars($date) - */ - public function cleanupDumpProperties(); - - /** - * @alias copy - * - * Get a copy of the instance. - * - * @return static - */ - public function clone(); - - /** - * Get the closest date from the instance (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return static - */ - public function closest($date1, $date2); - - /** - * Get a copy of the instance. - * - * @return static - */ - public function copy(); - - /** - * Create a new Carbon instance from a specific date and time. - * - * If any of $year, $month or $day are set to null their now() values will - * be used. - * - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * - * If $hour is not null then the default values for $minute and $second - * will be 0. - * - * @param DateTimeInterface|string|int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $timezone = null); - - /** - * Create a Carbon instance from just a date. The time portion is set to now. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createFromDate($year = null, $month = null, $day = null, $timezone = null); - - /** - * Create a Carbon instance from a specific format. - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static|null - */ - #[ReturnTypeWillChange] - public static function createFromFormat($format, $time, $timezone = null); - - /** - * Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|int|null $timezone optional timezone - * @param string|null $locale locale to be used for LTS, LT, LL, LLL, etc. macro-formats (en by fault, unneeded if no such macro-format in use) - * @param TranslatorInterface|null $translator optional custom translator to use for macro-formats - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function createFromIsoFormat(string $format, string $time, $timezone = null, ?string $locale = 'en', ?TranslatorInterface $translator = null); - - /** - * Create a Carbon instance from a specific format and a string in a given language. - * - * @param string $format Datetime format - * @param string $locale - * @param string $time - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function createFromLocaleFormat(string $format, string $locale, string $time, $timezone = null); - - /** - * Create a Carbon instance from a specific ISO format and a string in a given language. - * - * @param string $format Datetime ISO format - * @param string $locale - * @param string $time - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function createFromLocaleIsoFormat(string $format, string $locale, string $time, $timezone = null); - - /** - * Create a Carbon instance from just a time. The date portion is set to today. - * - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createFromTime($hour = 0, $minute = 0, $second = 0, $timezone = null): static; - - /** - * Create a Carbon instance from a time string. The date portion is set to today. - * - * @throws InvalidFormatException - */ - public static function createFromTimeString(string $time, DateTimeZone|string|int|null $timezone = null): static; - - /** - * Create a Carbon instance from a timestamp and set the timezone (UTC by default). - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - */ - public static function createFromTimestamp(string|int|float $timestamp, DateTimeZone|string|int|null $timezone = null): static; - - /** - * Create a Carbon instance from a timestamp in milliseconds. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - */ - public static function createFromTimestampMs(string|int|float $timestamp, DateTimeZone|string|int|null $timezone = null): static; - - /** - * Create a Carbon instance from a timestamp in milliseconds. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $timestamp - * - * @return static - */ - public static function createFromTimestampMsUTC($timestamp): static; - - /** - * Create a Carbon instance from a timestamp keeping the timezone to UTC. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - */ - public static function createFromTimestampUTC(string|int|float $timestamp): static; - - /** - * Create a Carbon instance from just a date. The time portion is set to midnight. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createMidnightDate($year = null, $month = null, $day = null, $timezone = null); - - /** - * Create a new safe Carbon instance from a specific date and time. - * - * If any of $year, $month or $day are set to null their now() values will - * be used. - * - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * - * If $hour is not null then the default values for $minute and $second - * will be 0. - * - * If one of the set values is not valid, an InvalidDateException - * will be thrown. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidDateException - * - * @return static|null - */ - public static function createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $timezone = null); - - /** - * Create a new Carbon instance from a specific date and time using strict validation. - * - * @see create() - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $timezone = null): static; - - /** - * Get/set the day of year. - * - * @template T of int|null - * - * @param int|null $value new value for day of year if using as setter. - * - * @psalm-param T $value - * - * @return static|int - * - * @psalm-return (T is int ? static : int) - */ - public function dayOfYear(?int $value = null): static|int; - - /** - * Get the difference as a CarbonInterval instance. - * Return relative interval (negative if $absolute flag is not set to true and the given date is before - * current one). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return CarbonInterval - */ - public function diffAsCarbonInterval($date = null, bool $absolute = false, array $skip = []): CarbonInterval; - - /** - * Get the difference as a DateInterval instance. - * Return relative interval (negative if $absolute flag is not set to true and the given date is before - * current one). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return DateInterval - */ - public function diffAsDateInterval($date = null, bool $absolute = false): DateInterval; - - /** - * Get the difference by the given interval using a filter closure. - * - * @param CarbonInterval $ci An interval to traverse by - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffFiltered(CarbonInterval $ci, Closure $callback, $date = null, bool $absolute = false): int; - - /** - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - * - * @example - * ``` - * echo Carbon::tomorrow()->diffForHumans() . "\n"; - * echo Carbon::tomorrow()->diffForHumans(['parts' => 2]) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(['parts' => 3, 'join' => true]) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday()) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday(), ['short' => true]) . "\n"; - * ``` - * - * @param Carbon|DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * ⦿ 'syntax' entry (see below) - * ⦿ 'short' entry (see below) - * ⦿ 'parts' entry (see below) - * ⦿ 'options' entry (see below) - * ⦿ 'skip' entry, list of units to skip (array of strings or a single string, - * ` it can be the unit name (singular or plural) or its shortcut - * ` (y, m, w, d, h, min, s, ms, µs). - * ⦿ 'aUnit' entry, prefer "an hour" over "1 hour" if true - * ⦿ 'altNumbers' entry, use alternative numbers if available - * ` (from the current language if true is passed, from the given language(s) - * ` if array or string is passed) - * ⦿ 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * ⦿ 'other' entry (see above) - * ⦿ 'minimumUnit' entry determines the smallest unit of time to display can be long or - * ` short form of the units, e.g. 'hour' or 'h' (default value: s) - * ⦿ 'locale' language in which the diff should be output (has no effect if 'translator' key is set) - * ⦿ 'translator' a custom translator to use to translator the output. - * if int passed, it adds modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - */ - public function diffForHumans($other = null, $syntax = null, $short = false, $parts = 1, $options = null): string; - - /** - * Get the difference in days. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInDays($date = null, bool $absolute = false, bool $utc = false): float; - - /** - * Get the difference in days using a filter closure. - * - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInDaysFiltered(Closure $callback, $date = null, bool $absolute = false): int; - - /** - * Get the difference in hours. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function diffInHours($date = null, bool $absolute = false): float; - - /** - * Get the difference in hours using a filter closure. - * - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInHoursFiltered(Closure $callback, $date = null, bool $absolute = false): int; - - /** - * Get the difference in microseconds. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function diffInMicroseconds($date = null, bool $absolute = false): float; - - /** - * Get the difference in milliseconds. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function diffInMilliseconds($date = null, bool $absolute = false): float; - - /** - * Get the difference in minutes. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function diffInMinutes($date = null, bool $absolute = false): float; - - /** - * Get the difference in months. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInMonths($date = null, bool $absolute = false, bool $utc = false): float; - - /** - * Get the difference in quarters. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInQuarters($date = null, bool $absolute = false, bool $utc = false): float; - - /** - * Get the difference in seconds. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function diffInSeconds($date = null, bool $absolute = false): float; - - /** - * @param Unit|string $unit microsecond, millisecond, second, minute, - * hour, day, week, month, quarter, year, - * century, millennium - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInUnit(Unit|string $unit, $date = null, bool $absolute = false, bool $utc = false): float; - - /** - * Get the difference in weekdays. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInWeekdays($date = null, bool $absolute = false): int; - - /** - * Get the difference in weekend days using a filter. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInWeekendDays($date = null, bool $absolute = false): int; - - /** - * Get the difference in weeks. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInWeeks($date = null, bool $absolute = false, bool $utc = false): float; - - /** - * Get the difference in years - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInYears($date = null, bool $absolute = false, bool $utc = false): float; - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - */ - public static function disableHumanDiffOption(int $humanDiffOption): void; - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - */ - public static function enableHumanDiffOption(int $humanDiffOption): void; - - /** - * Modify to end of current given unit. - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOf(Unit::Month) - * ->endOf(Unit::Week, Carbon::FRIDAY); - * ``` - */ - public function endOf(Unit|string $unit, mixed ...$params): static; - - /** - * Resets the date to end of the century and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfCentury(); - * ``` - * - * @return static - */ - public function endOfCentury(); - - /** - * Resets the time to 23:59:59.999999 end of day - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfDay(); - * ``` - * - * @return static - */ - public function endOfDay(); - - /** - * Resets the date to end of the decade and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfDecade(); - * ``` - * - * @return static - */ - public function endOfDecade(); - - /** - * Modify to end of current hour, minutes and seconds become 59 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfHour(); - * ``` - */ - public function endOfHour(): static; - - /** - * Resets the date to end of the millennium and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMillennium(); - * ``` - * - * @return static - */ - public function endOfMillennium(); - - /** - * Modify to end of current millisecond, microseconds such as 12345 become 123999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->endOfSecond() - * ->format('H:i:s.u'); - * ``` - */ - public function endOfMillisecond(): static; - - /** - * Modify to end of current minute, seconds become 59 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMinute(); - * ``` - */ - public function endOfMinute(): static; - - /** - * Resets the date to end of the month and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMonth(); - * ``` - * - * @return static - */ - public function endOfMonth(); - - /** - * Resets the date to end of the quarter and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfQuarter(); - * ``` - * - * @return static - */ - public function endOfQuarter(); - - /** - * Modify to end of current second, microseconds become 999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->endOfSecond() - * ->format('H:i:s.u'); - * ``` - */ - public function endOfSecond(): static; - - /** - * Resets the date to end of week (defined in $weekEndsAt) and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->endOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek(Carbon::SATURDAY) . "\n"; - * ``` - * - * @param WeekDay|int|null $weekEndsAt optional end allow you to specify the day of week to use to end the week - * - * @return static - */ - public function endOfWeek(WeekDay|int|null $weekEndsAt = null): static; - - /** - * Resets the date to end of the year and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfYear(); - * ``` - * - * @return static - */ - public function endOfYear(); - - /** - * Determines if the instance is equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->eq(Carbon::parse('2018-07-25 12:45:16')); // true - * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:17'); // false - * ``` - * - * @see equalTo() - */ - public function eq(DateTimeInterface|string $date): bool; - - /** - * Determines if the instance is equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->equalTo(Carbon::parse('2018-07-25 12:45:16')); // true - * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:17'); // false - * ``` - */ - public function equalTo(DateTimeInterface|string $date): bool; - - /** - * Set the current locale to the given, execute the passed function, reset the locale to previous one, - * then return the result of the closure (or null if the closure was void). - * - * @param string $locale locale ex. en - * @param callable $func - * - * @return mixed - */ - public static function executeWithLocale(string $locale, callable $func): mixed; - - /** - * Get the farthest date from the instance (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return static - */ - public function farthest($date1, $date2); - - /** - * Modify to the first occurrence of a given day of the week - * in the current month. If no dayOfWeek is provided, modify to the - * first day of the current month. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek - * - * @return static - */ - public function firstOfMonth($dayOfWeek = null); - - /** - * Modify to the first occurrence of a given day of the week - * in the current quarter. If no dayOfWeek is provided, modify to the - * first day of the current quarter. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function firstOfQuarter($dayOfWeek = null); - - /** - * Modify to the first occurrence of a given day of the week - * in the current year. If no dayOfWeek is provided, modify to the - * first day of the current year. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function firstOfYear($dayOfWeek = null); - - /** - * Round the current instance second with given precision if specified. - */ - public function floor(DateInterval|string|int|float $precision = 1): static; - - /** - * Truncate the current instance at the given unit with given precision if specified. - */ - public function floorUnit(string $unit, DateInterval|string|int|float $precision = 1): static; - - /** - * Truncate the current instance week. - * - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week - */ - public function floorWeek(WeekDay|int|null $weekStartsAt = null): static; - - /** - * @alias diffForHumans - * - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function from($other = null, $syntax = null, $short = false, $parts = 1, $options = null); - - /** - * Get the difference in a human readable format in the current locale from current - * instance to now. - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function fromNow($syntax = null, $short = false, $parts = 1, $options = null); - - /** - * Create an instance from a serialized string. - * - * @param string $value - * - * @throws InvalidFormatException - * - * @return static - */ - public static function fromSerialized($value): static; - - /** - * Register a custom macro. - * - * @param callable $macro - * @param int $priority marco with higher priority is tried first - * - * @return void - */ - public static function genericMacro(callable $macro, int $priority = 0): void; - - /** - * Get a part of the Carbon object. - * - * @throws UnknownGetterException - * - * @return string|int|bool|DateTimeZone - */ - public function get(Unit|string $name): mixed; - - /** - * Returns the alternative number for a given date property if available in the current locale. - * - * @param string $key date property - */ - public function getAltNumber(string $key): string; - - /** - * Returns the list of internally available locales and already loaded custom locales. - * (It will ignore custom translator dynamic loading.) - * - * @return array - */ - public static function getAvailableLocales(); - - /** - * Returns list of Language object for each available locale. This object allow you to get the ISO name, native - * name, region and variant of the locale. - * - * @return Language[] - */ - public static function getAvailableLocalesInfo(); - - /** - * Returns list of calendar formats for ISO formatting. - * - * @param string|null $locale current locale used if null - */ - public function getCalendarFormats(?string $locale = null): array; - - public function getClock(): ?WrapperClock; - - /** - * Get the days of the week. - */ - public static function getDays(): array; - - /** - * Return the number of days since the start of the week (using the current locale or the first parameter - * if explicitly given). - * - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week, - * if not provided, start of week is inferred from the locale - * (Sunday for en_US, Monday for de_DE, etc.) - */ - public function getDaysFromStartOfWeek(WeekDay|int|null $weekStartsAt = null): int; - - /** - * Get the fallback locale. - * - * @see https://symfony.com/doc/current/components/translation.html#fallback-locales - */ - public static function getFallbackLocale(): ?string; - - /** - * List of replacements from date() format to isoFormat(). - */ - public static function getFormatsToIsoReplacements(): array; - - /** - * Return default humanDiff() options (merged flags as integer). - */ - public static function getHumanDiffOptions(): int; - - /** - * Returns list of locale formats for ISO formatting. - * - * @param string|null $locale current locale used if null - */ - public function getIsoFormats(?string $locale = null): array; - - /** - * Returns list of locale units for ISO formatting. - */ - public static function getIsoUnits(): array; - - /** - * {@inheritdoc} - */ - public static function getLastErrors(): array|false; - - /** - * Get the raw callable macro registered globally or locally for a given name. - */ - public function getLocalMacro(string $name): ?callable; - - /** - * Get the translator of the current instance or the default if none set. - */ - public function getLocalTranslator(): TranslatorInterface; - - /** - * Get the current translator locale. - * - * @return string - */ - public static function getLocale(): string; - - /** - * Get the raw callable macro registered globally for a given name. - */ - public static function getMacro(string $name): ?callable; - - /** - * get midday/noon hour - * - * @return int - */ - public static function getMidDayAt(); - - /** - * Returns the offset hour and minute formatted with +/- and a given separator (":" by default). - * For example, if the time zone is 9 hours 30 minutes, you'll get "+09:30", with "@@" as first - * argument, "+09@@30", with "" as first argument, "+0930". Negative offset will return something - * like "-12:00". - * - * @param string $separator string to place between hours and minutes (":" by default) - */ - public function getOffsetString(string $separator = ':'): string; - - /** - * Returns a unit of the instance padded with 0 by default or any other string if specified. - * - * @param string $unit Carbon unit name - * @param int $length Length of the output (2 by default) - * @param string $padString String to use for padding ("0" by default) - * @param int $padType Side(s) to pad (STR_PAD_LEFT by default) - */ - public function getPaddedUnit($unit, $length = 2, $padString = '0', $padType = 0): string; - - /** - * Returns a timestamp rounded with the given precision (6 by default). - * - * @example getPreciseTimestamp() 1532087464437474 (microsecond maximum precision) - * @example getPreciseTimestamp(6) 1532087464437474 - * @example getPreciseTimestamp(5) 153208746443747 (1/100000 second precision) - * @example getPreciseTimestamp(4) 15320874644375 (1/10000 second precision) - * @example getPreciseTimestamp(3) 1532087464437 (millisecond precision) - * @example getPreciseTimestamp(2) 153208746444 (1/100 second precision) - * @example getPreciseTimestamp(1) 15320874644 (1/10 second precision) - * @example getPreciseTimestamp(0) 1532087464 (second precision) - * @example getPreciseTimestamp(-1) 153208746 (10 second precision) - * @example getPreciseTimestamp(-2) 15320875 (100 second precision) - * - * @param int $precision - * - * @return float - */ - public function getPreciseTimestamp($precision = 6): float; - - /** - * Returns current local settings. - */ - public function getSettings(): array; - - /** - * Get the Carbon instance (real or mock) to be returned when a "now" - * instance is created. - * - * @return Closure|self|null the current instance used for testing - */ - public static function getTestNow(): Closure|self|null; - - /** - * Return a format from H:i to H:i:s.u according to given unit precision. - * - * @param string $unitPrecision "minute", "second", "millisecond" or "microsecond" - */ - public static function getTimeFormatByPrecision(string $unitPrecision): string; - - /** - * Returns the timestamp with millisecond precision. - * - * @return int - */ - public function getTimestampMs(): int; - - /** - * Get the translation of the current week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * @param string $keySuffix "", "_short" or "_min" - * @param string|null $defaultValue default value if translation missing - */ - public function getTranslatedDayName(?string $context = null, string $keySuffix = '', ?string $defaultValue = null): string; - - /** - * Get the translation of the current abbreviated week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - */ - public function getTranslatedMinDayName(?string $context = null): string; - - /** - * Get the translation of the current month day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * @param string $keySuffix "" or "_short" - * @param string|null $defaultValue default value if translation missing - */ - public function getTranslatedMonthName(?string $context = null, string $keySuffix = '', ?string $defaultValue = null): string; - - /** - * Get the translation of the current short week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - */ - public function getTranslatedShortDayName(?string $context = null): string; - - /** - * Get the translation of the current short month day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - */ - public function getTranslatedShortMonthName(?string $context = null): string; - - /** - * Returns raw translation message for a given key. - * - * @param string $key key to find - * @param string|null $locale current locale used if null - * @param string|null $default default value if translation returns the key - * @param TranslatorInterface $translator an optional translator to use - * - * @return string - */ - public function getTranslationMessage(string $key, ?string $locale = null, ?string $default = null, $translator = null); - - /** - * Returns raw translation message for a given key. - * - * @param TranslatorInterface|null $translator the translator to use - * @param string $key key to find - * @param string|null $locale current locale used if null - * @param string|null $default default value if translation returns the key - * - * @return string|Closure|null - */ - public static function getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null); - - /** - * Initialize the default translator instance if necessary. - */ - public static function getTranslator(): TranslatorInterface; - - /** - * Get the last day of week. - * - * @param string $locale local to consider the last day of week. - * - * @return int - */ - public static function getWeekEndsAt(?string $locale = null): int; - - /** - * Get the first day of week. - * - * @return int - */ - public static function getWeekStartsAt(?string $locale = null): int; - - /** - * Get weekend days - */ - public static function getWeekendDays(): array; - - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:17'); // false - * ``` - */ - public function greaterThan(DateTimeInterface|string $date): bool; - - /** - * Determines if the instance is greater (after) than or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:17'); // false - * ``` - */ - public function greaterThanOrEqualTo(DateTimeInterface|string $date): bool; - - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:17'); // false - * ``` - * - * @see greaterThan() - */ - public function gt(DateTimeInterface|string $date): bool; - - /** - * Determines if the instance is greater (after) than or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:17'); // false - * ``` - * - * @see greaterThanOrEqualTo() - */ - public function gte(DateTimeInterface|string $date): bool; - - /** - * Checks if the (date)time string is in a given format. - * - * @example - * ``` - * Carbon::hasFormat('11:12:45', 'h:i:s'); // true - * Carbon::hasFormat('13:12:45', 'h:i:s'); // false - * ``` - */ - public static function hasFormat(string $date, string $format): bool; - - /** - * Checks if the (date)time string is in a given format. - * - * @example - * ``` - * Carbon::hasFormatWithModifiers('31/08/2015', 'd#m#Y'); // true - * Carbon::hasFormatWithModifiers('31/08/2015', 'm#d#Y'); // false - * ``` - * - * @param string $date - * @param string $format - * - * @return bool - */ - public static function hasFormatWithModifiers(?string $date, string $format): bool; - - /** - * Checks if macro is registered globally or locally. - */ - public function hasLocalMacro(string $name): bool; - - /** - * Return true if the current instance has its own translator. - */ - public function hasLocalTranslator(): bool; - - /** - * Checks if macro is registered globally. - * - * @param string $name - * - * @return bool - */ - public static function hasMacro(string $name): bool; - - /** - * Determine if a time string will produce a relative date. - * - * @return bool true if time match a relative date, false if absolute or invalid time string - */ - public static function hasRelativeKeywords(?string $time): bool; - - /** - * Determine if there is a valid test instance set. A valid test instance - * is anything that is not null. - * - * @return bool true if there is a test instance, otherwise false - */ - public static function hasTestNow(): bool; - - /** - * Create a Carbon instance from a DateTime one. - */ - public static function instance(DateTimeInterface $date): static; - - /** - * Returns true if the current date matches the given string. - * - * @example - * ``` - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2018')); // false - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('06-02')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06-02')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('Sunday')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('June')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:45')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:00')); // false - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12h')); // true - * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3pm')); // true - * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3am')); // false - * ``` - * - * @param string $tester day name, month name, hour, date, etc. as string - */ - public function is(WeekDay|Month|string $tester): bool; - - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:17'); // false - * ``` - * - * @see greaterThan() - */ - public function isAfter(DateTimeInterface|string $date): bool; - - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:17'); // true - * ``` - * - * @see lessThan() - */ - public function isBefore(DateTimeInterface|string $date): bool; - - /** - * Determines if the instance is between two others - * - * @example - * ``` - * Carbon::parse('2018-07-25')->isBetween('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->isBetween('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01', false); // false - * ``` - * - * @param bool $equal Indicates if an equal to comparison should be done - */ - public function isBetween(DateTimeInterface|string $date1, DateTimeInterface|string $date2, bool $equal = true): bool; - - /** - * Check if its the birthday. Compares the date/month values of the two dates. - * - * @example - * ``` - * Carbon::now()->subYears(5)->isBirthday(); // true - * Carbon::now()->subYears(5)->subDay()->isBirthday(); // false - * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-05')); // true - * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-06')); // false - * ``` - * - * @param DateTimeInterface|string|null $date The instance to compare with or null to use current day. - * - * @return bool - */ - public function isBirthday(DateTimeInterface|string|null $date = null): bool; - - /** - * Determines if the instance is in the current unit given. - * - * @example - * ``` - * Carbon::now()->isCurrentUnit('hour'); // true - * Carbon::now()->subHours(2)->isCurrentUnit('hour'); // false - * ``` - * - * @param string $unit The unit to test. - * - * @throws BadMethodCallException - */ - public function isCurrentUnit(string $unit): bool; - - /** - * Checks if this day is a specific day of the week. - * - * @example - * ``` - * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::WEDNESDAY); // true - * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::FRIDAY); // false - * Carbon::parse('2019-07-17')->isDayOfWeek('Wednesday'); // true - * Carbon::parse('2019-07-17')->isDayOfWeek('Friday'); // false - * ``` - * - * @param int|string $dayOfWeek - * - * @return bool - */ - public function isDayOfWeek($dayOfWeek): bool; - - /** - * Determines if the instance is end of century (last day by default but interval can be customized). - */ - public function isEndOfCentury(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Check if the instance is end of day. - * - * @example - * ``` - * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:58.999999')->isEndOfDay(); // false - * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(true); // true - * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(true); // false - * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(true); // false - * ``` - * - * @param bool $checkMicroseconds check time at microseconds precision - * @param Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval if an interval is specified it will be used as precision - * for instance with "15 minutes", it checks if current date-time - * is in the last 15 minutes of the day, with Unit::Hour, it - * checks if it's in the last hour of the day. - */ - public function isEndOfDay(Unit|DateInterval|Closure|CarbonConverterInterface|string|bool $checkMicroseconds = false, Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is end of decade (last day by default but interval can be customized). - */ - public function isEndOfDecade(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is end of hour (last microsecond by default but interval can be customized). - */ - public function isEndOfHour(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is end of millennium (last day by default but interval can be customized). - */ - public function isEndOfMillennium(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is end of millisecond (last microsecond by default but interval can be customized). - */ - public function isEndOfMillisecond(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is end of minute (last microsecond by default but interval can be customized). - */ - public function isEndOfMinute(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is end of month (last day by default but interval can be customized). - */ - public function isEndOfMonth(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is end of quarter (last day by default but interval can be customized). - */ - public function isEndOfQuarter(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is end of second (last microsecond by default but interval can be customized). - */ - public function isEndOfSecond(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Returns true if the date was created using CarbonImmutable::endOfTime() - * - * @return bool - */ - public function isEndOfTime(): bool; - - /** - * Check if the instance is end of a given unit (tolerating a given interval). - * - * @example - * ``` - * // Check if a date-time is the last 15 minutes of the hour it's in - * Carbon::parse('2019-02-28 20:13:00')->isEndOfUnit(Unit::Hour, '15 minutes'); // false - * ``` - */ - public function isEndOfUnit(Unit $unit, Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, mixed ...$params): bool; - - /** - * Determines if the instance is end of week (last day by default but interval can be customized). - * - * @example - * ``` - * Carbon::parse('2024-08-31')->endOfWeek()->isEndOfWeek(); // true - * Carbon::parse('2024-08-31')->isEndOfWeek(); // false - * ``` - */ - public function isEndOfWeek(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, WeekDay|int|null $weekEndsAt = null): bool; - - /** - * Determines if the instance is end of year (last day by default but interval can be customized). - */ - public function isEndOfYear(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is in the future, ie. greater (after) than now. - * - * @example - * ``` - * Carbon::now()->addHours(5)->isFuture(); // true - * Carbon::now()->subHours(5)->isFuture(); // false - * ``` - */ - public function isFuture(): bool; - - /** - * Returns true if the current class/instance is immutable. - */ - public static function isImmutable(): bool; - - /** - * Check if today is the last day of the Month - * - * @example - * ``` - * Carbon::parse('2019-02-28')->isLastOfMonth(); // true - * Carbon::parse('2019-03-28')->isLastOfMonth(); // false - * Carbon::parse('2019-03-30')->isLastOfMonth(); // false - * Carbon::parse('2019-03-31')->isLastOfMonth(); // true - * Carbon::parse('2019-04-30')->isLastOfMonth(); // true - * ``` - */ - public function isLastOfMonth(): bool; - - /** - * Determines if the instance is a leap year. - * - * @example - * ``` - * Carbon::parse('2020-01-01')->isLeapYear(); // true - * Carbon::parse('2019-01-01')->isLeapYear(); // false - * ``` - */ - public function isLeapYear(): bool; - - /** - * Determines if the instance is a long year (using ISO 8601 year). - * - * @example - * ``` - * Carbon::parse('2015-01-01')->isLongIsoYear(); // true - * Carbon::parse('2016-01-01')->isLongIsoYear(); // true - * Carbon::parse('2016-01-03')->isLongIsoYear(); // false - * Carbon::parse('2019-12-29')->isLongIsoYear(); // false - * Carbon::parse('2019-12-30')->isLongIsoYear(); // true - * ``` - * - * @see https://en.wikipedia.org/wiki/ISO_8601#Week_dates - */ - public function isLongIsoYear(): bool; - - /** - * Determines if the instance is a long year (using calendar year). - * - * ⚠️ This method completely ignores month and day to use the numeric year number, - * it's not correct if the exact date matters. For instance as `2019-12-30` is already - * in the first week of the 2020 year, if you want to know from this date if ISO week - * year 2020 is a long year, use `isLongIsoYear` instead. - * - * @example - * ``` - * Carbon::create(2015)->isLongYear(); // true - * Carbon::create(2016)->isLongYear(); // false - * ``` - * - * @see https://en.wikipedia.org/wiki/ISO_8601#Week_dates - */ - public function isLongYear(): bool; - - /** - * Check if the instance is midday. - * - * @example - * ``` - * Carbon::parse('2019-02-28 11:59:59.999999')->isMidday(); // false - * Carbon::parse('2019-02-28 12:00:00')->isMidday(); // true - * Carbon::parse('2019-02-28 12:00:00.999999')->isMidday(); // true - * Carbon::parse('2019-02-28 12:00:01')->isMidday(); // false - * ``` - */ - public function isMidday(): bool; - - /** - * Check if the instance is start of day / midnight. - * - * @example - * ``` - * Carbon::parse('2019-02-28 00:00:00')->isMidnight(); // true - * Carbon::parse('2019-02-28 00:00:00.999999')->isMidnight(); // true - * Carbon::parse('2019-02-28 00:00:01')->isMidnight(); // false - * ``` - */ - public function isMidnight(): bool; - - /** - * Returns true if a property can be changed via setter. - * - * @param string $unit - * - * @return bool - */ - public static function isModifiableUnit($unit): bool; - - /** - * Returns true if the current class/instance is mutable. - */ - public static function isMutable(): bool; - - /** - * Determines if the instance is in the past, ie. less (before) than now. - * - * @example - * ``` - * Carbon::now()->subHours(5)->isPast(); // true - * Carbon::now()->addHours(5)->isPast(); // false - * ``` - */ - public function isPast(): bool; - - /** - * Compares the formatted values of the two dates. - * - * @example - * ``` - * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-12-13')); // true - * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-06-14')); // false - * ``` - * - * @param string $format date formats to compare. - * @param DateTimeInterface|string $date instance to compare with or null to use current day. - */ - public function isSameAs(string $format, DateTimeInterface|string $date): bool; - - /** - * Checks if the passed in date is in the same month as the instance´s month. - * - * @example - * ``` - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-01-01')); // true - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-02-01')); // false - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01')); // false - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01'), false); // true - * ``` - * - * @param DateTimeInterface|string $date The instance to compare with or null to use the current date. - * @param bool $ofSameYear Check if it is the same month in the same year. - * - * @return bool - */ - public function isSameMonth(DateTimeInterface|string $date, bool $ofSameYear = true): bool; - - /** - * Checks if the passed in date is in the same quarter as the instance quarter (and year if needed). - * - * @example - * ``` - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-03-01')); // true - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-04-01')); // false - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01')); // false - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01'), false); // true - * ``` - * - * @param DateTimeInterface|string $date The instance to compare with or null to use current day. - * @param bool $ofSameYear Check if it is the same month in the same year. - * - * @return bool - */ - public function isSameQuarter(DateTimeInterface|string $date, bool $ofSameYear = true): bool; - - /** - * Determines if the instance is in the current unit given. - * - * @example - * ``` - * Carbon::parse('2019-01-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // true - * Carbon::parse('2018-12-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // false - * ``` - * - * @param string $unit singular unit string - * @param DateTimeInterface|string $date instance to compare with or null to use current day. - * - * @throws BadComparisonUnitException - * - * @return bool - */ - public function isSameUnit(string $unit, DateTimeInterface|string $date): bool; - - /** - * Determines if the instance is start of century (first day by default but interval can be customized). - */ - public function isStartOfCentury(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Check if the instance is start of day / midnight. - * - * @example - * ``` - * Carbon::parse('2019-02-28 00:00:00')->isStartOfDay(); // true - * Carbon::parse('2019-02-28 00:00:00.999999')->isStartOfDay(); // true - * Carbon::parse('2019-02-28 00:00:01')->isStartOfDay(); // false - * Carbon::parse('2019-02-28 00:00:00.000000')->isStartOfDay(true); // true - * Carbon::parse('2019-02-28 00:00:00.000012')->isStartOfDay(true); // false - * ``` - * - * @param bool $checkMicroseconds check time at microseconds precision - * @param Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval if an interval is specified it will be used as precision - * for instance with "15 minutes", it checks if current date-time - * is in the last 15 minutes of the day, with Unit::Hour, it - * checks if it's in the last hour of the day. - */ - public function isStartOfDay(Unit|DateInterval|Closure|CarbonConverterInterface|string|bool $checkMicroseconds = false, Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is start of decade (first day by default but interval can be customized). - */ - public function isStartOfDecade(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is start of hour (first microsecond by default but interval can be customized). - */ - public function isStartOfHour(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is start of millennium (first day by default but interval can be customized). - */ - public function isStartOfMillennium(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is start of millisecond (first microsecond by default but interval can be customized). - */ - public function isStartOfMillisecond(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is start of minute (first microsecond by default but interval can be customized). - */ - public function isStartOfMinute(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is start of month (first day by default but interval can be customized). - */ - public function isStartOfMonth(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is start of quarter (first day by default but interval can be customized). - */ - public function isStartOfQuarter(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Determines if the instance is start of second (first microsecond by default but interval can be customized). - */ - public function isStartOfSecond(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Returns true if the date was created using CarbonImmutable::startOfTime() - * - * @return bool - */ - public function isStartOfTime(): bool; - - /** - * Check if the instance is start of a given unit (tolerating a given interval). - * - * @example - * ``` - * // Check if a date-time is the first 15 minutes of the hour it's in - * Carbon::parse('2019-02-28 20:13:00')->isStartOfUnit(Unit::Hour, '15 minutes'); // true - * ``` - */ - public function isStartOfUnit(Unit $unit, Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, mixed ...$params): bool; - - /** - * Determines if the instance is start of week (first day by default but interval can be customized). - * - * @example - * ``` - * Carbon::parse('2024-08-31')->startOfWeek()->isStartOfWeek(); // true - * Carbon::parse('2024-08-31')->isStartOfWeek(); // false - * ``` - */ - public function isStartOfWeek(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, WeekDay|int|null $weekStartsAt = null): bool; - - /** - * Determines if the instance is start of year (first day by default but interval can be customized). - */ - public function isStartOfYear(Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null): bool; - - /** - * Returns true if the strict mode is globally in use, false else. - * (It can be overridden in specific instances.) - * - * @return bool - */ - public static function isStrictModeEnabled(): bool; - - /** - * Determines if the instance is today. - * - * @example - * ``` - * Carbon::today()->isToday(); // true - * Carbon::tomorrow()->isToday(); // false - * ``` - */ - public function isToday(): bool; - - /** - * Determines if the instance is tomorrow. - * - * @example - * ``` - * Carbon::tomorrow()->isTomorrow(); // true - * Carbon::yesterday()->isTomorrow(); // false - * ``` - */ - public function isTomorrow(): bool; - - /** - * Determines if the instance is a weekday. - * - * @example - * ``` - * Carbon::parse('2019-07-14')->isWeekday(); // false - * Carbon::parse('2019-07-15')->isWeekday(); // true - * ``` - */ - public function isWeekday(): bool; - - /** - * Determines if the instance is a weekend day. - * - * @example - * ``` - * Carbon::parse('2019-07-14')->isWeekend(); // true - * Carbon::parse('2019-07-15')->isWeekend(); // false - * ``` - */ - public function isWeekend(): bool; - - /** - * Determines if the instance is yesterday. - * - * @example - * ``` - * Carbon::yesterday()->isYesterday(); // true - * Carbon::tomorrow()->isYesterday(); // false - * ``` - */ - public function isYesterday(): bool; - - /** - * Format in the current language using ISO replacement patterns. - * - * @param string|null $originalFormat provide context if a chunk has been passed alone - */ - public function isoFormat(string $format, ?string $originalFormat = null): string; - - /** - * Get/set the week number using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $week - * @param int|null $dayOfWeek - * @param int|null $dayOfYear - * - * @return int|static - */ - public function isoWeek($week = null, $dayOfWeek = null, $dayOfYear = null); - - /** - * Set/get the week number of year using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int|static - */ - public function isoWeekYear($year = null, $dayOfWeek = null, $dayOfYear = null); - - /** - * Get/set the ISO weekday from 1 (Monday) to 7 (Sunday). - * - * @param WeekDay|int|null $value new value for weekday if using as setter. - */ - public function isoWeekday(WeekDay|int|null $value = null): static|int; - - /** - * Get the number of weeks of the current week-year using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int - */ - public function isoWeeksInYear($dayOfWeek = null, $dayOfYear = null); - - /** - * Prepare the object for JSON serialization. - */ - public function jsonSerialize(): mixed; - - /** - * Modify to the last occurrence of a given day of the week - * in the current month. If no dayOfWeek is provided, modify to the - * last day of the current month. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek - * - * @return static - */ - public function lastOfMonth($dayOfWeek = null); - - /** - * Modify to the last occurrence of a given day of the week - * in the current quarter. If no dayOfWeek is provided, modify to the - * last day of the current quarter. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function lastOfQuarter($dayOfWeek = null); - - /** - * Modify to the last occurrence of a given day of the week - * in the current year. If no dayOfWeek is provided, modify to the - * last day of the current year. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function lastOfYear($dayOfWeek = null); - - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:17'); // true - * ``` - */ - public function lessThan(DateTimeInterface|string $date): bool; - - /** - * Determines if the instance is less (before) or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:17'); // true - * ``` - */ - public function lessThanOrEqualTo(DateTimeInterface|string $date): bool; - - /** - * Get/set the locale for the current instance. - * - * @param string|null $locale - * @param string ...$fallbackLocales - * - * @return $this|string - */ - public function locale(?string $locale = null, string ...$fallbackLocales): static|string; - - /** - * Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). - * Support is considered enabled if the 3 words are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffOneDayWords(string $locale): bool; - - /** - * Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffSyntax(string $locale): bool; - - /** - * Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). - * Support is considered enabled if the 2 words are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffTwoDayWords(string $locale): bool; - - /** - * Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasPeriodSyntax($locale); - - /** - * Returns true if the given locale is internally supported and has short-units support. - * Support is considered enabled if either year, day or hour has a short variant translated. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasShortUnits(string $locale): bool; - - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:17'); // true - * ``` - * - * @see lessThan() - */ - public function lt(DateTimeInterface|string $date): bool; - - /** - * Determines if the instance is less (before) or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:17'); // true - * ``` - * - * @see lessThanOrEqualTo() - */ - public function lte(DateTimeInterface|string $date): bool; - - /** - * Register a custom macro. - * - * Pass null macro to remove it. - * - * @example - * ``` - * $userSettings = [ - * 'locale' => 'pt', - * 'timezone' => 'America/Sao_Paulo', - * ]; - * Carbon::macro('userFormat', function () use ($userSettings) { - * return $this->copy()->locale($userSettings['locale'])->tz($userSettings['timezone'])->calendar(); - * }); - * echo Carbon::yesterday()->hours(11)->userFormat(); - * ``` - */ - public static function macro(string $name, ?callable $macro): void; - - /** - * Make a Carbon instance from given variable if possible. - * - * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals - * and recurrences). Throw an exception for invalid format, but otherwise return null. - * - * @param mixed $var - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function make($var, DateTimeZone|string|null $timezone = null); - - /** - * Get the maximum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return static - */ - public function max($date = null); - - /** - * Get the maximum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see max() - * - * @return static - */ - public function maximum($date = null); - - /** - * Return the meridiem of the current time in the current locale. - * - * @param bool $isLower if true, returns lowercase variant if available in the current locale. - */ - public function meridiem(bool $isLower = false): string; - - /** - * Modify to midday, default to self::$midDayAt - * - * @return static - */ - public function midDay(); - - /** - * Get the minimum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return static - */ - public function min($date = null); - - /** - * Get the minimum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see min() - * - * @return static - */ - public function minimum($date = null); - - /** - * Mix another object into the class. - * - * @example - * ``` - * Carbon::mixin(new class { - * public function addMoon() { - * return function () { - * return $this->addDays(30); - * }; - * } - * public function subMoon() { - * return function () { - * return $this->subDays(30); - * }; - * } - * }); - * $fullMoon = Carbon::create('2018-12-22'); - * $nextFullMoon = $fullMoon->addMoon(); - * $blackMoon = Carbon::create('2019-01-06'); - * $previousBlackMoon = $blackMoon->subMoon(); - * echo "$nextFullMoon\n"; - * echo "$previousBlackMoon\n"; - * ``` - * - * @throws ReflectionException - */ - public static function mixin(object|string $mixin): void; - - /** - * Calls \DateTime::modify if mutable or \DateTimeImmutable::modify else. - * - * @see https://php.net/manual/en/datetime.modify.php - * - * @return static - */ - #[ReturnTypeWillChange] - public function modify($modify); - - /** - * Determines if the instance is not equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->ne(Carbon::parse('2018-07-25 12:45:16')); // false - * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:17'); // true - * ``` - * - * @see notEqualTo() - */ - public function ne(DateTimeInterface|string $date): bool; - - /** - * Modify to the next occurrence of a given modifier such as a day of - * the week. If no modifier is provided, modify to the next occurrence - * of the current day of the week. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param string|int|null $modifier - * - * @return static - */ - public function next($modifier = null); - - /** - * Go forward to the next weekday. - * - * @return static - */ - public function nextWeekday(); - - /** - * Go forward to the next weekend day. - * - * @return static - */ - public function nextWeekendDay(); - - /** - * Determines if the instance is not equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo(Carbon::parse('2018-07-25 12:45:16')); // false - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:17'); // true - * ``` - */ - public function notEqualTo(DateTimeInterface|string $date): bool; - - /** - * Get a Carbon instance for the current date and time. - */ - public static function now(DateTimeZone|string|int|null $timezone = null): static; - - /** - * Returns a present instance in the same timezone. - * - * @return static - */ - public function nowWithSameTz(): static; - - /** - * Modify to the given occurrence of a given day of the week - * in the current month. If the calculated occurrence is outside the scope - * of the current month, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfMonth($nth, $dayOfWeek); - - /** - * Modify to the given occurrence of a given day of the week - * in the current quarter. If the calculated occurrence is outside the scope - * of the current quarter, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfQuarter($nth, $dayOfWeek); - - /** - * Modify to the given occurrence of a given day of the week - * in the current year. If the calculated occurrence is outside the scope - * of the current year, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfYear($nth, $dayOfWeek); - - /** - * Return a property with its ordinal. - */ - public function ordinal(string $key, ?string $period = null): string; - - /** - * Create a carbon instance from a string. - * - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * - * @throws InvalidFormatException - */ - public static function parse(DateTimeInterface|WeekDay|Month|string|int|float|null $time, DateTimeZone|string|int|null $timezone = null): static; - - /** - * Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). - * - * @param string $time date/time string in the given language (may also contain English). - * @param string|null $locale if locale is null or not specified, current global locale will be - * used instead. - * @param DateTimeZone|string|int|null $timezone optional timezone for the new instance. - * - * @throws InvalidFormatException - */ - public static function parseFromLocale(string $time, ?string $locale = null, DateTimeZone|string|int|null $timezone = null): static; - - /** - * Returns standardized plural of a given singular/plural unit name (in English). - */ - public static function pluralUnit(string $unit): string; - - /** - * Modify to the previous occurrence of a given modifier such as a day of - * the week. If no dayOfWeek is provided, modify to the previous occurrence - * of the current day of the week. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param string|int|null $modifier - * - * @return static - */ - public function previous($modifier = null); - - /** - * Go backward to the previous weekday. - * - * @return static - */ - public function previousWeekday(); - - /** - * Go backward to the previous weekend day. - * - * @return static - */ - public function previousWeekendDay(); - - /** - * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). - * - * @param \DateTimeInterface|Carbon|CarbonImmutable|null $end period end date - * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit - * @param string|null $unit if specified, $interval must be an integer - */ - public function range($end = null, $interval = null, $unit = null): CarbonPeriod; - - /** - * Call native PHP DateTime/DateTimeImmutable add() method. - * - * @param DateInterval $interval - * - * @return static - */ - public function rawAdd(DateInterval $interval): static; - - /** - * Create a Carbon instance from a specific format. - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function rawCreateFromFormat(string $format, string $time, $timezone = null); - - /** - * @see https://php.net/manual/en/datetime.format.php - */ - public function rawFormat(string $format): string; - - /** - * Create a carbon instance from a string. - * - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * - * @throws InvalidFormatException - */ - public static function rawParse(DateTimeInterface|WeekDay|Month|string|int|float|null $time, DateTimeZone|string|int|null $timezone = null): static; - - /** - * Call native PHP DateTime/DateTimeImmutable sub() method. - */ - public function rawSub(DateInterval $interval): static; - - /** - * Remove all macros and generic macros. - */ - public static function resetMacros(): void; - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Reset the month overflow behavior. - * - * @return void - */ - public static function resetMonthsOverflow(): void; - - /** - * Reset the format used to the default when type juggling a Carbon instance to a string - * - * @return void - */ - public static function resetToStringFormat(): void; - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Reset the month overflow behavior. - * - * @return void - */ - public static function resetYearsOverflow(): void; - - /** - * Round the current instance second with given precision if specified. - */ - public function round(DateInterval|string|int|float $precision = 1, callable|string $function = 'round'): static; - - /** - * Round the current instance at the given unit with given precision if specified and the given function. - */ - public function roundUnit(string $unit, DateInterval|string|int|float $precision = 1, callable|string $function = 'round'): static; - - /** - * Round the current instance week. - * - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week - */ - public function roundWeek(WeekDay|int|null $weekStartsAt = null): static; - - /** - * The number of seconds since midnight. - * - * @return float - */ - public function secondsSinceMidnight(): float; - - /** - * The number of seconds until 23:59:59. - * - * @return float - */ - public function secondsUntilEndOfDay(): float; - - /** - * Return a serialized string of the instance. - */ - public function serialize(): string; - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather transform Carbon object before the serialization. - * - * JSON serialize all Carbon instances using the given callback. - */ - public static function serializeUsing(callable|string|null $format): void; - - /** - * Set a part of the Carbon object. - * - * @throws ImmutableException|UnknownSetterException - * - * @return $this - */ - public function set(Unit|array|string $name, DateTimeZone|Month|string|int|float|null $value = null): static; - - /** - * Set the date with gregorian year, month and day numbers. - * - * @see https://php.net/manual/en/datetime.setdate.php - */ - public function setDate(int $year, int $month, int $day): static; - - /** - * Set the year, month, and date for this instance to that of the passed instance. - */ - public function setDateFrom(DateTimeInterface|string $date): static; - - /** - * Set the date and time all together. - */ - public function setDateTime(int $year, int $month, int $day, int $hour, int $minute, int $second = 0, int $microseconds = 0): static; - - /** - * Set the date and time for this instance to that of the passed instance. - */ - public function setDateTimeFrom(DateTimeInterface|string $date): static; - - /** - * Set the day (keeping the current time) to the start of the week + the number of days passed as the first - * parameter. First day of week is driven by the locale unless explicitly set with the second parameter. - * - * @param int $numberOfDays number of days to add after the start of the current week - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week, - * if not provided, start of week is inferred from the locale - * (Sunday for en_US, Monday for de_DE, etc.) - */ - public function setDaysFromStartOfWeek(int $numberOfDays, WeekDay|int|null $weekStartsAt = null): static; - - /** - * Set the fallback locale. - * - * @see https://symfony.com/doc/current/components/translation.html#fallback-locales - * - * @param string $locale - */ - public static function setFallbackLocale(string $locale): void; - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - */ - public static function setHumanDiffOptions(int $humanDiffOptions): void; - - /** - * Set a date according to the ISO 8601 standard - using weeks and day offsets rather than specific dates. - * - * @see https://php.net/manual/en/datetime.setisodate.php - */ - public function setISODate(int $year, int $week, int $day = 1): static; - - /** - * Set the translator for the current instance. - */ - public function setLocalTranslator(TranslatorInterface $translator); - - /** - * Set the current translator locale and indicate if the source locale file exists. - * Pass 'auto' as locale to use the closest language to the current LC_TIME locale. - * - * @param string $locale locale ex. en - */ - public static function setLocale(string $locale): void; - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider mid-day is always 12pm, then if you need to test if it's an other - * hour, test it explicitly: - * $date->format('G') == 13 - * or to set explicitly to a given hour: - * $date->setTime(13, 0, 0, 0) - * - * Set midday/noon hour - * - * @param int $hour midday hour - * - * @return void - */ - public static function setMidDayAt($hour); - - /** - * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * - * Note the timezone parameter was left out of the examples above and - * has no affect as the mock value will be returned regardless of its value. - * - * Only the moment is mocked with setTestNow(), the timezone will still be the one passed - * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). - * - * To clear the test instance call this method using the default - * parameter of null. - * - * /!\ Use this method for unit tests only. - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - */ - public static function setTestNow(mixed $testNow = null): void; - - /** - * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * - * It will also align default timezone (e.g. call date_default_timezone_set()) with - * the second argument or if null, with the timezone of the given date object. - * - * To clear the test instance call this method using the default - * parameter of null. - * - * /!\ Use this method for unit tests only. - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - */ - public static function setTestNowAndTimezone($testNow = null, $timezone = null): void; - - /** - * Resets the current time of the DateTime object to a different time. - * - * @see https://php.net/manual/en/datetime.settime.php - */ - public function setTime(int $hour, int $minute, int $second = 0, int $microseconds = 0): static; - - /** - * Set the hour, minute, second and microseconds for this instance to that of the passed instance. - */ - public function setTimeFrom(DateTimeInterface|string $date): static; - - /** - * Set the time by time string. - */ - public function setTimeFromTimeString(string $time): static; - - /** - * Set the instance's timestamp. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - */ - public function setTimestamp(string|int|float $timestamp): static; - - /** - * Set the instance's timezone from a string or object. - */ - public function setTimezone(DateTimeZone|string|int $timeZone): static; - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather let Carbon object being cast to string with DEFAULT_TO_STRING_FORMAT, and - * use other method or custom format passed to format() method if you need to dump another string - * format. - * - * Set the default format used when type juggling a Carbon instance to a string. - * - * @param string|Closure|null $format - * - * @return void - */ - public static function setToStringFormat(Closure|string|null $format): void; - - /** - * Set the default translator instance to use. - * - * @param TranslatorInterface $translator - * - * @return void - */ - public static function setTranslator(TranslatorInterface $translator): void; - - /** - * Set specified unit to new given value. - * - * @param string $unit year, month, day, hour, minute, second or microsecond - * @param Month|int $value new value for given unit - */ - public function setUnit(string $unit, Month|int|float|null $value = null): static; - - /** - * Set any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value new value for the input unit - * @param string $overflowUnit unit name to not overflow - */ - public function setUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static; - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider week-end is always saturday and sunday, and if you have some custom - * week-end days to handle, give to those days an other name and create a macro for them: - * - * ``` - * Carbon::macro('isDayOff', function ($date) { - * return $date->isSunday() || $date->isMonday(); - * }); - * Carbon::macro('isNotDayOff', function ($date) { - * return !$date->isDayOff(); - * }); - * if ($someDate->isDayOff()) ... - * if ($someDate->isNotDayOff()) ... - * // Add 5 not-off days - * $count = 5; - * while ($someDate->isDayOff() || ($count-- > 0)) { - * $someDate->addDay(); - * } - * ``` - * - * Set weekend days - */ - public static function setWeekendDays(array $days): void; - - /** - * Set specific options. - * - strictMode: true|false|null - * - monthOverflow: true|false|null - * - yearOverflow: true|false|null - * - humanDiffOptions: int|null - * - toStringFormat: string|Closure|null - * - toJsonFormat: string|Closure|null - * - locale: string|null - * - timezone: \DateTimeZone|string|int|null - * - macros: array|null - * - genericMacros: array|null - * - * @param array $settings - * - * @return $this|static - */ - public function settings(array $settings): static; - - /** - * Set the instance's timezone from a string or object and add/subtract the offset difference. - */ - public function shiftTimezone(DateTimeZone|string $value): static; - - /** - * Get the month overflow global behavior (can be overridden in specific instances). - * - * @return bool - */ - public static function shouldOverflowMonths(): bool; - - /** - * Get the month overflow global behavior (can be overridden in specific instances). - * - * @return bool - */ - public static function shouldOverflowYears(): bool; - - /** - * @alias diffForHumans - * - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - */ - public function since($other = null, $syntax = null, $short = false, $parts = 1, $options = null); - - /** - * Returns standardized singular of a given singular/plural unit name (in English). - */ - public static function singularUnit(string $unit): string; - - public static function sleep(int|float $seconds): void; - - /** - * Modify to start of current given unit. - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOf(Unit::Month) - * ->endOf(Unit::Week, Carbon::FRIDAY); - * ``` - */ - public function startOf(Unit|string $unit, mixed ...$params): static; - - /** - * Resets the date to the first day of the century and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfCentury(); - * ``` - * - * @return static - */ - public function startOfCentury(); - - /** - * Resets the time to 00:00:00 start of day - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfDay(); - * ``` - * - * @return static - */ - public function startOfDay(); - - /** - * Resets the date to the first day of the decade and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfDecade(); - * ``` - * - * @return static - */ - public function startOfDecade(); - - /** - * Modify to start of current hour, minutes and seconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfHour(); - * ``` - */ - public function startOfHour(): static; - - /** - * Resets the date to the first day of the millennium and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMillennium(); - * ``` - * - * @return static - */ - public function startOfMillennium(); - - /** - * Modify to start of current millisecond, microseconds such as 12345 become 123000 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOfSecond() - * ->format('H:i:s.u'); - * ``` - */ - public function startOfMillisecond(): static; - - /** - * Modify to start of current minute, seconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMinute(); - * ``` - */ - public function startOfMinute(): static; - - /** - * Resets the date to the first day of the month and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMonth(); - * ``` - * - * @return static - */ - public function startOfMonth(); - - /** - * Resets the date to the first day of the quarter and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfQuarter(); - * ``` - * - * @return static - */ - public function startOfQuarter(); - - /** - * Modify to start of current second, microseconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOfSecond() - * ->format('H:i:s.u'); - * ``` - */ - public function startOfSecond(): static; - - /** - * Resets the date to the first day of week (defined in $weekStartsAt) and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->startOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek(Carbon::SUNDAY) . "\n"; - * ``` - * - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week - * - * @return static - */ - public function startOfWeek(WeekDay|int|null $weekStartsAt = null): static; - - /** - * Resets the date to the first day of the year and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfYear(); - * ``` - * - * @return static - */ - public function startOfYear(); - - /** - * Subtract given units or interval to the current instance. - * - * @example $date->sub('hour', 3) - * @example $date->sub(15, 'days') - * @example $date->sub(CarbonInterval::days(4)) - * - * @param Unit|string|DateInterval|Closure|CarbonConverterInterface $unit - * @param int|float $value - * @param bool|null $overflow - * - * @return static - */ - #[ReturnTypeWillChange] - public function sub($unit, $value = 1, ?bool $overflow = null): static; - - /** - * @deprecated Prefer to use add subUTCUnit() which more accurately defines what it's doing. - * - * Subtract seconds to the instance using timestamp. Positive $value travels - * into the past while negative $value travels forward. - * - * @param string $unit - * @param int $value - * - * @return static - */ - public function subRealUnit($unit, $value = 1): static; - - /** - * Subtract seconds to the instance using timestamp. Positive $value travels - * into the past while negative $value travels forward. - * - * @param string $unit - * @param int $value - * - * @return static - */ - public function subUTCUnit($unit, $value = 1): static; - - /** - * Subtract given units to the current instance. - */ - public function subUnit(Unit|string $unit, $value = 1, ?bool $overflow = null): static; - - /** - * Subtract any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value amount to subtract to the input unit - * @param string $overflowUnit unit name to not overflow - */ - public function subUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static; - - /** - * Subtract given units or interval to the current instance. - * - * @see sub() - * - * @param string|DateInterval $unit - * @param int|float $value - * @param bool|null $overflow - * - * @return static - */ - public function subtract($unit, $value = 1, ?bool $overflow = null): static; - - /** - * Get the difference in a human-readable format in the current locale from current instance to another - * instance given (or now if null given). - * - * @return string - */ - public function timespan($other = null, $timezone = null): string; - - /** - * Set the instance's timestamp. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - */ - public function timestamp(string|int|float $timestamp): static; - - /** - * @alias setTimezone - */ - public function timezone(DateTimeZone|string|int $value): static; - - /** - * Get the difference in a human readable format in the current locale from an other - * instance given (or now if null given) to current instance. - * - * When comparing a value in the past to default now: - * 1 hour from now - * 5 months from now - * - * When comparing a value in the future to default now: - * 1 hour ago - * 5 months ago - * - * When comparing a value in the past to another value: - * 1 hour after - * 5 months after - * - * When comparing a value in the future to another value: - * 1 hour before - * 5 months before - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function to($other = null, $syntax = null, $short = false, $parts = 1, $options = null); - - /** - * Get default array representation. - * - * @example - * ``` - * var_dump(Carbon::now()->toArray()); - * ``` - */ - public function toArray(): array; - - /** - * Format the instance as ATOM - * - * @example - * ``` - * echo Carbon::now()->toAtomString(); - * ``` - */ - public function toAtomString(): string; - - /** - * Format the instance as COOKIE - * - * @example - * ``` - * echo Carbon::now()->toCookieString(); - * ``` - */ - public function toCookieString(): string; - - /** - * @alias toDateTime - * - * Return native DateTime PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDate()); - * ``` - */ - public function toDate(): DateTime; - - /** - * Format the instance as date - * - * @example - * ``` - * echo Carbon::now()->toDateString(); - * ``` - */ - public function toDateString(): string; - - /** - * Return native DateTime PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDateTime()); - * ``` - */ - public function toDateTime(): DateTime; - - /** - * Return native toDateTimeImmutable PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDateTimeImmutable()); - * ``` - */ - public function toDateTimeImmutable(): DateTimeImmutable; - - /** - * Format the instance as date and time T-separated with no timezone - * - * @example - * ``` - * echo Carbon::now()->toDateTimeLocalString(); - * echo "\n"; - * echo Carbon::now()->toDateTimeLocalString('minute'); // You can specify precision among: minute, second, millisecond and microsecond - * ``` - */ - public function toDateTimeLocalString(string $unitPrecision = 'second'): string; - - /** - * Format the instance as date and time - * - * @example - * ``` - * echo Carbon::now()->toDateTimeString(); - * ``` - */ - public function toDateTimeString(string $unitPrecision = 'second'): string; - - /** - * Format the instance with day, date and time - * - * @example - * ``` - * echo Carbon::now()->toDayDateTimeString(); - * ``` - */ - public function toDayDateTimeString(): string; - - /** - * Format the instance as a readable date - * - * @example - * ``` - * echo Carbon::now()->toFormattedDateString(); - * ``` - */ - public function toFormattedDateString(): string; - - /** - * Format the instance with the day, and a readable date - * - * @example - * ``` - * echo Carbon::now()->toFormattedDayDateString(); - * ``` - */ - public function toFormattedDayDateString(): string; - - /** - * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z, if $keepOffset truthy, offset will be kept: - * 1977-04-22T01:00:00-05:00). - * - * @example - * ``` - * echo Carbon::now('America/Toronto')->toISOString() . "\n"; - * echo Carbon::now('America/Toronto')->toISOString(true) . "\n"; - * ``` - * - * @param bool $keepOffset Pass true to keep the date offset. Else forced to UTC. - */ - public function toISOString(bool $keepOffset = false): ?string; - - /** - * Return a immutable copy of the instance. - * - * @return CarbonImmutable - */ - public function toImmutable(); - - /** - * Format the instance as ISO8601 - * - * @example - * ``` - * echo Carbon::now()->toIso8601String(); - * ``` - */ - public function toIso8601String(): string; - - /** - * Convert the instance to UTC and return as Zulu ISO8601 - * - * @example - * ``` - * echo Carbon::now()->toIso8601ZuluString(); - * ``` - */ - public function toIso8601ZuluString(string $unitPrecision = 'second'): string; - - /** - * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z) with UTC timezone. - * - * @example - * ``` - * echo Carbon::now('America/Toronto')->toJSON(); - * ``` - */ - public function toJSON(): ?string; - - /** - * Return a mutable copy of the instance. - * - * @return Carbon - */ - public function toMutable(); - - /** - * Get the difference in a human readable format in the current locale from an other - * instance given to now - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single part) - * @param int $options human diff options - * - * @return string - */ - public function toNow($syntax = null, $short = false, $parts = 1, $options = null); - - /** - * Get default object representation. - * - * @example - * ``` - * var_dump(Carbon::now()->toObject()); - * ``` - */ - public function toObject(): object; - - /** - * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). - * - * @param \DateTimeInterface|Carbon|CarbonImmutable|int|null $end period end date or recurrences count if int - * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit - * @param string|null $unit if specified, $interval must be an integer - */ - public function toPeriod($end = null, $interval = null, $unit = null): CarbonPeriod; - - /** - * Format the instance as RFC1036 - * - * @example - * ``` - * echo Carbon::now()->toRfc1036String(); - * ``` - */ - public function toRfc1036String(): string; - - /** - * Format the instance as RFC1123 - * - * @example - * ``` - * echo Carbon::now()->toRfc1123String(); - * ``` - */ - public function toRfc1123String(): string; - - /** - * Format the instance as RFC2822 - * - * @example - * ``` - * echo Carbon::now()->toRfc2822String(); - * ``` - */ - public function toRfc2822String(): string; - - /** - * Format the instance as RFC3339. - * - * @example - * ``` - * echo Carbon::now()->toRfc3339String() . "\n"; - * echo Carbon::now()->toRfc3339String(true) . "\n"; - * ``` - */ - public function toRfc3339String(bool $extended = false): string; - - /** - * Format the instance as RFC7231 - * - * @example - * ``` - * echo Carbon::now()->toRfc7231String(); - * ``` - */ - public function toRfc7231String(): string; - - /** - * Format the instance as RFC822 - * - * @example - * ``` - * echo Carbon::now()->toRfc822String(); - * ``` - */ - public function toRfc822String(): string; - - /** - * Format the instance as RFC850 - * - * @example - * ``` - * echo Carbon::now()->toRfc850String(); - * ``` - */ - public function toRfc850String(): string; - - /** - * Format the instance as RSS - * - * @example - * ``` - * echo Carbon::now()->toRssString(); - * ``` - */ - public function toRssString(): string; - - /** - * Returns english human-readable complete date string. - * - * @example - * ``` - * echo Carbon::now()->toString(); - * ``` - */ - public function toString(): string; - - /** - * Format the instance as time - * - * @example - * ``` - * echo Carbon::now()->toTimeString(); - * ``` - */ - public function toTimeString(string $unitPrecision = 'second'): string; - - /** - * Format the instance as W3C - * - * @example - * ``` - * echo Carbon::now()->toW3cString(); - * ``` - */ - public function toW3cString(): string; - - /** - * Create a Carbon instance for today. - */ - public static function today(DateTimeZone|string|int|null $timezone = null): static; - - /** - * Create a Carbon instance for tomorrow. - */ - public static function tomorrow(DateTimeZone|string|int|null $timezone = null): static; - - /** - * Translate using translation string or callback available. - * - * @param string $key key to find - * @param array $parameters replacement parameters - * @param string|int|float|null $number number if plural - * @param TranslatorInterface|null $translator an optional translator to use - * @param bool $altNumbers pass true to use alternative numbers - * - * @return string - */ - public function translate(string $key, array $parameters = [], string|int|float|null $number = null, ?TranslatorInterface $translator = null, bool $altNumbers = false): string; - - /** - * Returns the alternative number for a given integer if available in the current locale. - * - * @param int $number - * - * @return string - */ - public function translateNumber(int $number): string; - - /** - * Translate a time string from a locale to an other. - * - * @param string $timeString date/time/duration string to translate (may also contain English) - * @param string|null $from input locale of the $timeString parameter (`Carbon::getLocale()` by default) - * @param string|null $to output locale of the result returned (`"en"` by default) - * @param int $mode specify what to translate with options: - * - self::TRANSLATE_ALL (default) - * - CarbonInterface::TRANSLATE_MONTHS - * - CarbonInterface::TRANSLATE_DAYS - * - CarbonInterface::TRANSLATE_UNITS - * - CarbonInterface::TRANSLATE_MERIDIEM - * You can use pipe to group: CarbonInterface::TRANSLATE_MONTHS | CarbonInterface::TRANSLATE_DAYS - * - * @return string - */ - public static function translateTimeString(string $timeString, ?string $from = null, ?string $to = null, int $mode = self::TRANSLATE_ALL): string; - - /** - * Translate a time string from the current locale (`$date->locale()`) to an other. - * - * @param string $timeString time string to translate - * @param string|null $to output locale of the result returned ("en" by default) - * - * @return string - */ - public function translateTimeStringTo(string $timeString, ?string $to = null): string; - - /** - * Translate using translation string or callback available. - * - * @param TranslatorInterface $translator an optional translator to use - * @param string $key key to find - * @param array $parameters replacement parameters - * @param int|float|null $number number if plural - * - * @return string - */ - public static function translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null): string; - - /** - * Format as ->format() do (using date replacements patterns from https://php.net/manual/en/function.date.php) - * but translate words whenever possible (months, day names, etc.) using the current locale. - */ - public function translatedFormat(string $format): string; - - /** - * Set the timezone or returns the timezone name if no arguments passed. - */ - public function tz(DateTimeZone|string|int|null $value = null): static|string; - - /** - * @alias getTimestamp - * - * Returns the UNIX timestamp for the current date. - * - * @return int - */ - public function unix(): int; - - /** - * @alias to - * - * Get the difference in a human readable format in the current locale from an other - * instance given (or now if null given) to current instance. - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function until($other = null, $syntax = null, $short = false, $parts = 1, $options = null); - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Indicates if months should be calculated with overflow. - * - * @param bool $monthsOverflow - * - * @return void - */ - public static function useMonthsOverflow(bool $monthsOverflow = true): void; - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - * - * Enable the strict mode (or disable with passing false). - * - * @param bool $strictModeEnabled - */ - public static function useStrictMode(bool $strictModeEnabled = true): void; - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Indicates if years should be calculated with overflow. - * - * @param bool $yearsOverflow - * - * @return void - */ - public static function useYearsOverflow(bool $yearsOverflow = true): void; - - /** - * Set the instance's timezone to UTC. - */ - public function utc(): static; - - /** - * Returns the minutes offset to UTC if no arguments passed, else set the timezone with given minutes shift passed. - */ - public function utcOffset(?int $minuteOffset = null): static|int; - - /** - * Returns the milliseconds timestamps used amongst other by Date javascript objects. - * - * @return float - */ - public function valueOf(): float; - - /** - * Get/set the week number using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $week - * @param int|null $dayOfWeek - * @param int|null $dayOfYear - * - * @return int|static - */ - public function week($week = null, $dayOfWeek = null, $dayOfYear = null); - - /** - * Set/get the week number of year using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int|static - */ - public function weekYear($year = null, $dayOfWeek = null, $dayOfYear = null); - - /** - * Get/set the weekday from 0 (Sunday) to 6 (Saturday). - * - * @param WeekDay|int|null $value new value for weekday if using as setter. - */ - public function weekday(WeekDay|int|null $value = null): static|int; - - /** - * Get the number of weeks of the current week-year using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int - */ - public function weeksInYear($dayOfWeek = null, $dayOfYear = null); - - /** - * Temporarily sets a static date to be used within the callback. - * Using setTestNow to set the date, executing the callback, then - * clearing the test instance. - * - * /!\ Use this method for unit tests only. - * - * @template T - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - * @param Closure(): T $callback - * - * @return T - */ - public static function withTestNow(mixed $testNow, callable $callback): mixed; - - /** - * Create a Carbon instance for yesterday. - */ - public static function yesterday(DateTimeZone|string|int|null $timezone = null): static; - - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php b/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php deleted file mode 100644 index 23508c5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php +++ /dev/null @@ -1,3402 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Carbon\Exceptions\BadFluentConstructorException; -use Carbon\Exceptions\BadFluentSetterException; -use Carbon\Exceptions\InvalidCastException; -use Carbon\Exceptions\InvalidFormatException; -use Carbon\Exceptions\InvalidIntervalException; -use Carbon\Exceptions\OutOfRangeException; -use Carbon\Exceptions\ParseErrorException; -use Carbon\Exceptions\UnitNotConfiguredException; -use Carbon\Exceptions\UnknownGetterException; -use Carbon\Exceptions\UnknownSetterException; -use Carbon\Exceptions\UnknownUnitException; -use Carbon\Traits\IntervalRounding; -use Carbon\Traits\IntervalStep; -use Carbon\Traits\LocalFactory; -use Carbon\Traits\MagicParameter; -use Carbon\Traits\Mixin; -use Carbon\Traits\Options; -use Carbon\Traits\ToStringFormat; -use Closure; -use DateInterval; -use DateTime; -use DateTimeInterface; -use DateTimeZone; -use Exception; -use InvalidArgumentException; -use ReflectionException; -use ReturnTypeWillChange; -use RuntimeException; -use Symfony\Contracts\Translation\TranslatorInterface; -use Throwable; - -/** - * A simple API extension for DateInterval. - * The implementation provides helpers to handle weeks but only days are saved. - * Weeks are calculated based on the total days of the current instance. - * - * @property int $years Year component of the current interval. (For P2Y6M, the value will be 2) - * @property int $months Month component of the current interval. (For P1Y6M10D, the value will be 6) - * @property int $weeks Week component of the current interval calculated from the days. (For P1Y6M17D, the value will be 2) - * @property int $dayz Day component of the current interval (weeks * 7 + days). (For P6M17DT20H, the value will be 17) - * @property int $hours Hour component of the current interval. (For P7DT20H5M, the value will be 20) - * @property int $minutes Minute component of the current interval. (For PT20H5M30S, the value will be 5) - * @property int $seconds Second component of the current interval. (CarbonInterval::minutes(2)->seconds(34)->microseconds(567_890)->seconds = 34) - * @property int $milliseconds Milliseconds component of the current interval. (CarbonInterval::seconds(34)->microseconds(567_890)->milliseconds = 567) - * @property int $microseconds Microseconds component of the current interval. (CarbonInterval::seconds(34)->microseconds(567_890)->microseconds = 567_890) - * @property int $microExcludeMilli Remaining microseconds without the milliseconds. - * @property int $dayzExcludeWeeks Total days remaining in the final week of the current instance (days % 7). - * @property int $daysExcludeWeeks alias of dayzExcludeWeeks - * @property-read float $totalYears Number of years equivalent to the interval. (For P1Y6M, the value will be 1.5) - * @property-read float $totalMonths Number of months equivalent to the interval. (For P1Y6M10D, the value will be ~12.357) - * @property-read float $totalWeeks Number of weeks equivalent to the interval. (For P6M17DT20H, the value will be ~26.548) - * @property-read float $totalDays Number of days equivalent to the interval. (For P17DT20H, the value will be ~17.833) - * @property-read float $totalDayz Alias for totalDays. - * @property-read float $totalHours Number of hours equivalent to the interval. (For P1DT20H5M, the value will be ~44.083) - * @property-read float $totalMinutes Number of minutes equivalent to the interval. (For PT20H5M30S, the value will be 1205.5) - * @property-read float $totalSeconds Number of seconds equivalent to the interval. (CarbonInterval::minutes(2)->seconds(34)->microseconds(567_890)->totalSeconds = 154.567_890) - * @property-read float $totalMilliseconds Number of milliseconds equivalent to the interval. (CarbonInterval::seconds(34)->microseconds(567_890)->totalMilliseconds = 34567.890) - * @property-read float $totalMicroseconds Number of microseconds equivalent to the interval. (CarbonInterval::seconds(34)->microseconds(567_890)->totalMicroseconds = 34567890) - * @property-read string $locale locale of the current instance - * - * @method static CarbonInterval years($years = 1) Create instance specifying a number of years or modify the number of years if called on an instance. - * @method static CarbonInterval year($years = 1) Alias for years() - * @method static CarbonInterval months($months = 1) Create instance specifying a number of months or modify the number of months if called on an instance. - * @method static CarbonInterval month($months = 1) Alias for months() - * @method static CarbonInterval weeks($weeks = 1) Create instance specifying a number of weeks or modify the number of weeks if called on an instance. - * @method static CarbonInterval week($weeks = 1) Alias for weeks() - * @method static CarbonInterval days($days = 1) Create instance specifying a number of days or modify the number of days if called on an instance. - * @method static CarbonInterval dayz($days = 1) Alias for days() - * @method static CarbonInterval daysExcludeWeeks($days = 1) Create instance specifying a number of days or modify the number of days (keeping the current number of weeks) if called on an instance. - * @method static CarbonInterval dayzExcludeWeeks($days = 1) Alias for daysExcludeWeeks() - * @method static CarbonInterval day($days = 1) Alias for days() - * @method static CarbonInterval hours($hours = 1) Create instance specifying a number of hours or modify the number of hours if called on an instance. - * @method static CarbonInterval hour($hours = 1) Alias for hours() - * @method static CarbonInterval minutes($minutes = 1) Create instance specifying a number of minutes or modify the number of minutes if called on an instance. - * @method static CarbonInterval minute($minutes = 1) Alias for minutes() - * @method static CarbonInterval seconds($seconds = 1) Create instance specifying a number of seconds or modify the number of seconds if called on an instance. - * @method static CarbonInterval second($seconds = 1) Alias for seconds() - * @method static CarbonInterval milliseconds($milliseconds = 1) Create instance specifying a number of milliseconds or modify the number of milliseconds if called on an instance. - * @method static CarbonInterval millisecond($milliseconds = 1) Alias for milliseconds() - * @method static CarbonInterval microseconds($microseconds = 1) Create instance specifying a number of microseconds or modify the number of microseconds if called on an instance. - * @method static CarbonInterval microsecond($microseconds = 1) Alias for microseconds() - * @method $this addYears(int $years) Add given number of years to the current interval - * @method $this subYears(int $years) Subtract given number of years to the current interval - * @method $this addMonths(int $months) Add given number of months to the current interval - * @method $this subMonths(int $months) Subtract given number of months to the current interval - * @method $this addWeeks(int|float $weeks) Add given number of weeks to the current interval - * @method $this subWeeks(int|float $weeks) Subtract given number of weeks to the current interval - * @method $this addDays(int|float $days) Add given number of days to the current interval - * @method $this subDays(int|float $days) Subtract given number of days to the current interval - * @method $this addHours(int|float $hours) Add given number of hours to the current interval - * @method $this subHours(int|float $hours) Subtract given number of hours to the current interval - * @method $this addMinutes(int|float $minutes) Add given number of minutes to the current interval - * @method $this subMinutes(int|float $minutes) Subtract given number of minutes to the current interval - * @method $this addSeconds(int|float $seconds) Add given number of seconds to the current interval - * @method $this subSeconds(int|float $seconds) Subtract given number of seconds to the current interval - * @method $this addMilliseconds(int|float $milliseconds) Add given number of milliseconds to the current interval - * @method $this subMilliseconds(int|float $milliseconds) Subtract given number of milliseconds to the current interval - * @method $this addMicroseconds(int|float $microseconds) Add given number of microseconds to the current interval - * @method $this subMicroseconds(int|float $microseconds) Subtract given number of microseconds to the current interval - * @method $this roundYear(int|float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this roundYears(int|float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this floorYear(int|float $precision = 1) Truncate the current instance year with given precision. - * @method $this floorYears(int|float $precision = 1) Truncate the current instance year with given precision. - * @method $this ceilYear(int|float $precision = 1) Ceil the current instance year with given precision. - * @method $this ceilYears(int|float $precision = 1) Ceil the current instance year with given precision. - * @method $this roundMonth(int|float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this roundMonths(int|float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this floorMonth(int|float $precision = 1) Truncate the current instance month with given precision. - * @method $this floorMonths(int|float $precision = 1) Truncate the current instance month with given precision. - * @method $this ceilMonth(int|float $precision = 1) Ceil the current instance month with given precision. - * @method $this ceilMonths(int|float $precision = 1) Ceil the current instance month with given precision. - * @method $this roundWeek(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundWeeks(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorWeek(int|float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorWeeks(int|float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilWeek(int|float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilWeeks(int|float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundDay(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundDays(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorDay(int|float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorDays(int|float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilDay(int|float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilDays(int|float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundHour(int|float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this roundHours(int|float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this floorHour(int|float $precision = 1) Truncate the current instance hour with given precision. - * @method $this floorHours(int|float $precision = 1) Truncate the current instance hour with given precision. - * @method $this ceilHour(int|float $precision = 1) Ceil the current instance hour with given precision. - * @method $this ceilHours(int|float $precision = 1) Ceil the current instance hour with given precision. - * @method $this roundMinute(int|float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this roundMinutes(int|float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this floorMinute(int|float $precision = 1) Truncate the current instance minute with given precision. - * @method $this floorMinutes(int|float $precision = 1) Truncate the current instance minute with given precision. - * @method $this ceilMinute(int|float $precision = 1) Ceil the current instance minute with given precision. - * @method $this ceilMinutes(int|float $precision = 1) Ceil the current instance minute with given precision. - * @method $this roundSecond(int|float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this roundSeconds(int|float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this floorSecond(int|float $precision = 1) Truncate the current instance second with given precision. - * @method $this floorSeconds(int|float $precision = 1) Truncate the current instance second with given precision. - * @method $this ceilSecond(int|float $precision = 1) Ceil the current instance second with given precision. - * @method $this ceilSeconds(int|float $precision = 1) Ceil the current instance second with given precision. - * @method $this roundMillennium(int|float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this roundMillennia(int|float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this floorMillennium(int|float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this floorMillennia(int|float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this ceilMillennium(int|float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this ceilMillennia(int|float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this roundCentury(int|float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this roundCenturies(int|float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this floorCentury(int|float $precision = 1) Truncate the current instance century with given precision. - * @method $this floorCenturies(int|float $precision = 1) Truncate the current instance century with given precision. - * @method $this ceilCentury(int|float $precision = 1) Ceil the current instance century with given precision. - * @method $this ceilCenturies(int|float $precision = 1) Ceil the current instance century with given precision. - * @method $this roundDecade(int|float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this roundDecades(int|float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this floorDecade(int|float $precision = 1) Truncate the current instance decade with given precision. - * @method $this floorDecades(int|float $precision = 1) Truncate the current instance decade with given precision. - * @method $this ceilDecade(int|float $precision = 1) Ceil the current instance decade with given precision. - * @method $this ceilDecades(int|float $precision = 1) Ceil the current instance decade with given precision. - * @method $this roundQuarter(int|float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this roundQuarters(int|float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this floorQuarter(int|float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this floorQuarters(int|float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this ceilQuarter(int|float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this ceilQuarters(int|float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this roundMillisecond(int|float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this roundMilliseconds(int|float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this floorMillisecond(int|float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this floorMilliseconds(int|float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this ceilMillisecond(int|float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this ceilMilliseconds(int|float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this roundMicrosecond(int|float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this roundMicroseconds(int|float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this floorMicrosecond(int|float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this floorMicroseconds(int|float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this ceilMicrosecond(int|float $precision = 1) Ceil the current instance microsecond with given precision. - * @method $this ceilMicroseconds(int|float $precision = 1) Ceil the current instance microsecond with given precision. - */ -class CarbonInterval extends DateInterval implements CarbonConverterInterface -{ - use LocalFactory; - use IntervalRounding; - use IntervalStep; - use MagicParameter; - use Mixin { - Mixin::mixin as baseMixin; - } - use Options; - use ToStringFormat; - - /** - * Unlimited parts for forHumans() method. - * - * INF constant can be used instead. - */ - public const NO_LIMIT = -1; - - public const POSITIVE = 1; - public const NEGATIVE = -1; - - /** - * Interval spec period designators - */ - public const PERIOD_PREFIX = 'P'; - public const PERIOD_YEARS = 'Y'; - public const PERIOD_MONTHS = 'M'; - public const PERIOD_DAYS = 'D'; - public const PERIOD_TIME_PREFIX = 'T'; - public const PERIOD_HOURS = 'H'; - public const PERIOD_MINUTES = 'M'; - public const PERIOD_SECONDS = 'S'; - - public const SPECIAL_TRANSLATIONS = [ - 1 => [ - 'option' => CarbonInterface::ONE_DAY_WORDS, - 'future' => 'diff_tomorrow', - 'past' => 'diff_yesterday', - ], - 2 => [ - 'option' => CarbonInterface::TWO_DAY_WORDS, - 'future' => 'diff_after_tomorrow', - 'past' => 'diff_before_yesterday', - ], - ]; - - protected static ?array $cascadeFactors = null; - - protected static array $formats = [ - 'y' => 'y', - 'Y' => 'y', - 'o' => 'y', - 'm' => 'm', - 'n' => 'm', - 'W' => 'weeks', - 'd' => 'd', - 'j' => 'd', - 'z' => 'd', - 'h' => 'h', - 'g' => 'h', - 'H' => 'h', - 'G' => 'h', - 'i' => 'i', - 's' => 's', - 'u' => 'micro', - 'v' => 'milli', - ]; - - private static ?array $flipCascadeFactors = null; - - private static bool $floatSettersEnabled = false; - - /** - * The registered macros. - */ - protected static array $macros = []; - - /** - * Timezone handler for settings() method. - */ - protected DateTimeZone|string|int|null $timezoneSetting = null; - - /** - * The input used to create the interval. - */ - protected mixed $originalInput = null; - - /** - * Start date if interval was created from a difference between 2 dates. - */ - protected ?CarbonInterface $startDate = null; - - /** - * End date if interval was created from a difference between 2 dates. - */ - protected ?CarbonInterface $endDate = null; - - /** - * End date if interval was created from a difference between 2 dates. - */ - protected ?DateInterval $rawInterval = null; - - /** - * Flag if the interval was made from a diff with absolute flag on. - */ - protected bool $absolute = false; - - protected ?array $initialValues = null; - - /** - * Set the instance's timezone from a string or object. - */ - public function setTimezone(DateTimeZone|string|int $timezone): static - { - $this->timezoneSetting = $timezone; - $this->checkStartAndEnd(); - - if ($this->startDate) { - $this->startDate = $this->startDate - ->avoidMutation() - ->setTimezone($timezone); - $this->rawInterval = null; - } - - if ($this->endDate) { - $this->endDate = $this->endDate - ->avoidMutation() - ->setTimezone($timezone); - $this->rawInterval = null; - } - - return $this; - } - - /** - * Set the instance's timezone from a string or object and add/subtract the offset difference. - */ - public function shiftTimezone(DateTimeZone|string|int $timezone): static - { - $this->timezoneSetting = $timezone; - $this->checkStartAndEnd(); - - if ($this->startDate) { - $this->startDate = $this->startDate - ->avoidMutation() - ->shiftTimezone($timezone); - $this->rawInterval = null; - } - - if ($this->endDate) { - $this->endDate = $this->endDate - ->avoidMutation() - ->shiftTimezone($timezone); - $this->rawInterval = null; - } - - return $this; - } - - /** - * Mapping of units and factors for cascading. - * - * Should only be modified by changing the factors or referenced constants. - */ - public static function getCascadeFactors(): array - { - return static::$cascadeFactors ?: static::getDefaultCascadeFactors(); - } - - protected static function getDefaultCascadeFactors(): array - { - return [ - 'milliseconds' => [CarbonInterface::MICROSECONDS_PER_MILLISECOND, 'microseconds'], - 'seconds' => [CarbonInterface::MILLISECONDS_PER_SECOND, 'milliseconds'], - 'minutes' => [CarbonInterface::SECONDS_PER_MINUTE, 'seconds'], - 'hours' => [CarbonInterface::MINUTES_PER_HOUR, 'minutes'], - 'dayz' => [CarbonInterface::HOURS_PER_DAY, 'hours'], - 'weeks' => [CarbonInterface::DAYS_PER_WEEK, 'dayz'], - 'months' => [CarbonInterface::WEEKS_PER_MONTH, 'weeks'], - 'years' => [CarbonInterface::MONTHS_PER_YEAR, 'months'], - ]; - } - - /** - * Set default cascading factors for ->cascade() method. - * - * @param array $cascadeFactors - */ - public static function setCascadeFactors(array $cascadeFactors) - { - self::$flipCascadeFactors = null; - static::$cascadeFactors = $cascadeFactors; - } - - /** - * This option allow you to opt-in for the Carbon 3 behavior where float - * values will no longer be cast to integer (so truncated). - * - * ⚠️ This settings will be applied globally, which mean your whole application - * code including the third-party dependencies that also may use Carbon will - * adopt the new behavior. - */ - public static function enableFloatSetters(bool $floatSettersEnabled = true): void - { - self::$floatSettersEnabled = $floatSettersEnabled; - } - - /////////////////////////////////////////////////////////////////// - //////////////////////////// CONSTRUCTORS ///////////////////////// - /////////////////////////////////////////////////////////////////// - - /** - * Create a new CarbonInterval instance. - * - * @param Closure|DateInterval|string|int|null $years - * @param int|float|null $months - * @param int|float|null $weeks - * @param int|float|null $days - * @param int|float|null $hours - * @param int|float|null $minutes - * @param int|float|null $seconds - * @param int|float|null $microseconds - * - * @throws Exception when the interval_spec (passed as $years) cannot be parsed as an interval. - */ - public function __construct($years = null, $months = null, $weeks = null, $days = null, $hours = null, $minutes = null, $seconds = null, $microseconds = null) - { - $this->originalInput = \func_num_args() === 1 ? $years : \func_get_args(); - - if ($years instanceof Closure) { - $this->step = $years; - $years = null; - } - - if ($years instanceof DateInterval) { - parent::__construct(static::getDateIntervalSpec($years)); - $this->f = $years->f; - self::copyNegativeUnits($years, $this); - - return; - } - - $spec = $years; - $isStringSpec = (\is_string($spec) && !preg_match('/^[\d.]/', $spec)); - - if (!$isStringSpec || (float) $years) { - $spec = static::PERIOD_PREFIX; - - $spec .= $years > 0 ? $years.static::PERIOD_YEARS : ''; - $spec .= $months > 0 ? $months.static::PERIOD_MONTHS : ''; - - $specDays = 0; - $specDays += $weeks > 0 ? $weeks * static::getDaysPerWeek() : 0; - $specDays += $days > 0 ? $days : 0; - - $spec .= $specDays > 0 ? $specDays.static::PERIOD_DAYS : ''; - - if ($hours > 0 || $minutes > 0 || $seconds > 0) { - $spec .= static::PERIOD_TIME_PREFIX; - $spec .= $hours > 0 ? $hours.static::PERIOD_HOURS : ''; - $spec .= $minutes > 0 ? $minutes.static::PERIOD_MINUTES : ''; - $spec .= $seconds > 0 ? $seconds.static::PERIOD_SECONDS : ''; - } - - if ($spec === static::PERIOD_PREFIX) { - // Allow the zero interval. - $spec .= '0'.static::PERIOD_YEARS; - } - } - - try { - parent::__construct($spec); - } catch (Throwable $exception) { - try { - parent::__construct('PT0S'); - - if ($isStringSpec) { - if (!preg_match('/^P - (?:(?[+-]?\d*(?:\.\d+)?)Y)? - (?:(?[+-]?\d*(?:\.\d+)?)M)? - (?:(?[+-]?\d*(?:\.\d+)?)W)? - (?:(?[+-]?\d*(?:\.\d+)?)D)? - (?:T - (?:(?[+-]?\d*(?:\.\d+)?)H)? - (?:(?[+-]?\d*(?:\.\d+)?)M)? - (?:(?[+-]?\d*(?:\.\d+)?)S)? - )? - $/x', $spec, $match)) { - throw new InvalidArgumentException("Invalid duration: $spec"); - } - - $years = (float) ($match['year'] ?? 0); - $this->assertSafeForInteger('year', $years); - $months = (float) ($match['month'] ?? 0); - $this->assertSafeForInteger('month', $months); - $weeks = (float) ($match['week'] ?? 0); - $this->assertSafeForInteger('week', $weeks); - $days = (float) ($match['day'] ?? 0); - $this->assertSafeForInteger('day', $days); - $hours = (float) ($match['hour'] ?? 0); - $this->assertSafeForInteger('hour', $hours); - $minutes = (float) ($match['minute'] ?? 0); - $this->assertSafeForInteger('minute', $minutes); - $seconds = (float) ($match['second'] ?? 0); - $this->assertSafeForInteger('second', $seconds); - $microseconds = (int) str_pad( - substr(explode('.', $match['second'] ?? '0.0')[1] ?? '0', 0, 6), - 6, - '0', - ); - } - - $totalDays = (($weeks * static::getDaysPerWeek()) + $days); - $this->assertSafeForInteger('days total (including weeks)', $totalDays); - - $this->y = (int) $years; - $this->m = (int) $months; - $this->d = (int) $totalDays; - $this->h = (int) $hours; - $this->i = (int) $minutes; - $this->s = (int) $seconds; - $secondFloatPart = (float) ($microseconds / CarbonInterface::MICROSECONDS_PER_SECOND); - $this->f = $secondFloatPart; - $intervalMicroseconds = (int) ($this->f * CarbonInterface::MICROSECONDS_PER_SECOND); - $intervalSeconds = $seconds - $secondFloatPart; - - if ( - ((float) $this->y) !== $years || - ((float) $this->m) !== $months || - ((float) $this->d) !== $totalDays || - ((float) $this->h) !== $hours || - ((float) $this->i) !== $minutes || - ((float) $this->s) !== $intervalSeconds || - $intervalMicroseconds !== ((int) $microseconds) - ) { - $this->add(static::fromString( - ($years - $this->y).' years '. - ($months - $this->m).' months '. - ($totalDays - $this->d).' days '. - ($hours - $this->h).' hours '. - ($minutes - $this->i).' minutes '. - ($intervalSeconds - $this->s).' seconds '. - ($microseconds - $intervalMicroseconds).' microseconds ', - )); - } - } catch (Throwable $secondException) { - throw $secondException instanceof OutOfRangeException ? $secondException : $exception; - } - } - - if ($microseconds !== null) { - $this->f = $microseconds / CarbonInterface::MICROSECONDS_PER_SECOND; - } - - foreach (['years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds'] as $unit) { - if ($$unit < 0) { - $this->set($unit, $$unit); - } - } - } - - /** - * Returns the factor for a given source-to-target couple. - * - * @param string $source - * @param string $target - * - * @return int|float|null - */ - public static function getFactor($source, $target) - { - $source = self::standardizeUnit($source); - $target = self::standardizeUnit($target); - $factors = self::getFlipCascadeFactors(); - - if (isset($factors[$source])) { - [$to, $factor] = $factors[$source]; - - if ($to === $target) { - return $factor; - } - - return $factor * static::getFactor($to, $target); - } - - return null; - } - - /** - * Returns the factor for a given source-to-target couple if set, - * else try to find the appropriate constant as the factor, such as Carbon::DAYS_PER_WEEK. - * - * @param string $source - * @param string $target - * - * @return int|float|null - */ - public static function getFactorWithDefault($source, $target) - { - $factor = self::getFactor($source, $target); - - if ($factor) { - return $factor; - } - - static $defaults = [ - 'month' => ['year' => Carbon::MONTHS_PER_YEAR], - 'week' => ['month' => Carbon::WEEKS_PER_MONTH], - 'day' => ['week' => Carbon::DAYS_PER_WEEK], - 'hour' => ['day' => Carbon::HOURS_PER_DAY], - 'minute' => ['hour' => Carbon::MINUTES_PER_HOUR], - 'second' => ['minute' => Carbon::SECONDS_PER_MINUTE], - 'millisecond' => ['second' => Carbon::MILLISECONDS_PER_SECOND], - 'microsecond' => ['millisecond' => Carbon::MICROSECONDS_PER_MILLISECOND], - ]; - - return $defaults[$source][$target] ?? null; - } - - /** - * Returns current config for days per week. - * - * @return int|float - */ - public static function getDaysPerWeek() - { - return static::getFactor('dayz', 'weeks') ?: Carbon::DAYS_PER_WEEK; - } - - /** - * Returns current config for hours per day. - * - * @return int|float - */ - public static function getHoursPerDay() - { - return static::getFactor('hours', 'dayz') ?: Carbon::HOURS_PER_DAY; - } - - /** - * Returns current config for minutes per hour. - * - * @return int|float - */ - public static function getMinutesPerHour() - { - return static::getFactor('minutes', 'hours') ?: Carbon::MINUTES_PER_HOUR; - } - - /** - * Returns current config for seconds per minute. - * - * @return int|float - */ - public static function getSecondsPerMinute() - { - return static::getFactor('seconds', 'minutes') ?: Carbon::SECONDS_PER_MINUTE; - } - - /** - * Returns current config for microseconds per second. - * - * @return int|float - */ - public static function getMillisecondsPerSecond() - { - return static::getFactor('milliseconds', 'seconds') ?: Carbon::MILLISECONDS_PER_SECOND; - } - - /** - * Returns current config for microseconds per second. - * - * @return int|float - */ - public static function getMicrosecondsPerMillisecond() - { - return static::getFactor('microseconds', 'milliseconds') ?: Carbon::MICROSECONDS_PER_MILLISECOND; - } - - /** - * Create a new CarbonInterval instance from specific values. - * This is an alias for the constructor that allows better fluent - * syntax as it allows you to do CarbonInterval::create(1)->fn() rather than - * (new CarbonInterval(1))->fn(). - * - * @param int $years - * @param int $months - * @param int $weeks - * @param int $days - * @param int $hours - * @param int $minutes - * @param int $seconds - * @param int $microseconds - * - * @throws Exception when the interval_spec (passed as $years) cannot be parsed as an interval. - * - * @return static - */ - public static function create($years = null, $months = null, $weeks = null, $days = null, $hours = null, $minutes = null, $seconds = null, $microseconds = null) - { - return new static($years, $months, $weeks, $days, $hours, $minutes, $seconds, $microseconds); - } - - /** - * Parse a string into a new CarbonInterval object according to the specified format. - * - * @example - * ``` - * echo Carboninterval::createFromFormat('H:i', '1:30'); - * ``` - * - * @param string $format Format of the $interval input string - * @param string|null $interval Input string to convert into an interval - * - * @throws \Carbon\Exceptions\ParseErrorException when the $interval cannot be parsed as an interval. - * - * @return static - */ - public static function createFromFormat(string $format, ?string $interval): static - { - $instance = new static(0); - $length = mb_strlen($format); - - if (preg_match('/s([,.])([uv])$/', $format, $match)) { - $interval = explode($match[1], $interval); - $index = \count($interval) - 1; - $interval[$index] = str_pad($interval[$index], $match[2] === 'v' ? 3 : 6, '0'); - $interval = implode($match[1], $interval); - } - - $interval ??= ''; - - for ($index = 0; $index < $length; $index++) { - $expected = mb_substr($format, $index, 1); - $nextCharacter = mb_substr($interval, 0, 1); - $unit = static::$formats[$expected] ?? null; - - if ($unit) { - if (!preg_match('/^-?\d+/', $interval, $match)) { - throw new ParseErrorException('number', $nextCharacter); - } - - $interval = mb_substr($interval, mb_strlen($match[0])); - $instance->$unit += (int) ($match[0]); - - continue; - } - - if ($nextCharacter !== $expected) { - throw new ParseErrorException( - "'$expected'", - $nextCharacter, - 'Allowed substitutes for interval formats are '.implode(', ', array_keys(static::$formats))."\n". - 'See https://php.net/manual/en/function.date.php for their meaning', - ); - } - - $interval = mb_substr($interval, 1); - } - - if ($interval !== '') { - throw new ParseErrorException( - 'end of string', - $interval, - ); - } - - return $instance; - } - - /** - * Return the original source used to create the current interval. - * - * @return array|int|string|DateInterval|mixed|null - */ - public function original() - { - return $this->originalInput; - } - - /** - * Return the start date if interval was created from a difference between 2 dates. - * - * @return CarbonInterface|null - */ - public function start(): ?CarbonInterface - { - $this->checkStartAndEnd(); - - return $this->startDate; - } - - /** - * Return the end date if interval was created from a difference between 2 dates. - * - * @return CarbonInterface|null - */ - public function end(): ?CarbonInterface - { - $this->checkStartAndEnd(); - - return $this->endDate; - } - - /** - * Get rid of the original input, start date and end date that may be kept in memory. - * - * @return $this - */ - public function optimize(): static - { - $this->originalInput = null; - $this->startDate = null; - $this->endDate = null; - $this->rawInterval = null; - $this->absolute = false; - - return $this; - } - - /** - * Get a copy of the instance. - * - * @return static - */ - public function copy(): static - { - $date = new static(0); - $date->copyProperties($this); - $date->step = $this->step; - - return $date; - } - - /** - * Get a copy of the instance. - * - * @return static - */ - public function clone(): static - { - return $this->copy(); - } - - /** - * Provide static helpers to create instances. Allows CarbonInterval::years(3). - * - * Note: This is done using the magic method to allow static and instance methods to - * have the same names. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @return static|mixed|null - */ - public static function __callStatic(string $method, array $parameters) - { - try { - $interval = new static(0); - $localStrictModeEnabled = $interval->localStrictModeEnabled; - $interval->localStrictModeEnabled = true; - - $result = static::hasMacro($method) - ? static::bindMacroContext(null, function () use (&$method, &$parameters, &$interval) { - return $interval->callMacro($method, $parameters); - }) - : $interval->$method(...$parameters); - - $interval->localStrictModeEnabled = $localStrictModeEnabled; - - return $result; - } catch (BadFluentSetterException $exception) { - if (Carbon::isStrictModeEnabled()) { - throw new BadFluentConstructorException($method, 0, $exception); - } - - return null; - } - } - - /** - * Evaluate the PHP generated by var_export() and recreate the exported CarbonInterval instance. - * - * @param array $dump data as exported by var_export() - * - * @return static - */ - #[ReturnTypeWillChange] - public static function __set_state($dump) - { - /** @noinspection PhpVoidFunctionResultUsedInspection */ - /** @var DateInterval $dateInterval */ - $dateInterval = parent::__set_state($dump); - - return static::instance($dateInterval); - } - - /** - * Return the current context from inside a macro callee or a new one if static. - * - * @return static - */ - protected static function this(): static - { - return end(static::$macroContextStack) ?: new static(0); - } - - /** - * Creates a CarbonInterval from string. - * - * Format: - * - * Suffix | Unit | Example | DateInterval expression - * -------|---------|---------|------------------------ - * y | years | 1y | P1Y - * mo | months | 3mo | P3M - * w | weeks | 2w | P2W - * d | days | 28d | P28D - * h | hours | 4h | PT4H - * m | minutes | 12m | PT12M - * s | seconds | 59s | PT59S - * - * e. g. `1w 3d 4h 32m 23s` is converted to 10 days 4 hours 32 minutes and 23 seconds. - * - * Special cases: - * - An empty string will return a zero interval - * - Fractions are allowed for weeks, days, hours and minutes and will be converted - * and rounded to the next smaller value (caution: 0.5w = 4d) - * - * @param string $intervalDefinition - * - * @throws InvalidIntervalException - * - * @return static - */ - public static function fromString(string $intervalDefinition): static - { - if (empty($intervalDefinition)) { - return self::withOriginal(new static(0), $intervalDefinition); - } - - $years = 0; - $months = 0; - $weeks = 0; - $days = 0; - $hours = 0; - $minutes = 0; - $seconds = 0; - $milliseconds = 0; - $microseconds = 0; - - $pattern = '/(-?\d+(?:\.\d+)?)\h*([^\d\h]*)/i'; - preg_match_all($pattern, $intervalDefinition, $parts, PREG_SET_ORDER); - - while ([$part, $value, $unit] = array_shift($parts)) { - $intValue = (int) $value; - $fraction = (float) $value - $intValue; - - // Fix calculation precision - switch (round($fraction, 6)) { - case 1: - $fraction = 0; - $intValue++; - - break; - case 0: - $fraction = 0; - - break; - } - - switch ($unit === 'µs' ? 'µs' : strtolower($unit)) { - case 'millennia': - case 'millennium': - $years += $intValue * CarbonInterface::YEARS_PER_MILLENNIUM; - - break; - - case 'century': - case 'centuries': - $years += $intValue * CarbonInterface::YEARS_PER_CENTURY; - - break; - - case 'decade': - case 'decades': - $years += $intValue * CarbonInterface::YEARS_PER_DECADE; - - break; - - case 'year': - case 'years': - case 'y': - case 'yr': - case 'yrs': - $years += $intValue; - - break; - - case 'quarter': - case 'quarters': - $months += $intValue * CarbonInterface::MONTHS_PER_QUARTER; - - break; - - case 'month': - case 'months': - case 'mo': - case 'mos': - $months += $intValue; - - break; - - case 'week': - case 'weeks': - case 'w': - $weeks += $intValue; - - if ($fraction) { - $parts[] = [null, $fraction * static::getDaysPerWeek(), 'd']; - } - - break; - - case 'day': - case 'days': - case 'd': - $days += $intValue; - - if ($fraction) { - $parts[] = [null, $fraction * static::getHoursPerDay(), 'h']; - } - - break; - - case 'hour': - case 'hours': - case 'h': - $hours += $intValue; - - if ($fraction) { - $parts[] = [null, $fraction * static::getMinutesPerHour(), 'm']; - } - - break; - - case 'minute': - case 'minutes': - case 'm': - $minutes += $intValue; - - if ($fraction) { - $parts[] = [null, $fraction * static::getSecondsPerMinute(), 's']; - } - - break; - - case 'second': - case 'seconds': - case 's': - $seconds += $intValue; - - if ($fraction) { - $parts[] = [null, $fraction * static::getMillisecondsPerSecond(), 'ms']; - } - - break; - - case 'millisecond': - case 'milliseconds': - case 'milli': - case 'ms': - $milliseconds += $intValue; - - if ($fraction) { - $microseconds += round($fraction * static::getMicrosecondsPerMillisecond()); - } - - break; - - case 'microsecond': - case 'microseconds': - case 'micro': - case 'µs': - $microseconds += $intValue; - - break; - - default: - throw new InvalidIntervalException( - \sprintf('Invalid part %s in definition %s', $part, $intervalDefinition), - ); - } - } - - return self::withOriginal( - new static($years, $months, $weeks, $days, $hours, $minutes, $seconds, $milliseconds * Carbon::MICROSECONDS_PER_MILLISECOND + $microseconds), - $intervalDefinition, - ); - } - - /** - * Creates a CarbonInterval from string using a different locale. - * - * @param string $interval interval string in the given language (may also contain English). - * @param string|null $locale if locale is null or not specified, current global locale will be used instead. - * - * @return static - */ - public static function parseFromLocale(string $interval, ?string $locale = null): static - { - return static::fromString(Carbon::translateTimeString($interval, $locale ?: static::getLocale(), CarbonInterface::DEFAULT_LOCALE)); - } - - /** - * Create an interval from the difference between 2 dates. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $start - * @param \Carbon\Carbon|\DateTimeInterface|mixed $end - * - * @return static - */ - public static function diff($start, $end = null, bool $absolute = false, array $skip = []): static - { - $start = $start instanceof CarbonInterface ? $start : Carbon::make($start); - $end = $end instanceof CarbonInterface ? $end : Carbon::make($end); - $rawInterval = $start->diffAsDateInterval($end, $absolute); - $interval = static::instance($rawInterval, $skip); - - $interval->absolute = $absolute; - $interval->rawInterval = $rawInterval; - $interval->startDate = $start; - $interval->endDate = $end; - $interval->initialValues = $interval->getInnerValues(); - - return $interval; - } - - /** - * Invert the interval if it's inverted. - * - * @param bool $absolute do nothing if set to false - * - * @return $this - */ - public function abs(bool $absolute = false): static - { - if ($absolute && $this->invert) { - $this->invert(); - } - - return $this; - } - - /** - * @alias abs - * - * Invert the interval if it's inverted. - * - * @param bool $absolute do nothing if set to false - * - * @return $this - */ - public function absolute(bool $absolute = true): static - { - return $this->abs($absolute); - } - - /** - * Cast the current instance into the given class. - * - * @template T of DateInterval - * - * @psalm-param class-string $className The $className::instance() method will be called to cast the current object. - * - * @return T - */ - public function cast(string $className): mixed - { - return self::castIntervalToClass($this, $className); - } - - /** - * Create a CarbonInterval instance from a DateInterval one. Can not instance - * DateInterval objects created from DateTime::diff() as you can't externally - * set the $days field. - * - * @param DateInterval $interval - * @param bool $skipCopy set to true to return the passed object - * (without copying it) if it's already of the - * current class - * - * @return static - */ - public static function instance(DateInterval $interval, array $skip = [], bool $skipCopy = false): static - { - if ($skipCopy && $interval instanceof static) { - return $interval; - } - - return self::castIntervalToClass($interval, static::class, $skip); - } - - /** - * Make a CarbonInterval instance from given variable if possible. - * - * Always return a new instance. Parse only strings and only these likely to be intervals (skip dates - * and recurrences). Throw an exception for invalid format, but otherwise return null. - * - * @param mixed|int|DateInterval|string|Closure|Unit|null $interval interval or number of the given $unit - * @param Unit|string|null $unit if specified, $interval must be an integer - * @param bool $skipCopy set to true to return the passed object - * (without copying it) if it's already of the - * current class - * - * @return static|null - */ - public static function make($interval, $unit = null, bool $skipCopy = false): ?self - { - if ($interval instanceof Unit) { - $interval = $interval->interval(); - } - - if ($unit instanceof Unit) { - $unit = $unit->value; - } - - if ($unit) { - $interval = "$interval $unit"; - } - - if ($interval instanceof DateInterval) { - return static::instance($interval, [], $skipCopy); - } - - if ($interval instanceof Closure) { - return self::withOriginal(new static($interval), $interval); - } - - if (!\is_string($interval)) { - return null; - } - - return static::makeFromString($interval); - } - - protected static function makeFromString(string $interval): ?self - { - $interval = preg_replace('/\s+/', ' ', trim($interval)); - - if (preg_match('/^P[T\d]/', $interval)) { - return new static($interval); - } - - if (preg_match('/^(?:\h*-?\d+(?:\.\d+)?\h*[a-z]+)+$/i', $interval)) { - return static::fromString($interval); - } - - $intervalInstance = static::createFromDateString($interval); - - return $intervalInstance->isEmpty() ? null : $intervalInstance; - } - - protected function resolveInterval($interval): ?self - { - if (!($interval instanceof self)) { - return self::make($interval); - } - - return $interval; - } - - /** - * Sets up a DateInterval from the relative parts of the string. - * - * @param string $datetime - * - * @return static - * - * @link https://php.net/manual/en/dateinterval.createfromdatestring.php - */ - public static function createFromDateString(string $datetime): static - { - $string = strtr($datetime, [ - ',' => ' ', - ' and ' => ' ', - ]); - $previousException = null; - - try { - $interval = parent::createFromDateString($string); - } catch (Throwable $exception) { - $interval = null; - $previousException = $exception; - } - - $interval ?: throw new InvalidFormatException( - 'Could not create interval from: '.var_export($datetime, true), - previous: $previousException, - ); - - if (!($interval instanceof static)) { - $interval = static::instance($interval); - } - - return self::withOriginal($interval, $datetime); - } - - /////////////////////////////////////////////////////////////////// - ///////////////////////// GETTERS AND SETTERS ///////////////////// - /////////////////////////////////////////////////////////////////// - - /** - * Get a part of the CarbonInterval object. - */ - public function get(Unit|string $name): int|float|string|null - { - $name = Unit::toName($name); - - if (str_starts_with($name, 'total')) { - return $this->total(substr($name, 5)); - } - - $resolvedUnit = Carbon::singularUnit(rtrim($name, 'z')); - - return match ($resolvedUnit) { - 'tzname', 'tz_name' => match (true) { - ($this->timezoneSetting === null) => null, - \is_string($this->timezoneSetting) => $this->timezoneSetting, - ($this->timezoneSetting instanceof DateTimeZone) => $this->timezoneSetting->getName(), - default => CarbonTimeZone::instance($this->timezoneSetting)->getName(), - }, - 'year' => $this->y, - 'month' => $this->m, - 'day' => $this->d, - 'hour' => $this->h, - 'minute' => $this->i, - 'second' => $this->s, - 'milli', 'millisecond' => (int) (round($this->f * Carbon::MICROSECONDS_PER_SECOND) / - Carbon::MICROSECONDS_PER_MILLISECOND), - 'micro', 'microsecond' => (int) round($this->f * Carbon::MICROSECONDS_PER_SECOND), - 'microexcludemilli' => (int) round($this->f * Carbon::MICROSECONDS_PER_SECOND) % - Carbon::MICROSECONDS_PER_MILLISECOND, - 'week' => (int) ($this->d / (int) static::getDaysPerWeek()), - 'daysexcludeweek', 'dayzexcludeweek' => $this->d % (int) static::getDaysPerWeek(), - 'locale' => $this->getTranslatorLocale(), - default => throw new UnknownGetterException($name, previous: new UnknownGetterException($resolvedUnit)), - }; - } - - /** - * Get a part of the CarbonInterval object. - */ - public function __get(string $name): int|float|string|null - { - return $this->get($name); - } - - /** - * Set a part of the CarbonInterval object. - * - * @param Unit|string|array $name - * @param int $value - * - * @throws UnknownSetterException - * - * @return $this - */ - public function set($name, $value = null): static - { - $properties = \is_array($name) ? $name : [$name => $value]; - - foreach ($properties as $key => $value) { - switch (Carbon::singularUnit($key instanceof Unit ? $key->value : rtrim((string) $key, 'z'))) { - case 'year': - $this->checkIntegerValue($key, $value); - $this->y = $value; - $this->handleDecimalPart('year', $value, $this->y); - - break; - - case 'month': - $this->checkIntegerValue($key, $value); - $this->m = $value; - $this->handleDecimalPart('month', $value, $this->m); - - break; - - case 'week': - $this->checkIntegerValue($key, $value); - $days = $value * (int) static::getDaysPerWeek(); - $this->assertSafeForInteger('days total (including weeks)', $days); - $this->d = $days; - $this->handleDecimalPart('day', $days, $this->d); - - break; - - case 'day': - if ($value === false) { - break; - } - - $this->checkIntegerValue($key, $value); - $this->d = $value; - $this->handleDecimalPart('day', $value, $this->d); - - break; - - case 'daysexcludeweek': - case 'dayzexcludeweek': - $this->checkIntegerValue($key, $value); - $days = $this->weeks * (int) static::getDaysPerWeek() + $value; - $this->assertSafeForInteger('days total (including weeks)', $days); - $this->d = $days; - $this->handleDecimalPart('day', $days, $this->d); - - break; - - case 'hour': - $this->checkIntegerValue($key, $value); - $this->h = $value; - $this->handleDecimalPart('hour', $value, $this->h); - - break; - - case 'minute': - $this->checkIntegerValue($key, $value); - $this->i = $value; - $this->handleDecimalPart('minute', $value, $this->i); - - break; - - case 'second': - $this->checkIntegerValue($key, $value); - $this->s = $value; - $this->handleDecimalPart('second', $value, $this->s); - - break; - - case 'milli': - case 'millisecond': - $this->microseconds = $value * Carbon::MICROSECONDS_PER_MILLISECOND + $this->microseconds % Carbon::MICROSECONDS_PER_MILLISECOND; - - break; - - case 'micro': - case 'microsecond': - $this->f = $value / Carbon::MICROSECONDS_PER_SECOND; - - break; - - default: - if (str_starts_with($key, ' * ')) { - return $this->setSetting(substr($key, 3), $value); - } - - if ($this->localStrictModeEnabled ?? Carbon::isStrictModeEnabled()) { - throw new UnknownSetterException($key); - } - - $this->$key = $value; - } - } - - return $this; - } - - /** - * Set a part of the CarbonInterval object. - * - * @param string $name - * @param int $value - * - * @throws UnknownSetterException - */ - public function __set(string $name, $value) - { - $this->set($name, $value); - } - - /** - * Allow setting of weeks and days to be cumulative. - * - * @param int $weeks Number of weeks to set - * @param int $days Number of days to set - * - * @return static - */ - public function weeksAndDays(int $weeks, int $days): static - { - $this->dayz = ($weeks * static::getDaysPerWeek()) + $days; - - return $this; - } - - /** - * Returns true if the interval is empty for each unit. - * - * @return bool - */ - public function isEmpty(): bool - { - return $this->years === 0 && - $this->months === 0 && - $this->dayz === 0 && - !$this->days && - $this->hours === 0 && - $this->minutes === 0 && - $this->seconds === 0 && - $this->microseconds === 0; - } - - /** - * Register a custom macro. - * - * Pass null macro to remove it. - * - * @example - * ``` - * CarbonInterval::macro('twice', function () { - * return $this->times(2); - * }); - * echo CarbonInterval::hours(2)->twice(); - * ``` - */ - public static function macro(string $name, ?callable $macro): void - { - static::$macros[$name] = $macro; - } - - /** - * Register macros from a mixin object. - * - * @example - * ``` - * CarbonInterval::mixin(new class { - * public function daysToHours() { - * return function () { - * $this->hours += $this->days; - * $this->days = 0; - * - * return $this; - * }; - * } - * public function hoursToDays() { - * return function () { - * $this->days += $this->hours; - * $this->hours = 0; - * - * return $this; - * }; - * } - * }); - * echo CarbonInterval::hours(5)->hoursToDays() . "\n"; - * echo CarbonInterval::days(5)->daysToHours() . "\n"; - * ``` - * - * @param object|string $mixin - * - * @throws ReflectionException - * - * @return void - */ - public static function mixin($mixin): void - { - static::baseMixin($mixin); - } - - /** - * Check if macro is registered. - * - * @param string $name - * - * @return bool - */ - public static function hasMacro(string $name): bool - { - return isset(static::$macros[$name]); - } - - /** - * Call given macro. - * - * @param string $name - * @param array $parameters - * - * @return mixed - */ - protected function callMacro(string $name, array $parameters) - { - $macro = static::$macros[$name]; - - if ($macro instanceof Closure) { - $boundMacro = @$macro->bindTo($this, static::class) ?: @$macro->bindTo(null, static::class); - - return ($boundMacro ?: $macro)(...$parameters); - } - - return $macro(...$parameters); - } - - /** - * Allow fluent calls on the setters... CarbonInterval::years(3)->months(5)->day(). - * - * Note: This is done using the magic method to allow static and instance methods to - * have the same names. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @throws BadFluentSetterException|Throwable - * - * @return static|int|float|string - */ - public function __call(string $method, array $parameters) - { - if (static::hasMacro($method)) { - return static::bindMacroContext($this, function () use (&$method, &$parameters) { - return $this->callMacro($method, $parameters); - }); - } - - $roundedValue = $this->callRoundMethod($method, $parameters); - - if ($roundedValue !== null) { - return $roundedValue; - } - - if (preg_match('/^(?add|sub)(?[A-Z].*)$/', $method, $match)) { - $value = $this->getMagicParameter($parameters, 0, Carbon::pluralUnit($match['unit']), 0); - - return $this->{$match['method']}($value, $match['unit']); - } - - $value = $this->getMagicParameter($parameters, 0, Carbon::pluralUnit($method), 1); - - try { - $this->set($method, $value); - } catch (UnknownSetterException $exception) { - if ($this->localStrictModeEnabled ?? Carbon::isStrictModeEnabled()) { - throw new BadFluentSetterException($method, 0, $exception); - } - } - - return $this; - } - - protected function getForHumansInitialVariables($syntax, $short): array - { - if (\is_array($syntax)) { - return $syntax; - } - - if (\is_int($short)) { - return [ - 'parts' => $short, - 'short' => false, - ]; - } - - if (\is_bool($syntax)) { - return [ - 'short' => $syntax, - 'syntax' => CarbonInterface::DIFF_ABSOLUTE, - ]; - } - - return []; - } - - /** - * @param mixed $syntax - * @param mixed $short - * @param mixed $parts - * @param mixed $options - * - * @return array - */ - protected function getForHumansParameters($syntax = null, $short = false, $parts = self::NO_LIMIT, $options = null): array - { - $optionalSpace = ' '; - $default = $this->getTranslationMessage('list.0') ?? $this->getTranslationMessage('list') ?? ' '; - /** @var bool|string $join */ - $join = $default === '' ? '' : ' '; - /** @var bool|array|string $altNumbers */ - $altNumbers = false; - $aUnit = false; - $minimumUnit = 's'; - $skip = []; - extract($this->getForHumansInitialVariables($syntax, $short)); - $skip = array_map( - static fn ($unit) => $unit instanceof Unit ? $unit->value : $unit, - (array) $skip, - ); - $skip = array_map( - 'strtolower', - array_filter($skip, static fn ($unit) => \is_string($unit) && $unit !== ''), - ); - - $syntax ??= CarbonInterface::DIFF_ABSOLUTE; - - if ($parts === self::NO_LIMIT) { - $parts = INF; - } - - $options ??= static::getHumanDiffOptions(); - - if ($join === false) { - $join = ' '; - } elseif ($join === true) { - $join = [ - $default, - $this->getTranslationMessage('list.1') ?? $default, - ]; - } - - if ($altNumbers && $altNumbers !== true) { - $language = new Language($this->locale); - $altNumbers = \in_array($language->getCode(), (array) $altNumbers, true); - } - - if (\is_array($join)) { - [$default, $last] = $join; - - if ($default !== ' ') { - $optionalSpace = ''; - } - - $join = function ($list) use ($default, $last) { - if (\count($list) < 2) { - return implode('', $list); - } - - $end = array_pop($list); - - return implode($default, $list).$last.$end; - }; - } - - if (\is_string($join)) { - if ($join !== ' ') { - $optionalSpace = ''; - } - - $glue = $join; - $join = static fn ($list) => implode($glue, $list); - } - - $interpolations = [ - ':optional-space' => $optionalSpace, - ]; - - $translator ??= isset($locale) ? Translator::get($locale) : null; - - return [$syntax, $short, $parts, $options, $join, $aUnit, $altNumbers, $interpolations, $minimumUnit, $skip, $translator]; - } - - protected static function getRoundingMethodFromOptions(int $options): ?string - { - if ($options & CarbonInterface::ROUND) { - return 'round'; - } - - if ($options & CarbonInterface::CEIL) { - return 'ceil'; - } - - if ($options & CarbonInterface::FLOOR) { - return 'floor'; - } - - return null; - } - - /** - * Returns interval values as an array where key are the unit names and values the counts. - * - * @return int[] - */ - public function toArray(): array - { - return [ - 'years' => $this->years, - 'months' => $this->months, - 'weeks' => $this->weeks, - 'days' => $this->daysExcludeWeeks, - 'hours' => $this->hours, - 'minutes' => $this->minutes, - 'seconds' => $this->seconds, - 'microseconds' => $this->microseconds, - ]; - } - - /** - * Returns interval non-zero values as an array where key are the unit names and values the counts. - * - * @return int[] - */ - public function getNonZeroValues(): array - { - return array_filter($this->toArray(), 'intval'); - } - - /** - * Returns interval values as an array where key are the unit names and values the counts - * from the biggest non-zero one the the smallest non-zero one. - * - * @return int[] - */ - public function getValuesSequence(): array - { - $nonZeroValues = $this->getNonZeroValues(); - - if ($nonZeroValues === []) { - return []; - } - - $keys = array_keys($nonZeroValues); - $firstKey = $keys[0]; - $lastKey = $keys[\count($keys) - 1]; - $values = []; - $record = false; - - foreach ($this->toArray() as $unit => $count) { - if ($unit === $firstKey) { - $record = true; - } - - if ($record) { - $values[$unit] = $count; - } - - if ($unit === $lastKey) { - $record = false; - } - } - - return $values; - } - - /** - * Get the current interval in a human readable format in the current locale. - * - * @example - * ``` - * echo CarbonInterval::fromString('4d 3h 40m')->forHumans() . "\n"; - * echo CarbonInterval::fromString('4d 3h 40m')->forHumans(['parts' => 2]) . "\n"; - * echo CarbonInterval::fromString('4d 3h 40m')->forHumans(['parts' => 3, 'join' => true]) . "\n"; - * echo CarbonInterval::fromString('4d 3h 40m')->forHumans(['short' => true]) . "\n"; - * echo CarbonInterval::fromString('1d 24h')->forHumans(['join' => ' or ']) . "\n"; - * echo CarbonInterval::fromString('1d 24h')->forHumans(['minimumUnit' => 'hour']) . "\n"; - * ``` - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contain: - * ⦿ 'syntax' entry (see below) - * ⦿ 'short' entry (see below) - * ⦿ 'parts' entry (see below) - * ⦿ 'options' entry (see below) - * ⦿ 'skip' entry, list of units to skip (array of strings or a single string, - * ` it can be the unit name (singular or plural) or its shortcut - * ` (y, m, w, d, h, min, s, ms, µs). - * ⦿ 'aUnit' entry, prefer "an hour" over "1 hour" if true - * ⦿ 'altNumbers' entry, use alternative numbers if available - * ` (from the current language if true is passed, from the given language(s) - * ` if array or string is passed) - * ⦿ 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * ⦿ 'minimumUnit' entry determines the smallest unit of time to display can be long or - * ` short form of the units, e.g. 'hour' or 'h' (default value: s) - * ⦿ 'locale' language in which the diff should be output (has no effect if 'translator' key is set) - * ⦿ 'translator' a custom translator to use to translator the output. - * if int passed, it adds modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: -1: no limits) - * @param int $options human diff options - * - * @throws Exception - * - * @return string - */ - public function forHumans($syntax = null, $short = false, $parts = self::NO_LIMIT, $options = null): string - { - /* @var TranslatorInterface|null $translator */ - [$syntax, $short, $parts, $options, $join, $aUnit, $altNumbers, $interpolations, $minimumUnit, $skip, $translator] = $this - ->getForHumansParameters($syntax, $short, $parts, $options); - - $interval = []; - - $syntax = (int) ($syntax ?? CarbonInterface::DIFF_ABSOLUTE); - $absolute = $syntax === CarbonInterface::DIFF_ABSOLUTE; - $relativeToNow = $syntax === CarbonInterface::DIFF_RELATIVE_TO_NOW; - $count = 1; - $unit = $short ? 's' : 'second'; - $isFuture = $this->invert === 1; - $transId = $relativeToNow ? ($isFuture ? 'from_now' : 'ago') : ($isFuture ? 'after' : 'before'); - $declensionMode = null; - - $translator ??= $this->getLocalTranslator(); - - $handleDeclensions = function ($unit, $count, $index = 0, $parts = 1) use ($interpolations, $transId, $translator, $altNumbers, $absolute, &$declensionMode) { - if (!$absolute) { - $declensionMode = $declensionMode ?? $this->translate($transId.'_mode'); - - if ($this->needsDeclension($declensionMode, $index, $parts)) { - // Some languages have special pluralization for past and future tense. - $key = $unit.'_'.$transId; - $result = $this->translate($key, $interpolations, $count, $translator, $altNumbers); - - if ($result !== $key) { - return $result; - } - } - } - - $result = $this->translate($unit, $interpolations, $count, $translator, $altNumbers); - - if ($result !== $unit) { - return $result; - } - - return null; - }; - - $intervalValues = $this; - $method = static::getRoundingMethodFromOptions($options); - - if ($method) { - $previousCount = INF; - - while ( - \count($intervalValues->getNonZeroValues()) > $parts && - ($count = \count($keys = array_keys($intervalValues->getValuesSequence()))) > 1 - ) { - $index = min($count, $previousCount - 1) - 2; - - if ($index < 0) { - break; - } - - $intervalValues = $this->copy()->roundUnit( - $keys[$index], - 1, - $method, - ); - $previousCount = $count; - } - } - - $diffIntervalArray = [ - ['value' => $intervalValues->years, 'unit' => 'year', 'unitShort' => 'y'], - ['value' => $intervalValues->months, 'unit' => 'month', 'unitShort' => 'm'], - ['value' => $intervalValues->weeks, 'unit' => 'week', 'unitShort' => 'w'], - ['value' => $intervalValues->daysExcludeWeeks, 'unit' => 'day', 'unitShort' => 'd'], - ['value' => $intervalValues->hours, 'unit' => 'hour', 'unitShort' => 'h'], - ['value' => $intervalValues->minutes, 'unit' => 'minute', 'unitShort' => 'min'], - ['value' => $intervalValues->seconds, 'unit' => 'second', 'unitShort' => 's'], - ['value' => $intervalValues->milliseconds, 'unit' => 'millisecond', 'unitShort' => 'ms'], - ['value' => $intervalValues->microExcludeMilli, 'unit' => 'microsecond', 'unitShort' => 'µs'], - ]; - - if (!empty($skip)) { - foreach ($diffIntervalArray as $index => &$unitData) { - $nextIndex = $index + 1; - - if ($unitData['value'] && - isset($diffIntervalArray[$nextIndex]) && - \count(array_intersect([$unitData['unit'], $unitData['unit'].'s', $unitData['unitShort']], $skip)) - ) { - $diffIntervalArray[$nextIndex]['value'] += $unitData['value'] * - self::getFactorWithDefault($diffIntervalArray[$nextIndex]['unit'], $unitData['unit']); - $unitData['value'] = 0; - } - } - } - - $transChoice = function ($short, $unitData, $index, $parts) use ($absolute, $handleDeclensions, $translator, $aUnit, $altNumbers, $interpolations) { - $count = $unitData['value']; - - if ($short) { - $result = $handleDeclensions($unitData['unitShort'], $count, $index, $parts); - - if ($result !== null) { - return $result; - } - } elseif ($aUnit) { - $result = $handleDeclensions('a_'.$unitData['unit'], $count, $index, $parts); - - if ($result !== null) { - return $result; - } - } - - if (!$absolute) { - return $handleDeclensions($unitData['unit'], $count, $index, $parts); - } - - return $this->translate($unitData['unit'], $interpolations, $count, $translator, $altNumbers); - }; - - $fallbackUnit = ['second', 's']; - - foreach ($diffIntervalArray as $diffIntervalData) { - if ($diffIntervalData['value'] > 0) { - $unit = $short ? $diffIntervalData['unitShort'] : $diffIntervalData['unit']; - $count = $diffIntervalData['value']; - $interval[] = [$short, $diffIntervalData]; - } elseif ($options & CarbonInterface::SEQUENTIAL_PARTS_ONLY && \count($interval) > 0) { - break; - } - - // break the loop after we get the required number of parts in array - if (\count($interval) >= $parts) { - break; - } - - // break the loop after we have reached the minimum unit - if (\in_array($minimumUnit, [$diffIntervalData['unit'], $diffIntervalData['unitShort']], true)) { - $fallbackUnit = [$diffIntervalData['unit'], $diffIntervalData['unitShort']]; - - break; - } - } - - $actualParts = \count($interval); - - foreach ($interval as $index => &$item) { - $item = $transChoice($item[0], $item[1], $index, $actualParts); - } - - if (\count($interval) === 0) { - if ($relativeToNow && $options & CarbonInterface::JUST_NOW) { - $key = 'diff_now'; - $translation = $this->translate($key, $interpolations, null, $translator); - - if ($translation !== $key) { - return $translation; - } - } - - $count = $options & CarbonInterface::NO_ZERO_DIFF ? 1 : 0; - $unit = $fallbackUnit[$short ? 1 : 0]; - $interval[] = $this->translate($unit, $interpolations, $count, $translator, $altNumbers); - } - - // join the interval parts by a space - $time = $join($interval); - - unset($diffIntervalArray, $interval); - - if ($absolute) { - return $time; - } - - $isFuture = $this->invert === 1; - - $transId = $relativeToNow ? ($isFuture ? 'from_now' : 'ago') : ($isFuture ? 'after' : 'before'); - - if ($parts === 1) { - if ($relativeToNow && $unit === 'day') { - $specialTranslations = static::SPECIAL_TRANSLATIONS[$count] ?? null; - - if ($specialTranslations && $options & $specialTranslations['option']) { - $key = $specialTranslations[$isFuture ? 'future' : 'past']; - $translation = $this->translate($key, $interpolations, null, $translator); - - if ($translation !== $key) { - return $translation; - } - } - } - - $aTime = $aUnit ? $handleDeclensions('a_'.$unit, $count) : null; - - $time = $aTime ?: $handleDeclensions($unit, $count) ?: $time; - } - - $time = [':time' => $time]; - - return $this->translate($transId, array_merge($time, $interpolations, $time), null, $translator); - } - - public function format(string $format): string - { - $output = parent::format($format); - - if (!str_contains($format, '%a') || !isset($this->startDate, $this->endDate)) { - return $output; - } - - $this->rawInterval ??= $this->startDate->diffAsDateInterval($this->endDate); - - return str_replace('(unknown)', $this->rawInterval->format('%a'), $output); - } - - /** - * Format the instance as a string using the forHumans() function. - * - * @throws Exception - * - * @return string - */ - public function __toString(): string - { - $format = $this->localToStringFormat - ?? $this->getFactory()->getSettings()['toStringFormat'] - ?? null; - - if (!$format) { - return $this->forHumans(); - } - - if ($format instanceof Closure) { - return $format($this); - } - - return $this->format($format); - } - - /** - * Return native DateInterval PHP object matching the current instance. - * - * @example - * ``` - * var_dump(CarbonInterval::hours(2)->toDateInterval()); - * ``` - * - * @return DateInterval - */ - public function toDateInterval(): DateInterval - { - return self::castIntervalToClass($this, DateInterval::class); - } - - /** - * Convert the interval to a CarbonPeriod. - * - * @param DateTimeInterface|string|int ...$params Start date, [end date or recurrences] and optional settings. - * - * @return CarbonPeriod - */ - public function toPeriod(...$params): CarbonPeriod - { - if ($this->timezoneSetting) { - $timeZone = \is_string($this->timezoneSetting) - ? new DateTimeZone($this->timezoneSetting) - : $this->timezoneSetting; - - if ($timeZone instanceof DateTimeZone) { - array_unshift($params, $timeZone); - } - } - - $class = ($params[0] ?? null) instanceof DateTime ? CarbonPeriod::class : CarbonPeriodImmutable::class; - - return $class::create($this, ...$params); - } - - /** - * Decompose the current interval into - * - * @param mixed|int|DateInterval|string|Closure|Unit|null $interval interval or number of the given $unit - * @param Unit|string|null $unit if specified, $interval must be an integer - * - * @return CarbonPeriod - */ - public function stepBy($interval, Unit|string|null $unit = null): CarbonPeriod - { - $this->checkStartAndEnd(); - $start = $this->startDate ?? CarbonImmutable::make('now'); - $end = $this->endDate ?? $start->copy()->add($this); - - try { - $step = static::make($interval, $unit); - } catch (InvalidFormatException $exception) { - if ($unit || (\is_string($interval) ? preg_match('/(\s|\d)/', $interval) : !($interval instanceof Unit))) { - throw $exception; - } - - $step = static::make(1, $interval); - } - - $class = $start instanceof DateTime ? CarbonPeriod::class : CarbonPeriodImmutable::class; - - return $class::create($step, $start, $end); - } - - /** - * Invert the interval. - * - * @param bool|int $inverted if a parameter is passed, the passed value cast as 1 or 0 is used - * as the new value of the ->invert property. - * - * @return $this - */ - public function invert($inverted = null): static - { - $this->invert = (\func_num_args() === 0 ? !$this->invert : $inverted) ? 1 : 0; - - return $this; - } - - protected function solveNegativeInterval(): static - { - if (!$this->isEmpty() && $this->years <= 0 && $this->months <= 0 && $this->dayz <= 0 && $this->hours <= 0 && $this->minutes <= 0 && $this->seconds <= 0 && $this->microseconds <= 0) { - $this->years *= self::NEGATIVE; - $this->months *= self::NEGATIVE; - $this->dayz *= self::NEGATIVE; - $this->hours *= self::NEGATIVE; - $this->minutes *= self::NEGATIVE; - $this->seconds *= self::NEGATIVE; - $this->microseconds *= self::NEGATIVE; - $this->invert(); - } - - return $this; - } - - /** - * Add the passed interval to the current instance. - * - * @param string|DateInterval $unit - * @param int|float $value - * - * @return $this - */ - public function add($unit, $value = 1): static - { - if (is_numeric($unit)) { - [$value, $unit] = [$unit, $value]; - } - - if (\is_string($unit) && !preg_match('/^\s*-?\d/', $unit)) { - $unit = "$value $unit"; - $value = 1; - } - - $interval = static::make($unit); - - if (!$interval) { - throw new InvalidIntervalException('This type of data cannot be added/subtracted.'); - } - - if ($value !== 1) { - $interval->times($value); - } - - $sign = ($this->invert === 1) !== ($interval->invert === 1) ? self::NEGATIVE : self::POSITIVE; - $this->years += $interval->y * $sign; - $this->months += $interval->m * $sign; - $this->dayz += ($interval->days === false ? $interval->d : $interval->days) * $sign; - $this->hours += $interval->h * $sign; - $this->minutes += $interval->i * $sign; - $this->seconds += $interval->s * $sign; - $this->microseconds += $interval->microseconds * $sign; - - $this->solveNegativeInterval(); - - return $this; - } - - /** - * Subtract the passed interval to the current instance. - * - * @param string|DateInterval $unit - * @param int|float $value - * - * @return $this - */ - public function sub($unit, $value = 1): static - { - if (is_numeric($unit)) { - [$value, $unit] = [$unit, $value]; - } - - return $this->add($unit, -(float) $value); - } - - /** - * Subtract the passed interval to the current instance. - * - * @param string|DateInterval $unit - * @param int|float $value - * - * @return $this - */ - public function subtract($unit, $value = 1): static - { - return $this->sub($unit, $value); - } - - /** - * Add given parameters to the current interval. - * - * @param int $years - * @param int $months - * @param int|float $weeks - * @param int|float $days - * @param int|float $hours - * @param int|float $minutes - * @param int|float $seconds - * @param int|float $microseconds - * - * @return $this - */ - public function plus( - $years = 0, - $months = 0, - $weeks = 0, - $days = 0, - $hours = 0, - $minutes = 0, - $seconds = 0, - $microseconds = 0 - ): static { - return $this->add(" - $years years $months months $weeks weeks $days days - $hours hours $minutes minutes $seconds seconds $microseconds microseconds - "); - } - - /** - * Add given parameters to the current interval. - * - * @param int $years - * @param int $months - * @param int|float $weeks - * @param int|float $days - * @param int|float $hours - * @param int|float $minutes - * @param int|float $seconds - * @param int|float $microseconds - * - * @return $this - */ - public function minus( - $years = 0, - $months = 0, - $weeks = 0, - $days = 0, - $hours = 0, - $minutes = 0, - $seconds = 0, - $microseconds = 0 - ): static { - return $this->sub(" - $years years $months months $weeks weeks $days days - $hours hours $minutes minutes $seconds seconds $microseconds microseconds - "); - } - - /** - * Multiply current instance given number of times. times() is naive, it multiplies each unit - * (so day can be greater than 31, hour can be greater than 23, etc.) and the result is rounded - * separately for each unit. - * - * Use times() when you want a fast and approximated calculation that does not cascade units. - * - * For a precise and cascaded calculation, - * - * @see multiply() - * - * @param float|int $factor - * - * @return $this - */ - public function times($factor): static - { - if ($factor < 0) { - $this->invert = $this->invert ? 0 : 1; - $factor = -$factor; - } - - $this->years = (int) round($this->years * $factor); - $this->months = (int) round($this->months * $factor); - $this->dayz = (int) round($this->dayz * $factor); - $this->hours = (int) round($this->hours * $factor); - $this->minutes = (int) round($this->minutes * $factor); - $this->seconds = (int) round($this->seconds * $factor); - $this->microseconds = (int) round($this->microseconds * $factor); - - return $this; - } - - /** - * Divide current instance by a given divider. shares() is naive, it divides each unit separately - * and the result is rounded for each unit. So 5 hours and 20 minutes shared by 3 becomes 2 hours - * and 7 minutes. - * - * Use shares() when you want a fast and approximated calculation that does not cascade units. - * - * For a precise and cascaded calculation, - * - * @see divide() - * - * @param float|int $divider - * - * @return $this - */ - public function shares($divider): static - { - return $this->times(1 / $divider); - } - - protected function copyProperties(self $interval, $ignoreSign = false): static - { - $this->years = $interval->years; - $this->months = $interval->months; - $this->dayz = $interval->dayz; - $this->hours = $interval->hours; - $this->minutes = $interval->minutes; - $this->seconds = $interval->seconds; - $this->microseconds = $interval->microseconds; - - if (!$ignoreSign) { - $this->invert = $interval->invert; - } - - return $this; - } - - /** - * Multiply and cascade current instance by a given factor. - * - * @param float|int $factor - * - * @return $this - */ - public function multiply($factor): static - { - if ($factor < 0) { - $this->invert = $this->invert ? 0 : 1; - $factor = -$factor; - } - - $yearPart = (int) floor($this->years * $factor); // Split calculation to prevent imprecision - - if ($yearPart) { - $this->years -= $yearPart / $factor; - } - - return $this->copyProperties( - static::create($yearPart) - ->microseconds(abs($this->totalMicroseconds) * $factor) - ->cascade(), - true, - ); - } - - /** - * Divide and cascade current instance by a given divider. - * - * @param float|int $divider - * - * @return $this - */ - public function divide($divider): static - { - return $this->multiply(1 / $divider); - } - - /** - * Get the interval_spec string of a date interval. - * - * @param DateInterval $interval - * - * @return string - */ - public static function getDateIntervalSpec(DateInterval $interval, bool $microseconds = false, array $skip = []): string - { - $date = array_filter([ - static::PERIOD_YEARS => abs($interval->y), - static::PERIOD_MONTHS => abs($interval->m), - static::PERIOD_DAYS => abs($interval->d), - ]); - - $skip = array_map([Unit::class, 'toNameIfUnit'], $skip); - - if ( - $interval->days >= CarbonInterface::DAYS_PER_WEEK * CarbonInterface::WEEKS_PER_MONTH && - (!isset($date[static::PERIOD_YEARS]) || \count(array_intersect(['y', 'year', 'years'], $skip))) && - (!isset($date[static::PERIOD_MONTHS]) || \count(array_intersect(['m', 'month', 'months'], $skip))) - ) { - $date = [ - static::PERIOD_DAYS => abs($interval->days), - ]; - } - - $seconds = abs($interval->s); - if ($microseconds && $interval->f > 0) { - $seconds = \sprintf('%d.%06d', $seconds, abs($interval->f) * 1000000); - } - - $time = array_filter([ - static::PERIOD_HOURS => abs($interval->h), - static::PERIOD_MINUTES => abs($interval->i), - static::PERIOD_SECONDS => $seconds, - ]); - - $specString = static::PERIOD_PREFIX; - - foreach ($date as $key => $value) { - $specString .= $value.$key; - } - - if (\count($time) > 0) { - $specString .= static::PERIOD_TIME_PREFIX; - foreach ($time as $key => $value) { - $specString .= $value.$key; - } - } - - return $specString === static::PERIOD_PREFIX ? 'PT0S' : $specString; - } - - /** - * Get the interval_spec string. - * - * @return string - */ - public function spec(bool $microseconds = false): string - { - return static::getDateIntervalSpec($this, $microseconds); - } - - /** - * Comparing 2 date intervals. - * - * @param DateInterval $first - * @param DateInterval $second - * - * @return int 0, 1 or -1 - */ - public static function compareDateIntervals(DateInterval $first, DateInterval $second): int - { - $current = Carbon::now(); - $passed = $current->avoidMutation()->add($second); - $current->add($first); - - return $current <=> $passed; - } - - /** - * Comparing with passed interval. - * - * @param DateInterval $interval - * - * @return int 0, 1 or -1 - */ - public function compare(DateInterval $interval): int - { - return static::compareDateIntervals($this, $interval); - } - - /** - * Convert overflowed values into bigger units. - * - * @return $this - */ - public function cascade(): static - { - return $this->doCascade(false); - } - - public function hasNegativeValues(): bool - { - foreach ($this->toArray() as $value) { - if ($value < 0) { - return true; - } - } - - return false; - } - - public function hasPositiveValues(): bool - { - foreach ($this->toArray() as $value) { - if ($value > 0) { - return true; - } - } - - return false; - } - - /** - * Get amount of given unit equivalent to the interval. - * - * @param string $unit - * - * @throws UnknownUnitException|UnitNotConfiguredException - * - * @return float - */ - public function total(string $unit): float - { - $realUnit = $unit = strtolower($unit); - - if (\in_array($unit, ['days', 'weeks'])) { - $realUnit = 'dayz'; - } elseif (!\in_array($unit, ['microseconds', 'milliseconds', 'seconds', 'minutes', 'hours', 'dayz', 'months', 'years'])) { - throw new UnknownUnitException($unit); - } - - $this->checkStartAndEnd(); - - if ($this->startDate && $this->endDate) { - $diff = $this->startDate->diffInUnit($unit, $this->endDate); - - return $this->absolute ? abs($diff) : $diff; - } - - $result = 0; - $cumulativeFactor = 0; - $unitFound = false; - $factors = self::getFlipCascadeFactors(); - $daysPerWeek = (int) static::getDaysPerWeek(); - - $values = [ - 'years' => $this->years, - 'months' => $this->months, - 'weeks' => (int) ($this->d / $daysPerWeek), - 'dayz' => fmod($this->d, $daysPerWeek), - 'hours' => $this->hours, - 'minutes' => $this->minutes, - 'seconds' => $this->seconds, - 'milliseconds' => (int) ($this->microseconds / Carbon::MICROSECONDS_PER_MILLISECOND), - 'microseconds' => $this->microseconds % Carbon::MICROSECONDS_PER_MILLISECOND, - ]; - - if (isset($factors['dayz']) && $factors['dayz'][0] !== 'weeks') { - $values['dayz'] += $values['weeks'] * $daysPerWeek; - $values['weeks'] = 0; - } - - foreach ($factors as $source => [$target, $factor]) { - if ($source === $realUnit) { - $unitFound = true; - $value = $values[$source]; - $result += $value; - $cumulativeFactor = 1; - } - - if ($factor === false) { - if ($unitFound) { - break; - } - - $result = 0; - $cumulativeFactor = 0; - - continue; - } - - if ($target === $realUnit) { - $unitFound = true; - } - - if ($cumulativeFactor) { - $cumulativeFactor *= $factor; - $result += $values[$target] * $cumulativeFactor; - - continue; - } - - $value = $values[$source]; - - $result = ($result + $value) / $factor; - } - - if (isset($target) && !$cumulativeFactor) { - $result += $values[$target]; - } - - if (!$unitFound) { - throw new UnitNotConfiguredException($unit); - } - - if ($this->invert) { - $result *= self::NEGATIVE; - } - - if ($unit === 'weeks') { - $result /= $daysPerWeek; - } - - // Cast as int numbers with no decimal part - return fmod($result, 1) === 0.0 ? (int) $result : $result; - } - - /** - * Determines if the instance is equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see equalTo() - * - * @return bool - */ - public function eq($interval): bool - { - return $this->equalTo($interval); - } - - /** - * Determines if the instance is equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function equalTo($interval): bool - { - $interval = $this->resolveInterval($interval); - - if ($interval === null) { - return false; - } - - $step = $this->getStep(); - - if ($step) { - return $step === $interval->getStep(); - } - - if ($this->isEmpty()) { - return $interval->isEmpty(); - } - - $cascadedInterval = $this->copy()->cascade(); - $comparedInterval = $interval->copy()->cascade(); - - return $cascadedInterval->invert === $comparedInterval->invert && - $cascadedInterval->getNonZeroValues() === $comparedInterval->getNonZeroValues(); - } - - /** - * Determines if the instance is not equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see notEqualTo() - * - * @return bool - */ - public function ne($interval): bool - { - return $this->notEqualTo($interval); - } - - /** - * Determines if the instance is not equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function notEqualTo($interval): bool - { - return !$this->eq($interval); - } - - /** - * Determines if the instance is greater (longer) than another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see greaterThan() - * - * @return bool - */ - public function gt($interval): bool - { - return $this->greaterThan($interval); - } - - /** - * Determines if the instance is greater (longer) than another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function greaterThan($interval): bool - { - $interval = $this->resolveInterval($interval); - - return $interval === null || $this->totalMicroseconds > $interval->totalMicroseconds; - } - - /** - * Determines if the instance is greater (longer) than or equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see greaterThanOrEqualTo() - * - * @return bool - */ - public function gte($interval): bool - { - return $this->greaterThanOrEqualTo($interval); - } - - /** - * Determines if the instance is greater (longer) than or equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function greaterThanOrEqualTo($interval): bool - { - return $this->greaterThan($interval) || $this->equalTo($interval); - } - - /** - * Determines if the instance is less (shorter) than another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see lessThan() - * - * @return bool - */ - public function lt($interval): bool - { - return $this->lessThan($interval); - } - - /** - * Determines if the instance is less (shorter) than another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function lessThan($interval): bool - { - $interval = $this->resolveInterval($interval); - - return $interval !== null && $this->totalMicroseconds < $interval->totalMicroseconds; - } - - /** - * Determines if the instance is less (shorter) than or equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see lessThanOrEqualTo() - * - * @return bool - */ - public function lte($interval): bool - { - return $this->lessThanOrEqualTo($interval); - } - - /** - * Determines if the instance is less (shorter) than or equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function lessThanOrEqualTo($interval): bool - { - return $this->lessThan($interval) || $this->equalTo($interval); - } - - /** - * Determines if the instance is between two others. - * - * The third argument allow you to specify if bounds are included or not (true by default) - * but for when you including/excluding bounds may produce different results in your application, - * we recommend to use the explicit methods ->betweenIncluded() or ->betweenExcluded() instead. - * - * @example - * ``` - * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::days(3)); // true - * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::hours(36)); // false - * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::days(2)); // true - * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::days(2), false); // false - * ``` - * - * @param CarbonInterval|DateInterval|mixed $interval1 - * @param CarbonInterval|DateInterval|mixed $interval2 - * @param bool $equal Indicates if an equal to comparison should be done - * - * @return bool - */ - public function between($interval1, $interval2, bool $equal = true): bool - { - return $equal - ? $this->greaterThanOrEqualTo($interval1) && $this->lessThanOrEqualTo($interval2) - : $this->greaterThan($interval1) && $this->lessThan($interval2); - } - - /** - * Determines if the instance is between two others, bounds excluded. - * - * @example - * ``` - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(3)); // true - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::hours(36)); // false - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(2)); // true - * ``` - * - * @param CarbonInterval|DateInterval|mixed $interval1 - * @param CarbonInterval|DateInterval|mixed $interval2 - * - * @return bool - */ - public function betweenIncluded($interval1, $interval2): bool - { - return $this->between($interval1, $interval2, true); - } - - /** - * Determines if the instance is between two others, bounds excluded. - * - * @example - * ``` - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(3)); // true - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::hours(36)); // false - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(2)); // false - * ``` - * - * @param CarbonInterval|DateInterval|mixed $interval1 - * @param CarbonInterval|DateInterval|mixed $interval2 - * - * @return bool - */ - public function betweenExcluded($interval1, $interval2): bool - { - return $this->between($interval1, $interval2, false); - } - - /** - * Determines if the instance is between two others - * - * @example - * ``` - * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::days(3)); // true - * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::hours(36)); // false - * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::days(2)); // true - * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::days(2), false); // false - * ``` - * - * @param CarbonInterval|DateInterval|mixed $interval1 - * @param CarbonInterval|DateInterval|mixed $interval2 - * @param bool $equal Indicates if an equal to comparison should be done - * - * @return bool - */ - public function isBetween($interval1, $interval2, bool $equal = true): bool - { - return $this->between($interval1, $interval2, $equal); - } - - /** - * Round the current instance at the given unit with given precision if specified and the given function. - * - * @throws Exception - */ - public function roundUnit(string $unit, DateInterval|string|int|float $precision = 1, string $function = 'round'): static - { - if (static::getCascadeFactors() !== static::getDefaultCascadeFactors()) { - $value = $function($this->total($unit) / $precision) * $precision; - $inverted = $value < 0; - - return $this->copyProperties(self::fromString( - number_format(abs($value), 12, '.', '').' '.$unit - )->invert($inverted)->cascade()); - } - - $base = CarbonImmutable::parse('2000-01-01 00:00:00', 'UTC') - ->roundUnit($unit, $precision, $function); - $next = $base->add($this); - $inverted = $next < $base; - - if ($inverted) { - $next = $base->sub($this); - } - - $this->copyProperties( - $next - ->roundUnit($unit, $precision, $function) - ->diff($base), - ); - - return $this->invert($inverted); - } - - /** - * Truncate the current instance at the given unit with given precision if specified. - * - * @param string $unit - * @param float|int|string|DateInterval|null $precision - * - * @throws Exception - * - * @return $this - */ - public function floorUnit(string $unit, $precision = 1): static - { - return $this->roundUnit($unit, $precision, 'floor'); - } - - /** - * Ceil the current instance at the given unit with given precision if specified. - * - * @param string $unit - * @param float|int|string|DateInterval|null $precision - * - * @throws Exception - * - * @return $this - */ - public function ceilUnit(string $unit, $precision = 1): static - { - return $this->roundUnit($unit, $precision, 'ceil'); - } - - /** - * Round the current instance second with given precision if specified. - * - * @param float|int|string|DateInterval|null $precision - * @param string $function - * - * @throws Exception - * - * @return $this - */ - public function round($precision = 1, string $function = 'round'): static - { - return $this->roundWith($precision, $function); - } - - /** - * Round the current instance second with given precision if specified. - * - * @throws Exception - * - * @return $this - */ - public function floor(DateInterval|string|float|int $precision = 1): static - { - return $this->round($precision, 'floor'); - } - - /** - * Ceil the current instance second with given precision if specified. - * - * @throws Exception - * - * @return $this - */ - public function ceil(DateInterval|string|float|int $precision = 1): static - { - return $this->round($precision, 'ceil'); - } - - public function __unserialize(array $data): void - { - $properties = array_combine( - array_map( - static fn (mixed $key) => \is_string($key) - ? str_replace('tzName', 'timezoneSetting', $key) - : $key, - array_keys($data), - ), - $data, - ); - - if (method_exists(parent::class, '__unserialize')) { - // PHP >= 8.2 - parent::__unserialize($properties); - - return; - } - - // PHP <= 8.1 - // @codeCoverageIgnoreStart - foreach ($properties as $property => $value) { - $name = preg_replace('/^\0.+\0/', '', $property); - $localStrictMode = $this->localStrictModeEnabled; - $this->localStrictModeEnabled = false; - $this->$name = $value; - - if ($name !== 'localStrictModeEnabled') { - $this->localStrictModeEnabled = $localStrictMode; - } - } - // @codeCoverageIgnoreEnd - } - - /** - * @template T - * - * @param T $interval - * @param mixed $original - * - * @return T - */ - private static function withOriginal(mixed $interval, mixed $original): mixed - { - if ($interval instanceof self) { - $interval->originalInput = $original; - } - - return $interval; - } - - private static function standardizeUnit(string $unit): string - { - $unit = rtrim($unit, 'sz').'s'; - - return $unit === 'days' ? 'dayz' : $unit; - } - - private static function getFlipCascadeFactors(): array - { - if (!self::$flipCascadeFactors) { - self::$flipCascadeFactors = []; - - foreach (self::getCascadeFactors() as $to => [$factor, $from]) { - self::$flipCascadeFactors[self::standardizeUnit($from)] = [self::standardizeUnit($to), $factor]; - } - } - - return self::$flipCascadeFactors; - } - - /** - * @template T of DateInterval - * - * @param DateInterval $interval - * - * @psalm-param class-string $className - * - * @return T - */ - private static function castIntervalToClass(DateInterval $interval, string $className, array $skip = []): object - { - $mainClass = DateInterval::class; - - if (!is_a($className, $mainClass, true)) { - throw new InvalidCastException("$className is not a sub-class of $mainClass."); - } - - $microseconds = $interval->f; - $instance = new $className(static::getDateIntervalSpec($interval, false, $skip)); - - if ($instance instanceof self) { - $instance->originalInput = $interval; - } - - if ($microseconds) { - $instance->f = $microseconds; - } - - if ($interval instanceof self && is_a($className, self::class, true)) { - self::copyStep($interval, $instance); - } - - self::copyNegativeUnits($interval, $instance); - - return self::withOriginal($instance, $interval); - } - - private static function copyStep(self $from, self $to): void - { - $to->setStep($from->getStep()); - } - - private static function copyNegativeUnits(DateInterval $from, DateInterval $to): void - { - $to->invert = $from->invert; - - foreach (['y', 'm', 'd', 'h', 'i', 's'] as $unit) { - if ($from->$unit < 0) { - $to->$unit *= self::NEGATIVE; - } - } - } - - private function invertCascade(array $values): static - { - return $this->set(array_map(function ($value) { - return -$value; - }, $values))->doCascade(true)->invert(); - } - - private function doCascade(bool $deep): static - { - $originalData = $this->toArray(); - $originalData['milliseconds'] = (int) ($originalData['microseconds'] / static::getMicrosecondsPerMillisecond()); - $originalData['microseconds'] = $originalData['microseconds'] % static::getMicrosecondsPerMillisecond(); - $originalData['weeks'] = (int) ($this->d / static::getDaysPerWeek()); - $originalData['daysExcludeWeeks'] = fmod($this->d, static::getDaysPerWeek()); - unset($originalData['days']); - $newData = $originalData; - $previous = []; - - foreach (self::getFlipCascadeFactors() as $source => [$target, $factor]) { - foreach (['source', 'target'] as $key) { - if ($$key === 'dayz') { - $$key = 'daysExcludeWeeks'; - } - } - - $value = $newData[$source]; - $modulo = fmod($factor + fmod($value, $factor), $factor); - $newData[$source] = $modulo; - $newData[$target] += ($value - $modulo) / $factor; - - $decimalPart = fmod($newData[$source], 1); - - if ($decimalPart !== 0.0) { - $unit = $source; - - foreach ($previous as [$subUnit, $subFactor]) { - $newData[$unit] -= $decimalPart; - $newData[$subUnit] += $decimalPart * $subFactor; - $decimalPart = fmod($newData[$subUnit], 1); - - if ($decimalPart === 0.0) { - break; - } - - $unit = $subUnit; - } - } - - array_unshift($previous, [$source, $factor]); - } - - $positive = null; - - if (!$deep) { - foreach ($newData as $value) { - if ($value) { - if ($positive === null) { - $positive = ($value > 0); - - continue; - } - - if (($value > 0) !== $positive) { - return $this->invertCascade($originalData) - ->solveNegativeInterval(); - } - } - } - } - - return $this->set($newData) - ->solveNegativeInterval(); - } - - private function needsDeclension(string $mode, int $index, int $parts): bool - { - return match ($mode) { - 'last' => $index === $parts - 1, - default => true, - }; - } - - private function checkIntegerValue(string $name, mixed $value): void - { - if (\is_int($value)) { - return; - } - - $this->assertSafeForInteger($name, $value); - - if (\is_float($value) && (((float) (int) $value) === $value)) { - return; - } - - if (!self::$floatSettersEnabled) { - $type = \gettype($value); - @trigger_error( - "Since 2.70.0, it's deprecated to pass $type value for $name.\n". - "It's truncated when stored as an integer interval unit.\n". - "From 3.0.0, decimal part will no longer be truncated and will be cascaded to smaller units.\n". - "- To maintain the current behavior, use explicit cast: $name((int) \$value)\n". - "- To adopt the new behavior globally, call CarbonInterval::enableFloatSetters()\n", - \E_USER_DEPRECATED, - ); - } - } - - /** - * Throw an exception if precision loss when storing the given value as an integer would be >= 1.0. - */ - private function assertSafeForInteger(string $name, mixed $value): void - { - if ($value && !\is_int($value) && ($value >= 0x7fffffffffffffff || $value <= -0x7fffffffffffffff)) { - throw new OutOfRangeException($name, -0x7fffffffffffffff, 0x7fffffffffffffff, $value); - } - } - - private function handleDecimalPart(string $unit, mixed $value, mixed $integerValue): void - { - if (self::$floatSettersEnabled) { - $floatValue = (float) $value; - $base = (float) $integerValue; - - if ($floatValue === $base) { - return; - } - - $units = [ - 'y' => 'year', - 'm' => 'month', - 'd' => 'day', - 'h' => 'hour', - 'i' => 'minute', - 's' => 'second', - ]; - $upper = true; - - foreach ($units as $property => $name) { - if ($name === $unit) { - $upper = false; - - continue; - } - - if (!$upper && $this->$property !== 0) { - throw new RuntimeException( - "You cannot set $unit to a float value as $name would be overridden, ". - 'set it first to 0 explicitly if you really want to erase its value' - ); - } - } - - $this->add($unit, $floatValue - $base); - } - } - - private function getInnerValues(): array - { - return [$this->y, $this->m, $this->d, $this->h, $this->i, $this->s, $this->f, $this->invert, $this->days]; - } - - private function checkStartAndEnd(): void - { - if ( - $this->initialValues !== null - && ($this->startDate !== null || $this->endDate !== null) - && $this->initialValues !== $this->getInnerValues() - ) { - $this->absolute = false; - $this->startDate = null; - $this->endDate = null; - $this->rawInterval = null; - } - } - - /** @return $this */ - private function setSetting(string $setting, mixed $value): self - { - switch ($setting) { - case 'timezoneSetting': - return $value === null ? $this : $this->setTimezone($value); - - case 'step': - $this->setStep($value); - - return $this; - - case 'localMonthsOverflow': - return $value === null ? $this : $this->settings(['monthOverflow' => $value]); - - case 'localYearsOverflow': - return $value === null ? $this : $this->settings(['yearOverflow' => $value]); - - case 'localStrictModeEnabled': - case 'localHumanDiffOptions': - case 'localToStringFormat': - case 'localSerializer': - case 'localMacros': - case 'localGenericMacros': - case 'localFormatFunction': - case 'localTranslator': - $this->$setting = $value; - - return $this; - - default: - // Drop unknown settings - return $this; - } - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php b/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php deleted file mode 100644 index fb8dab6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php +++ /dev/null @@ -1,2579 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Carbon\Exceptions\EndLessPeriodException; -use Carbon\Exceptions\InvalidCastException; -use Carbon\Exceptions\InvalidIntervalException; -use Carbon\Exceptions\InvalidPeriodDateException; -use Carbon\Exceptions\InvalidPeriodParameterException; -use Carbon\Exceptions\NotACarbonClassException; -use Carbon\Exceptions\NotAPeriodException; -use Carbon\Exceptions\UnknownGetterException; -use Carbon\Exceptions\UnknownMethodException; -use Carbon\Exceptions\UnreachableException; -use Carbon\Traits\DeprecatedPeriodProperties; -use Carbon\Traits\IntervalRounding; -use Carbon\Traits\LocalFactory; -use Carbon\Traits\Mixin; -use Carbon\Traits\Options; -use Carbon\Traits\ToStringFormat; -use Closure; -use Countable; -use DateInterval; -use DatePeriod; -use DateTime; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use Generator; -use InvalidArgumentException; -use JsonSerializable; -use ReflectionException; -use ReturnTypeWillChange; -use RuntimeException; -use Throwable; - -// @codeCoverageIgnoreStart -require PHP_VERSION < 8.2 - ? __DIR__.'/../../lazy/Carbon/ProtectedDatePeriod.php' - : __DIR__.'/../../lazy/Carbon/UnprotectedDatePeriod.php'; -// @codeCoverageIgnoreEnd - -/** - * Substitution of DatePeriod with some modifications and many more features. - * - * @method static static|CarbonInterface start($date = null, $inclusive = null) Create instance specifying start date or modify the start date if called on an instance. - * @method static static since($date = null, $inclusive = null) Alias for start(). - * @method static static sinceNow($inclusive = null) Create instance with start date set to now or set the start date to now if called on an instance. - * @method static static|CarbonInterface end($date = null, $inclusive = null) Create instance specifying end date or modify the end date if called on an instance. - * @method static static until($date = null, $inclusive = null) Alias for end(). - * @method static static untilNow($inclusive = null) Create instance with end date set to now or set the end date to now if called on an instance. - * @method static static dates($start, $end = null) Create instance with start and end dates or modify the start and end dates if called on an instance. - * @method static static between($start, $end = null) Create instance with start and end dates or modify the start and end dates if called on an instance. - * @method static static recurrences($recurrences = null) Create instance with maximum number of recurrences or modify the number of recurrences if called on an instance. - * @method static static times($recurrences = null) Alias for recurrences(). - * @method static static|int|null options($options = null) Create instance with options or modify the options if called on an instance. - * @method static static toggle($options, $state = null) Create instance with options toggled on or off, or toggle options if called on an instance. - * @method static static filter($callback, $name = null) Create instance with filter added to the stack or append a filter if called on an instance. - * @method static static push($callback, $name = null) Alias for filter(). - * @method static static prepend($callback, $name = null) Create instance with filter prepended to the stack or prepend a filter if called on an instance. - * @method static static|array filters(array $filters = []) Create instance with filters stack or replace the whole filters stack if called on an instance. - * @method static static|CarbonInterval interval($interval = null) Create instance with given date interval or modify the interval if called on an instance. - * @method static static each($interval) Create instance with given date interval or modify the interval if called on an instance. - * @method static static every($interval) Create instance with given date interval or modify the interval if called on an instance. - * @method static static step($interval) Create instance with given date interval or modify the interval if called on an instance. - * @method static static stepBy($interval) Create instance with given date interval or modify the interval if called on an instance. - * @method static static invert() Create instance with inverted date interval or invert the interval if called on an instance. - * @method static static years($years = 1) Create instance specifying a number of years for date interval or replace the interval by the given a number of years if called on an instance. - * @method static static year($years = 1) Alias for years(). - * @method static static months($months = 1) Create instance specifying a number of months for date interval or replace the interval by the given a number of months if called on an instance. - * @method static static month($months = 1) Alias for months(). - * @method static static weeks($weeks = 1) Create instance specifying a number of weeks for date interval or replace the interval by the given a number of weeks if called on an instance. - * @method static static week($weeks = 1) Alias for weeks(). - * @method static static days($days = 1) Create instance specifying a number of days for date interval or replace the interval by the given a number of days if called on an instance. - * @method static static dayz($days = 1) Alias for days(). - * @method static static day($days = 1) Alias for days(). - * @method static static hours($hours = 1) Create instance specifying a number of hours for date interval or replace the interval by the given a number of hours if called on an instance. - * @method static static hour($hours = 1) Alias for hours(). - * @method static static minutes($minutes = 1) Create instance specifying a number of minutes for date interval or replace the interval by the given a number of minutes if called on an instance. - * @method static static minute($minutes = 1) Alias for minutes(). - * @method static static seconds($seconds = 1) Create instance specifying a number of seconds for date interval or replace the interval by the given a number of seconds if called on an instance. - * @method static static second($seconds = 1) Alias for seconds(). - * @method static static milliseconds($milliseconds = 1) Create instance specifying a number of milliseconds for date interval or replace the interval by the given a number of milliseconds if called on an instance. - * @method static static millisecond($milliseconds = 1) Alias for milliseconds(). - * @method static static microseconds($microseconds = 1) Create instance specifying a number of microseconds for date interval or replace the interval by the given a number of microseconds if called on an instance. - * @method static static microsecond($microseconds = 1) Alias for microseconds(). - * @method $this roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method $this floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method $this ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method $this ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method $this roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method $this floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method $this ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method $this ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method $this roundWeek(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundWeeks(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorWeek(float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorWeeks(float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilWeek(float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilWeeks(float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method $this floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method $this ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method $this ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method $this roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method $this floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method $this ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method $this ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method $this roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method $this ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * - * @mixin DeprecatedPeriodProperties - * - * @SuppressWarnings(PHPMD.TooManyFields) - * @SuppressWarnings(PHPMD.CamelCasePropertyName) - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - */ -class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable -{ - use LocalFactory; - use IntervalRounding; - use Mixin { - Mixin::mixin as baseMixin; - } - use Options { - Options::__debugInfo as baseDebugInfo; - } - use ToStringFormat; - - /** - * Built-in filter for limit by recurrences. - * - * @var callable - */ - public const RECURRENCES_FILTER = [self::class, 'filterRecurrences']; - - /** - * Built-in filter for limit to an end. - * - * @var callable - */ - public const END_DATE_FILTER = [self::class, 'filterEndDate']; - - /** - * Special value which can be returned by filters to end iteration. Also a filter. - * - * @var callable - */ - public const END_ITERATION = [self::class, 'endIteration']; - - /** - * Exclude end date from iteration. - * - * @var int - */ - public const EXCLUDE_END_DATE = 8; - - /** - * Yield CarbonImmutable instances. - * - * @var int - */ - public const IMMUTABLE = 4; - - /** - * Number of maximum attempts before giving up on finding next valid date. - * - * @var int - */ - public const NEXT_MAX_ATTEMPTS = 1000; - - /** - * Number of maximum attempts before giving up on finding end date. - * - * @var int - */ - public const END_MAX_ATTEMPTS = 10000; - - /** - * Default date class of iteration items. - * - * @var string - */ - protected const DEFAULT_DATE_CLASS = Carbon::class; - - /** - * The registered macros. - */ - protected static array $macros = []; - - /** - * Date class of iteration items. - */ - protected string $dateClass = Carbon::class; - - /** - * Underlying date interval instance. Always present, one day by default. - */ - protected ?CarbonInterval $dateInterval = null; - - /** - * True once __construct is finished. - */ - protected bool $constructed = false; - - /** - * Whether current date interval was set by default. - */ - protected bool $isDefaultInterval = false; - - /** - * The filters stack. - */ - protected array $filters = []; - - /** - * Period start date. Applied on rewind. Always present, now by default. - */ - protected ?CarbonInterface $startDate = null; - - /** - * Period end date. For inverted interval should be before the start date. Applied via a filter. - */ - protected ?CarbonInterface $endDate = null; - - /** - * Limit for number of recurrences. Applied via a filter. - */ - protected int|float|null $carbonRecurrences = null; - - /** - * Iteration options. - */ - protected ?int $options = null; - - /** - * Index of current date. Always sequential, even if some dates are skipped by filters. - * Equal to null only before the first iteration. - */ - protected int $key = 0; - - /** - * Current date. May temporarily hold unaccepted value when looking for a next valid date. - * Equal to null only before the first iteration. - */ - protected ?CarbonInterface $carbonCurrent = null; - - /** - * Timezone of current date. Taken from the start date. - */ - protected ?DateTimeZone $timezone = null; - - /** - * The cached validation result for current date. - */ - protected array|string|bool|null $validationResult = null; - - /** - * Timezone handler for settings() method. - */ - protected DateTimeZone|string|int|null $timezoneSetting = null; - - public function getIterator(): Generator - { - $this->rewind(); - - while ($this->valid()) { - $key = $this->key(); - $value = $this->current(); - - yield $key => $value; - - $this->next(); - } - } - - /** - * Make a CarbonPeriod instance from given variable if possible. - */ - public static function make(mixed $var): ?static - { - try { - return static::instance($var); - } catch (NotAPeriodException) { - return static::create($var); - } - } - - /** - * Create a new instance from a DatePeriod or CarbonPeriod object. - */ - public static function instance(mixed $period): static - { - if ($period instanceof static) { - return $period->copy(); - } - - if ($period instanceof self) { - return new static( - $period->getStartDate(), - $period->getEndDate() ?? $period->getRecurrences(), - $period->getDateInterval(), - $period->getOptions(), - ); - } - - if ($period instanceof DatePeriod) { - return new static( - $period->start, - $period->end ?: ($period->recurrences - 1), - $period->interval, - $period->include_start_date ? 0 : static::EXCLUDE_START_DATE, - ); - } - - $class = static::class; - $type = \gettype($period); - $chunks = explode('::', __METHOD__); - - throw new NotAPeriodException( - 'Argument 1 passed to '.$class.'::'.end($chunks).'() '. - 'must be an instance of DatePeriod or '.$class.', '. - ($type === 'object' ? 'instance of '.\get_class($period) : $type).' given.', - ); - } - - /** - * Create a new instance. - */ - public static function create(...$params): static - { - return static::createFromArray($params); - } - - /** - * Create a new instance from an array of parameters. - */ - public static function createFromArray(array $params): static - { - return new static(...$params); - } - - /** - * Create CarbonPeriod from ISO 8601 string. - */ - public static function createFromIso(string $iso, ?int $options = null): static - { - $params = static::parseIso8601($iso); - - $instance = static::createFromArray($params); - - if ($options !== null) { - $instance->options = $options; - $instance->handleChangedParameters(); - } - - return $instance; - } - - /** - * Return whether given interval contains non zero value of any time unit. - */ - protected static function intervalHasTime(DateInterval $interval): bool - { - return $interval->h || $interval->i || $interval->s || $interval->f; - } - - /** - * Return whether given variable is an ISO 8601 specification. - * - * Note: Check is very basic, as actual validation will be done later when parsing. - * We just want to ensure that variable is not any other type of valid parameter. - */ - protected static function isIso8601(mixed $var): bool - { - if (!\is_string($var)) { - return false; - } - - // Match slash but not within a timezone name. - $part = '[a-z]+(?:[_-][a-z]+)*'; - - preg_match("#\b$part/$part\b|(/)#i", $var, $match); - - return isset($match[1]); - } - - /** - * Parse given ISO 8601 string into an array of arguments. - * - * @SuppressWarnings(PHPMD.ElseExpression) - */ - protected static function parseIso8601(string $iso): array - { - $result = []; - - $interval = null; - $start = null; - $end = null; - $dateClass = static::DEFAULT_DATE_CLASS; - - foreach (explode('/', $iso) as $key => $part) { - if ($key === 0 && preg_match('/^R(\d*|INF)$/', $part, $match)) { - $parsed = \strlen($match[1]) ? (($match[1] !== 'INF') ? (int) $match[1] : INF) : null; - } elseif ($interval === null && $parsed = self::makeInterval($part)) { - $interval = $part; - } elseif ($start === null && $parsed = $dateClass::make($part)) { - $start = $part; - } elseif ($end === null && $parsed = $dateClass::make(static::addMissingParts($start ?? '', $part))) { - $end = $part; - } else { - throw new InvalidPeriodParameterException("Invalid ISO 8601 specification: $iso."); - } - - $result[] = $parsed; - } - - return $result; - } - - /** - * Add missing parts of the target date from the source date. - */ - protected static function addMissingParts(string $source, string $target): string - { - $pattern = '/'.preg_replace('/\d+/', '[0-9]+', preg_quote($target, '/')).'$/'; - - $result = preg_replace($pattern, $target, $source, 1, $count); - - return $count ? $result : $target; - } - - private static function makeInterval(mixed $input): ?CarbonInterval - { - try { - return CarbonInterval::make($input); - } catch (Throwable) { - return null; - } - } - - private static function makeTimezone(mixed $input): ?CarbonTimeZone - { - if (!\is_string($input)) { - return null; - } - - try { - return CarbonTimeZone::create($input); - } catch (Throwable) { - return null; - } - } - - /** - * Register a custom macro. - * - * Pass null macro to remove it. - * - * @example - * ``` - * CarbonPeriod::macro('middle', function () { - * return $this->getStartDate()->average($this->getEndDate()); - * }); - * echo CarbonPeriod::since('2011-05-12')->until('2011-06-03')->middle(); - * ``` - */ - public static function macro(string $name, ?callable $macro): void - { - static::$macros[$name] = $macro; - } - - /** - * Register macros from a mixin object. - * - * @example - * ``` - * CarbonPeriod::mixin(new class { - * public function addDays() { - * return function ($count = 1) { - * return $this->setStartDate( - * $this->getStartDate()->addDays($count) - * )->setEndDate( - * $this->getEndDate()->addDays($count) - * ); - * }; - * } - * public function subDays() { - * return function ($count = 1) { - * return $this->setStartDate( - * $this->getStartDate()->subDays($count) - * )->setEndDate( - * $this->getEndDate()->subDays($count) - * ); - * }; - * } - * }); - * echo CarbonPeriod::create('2000-01-01', '2000-02-01')->addDays(5)->subDays(3); - * ``` - * - * @throws ReflectionException - */ - public static function mixin(object|string $mixin): void - { - static::baseMixin($mixin); - } - - /** - * Check if macro is registered. - */ - public static function hasMacro(string $name): bool - { - return isset(static::$macros[$name]); - } - - /** - * Provide static proxy for instance aliases. - */ - public static function __callStatic(string $method, array $parameters): mixed - { - $date = new static(); - - if (static::hasMacro($method)) { - return static::bindMacroContext(null, static fn () => $date->callMacro($method, $parameters)); - } - - return $date->$method(...$parameters); - } - - /** - * CarbonPeriod constructor. - * - * @SuppressWarnings(PHPMD.ElseExpression) - * - * @throws InvalidArgumentException - */ - public function __construct(...$arguments) - { - $raw = null; - - if (isset($arguments['raw'])) { - $raw = $arguments['raw']; - $this->isDefaultInterval = $arguments['isDefaultInterval'] ?? false; - - if (isset($arguments['dateClass'])) { - $this->dateClass = $arguments['dateClass']; - } - - $arguments = $raw; - } - - // Parse and assign arguments one by one. First argument may be an ISO 8601 spec, - // which will be first parsed into parts and then processed the same way. - - $argumentsCount = \count($arguments); - - if ($argumentsCount && static::isIso8601($iso = $arguments[0])) { - array_splice($arguments, 0, 1, static::parseIso8601($iso)); - } - - if ($argumentsCount === 1) { - if ($arguments[0] instanceof self) { - $arguments = [ - $arguments[0]->getStartDate(), - $arguments[0]->getEndDate() ?? $arguments[0]->getRecurrences(), - $arguments[0]->getDateInterval(), - $arguments[0]->getOptions(), - ]; - } elseif ($arguments[0] instanceof DatePeriod) { - $arguments = [ - $arguments[0]->start, - $arguments[0]->end ?: ($arguments[0]->recurrences - 1), - $arguments[0]->interval, - $arguments[0]->include_start_date ? 0 : static::EXCLUDE_START_DATE, - ]; - } - } - - if (is_a($this->dateClass, DateTimeImmutable::class, true)) { - $this->options = static::IMMUTABLE; - } - - $optionsSet = false; - $originalArguments = []; - $sortedArguments = []; - - foreach ($arguments as $argument) { - $parsedDate = null; - - if ($argument instanceof DateTimeZone) { - $sortedArguments = $this->configureTimezone($argument, $sortedArguments, $originalArguments); - } elseif (!isset($sortedArguments['interval']) && - ( - (\is_string($argument) && preg_match( - '/^(-?\d(\d(?![\/-])|[^\d\/-]([\/-])?)*|P[T\d].*|(?:\h*\d+(?:\.\d+)?\h*[a-z]+)+)$/i', - $argument, - )) || - $argument instanceof DateInterval || - $argument instanceof Closure || - $argument instanceof Unit - ) && - $parsedInterval = self::makeInterval($argument) - ) { - $sortedArguments['interval'] = $parsedInterval; - } elseif (!isset($sortedArguments['start']) && $parsedDate = $this->makeDateTime($argument)) { - $sortedArguments['start'] = $parsedDate; - $originalArguments['start'] = $argument; - } elseif (!isset($sortedArguments['end']) && ($parsedDate = $parsedDate ?? $this->makeDateTime($argument))) { - $sortedArguments['end'] = $parsedDate; - $originalArguments['end'] = $argument; - } elseif (!isset($sortedArguments['recurrences']) && - !isset($sortedArguments['end']) && - (\is_int($argument) || \is_float($argument)) - && $argument >= 0 - ) { - $sortedArguments['recurrences'] = $argument; - } elseif (!$optionsSet && (\is_int($argument) || $argument === null)) { - $optionsSet = true; - $sortedArguments['options'] = (((int) $this->options) | ((int) $argument)); - } elseif ($parsedTimezone = self::makeTimezone($argument)) { - $sortedArguments = $this->configureTimezone($parsedTimezone, $sortedArguments, $originalArguments); - } else { - throw new InvalidPeriodParameterException('Invalid constructor parameters.'); - } - } - - if ($raw === null && isset($sortedArguments['start'])) { - $end = $sortedArguments['end'] ?? max(1, $sortedArguments['recurrences'] ?? 1); - - if (\is_float($end)) { - $end = $end === INF ? PHP_INT_MAX : (int) round($end); - } - - $raw = [ - $sortedArguments['start'], - $sortedArguments['interval'] ?? CarbonInterval::day(), - $end, - ]; - } - - $this->setFromAssociativeArray($sortedArguments); - - if ($this->startDate === null) { - $dateClass = $this->dateClass; - $this->setStartDate($dateClass::now()); - } - - if ($this->dateInterval === null) { - $this->setDateInterval(CarbonInterval::day()); - - $this->isDefaultInterval = true; - } - - if ($this->options === null) { - $this->setOptions(0); - } - - parent::__construct( - $this->startDate, - $this->dateInterval, - $this->endDate ?? $this->recurrences ?? 1, - $this->options, - ); - $this->constructed = true; - } - - /** - * Get a copy of the instance. - */ - public function copy(): static - { - return clone $this; - } - - /** - * Prepare the instance to be set (self if mutable to be mutated, - * copy if immutable to generate a new instance). - */ - protected function copyIfImmutable(): static - { - return $this; - } - - /** - * Get the getter for a property allowing both `DatePeriod` snakeCase and camelCase names. - */ - protected function getGetter(string $name): ?callable - { - return match (strtolower(preg_replace('/[A-Z]/', '_$0', $name))) { - 'start', 'start_date' => [$this, 'getStartDate'], - 'end', 'end_date' => [$this, 'getEndDate'], - 'interval', 'date_interval' => [$this, 'getDateInterval'], - 'recurrences' => [$this, 'getRecurrences'], - 'include_start_date' => [$this, 'isStartIncluded'], - 'include_end_date' => [$this, 'isEndIncluded'], - 'current' => [$this, 'current'], - 'locale' => [$this, 'locale'], - 'tzname', 'tz_name' => fn () => match (true) { - $this->timezoneSetting === null => null, - \is_string($this->timezoneSetting) => $this->timezoneSetting, - $this->timezoneSetting instanceof DateTimeZone => $this->timezoneSetting->getName(), - default => CarbonTimeZone::instance($this->timezoneSetting)->getName(), - }, - default => null, - }; - } - - /** - * Get a property allowing both `DatePeriod` snakeCase and camelCase names. - * - * @param string $name - * - * @return bool|CarbonInterface|CarbonInterval|int|null - */ - public function get(string $name) - { - $getter = $this->getGetter($name); - - if ($getter) { - return $getter(); - } - - throw new UnknownGetterException($name); - } - - /** - * Get a property allowing both `DatePeriod` snakeCase and camelCase names. - * - * @param string $name - * - * @return bool|CarbonInterface|CarbonInterval|int|null - */ - public function __get(string $name) - { - return $this->get($name); - } - - /** - * Check if an attribute exists on the object - * - * @param string $name - * - * @return bool - */ - public function __isset(string $name): bool - { - return $this->getGetter($name) !== null; - } - - /** - * @alias copy - * - * Get a copy of the instance. - * - * @return static - */ - public function clone() - { - return clone $this; - } - - /** - * Set the iteration item class. - * - * @param string $dateClass - * - * @return static - */ - public function setDateClass(string $dateClass) - { - if (!is_a($dateClass, CarbonInterface::class, true)) { - throw new NotACarbonClassException($dateClass); - } - - $self = $this->copyIfImmutable(); - $self->dateClass = $dateClass; - - if (is_a($dateClass, Carbon::class, true)) { - $self->options = $self->options & ~static::IMMUTABLE; - } elseif (is_a($dateClass, CarbonImmutable::class, true)) { - $self->options = $self->options | static::IMMUTABLE; - } - - return $self; - } - - /** - * Returns iteration item date class. - * - * @return string - */ - public function getDateClass(): string - { - return $this->dateClass; - } - - /** - * Change the period date interval. - * - * @param DateInterval|string|int $interval - * @param Unit|string $unit the unit of $interval if it's a number - * - * @throws InvalidIntervalException - * - * @return static - */ - public function setDateInterval(mixed $interval, Unit|string|null $unit = null): static - { - if ($interval instanceof Unit) { - $interval = $interval->interval(); - } - - if ($unit instanceof Unit) { - $unit = $unit->name; - } - - if (!$interval = CarbonInterval::make($interval, $unit)) { - throw new InvalidIntervalException('Invalid interval.'); - } - - if ($interval->spec() === 'PT0S' && !$interval->f && !$interval->getStep()) { - throw new InvalidIntervalException('Empty interval is not accepted.'); - } - - $self = $this->copyIfImmutable(); - $self->dateInterval = $interval; - - $self->isDefaultInterval = false; - - $self->handleChangedParameters(); - - return $self; - } - - /** - * Reset the date interval to the default value. - * - * Difference with simply setting interval to 1-day is that P1D will not appear when calling toIso8601String() - * and also next adding to the interval won't include the default 1-day. - */ - public function resetDateInterval(): static - { - $self = $this->copyIfImmutable(); - $self->setDateInterval(CarbonInterval::day()); - - $self->isDefaultInterval = true; - - return $self; - } - - /** - * Invert the period date interval. - */ - public function invertDateInterval(): static - { - return $this->setDateInterval($this->dateInterval->invert()); - } - - /** - * Set start and end date. - * - * @param DateTime|DateTimeInterface|string $start - * @param DateTime|DateTimeInterface|string|null $end - * - * @return static - */ - public function setDates(mixed $start, mixed $end): static - { - return $this->setStartDate($start)->setEndDate($end); - } - - /** - * Change the period options. - * - * @param int|null $options - * - * @return static - */ - public function setOptions(?int $options): static - { - $self = $this->copyIfImmutable(); - $self->options = $options ?? 0; - - $self->handleChangedParameters(); - - return $self; - } - - /** - * Get the period options. - */ - public function getOptions(): int - { - return $this->options ?? 0; - } - - /** - * Toggle given options on or off. - * - * @param int $options - * @param bool|null $state - * - * @throws InvalidArgumentException - * - * @return static - */ - public function toggleOptions(int $options, ?bool $state = null): static - { - $self = $this->copyIfImmutable(); - - if ($state === null) { - $state = ($this->options & $options) !== $options; - } - - return $self->setOptions( - $state ? - $this->options | $options : - $this->options & ~$options, - ); - } - - /** - * Toggle EXCLUDE_START_DATE option. - */ - public function excludeStartDate(bool $state = true): static - { - return $this->toggleOptions(static::EXCLUDE_START_DATE, $state); - } - - /** - * Toggle EXCLUDE_END_DATE option. - */ - public function excludeEndDate(bool $state = true): static - { - return $this->toggleOptions(static::EXCLUDE_END_DATE, $state); - } - - /** - * Get the underlying date interval. - */ - public function getDateInterval(): CarbonInterval - { - return $this->dateInterval->copy(); - } - - /** - * Get start date of the period. - * - * @param string|null $rounding Optional rounding 'floor', 'ceil', 'round' using the period interval. - */ - public function getStartDate(?string $rounding = null): CarbonInterface - { - $date = $this->startDate->avoidMutation(); - - return $rounding ? $date->round($this->getDateInterval(), $rounding) : $date; - } - - /** - * Get end date of the period. - * - * @param string|null $rounding Optional rounding 'floor', 'ceil', 'round' using the period interval. - */ - public function getEndDate(?string $rounding = null): ?CarbonInterface - { - if (!$this->endDate) { - return null; - } - - $date = $this->endDate->avoidMutation(); - - return $rounding ? $date->round($this->getDateInterval(), $rounding) : $date; - } - - /** - * Get number of recurrences. - */ - #[ReturnTypeWillChange] - public function getRecurrences(): int|float|null - { - return $this->carbonRecurrences; - } - - /** - * Returns true if the start date should be excluded. - */ - public function isStartExcluded(): bool - { - return ($this->options & static::EXCLUDE_START_DATE) !== 0; - } - - /** - * Returns true if the end date should be excluded. - */ - public function isEndExcluded(): bool - { - return ($this->options & static::EXCLUDE_END_DATE) !== 0; - } - - /** - * Returns true if the start date should be included. - */ - public function isStartIncluded(): bool - { - return !$this->isStartExcluded(); - } - - /** - * Returns true if the end date should be included. - */ - public function isEndIncluded(): bool - { - return !$this->isEndExcluded(); - } - - /** - * Return the start if it's included by option, else return the start + 1 period interval. - */ - public function getIncludedStartDate(): CarbonInterface - { - $start = $this->getStartDate(); - - if ($this->isStartExcluded()) { - return $start->add($this->getDateInterval()); - } - - return $start; - } - - /** - * Return the end if it's included by option, else return the end - 1 period interval. - * Warning: if the period has no fixed end, this method will iterate the period to calculate it. - */ - public function getIncludedEndDate(): CarbonInterface - { - $end = $this->getEndDate(); - - if (!$end) { - return $this->calculateEnd(); - } - - if ($this->isEndExcluded()) { - return $end->sub($this->getDateInterval()); - } - - return $end; - } - - /** - * Add a filter to the stack. - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function addFilter(callable|string $callback, ?string $name = null): static - { - $self = $this->copyIfImmutable(); - $tuple = $self->createFilterTuple(\func_get_args()); - - $self->filters[] = $tuple; - - $self->handleChangedParameters(); - - return $self; - } - - /** - * Prepend a filter to the stack. - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function prependFilter(callable|string $callback, ?string $name = null): static - { - $self = $this->copyIfImmutable(); - $tuple = $self->createFilterTuple(\func_get_args()); - - array_unshift($self->filters, $tuple); - - $self->handleChangedParameters(); - - return $self; - } - - /** - * Remove a filter by instance or name. - */ - public function removeFilter(callable|string $filter): static - { - $self = $this->copyIfImmutable(); - $key = \is_callable($filter) ? 0 : 1; - - $self->filters = array_values(array_filter( - $this->filters, - static fn ($tuple) => $tuple[$key] !== $filter, - )); - - $self->updateInternalState(); - - $self->handleChangedParameters(); - - return $self; - } - - /** - * Return whether given instance or name is in the filter stack. - */ - public function hasFilter(callable|string $filter): bool - { - $key = \is_callable($filter) ? 0 : 1; - - foreach ($this->filters as $tuple) { - if ($tuple[$key] === $filter) { - return true; - } - } - - return false; - } - - /** - * Get filters stack. - */ - public function getFilters(): array - { - return $this->filters; - } - - /** - * Set filters stack. - */ - public function setFilters(array $filters): static - { - $self = $this->copyIfImmutable(); - $self->filters = $filters; - - $self->updateInternalState(); - - $self->handleChangedParameters(); - - return $self; - } - - /** - * Reset filters stack. - */ - public function resetFilters(): static - { - $self = $this->copyIfImmutable(); - $self->filters = []; - - if ($self->endDate !== null) { - $self->filters[] = [static::END_DATE_FILTER, null]; - } - - if ($self->carbonRecurrences !== null) { - $self->filters[] = [static::RECURRENCES_FILTER, null]; - } - - $self->handleChangedParameters(); - - return $self; - } - - /** - * Add a recurrences filter (set maximum number of recurrences). - * - * @throws InvalidArgumentException - */ - public function setRecurrences(int|float|null $recurrences): static - { - if ($recurrences === null) { - return $this->removeFilter(static::RECURRENCES_FILTER); - } - - if ($recurrences < 0) { - throw new InvalidPeriodParameterException('Invalid number of recurrences.'); - } - - /** @var self $self */ - $self = $this->copyIfImmutable(); - $self->carbonRecurrences = $recurrences === INF ? INF : (int) $recurrences; - - if (!$self->hasFilter(static::RECURRENCES_FILTER)) { - return $self->addFilter(static::RECURRENCES_FILTER); - } - - $self->handleChangedParameters(); - - return $self; - } - - /** - * Change the period start date. - * - * @param DateTime|DateTimeInterface|string $date - * @param bool|null $inclusive - * - * @throws InvalidPeriodDateException - * - * @return static - */ - public function setStartDate(mixed $date, ?bool $inclusive = null): static - { - if (!$this->isInfiniteDate($date) && !($date = ([$this->dateClass, 'make'])($date, $this->timezone))) { - throw new InvalidPeriodDateException('Invalid start date.'); - } - - $self = $this->copyIfImmutable(); - $self->startDate = $date; - - if ($inclusive !== null) { - $self = $self->toggleOptions(static::EXCLUDE_START_DATE, !$inclusive); - } - - return $self; - } - - /** - * Change the period end date. - * - * @param DateTime|DateTimeInterface|string|null $date - * @param bool|null $inclusive - * - * @throws \InvalidArgumentException - * - * @return static - */ - public function setEndDate(mixed $date, ?bool $inclusive = null): static - { - if ($date !== null && !$this->isInfiniteDate($date) && !$date = ([$this->dateClass, 'make'])($date, $this->timezone)) { - throw new InvalidPeriodDateException('Invalid end date.'); - } - - if (!$date) { - return $this->removeFilter(static::END_DATE_FILTER); - } - - $self = $this->copyIfImmutable(); - $self->endDate = $date; - - if ($inclusive !== null) { - $self = $self->toggleOptions(static::EXCLUDE_END_DATE, !$inclusive); - } - - if (!$self->hasFilter(static::END_DATE_FILTER)) { - return $self->addFilter(static::END_DATE_FILTER); - } - - $self->handleChangedParameters(); - - return $self; - } - - /** - * Check if the current position is valid. - */ - public function valid(): bool - { - return $this->validateCurrentDate() === true; - } - - /** - * Return the current key. - */ - public function key(): ?int - { - return $this->valid() - ? $this->key - : null; - } - - /** - * Return the current date. - */ - public function current(): ?CarbonInterface - { - return $this->valid() - ? $this->prepareForReturn($this->carbonCurrent) - : null; - } - - /** - * Move forward to the next date. - * - * @throws RuntimeException - */ - public function next(): void - { - if ($this->carbonCurrent === null) { - $this->rewind(); - } - - if ($this->validationResult !== static::END_ITERATION) { - $this->key++; - - $this->incrementCurrentDateUntilValid(); - } - } - - /** - * Rewind to the start date. - * - * Iterating over a date in the UTC timezone avoids bug during backward DST change. - * - * @see https://bugs.php.net/bug.php?id=72255 - * @see https://bugs.php.net/bug.php?id=74274 - * @see https://wiki.php.net/rfc/datetime_and_daylight_saving_time - * - * @throws RuntimeException - */ - public function rewind(): void - { - $this->key = 0; - $this->carbonCurrent = ([$this->dateClass, 'make'])($this->startDate); - $settings = $this->getSettings(); - - if ($this->hasLocalTranslator()) { - $settings['locale'] = $this->getTranslatorLocale(); - } - - $this->carbonCurrent->settings($settings); - $this->timezone = static::intervalHasTime($this->dateInterval) ? $this->carbonCurrent->getTimezone() : null; - - if ($this->timezone) { - $this->carbonCurrent = $this->carbonCurrent->utc(); - } - - $this->validationResult = null; - - if ($this->isStartExcluded() || $this->validateCurrentDate() === false) { - $this->incrementCurrentDateUntilValid(); - } - } - - /** - * Skip iterations and returns iteration state (false if ended, true if still valid). - * - * @param int $count steps number to skip (1 by default) - * - * @return bool - */ - public function skip(int $count = 1): bool - { - for ($i = $count; $this->valid() && $i > 0; $i--) { - $this->next(); - } - - return $this->valid(); - } - - /** - * Format the date period as ISO 8601. - */ - public function toIso8601String(): string - { - $parts = []; - - if ($this->carbonRecurrences !== null) { - $parts[] = 'R'.$this->carbonRecurrences; - } - - $parts[] = $this->startDate->toIso8601String(); - - if (!$this->isDefaultInterval) { - $parts[] = $this->dateInterval->spec(); - } - - if ($this->endDate !== null) { - $parts[] = $this->endDate->toIso8601String(); - } - - return implode('/', $parts); - } - - /** - * Convert the date period into a string. - */ - public function toString(): string - { - $format = $this->localToStringFormat - ?? $this->getFactory()->getSettings()['toStringFormat'] - ?? null; - - if ($format instanceof Closure) { - return $format($this); - } - - $translator = ([$this->dateClass, 'getTranslator'])(); - - $parts = []; - - $format = $format ?? ( - !$this->startDate->isStartOfDay() || ($this->endDate && !$this->endDate->isStartOfDay()) - ? 'Y-m-d H:i:s' - : 'Y-m-d' - ); - - if ($this->carbonRecurrences !== null) { - $parts[] = $this->translate('period_recurrences', [], $this->carbonRecurrences, $translator); - } - - $parts[] = $this->translate('period_interval', [':interval' => $this->dateInterval->forHumans([ - 'join' => true, - ])], null, $translator); - - $parts[] = $this->translate('period_start_date', [':date' => $this->startDate->rawFormat($format)], null, $translator); - - if ($this->endDate !== null) { - $parts[] = $this->translate('period_end_date', [':date' => $this->endDate->rawFormat($format)], null, $translator); - } - - $result = implode(' ', $parts); - - return mb_strtoupper(mb_substr($result, 0, 1)).mb_substr($result, 1); - } - - /** - * Format the date period as ISO 8601. - */ - public function spec(): string - { - return $this->toIso8601String(); - } - - /** - * Cast the current instance into the given class. - * - * @param string $className The $className::instance() method will be called to cast the current object. - * - * @return DatePeriod|object - */ - public function cast(string $className): object - { - if (!method_exists($className, 'instance')) { - if (is_a($className, DatePeriod::class, true)) { - return new $className( - $this->rawDate($this->getStartDate()), - $this->getDateInterval(), - $this->getEndDate() ? $this->rawDate($this->getIncludedEndDate()) : $this->getRecurrences(), - $this->isStartExcluded() ? DatePeriod::EXCLUDE_START_DATE : 0, - ); - } - - throw new InvalidCastException("$className has not the instance() method needed to cast the date."); - } - - return $className::instance($this); - } - - /** - * Return native DatePeriod PHP object matching the current instance. - * - * @example - * ``` - * var_dump(CarbonPeriod::create('2021-01-05', '2021-02-15')->toDatePeriod()); - * ``` - */ - public function toDatePeriod(): DatePeriod - { - return $this->cast(DatePeriod::class); - } - - /** - * Return `true` if the period has no custom filter and is guaranteed to be endless. - * - * Note that we can't check if a period is endless as soon as it has custom filters - * because filters can emit `CarbonPeriod::END_ITERATION` to stop the iteration in - * a way we can't predict without actually iterating the period. - */ - public function isUnfilteredAndEndLess(): bool - { - foreach ($this->filters as $filter) { - switch ($filter) { - case [static::RECURRENCES_FILTER, null]: - if ($this->carbonRecurrences !== null && is_finite($this->carbonRecurrences)) { - return false; - } - - break; - - case [static::END_DATE_FILTER, null]: - if ($this->endDate !== null && !$this->endDate->isEndOfTime()) { - return false; - } - - break; - - default: - return false; - } - } - - return true; - } - - /** - * Convert the date period into an array without changing current iteration state. - * - * @return CarbonInterface[] - */ - public function toArray(): array - { - if ($this->isUnfilteredAndEndLess()) { - throw new EndLessPeriodException("Endless period can't be converted to array nor counted."); - } - - $state = [ - $this->key, - $this->carbonCurrent ? $this->carbonCurrent->avoidMutation() : null, - $this->validationResult, - ]; - - $result = iterator_to_array($this); - - [$this->key, $this->carbonCurrent, $this->validationResult] = $state; - - return $result; - } - - /** - * Count dates in the date period. - */ - public function count(): int - { - return \count($this->toArray()); - } - - /** - * Return the first date in the date period. - */ - public function first(): ?CarbonInterface - { - if ($this->isUnfilteredAndEndLess()) { - foreach ($this as $date) { - $this->rewind(); - - return $date; - } - - return null; - } - - return ($this->toArray() ?: [])[0] ?? null; - } - - /** - * Return the last date in the date period. - */ - public function last(): ?CarbonInterface - { - $array = $this->toArray(); - - return $array ? $array[\count($array) - 1] : null; - } - - /** - * Convert the date period into a string. - */ - public function __toString(): string - { - return $this->toString(); - } - - /** - * Add aliases for setters. - * - * CarbonPeriod::days(3)->hours(5)->invert() - * ->sinceNow()->until('2010-01-10') - * ->filter(...) - * ->count() - * - * Note: We use magic method to let static and instance aliases with the same names. - */ - public function __call(string $method, array $parameters): mixed - { - if (static::hasMacro($method)) { - return static::bindMacroContext($this, fn () => $this->callMacro($method, $parameters)); - } - - $roundedValue = $this->callRoundMethod($method, $parameters); - - if ($roundedValue !== null) { - return $roundedValue; - } - - $count = \count($parameters); - - switch ($method) { - case 'start': - case 'since': - if ($count === 0) { - return $this->getStartDate(); - } - - self::setDefaultParameters($parameters, [ - [0, 'date', null], - ]); - - return $this->setStartDate(...$parameters); - - case 'sinceNow': - return $this->setStartDate(new Carbon(), ...$parameters); - - case 'end': - case 'until': - if ($count === 0) { - return $this->getEndDate(); - } - - self::setDefaultParameters($parameters, [ - [0, 'date', null], - ]); - - return $this->setEndDate(...$parameters); - - case 'untilNow': - return $this->setEndDate(new Carbon(), ...$parameters); - - case 'dates': - case 'between': - self::setDefaultParameters($parameters, [ - [0, 'start', null], - [1, 'end', null], - ]); - - return $this->setDates(...$parameters); - - case 'recurrences': - case 'times': - if ($count === 0) { - return $this->getRecurrences(); - } - - self::setDefaultParameters($parameters, [ - [0, 'recurrences', null], - ]); - - return $this->setRecurrences(...$parameters); - - case 'options': - if ($count === 0) { - return $this->getOptions(); - } - - self::setDefaultParameters($parameters, [ - [0, 'options', null], - ]); - - return $this->setOptions(...$parameters); - - case 'toggle': - self::setDefaultParameters($parameters, [ - [0, 'options', null], - ]); - - return $this->toggleOptions(...$parameters); - - case 'filter': - case 'push': - return $this->addFilter(...$parameters); - - case 'prepend': - return $this->prependFilter(...$parameters); - - case 'filters': - if ($count === 0) { - return $this->getFilters(); - } - - self::setDefaultParameters($parameters, [ - [0, 'filters', []], - ]); - - return $this->setFilters(...$parameters); - - case 'interval': - case 'each': - case 'every': - case 'step': - case 'stepBy': - if ($count === 0) { - return $this->getDateInterval(); - } - - return $this->setDateInterval(...$parameters); - - case 'invert': - return $this->invertDateInterval(); - - case 'years': - case 'year': - case 'months': - case 'month': - case 'weeks': - case 'week': - case 'days': - case 'dayz': - case 'day': - case 'hours': - case 'hour': - case 'minutes': - case 'minute': - case 'seconds': - case 'second': - case 'milliseconds': - case 'millisecond': - case 'microseconds': - case 'microsecond': - return $this->setDateInterval(( - // Override default P1D when instantiating via fluent setters. - [$this->isDefaultInterval ? new CarbonInterval('PT0S') : $this->dateInterval, $method] - )(...$parameters)); - } - - $dateClass = $this->dateClass; - - if ($this->localStrictModeEnabled ?? $dateClass::isStrictModeEnabled()) { - throw new UnknownMethodException($method); - } - - return $this; - } - - /** - * Set the instance's timezone from a string or object and apply it to start/end. - */ - public function setTimezone(DateTimeZone|string|int $timezone): static - { - $self = $this->copyIfImmutable(); - $self->timezoneSetting = $timezone; - $self->timezone = CarbonTimeZone::instance($timezone); - - if ($self->startDate) { - $self = $self->setStartDate($self->startDate->setTimezone($timezone)); - } - - if ($self->endDate) { - $self = $self->setEndDate($self->endDate->setTimezone($timezone)); - } - - return $self; - } - - /** - * Set the instance's timezone from a string or object and add/subtract the offset difference to start/end. - */ - public function shiftTimezone(DateTimeZone|string|int $timezone): static - { - $self = $this->copyIfImmutable(); - $self->timezoneSetting = $timezone; - $self->timezone = CarbonTimeZone::instance($timezone); - - if ($self->startDate) { - $self = $self->setStartDate($self->startDate->shiftTimezone($timezone)); - } - - if ($self->endDate) { - $self = $self->setEndDate($self->endDate->shiftTimezone($timezone)); - } - - return $self; - } - - /** - * Returns the end is set, else calculated from start and recurrences. - * - * @param string|null $rounding Optional rounding 'floor', 'ceil', 'round' using the period interval. - * - * @return CarbonInterface - */ - public function calculateEnd(?string $rounding = null): CarbonInterface - { - if ($end = $this->getEndDate($rounding)) { - return $end; - } - - if ($this->dateInterval->isEmpty()) { - return $this->getStartDate($rounding); - } - - $date = $this->getEndFromRecurrences() ?? $this->iterateUntilEnd(); - - if ($date && $rounding) { - $date = $date->avoidMutation()->round($this->getDateInterval(), $rounding); - } - - return $date; - } - - private function getEndFromRecurrences(): ?CarbonInterface - { - if ($this->carbonRecurrences === null) { - throw new UnreachableException( - "Could not calculate period end without either explicit end or recurrences.\n". - "If you're looking for a forever-period, use ->setRecurrences(INF).", - ); - } - - if ($this->carbonRecurrences === INF) { - $start = $this->getStartDate(); - - return $start < $start->avoidMutation()->add($this->getDateInterval()) - ? CarbonImmutable::endOfTime() - : CarbonImmutable::startOfTime(); - } - - if ($this->filters === [[static::RECURRENCES_FILTER, null]]) { - return $this->getStartDate()->avoidMutation()->add( - $this->getDateInterval()->times( - $this->carbonRecurrences - ($this->isStartExcluded() ? 0 : 1), - ), - ); - } - - return null; - } - - private function iterateUntilEnd(): ?CarbonInterface - { - $attempts = 0; - $date = null; - - foreach ($this as $date) { - if (++$attempts > static::END_MAX_ATTEMPTS) { - throw new UnreachableException( - 'Could not calculate period end after iterating '.static::END_MAX_ATTEMPTS.' times.', - ); - } - } - - return $date; - } - - /** - * Returns true if the current period overlaps the given one (if 1 parameter passed) - * or the period between 2 dates (if 2 parameters passed). - * - * @param CarbonPeriod|\DateTimeInterface|Carbon|CarbonImmutable|string $rangeOrRangeStart - * @param \DateTimeInterface|Carbon|CarbonImmutable|string|null $rangeEnd - * - * @return bool - */ - public function overlaps(mixed $rangeOrRangeStart, mixed $rangeEnd = null): bool - { - $range = $rangeEnd ? static::create($rangeOrRangeStart, $rangeEnd) : $rangeOrRangeStart; - - if (!($range instanceof self)) { - $range = static::create($range); - } - - [$start, $end] = $this->orderCouple($this->getStartDate(), $this->calculateEnd()); - [$rangeStart, $rangeEnd] = $this->orderCouple($range->getStartDate(), $range->calculateEnd()); - - return $end > $rangeStart && $rangeEnd > $start; - } - - /** - * Execute a given function on each date of the period. - * - * @example - * ``` - * Carbon::create('2020-11-29')->daysUntil('2020-12-24')->forEach(function (Carbon $date) { - * echo $date->diffInDays('2020-12-25')." days before Christmas!\n"; - * }); - * ``` - */ - public function forEach(callable $callback): void - { - foreach ($this as $date) { - $callback($date); - } - } - - /** - * Execute a given function on each date of the period and yield the result of this function. - * - * @example - * ``` - * $period = Carbon::create('2020-11-29')->daysUntil('2020-12-24'); - * echo implode("\n", iterator_to_array($period->map(function (Carbon $date) { - * return $date->diffInDays('2020-12-25').' days before Christmas!'; - * }))); - * ``` - */ - public function map(callable $callback): Generator - { - foreach ($this as $date) { - yield $callback($date); - } - } - - /** - * Determines if the instance is equal to another. - * Warning: if options differ, instances will never be equal. - * - * @see equalTo() - */ - public function eq(mixed $period): bool - { - return $this->equalTo($period); - } - - /** - * Determines if the instance is equal to another. - * Warning: if options differ, instances will never be equal. - */ - public function equalTo(mixed $period): bool - { - if (!($period instanceof self)) { - $period = self::make($period); - } - - $end = $this->getEndDate(); - - return $period !== null - && $this->getDateInterval()->eq($period->getDateInterval()) - && $this->getStartDate()->eq($period->getStartDate()) - && ($end ? $end->eq($period->getEndDate()) : $this->getRecurrences() === $period->getRecurrences()) - && ($this->getOptions() & (~static::IMMUTABLE)) === ($period->getOptions() & (~static::IMMUTABLE)); - } - - /** - * Determines if the instance is not equal to another. - * Warning: if options differ, instances will never be equal. - * - * @see notEqualTo() - */ - public function ne(mixed $period): bool - { - return $this->notEqualTo($period); - } - - /** - * Determines if the instance is not equal to another. - * Warning: if options differ, instances will never be equal. - */ - public function notEqualTo(mixed $period): bool - { - return !$this->eq($period); - } - - /** - * Determines if the start date is before another given date. - * (Rather start/end are included by options is ignored.) - */ - public function startsBefore(mixed $date = null): bool - { - return $this->getStartDate()->lessThan($this->resolveCarbon($date)); - } - - /** - * Determines if the start date is before or the same as a given date. - * (Rather start/end are included by options is ignored.) - */ - public function startsBeforeOrAt(mixed $date = null): bool - { - return $this->getStartDate()->lessThanOrEqualTo($this->resolveCarbon($date)); - } - - /** - * Determines if the start date is after another given date. - * (Rather start/end are included by options is ignored.) - */ - public function startsAfter(mixed $date = null): bool - { - return $this->getStartDate()->greaterThan($this->resolveCarbon($date)); - } - - /** - * Determines if the start date is after or the same as a given date. - * (Rather start/end are included by options is ignored.) - */ - public function startsAfterOrAt(mixed $date = null): bool - { - return $this->getStartDate()->greaterThanOrEqualTo($this->resolveCarbon($date)); - } - - /** - * Determines if the start date is the same as a given date. - * (Rather start/end are included by options is ignored.) - */ - public function startsAt(mixed $date = null): bool - { - return $this->getStartDate()->equalTo($this->resolveCarbon($date)); - } - - /** - * Determines if the end date is before another given date. - * (Rather start/end are included by options is ignored.) - */ - public function endsBefore(mixed $date = null): bool - { - return $this->calculateEnd()->lessThan($this->resolveCarbon($date)); - } - - /** - * Determines if the end date is before or the same as a given date. - * (Rather start/end are included by options is ignored.) - */ - public function endsBeforeOrAt(mixed $date = null): bool - { - return $this->calculateEnd()->lessThanOrEqualTo($this->resolveCarbon($date)); - } - - /** - * Determines if the end date is after another given date. - * (Rather start/end are included by options is ignored.) - */ - public function endsAfter(mixed $date = null): bool - { - return $this->calculateEnd()->greaterThan($this->resolveCarbon($date)); - } - - /** - * Determines if the end date is after or the same as a given date. - * (Rather start/end are included by options is ignored.) - */ - public function endsAfterOrAt(mixed $date = null): bool - { - return $this->calculateEnd()->greaterThanOrEqualTo($this->resolveCarbon($date)); - } - - /** - * Determines if the end date is the same as a given date. - * (Rather start/end are included by options is ignored.) - */ - public function endsAt(mixed $date = null): bool - { - return $this->calculateEnd()->equalTo($this->resolveCarbon($date)); - } - - /** - * Return true if start date is now or later. - * (Rather start/end are included by options is ignored.) - */ - public function isStarted(): bool - { - return $this->startsBeforeOrAt(); - } - - /** - * Return true if end date is now or later. - * (Rather start/end are included by options is ignored.) - */ - public function isEnded(): bool - { - return $this->endsBeforeOrAt(); - } - - /** - * Return true if now is between start date (included) and end date (excluded). - * (Rather start/end are included by options is ignored.) - */ - public function isInProgress(): bool - { - return $this->isStarted() && !$this->isEnded(); - } - - /** - * Round the current instance at the given unit with given precision if specified and the given function. - */ - public function roundUnit( - string $unit, - DateInterval|float|int|string|null $precision = 1, - callable|string $function = 'round', - ): static { - $self = $this->copyIfImmutable(); - $self = $self->setStartDate($self->getStartDate()->roundUnit($unit, $precision, $function)); - - if ($self->endDate) { - $self = $self->setEndDate($self->getEndDate()->roundUnit($unit, $precision, $function)); - } - - return $self->setDateInterval($self->getDateInterval()->roundUnit($unit, $precision, $function)); - } - - /** - * Truncate the current instance at the given unit with given precision if specified. - */ - public function floorUnit(string $unit, DateInterval|float|int|string|null $precision = 1): static - { - return $this->roundUnit($unit, $precision, 'floor'); - } - - /** - * Ceil the current instance at the given unit with given precision if specified. - */ - public function ceilUnit(string $unit, DateInterval|float|int|string|null $precision = 1): static - { - return $this->roundUnit($unit, $precision, 'ceil'); - } - - /** - * Round the current instance second with given precision if specified (else period interval is used). - */ - public function round( - DateInterval|float|int|string|null $precision = null, - callable|string $function = 'round', - ): static { - return $this->roundWith( - $precision ?? $this->getDateInterval()->setLocalTranslator(TranslatorImmutable::get('en'))->forHumans(), - $function - ); - } - - /** - * Round the current instance second with given precision if specified (else period interval is used). - */ - public function floor(DateInterval|float|int|string|null $precision = null): static - { - return $this->round($precision, 'floor'); - } - - /** - * Ceil the current instance second with given precision if specified (else period interval is used). - */ - public function ceil(DateInterval|float|int|string|null $precision = null): static - { - return $this->round($precision, 'ceil'); - } - - /** - * Specify data which should be serialized to JSON. - * - * @link https://php.net/manual/en/jsonserializable.jsonserialize.php - * - * @return CarbonInterface[] - */ - public function jsonSerialize(): array - { - return $this->toArray(); - } - - /** - * Return true if the given date is between start and end. - */ - public function contains(mixed $date = null): bool - { - $startMethod = 'startsBefore'.($this->isStartIncluded() ? 'OrAt' : ''); - $endMethod = 'endsAfter'.($this->isEndIncluded() ? 'OrAt' : ''); - - return $this->$startMethod($date) && $this->$endMethod($date); - } - - /** - * Return true if the current period follows a given other period (with no overlap). - * For instance, [2019-08-01 -> 2019-08-12] follows [2019-07-29 -> 2019-07-31] - * Note than in this example, follows() would be false if 2019-08-01 or 2019-07-31 was excluded by options. - */ - public function follows(mixed $period, mixed ...$arguments): bool - { - $period = $this->resolveCarbonPeriod($period, ...$arguments); - - return $this->getIncludedStartDate()->equalTo($period->getIncludedEndDate()->add($period->getDateInterval())); - } - - /** - * Return true if the given other period follows the current one (with no overlap). - * For instance, [2019-07-29 -> 2019-07-31] is followed by [2019-08-01 -> 2019-08-12] - * Note than in this example, isFollowedBy() would be false if 2019-08-01 or 2019-07-31 was excluded by options. - */ - public function isFollowedBy(mixed $period, mixed ...$arguments): bool - { - $period = $this->resolveCarbonPeriod($period, ...$arguments); - - return $period->follows($this); - } - - /** - * Return true if the given period either follows or is followed by the current one. - * - * @see follows() - * @see isFollowedBy() - */ - public function isConsecutiveWith(mixed $period, mixed ...$arguments): bool - { - return $this->follows($period, ...$arguments) || $this->isFollowedBy($period, ...$arguments); - } - - public function __debugInfo(): array - { - $info = $this->baseDebugInfo(); - unset($info['start'], $info['end'], $info['interval'], $info['include_start_date'], $info['include_end_date']); - - return $info; - } - - /** - * Update properties after removing built-in filters. - */ - protected function updateInternalState(): void - { - if (!$this->hasFilter(static::END_DATE_FILTER)) { - $this->endDate = null; - } - - if (!$this->hasFilter(static::RECURRENCES_FILTER)) { - $this->carbonRecurrences = null; - } - } - - /** - * Create a filter tuple from raw parameters. - * - * Will create an automatic filter callback for one of Carbon's is* methods. - */ - protected function createFilterTuple(array $parameters): array - { - $method = array_shift($parameters); - - if (!$this->isCarbonPredicateMethod($method)) { - return [$method, array_shift($parameters)]; - } - - return [static fn ($date) => ([$date, $method])(...$parameters), $method]; - } - - /** - * Return whether given callable is a string pointing to one of Carbon's is* methods - * and should be automatically converted to a filter callback. - */ - protected function isCarbonPredicateMethod(callable|string $callable): bool - { - return \is_string($callable) && str_starts_with($callable, 'is') && - (method_exists($this->dateClass, $callable) || ([$this->dateClass, 'hasMacro'])($callable)); - } - - /** - * Recurrences filter callback (limits number of recurrences). - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - protected function filterRecurrences(CarbonInterface $current, int $key): bool|callable - { - if ($key < $this->carbonRecurrences) { - return true; - } - - return static::END_ITERATION; - } - - /** - * End date filter callback. - * - * @return bool|static::END_ITERATION - */ - protected function filterEndDate(CarbonInterface $current): bool|callable - { - if (!$this->isEndExcluded() && $current == $this->endDate) { - return true; - } - - if ($this->dateInterval->invert ? $current > $this->endDate : $current < $this->endDate) { - return true; - } - - return static::END_ITERATION; - } - - /** - * End iteration filter callback. - * - * @return static::END_ITERATION - */ - protected function endIteration(): callable - { - return static::END_ITERATION; - } - - /** - * Handle change of the parameters. - */ - protected function handleChangedParameters(): void - { - if (($this->getOptions() & static::IMMUTABLE) && $this->dateClass === Carbon::class) { - $this->dateClass = CarbonImmutable::class; - } elseif (!($this->getOptions() & static::IMMUTABLE) && $this->dateClass === CarbonImmutable::class) { - $this->dateClass = Carbon::class; - } - - $this->validationResult = null; - } - - /** - * Validate current date and stop iteration when necessary. - * - * Returns true when current date is valid, false if it is not, or static::END_ITERATION - * when iteration should be stopped. - * - * @return bool|static::END_ITERATION - */ - protected function validateCurrentDate(): bool|callable - { - if ($this->carbonCurrent === null) { - $this->rewind(); - } - - // Check after the first rewind to avoid repeating the initial validation. - return $this->validationResult ?? ($this->validationResult = $this->checkFilters()); - } - - /** - * Check whether current value and key pass all the filters. - * - * @return bool|static::END_ITERATION - */ - protected function checkFilters(): bool|callable - { - $current = $this->prepareForReturn($this->carbonCurrent); - - foreach ($this->filters as $tuple) { - $result = \call_user_func($tuple[0], $current->avoidMutation(), $this->key, $this); - - if ($result === static::END_ITERATION) { - return static::END_ITERATION; - } - - if (!$result) { - return false; - } - } - - return true; - } - - /** - * Prepare given date to be returned to the external logic. - * - * @param CarbonInterface $date - * - * @return CarbonInterface - */ - protected function prepareForReturn(CarbonInterface $date) - { - $date = ([$this->dateClass, 'make'])($date); - - if ($this->timezone) { - return $date->setTimezone($this->timezone); - } - - return $date; - } - - /** - * Keep incrementing the current date until a valid date is found or the iteration is ended. - * - * @throws RuntimeException - */ - protected function incrementCurrentDateUntilValid(): void - { - $attempts = 0; - - do { - $this->carbonCurrent = $this->carbonCurrent->add($this->dateInterval); - - $this->validationResult = null; - - if (++$attempts > static::NEXT_MAX_ATTEMPTS) { - throw new UnreachableException('Could not find next valid date.'); - } - } while ($this->validateCurrentDate() === false); - } - - /** - * Call given macro. - */ - protected function callMacro(string $name, array $parameters): mixed - { - $macro = static::$macros[$name]; - - if ($macro instanceof Closure) { - $boundMacro = @$macro->bindTo($this, static::class) ?: @$macro->bindTo(null, static::class); - - return ($boundMacro ?: $macro)(...$parameters); - } - - return $macro(...$parameters); - } - - /** - * Return the Carbon instance passed through, a now instance in the same timezone - * if null given or parse the input if string given. - * - * @param \Carbon\Carbon|\Carbon\CarbonPeriod|\Carbon\CarbonInterval|\DateInterval|\DatePeriod|\DateTimeInterface|string|null $date - * - * @return \Carbon\CarbonInterface - */ - protected function resolveCarbon($date = null) - { - return $this->getStartDate()->nowWithSameTz()->carbonize($date); - } - - /** - * Resolve passed arguments or DatePeriod to a CarbonPeriod object. - */ - protected function resolveCarbonPeriod(mixed $period, mixed ...$arguments): self - { - if ($period instanceof self) { - return $period; - } - - return $period instanceof DatePeriod - ? static::instance($period) - : static::create($period, ...$arguments); - } - - private function orderCouple($first, $second): array - { - return $first > $second ? [$second, $first] : [$first, $second]; - } - - private function makeDateTime($value): ?DateTimeInterface - { - if ($value instanceof DateTimeInterface) { - return $value; - } - - if ($value instanceof WeekDay || $value instanceof Month) { - $dateClass = $this->dateClass; - - return new $dateClass($value, $this->timezoneSetting); - } - - if (\is_string($value)) { - $value = trim($value); - - if (!preg_match('/^P[\dT]/', $value) && - !preg_match('/^R\d/', $value) && - preg_match('/[a-z\d]/i', $value) - ) { - $dateClass = $this->dateClass; - - return $dateClass::parse($value, $this->timezoneSetting); - } - } - - return null; - } - - private function isInfiniteDate($date): bool - { - return $date instanceof CarbonInterface && ($date->isEndOfTime() || $date->isStartOfTime()); - } - - private function rawDate($date): ?DateTimeInterface - { - if ($date === false || $date === null) { - return null; - } - - if ($date instanceof CarbonInterface) { - return $date->isMutable() - ? $date->toDateTime() - : $date->toDateTimeImmutable(); - } - - if (\in_array(\get_class($date), [DateTime::class, DateTimeImmutable::class], true)) { - return $date; - } - - $class = $date instanceof DateTime ? DateTime::class : DateTimeImmutable::class; - - return new $class($date->format('Y-m-d H:i:s.u'), $date->getTimezone()); - } - - private static function setDefaultParameters(array &$parameters, array $defaults): void - { - foreach ($defaults as [$index, $name, $value]) { - if (!\array_key_exists($index, $parameters) && !\array_key_exists($name, $parameters)) { - $parameters[$index] = $value; - } - } - } - - private function setFromAssociativeArray(array $parameters): void - { - if (isset($parameters['start'])) { - $this->setStartDate($parameters['start']); - } - - if (isset($parameters['start'])) { - $this->setStartDate($parameters['start']); - } - - if (isset($parameters['end'])) { - $this->setEndDate($parameters['end']); - } - - if (isset($parameters['recurrences'])) { - $this->setRecurrences($parameters['recurrences']); - } - - if (isset($parameters['interval'])) { - $this->setDateInterval($parameters['interval']); - } - - if (isset($parameters['options'])) { - $this->setOptions($parameters['options']); - } - } - - private function configureTimezone(DateTimeZone $timezone, array $sortedArguments, array $originalArguments): array - { - $this->setTimezone($timezone); - - if (\is_string($originalArguments['start'] ?? null)) { - $sortedArguments['start'] = $this->makeDateTime($originalArguments['start']); - } - - if (\is_string($originalArguments['end'] ?? null)) { - $sortedArguments['end'] = $this->makeDateTime($originalArguments['end']); - } - - return $sortedArguments; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php b/vendor/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php deleted file mode 100644 index 0e8ff28..0000000 --- a/vendor/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -class CarbonPeriodImmutable extends CarbonPeriod -{ - /** - * Default date class of iteration items. - * - * @var string - */ - protected const DEFAULT_DATE_CLASS = CarbonImmutable::class; - - /** - * Date class of iteration items. - */ - protected string $dateClass = CarbonImmutable::class; - - /** - * Prepare the instance to be set (self if mutable to be mutated, - * copy if immutable to generate a new instance). - */ - protected function copyIfImmutable(): static - { - return $this->constructed ? clone $this : $this; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php b/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php deleted file mode 100644 index 974efcb..0000000 --- a/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php +++ /dev/null @@ -1,322 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Carbon\Exceptions\InvalidCastException; -use Carbon\Exceptions\InvalidTimeZoneException; -use Carbon\Traits\LocalFactory; -use DateTimeInterface; -use DateTimeZone; -use Exception; -use Throwable; - -class CarbonTimeZone extends DateTimeZone -{ - use LocalFactory; - - public const MAXIMUM_TIMEZONE_OFFSET = 99; - - public function __construct(string|int|float $timezone) - { - $this->initLocalFactory(); - - parent::__construct(static::getDateTimeZoneNameFromMixed($timezone)); - } - - protected static function parseNumericTimezone(string|int|float $timezone): string - { - if (abs((float) $timezone) > static::MAXIMUM_TIMEZONE_OFFSET) { - throw new InvalidTimeZoneException( - 'Absolute timezone offset cannot be greater than '. - static::MAXIMUM_TIMEZONE_OFFSET.'.', - ); - } - - return ($timezone >= 0 ? '+' : '').ltrim((string) $timezone, '+').':00'; - } - - protected static function getDateTimeZoneNameFromMixed(string|int|float $timezone): string - { - if (\is_string($timezone)) { - $timezone = preg_replace('/^\s*([+-]\d+)(\d{2})\s*$/', '$1:$2', $timezone); - } - - if (is_numeric($timezone)) { - return static::parseNumericTimezone($timezone); - } - - return $timezone; - } - - /** - * Cast the current instance into the given class. - * - * @param class-string $className The $className::instance() method will be called to cast the current object. - * - * @return DateTimeZone|mixed - */ - public function cast(string $className): mixed - { - if (!method_exists($className, 'instance')) { - if (is_a($className, DateTimeZone::class, true)) { - return new $className($this->getName()); - } - - throw new InvalidCastException("$className has not the instance() method needed to cast the date."); - } - - return $className::instance($this); - } - - /** - * Create a CarbonTimeZone from mixed input. - * - * @param DateTimeZone|string|int|false|null $object original value to get CarbonTimeZone from it. - * @param DateTimeZone|string|int|false|null $objectDump dump of the object for error messages. - * - * @throws InvalidTimeZoneException - * - * @return static|null - */ - public static function instance( - DateTimeZone|string|int|false|null $object, - DateTimeZone|string|int|false|null $objectDump = null, - ): ?self { - $timezone = $object; - - if ($timezone instanceof static) { - return $timezone; - } - - if ($timezone === null || $timezone === false) { - return null; - } - - try { - if (!($timezone instanceof DateTimeZone)) { - $name = static::getDateTimeZoneNameFromMixed($object); - $timezone = new static($name); - } - - return $timezone instanceof static ? $timezone : new static($timezone->getName()); - } catch (Exception $exception) { - throw new InvalidTimeZoneException( - 'Unknown or bad timezone ('.($objectDump ?: $object).')', - previous: $exception, - ); - } - } - - /** - * Returns abbreviated name of the current timezone according to DST setting. - * - * @param bool $dst - * - * @return string - */ - public function getAbbreviatedName(bool $dst = false): string - { - $name = $this->getName(); - - foreach ($this->listAbbreviations() as $abbreviation => $zones) { - foreach ($zones as $zone) { - if ($zone['timezone_id'] === $name && $zone['dst'] == $dst) { - return $abbreviation; - } - } - } - - return 'unknown'; - } - - /** - * @alias getAbbreviatedName - * - * Returns abbreviated name of the current timezone according to DST setting. - * - * @param bool $dst - * - * @return string - */ - public function getAbbr(bool $dst = false): string - { - return $this->getAbbreviatedName($dst); - } - - /** - * Get the offset as string "sHH:MM" (such as "+00:00" or "-12:30"). - */ - public function toOffsetName(?DateTimeInterface $date = null): string - { - return static::getOffsetNameFromMinuteOffset( - $this->getOffset($this->resolveCarbon($date)) / 60, - ); - } - - /** - * Returns a new CarbonTimeZone object using the offset string instead of region string. - */ - public function toOffsetTimeZone(?DateTimeInterface $date = null): static - { - return new static($this->toOffsetName($date)); - } - - /** - * Returns the first region string (such as "America/Toronto") that matches the current timezone or - * false if no match is found. - * - * @see timezone_name_from_abbr native PHP function. - */ - public function toRegionName(?DateTimeInterface $date = null, int $isDST = 1): ?string - { - $name = $this->getName(); - $firstChar = substr($name, 0, 1); - - if ($firstChar !== '+' && $firstChar !== '-') { - return $name; - } - - $date = $this->resolveCarbon($date); - - // Integer construction no longer supported since PHP 8 - // @codeCoverageIgnoreStart - try { - $offset = @$this->getOffset($date) ?: 0; - } catch (Throwable) { - $offset = 0; - } - // @codeCoverageIgnoreEnd - - $name = @timezone_name_from_abbr('', $offset, $isDST); - - if ($name) { - return $name; - } - - foreach (timezone_identifiers_list() as $timezone) { - if (Carbon::instance($date)->setTimezone($timezone)->getOffset() === $offset) { - return $timezone; - } - } - - return null; - } - - /** - * Returns a new CarbonTimeZone object using the region string instead of offset string. - */ - public function toRegionTimeZone(?DateTimeInterface $date = null): ?self - { - $timezone = $this->toRegionName($date); - - if ($timezone !== null) { - return new static($timezone); - } - - if (Carbon::isStrictModeEnabled()) { - throw new InvalidTimeZoneException('Unknown timezone for offset '.$this->getOffset($this->resolveCarbon($date)).' seconds.'); - } - - return null; - } - - /** - * Cast to string (get timezone name). - * - * @return string - */ - public function __toString() - { - return $this->getName(); - } - - /** - * Return the type number: - * - * Type 1; A UTC offset, such as -0300 - * Type 2; A timezone abbreviation, such as GMT - * Type 3: A timezone identifier, such as Europe/London - */ - public function getType(): int - { - return preg_match('/"timezone_type";i:(\d)/', serialize($this), $match) ? (int) $match[1] : 3; - } - - /** - * Create a CarbonTimeZone from mixed input. - * - * @param DateTimeZone|string|int|null $object - * - * @return false|static - */ - public static function create($object = null) - { - return static::instance($object); - } - - /** - * Create a CarbonTimeZone from int/float hour offset. - * - * @param float $hourOffset number of hour of the timezone shift (can be decimal). - * - * @return false|static - */ - public static function createFromHourOffset(float $hourOffset) - { - return static::createFromMinuteOffset($hourOffset * Carbon::MINUTES_PER_HOUR); - } - - /** - * Create a CarbonTimeZone from int/float minute offset. - * - * @param float $minuteOffset number of total minutes of the timezone shift. - * - * @return false|static - */ - public static function createFromMinuteOffset(float $minuteOffset) - { - return static::instance(static::getOffsetNameFromMinuteOffset($minuteOffset)); - } - - /** - * Convert a total minutes offset into a standardized timezone offset string. - * - * @param float $minutes number of total minutes of the timezone shift. - * - * @return string - */ - public static function getOffsetNameFromMinuteOffset(float $minutes): string - { - $minutes = round($minutes); - $unsignedMinutes = abs($minutes); - - return ($minutes < 0 ? '-' : '+'). - str_pad((string) floor($unsignedMinutes / 60), 2, '0', STR_PAD_LEFT). - ':'. - str_pad((string) ($unsignedMinutes % 60), 2, '0', STR_PAD_LEFT); - } - - private function resolveCarbon(?DateTimeInterface $date): DateTimeInterface - { - if ($date) { - return $date; - } - - if (isset($this->clock)) { - return $this->clock->now()->setTimezone($this); - } - - return Carbon::now($this); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php b/vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php deleted file mode 100644 index 3aabe3f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Cli; - -class Invoker -{ - public const CLI_CLASS_NAME = 'Carbon\\Cli'; - - protected function runWithCli(string $className, array $parameters): bool - { - $cli = new $className(); - - return $cli(...$parameters); - } - - public function __invoke(...$parameters): bool - { - if (class_exists(self::CLI_CLASS_NAME)) { - return $this->runWithCli(self::CLI_CLASS_NAME, $parameters); - } - - $function = (($parameters[1] ?? '') === 'install' ? ($parameters[2] ?? null) : null) ?: 'shell_exec'; - $function('composer require carbon-cli/carbon-cli --no-interaction'); - - echo 'Installation succeeded.'; - - return true; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php deleted file mode 100644 index db1ea8e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use Throwable; - -class BadComparisonUnitException extends UnitException -{ - /** - * The unit. - * - * @var string - */ - protected $unit; - - /** - * Constructor. - * - * @param string $unit - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($unit, $code = 0, ?Throwable $previous = null) - { - $this->unit = $unit; - - parent::__construct("Bad comparison unit: '$unit'", $code, $previous); - } - - /** - * Get the unit. - * - * @return string - */ - public function getUnit(): string - { - return $this->unit; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php deleted file mode 100644 index e8cded0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use BadMethodCallException as BaseBadMethodCallException; -use Throwable; - -class BadFluentConstructorException extends BaseBadMethodCallException implements BadMethodCallException -{ - /** - * The method. - * - * @var string - */ - protected $method; - - /** - * Constructor. - * - * @param string $method - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($method, $code = 0, ?Throwable $previous = null) - { - $this->method = $method; - - parent::__construct(\sprintf("Unknown fluent constructor '%s'.", $method), $code, $previous); - } - - /** - * Get the method. - * - * @return string - */ - public function getMethod(): string - { - return $this->method; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php deleted file mode 100644 index b3111bf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use BadMethodCallException as BaseBadMethodCallException; -use Throwable; - -class BadFluentSetterException extends BaseBadMethodCallException implements BadMethodCallException -{ - /** - * The setter. - * - * @var string - */ - protected $setter; - - /** - * Constructor. - * - * @param string $setter - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($setter, $code = 0, ?Throwable $previous = null) - { - $this->setter = $setter; - - parent::__construct(\sprintf("Unknown fluent setter '%s'", $setter), $code, $previous); - } - - /** - * Get the setter. - * - * @return string - */ - public function getSetter(): string - { - return $this->setter; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php deleted file mode 100644 index 3f10af9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -interface BadMethodCallException extends Exception -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php deleted file mode 100644 index a3d764e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use RuntimeException as BaseRuntimeException; - -final class EndLessPeriodException extends BaseRuntimeException implements RuntimeException -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php deleted file mode 100644 index ee42fd6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -interface Exception -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php deleted file mode 100644 index e8550a5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use RuntimeException as BaseRuntimeException; -use Throwable; - -class ImmutableException extends BaseRuntimeException implements RuntimeException -{ - /** - * The value. - * - * @var string - */ - protected $value; - - /** - * Constructor. - * - * @param string $value the immutable type/value - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($value, $code = 0, ?Throwable $previous = null) - { - $this->value = $value; - parent::__construct("$value is immutable.", $code, $previous); - } - - /** - * Get the value. - * - * @return string - */ - public function getValue(): string - { - return $this->value; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php deleted file mode 100644 index 7fb5a99..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -interface InvalidArgumentException extends Exception -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php deleted file mode 100644 index c0ebe49..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; - -class InvalidCastException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php deleted file mode 100644 index 8396fdc..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; - -class InvalidDateException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * The invalid field. - * - * @var string - */ - private $field; - - /** - * The invalid value. - * - * @var mixed - */ - private $value; - - /** - * Constructor. - * - * @param string $field - * @param mixed $value - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($field, $value, $code = 0, ?Throwable $previous = null) - { - $this->field = $field; - $this->value = $value; - parent::__construct($field.' : '.$value.' is not a valid value.', $code, $previous); - } - - /** - * Get the invalid field. - * - * @return string - */ - public function getField() - { - return $this->field; - } - - /** - * Get the invalid value. - * - * @return mixed - */ - public function getValue() - { - return $this->value; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php deleted file mode 100644 index ffc5f21..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; - -class InvalidFormatException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php deleted file mode 100644 index 7390f41..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; - -class InvalidIntervalException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php deleted file mode 100644 index dc2f8ad..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; - -class InvalidPeriodDateException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php deleted file mode 100644 index f6c33fd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; - -class InvalidPeriodParameterException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php deleted file mode 100644 index 33052e2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; - -class InvalidTimeZoneException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php deleted file mode 100644 index 1cd485f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; - -class InvalidTypeException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php deleted file mode 100644 index fcc0c2c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use Carbon\CarbonInterface; -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; - -class NotACarbonClassException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * The className. - * - * @var string - */ - protected $className; - - /** - * Constructor. - * - * @param string $className - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($className, $code = 0, ?Throwable $previous = null) - { - $this->className = $className; - - parent::__construct(\sprintf( - 'Given class does not implement %s: %s', - CarbonInterface::class, - $className, - ), $code, $previous); - } - - /** - * Get the className. - * - * @return string - */ - public function getClassName(): string - { - return $this->className; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php deleted file mode 100644 index 23e09a2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; - -class NotAPeriodException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php deleted file mode 100644 index 76158eb..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; - -class NotLocaleAwareException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * Constructor. - * - * @param mixed $object - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($object, $code = 0, ?Throwable $previous = null) - { - $dump = \is_object($object) ? \get_class($object) : \gettype($object); - - parent::__construct("$dump does neither implements Symfony\Contracts\Translation\LocaleAwareInterface nor getLocale() method.", $code, $previous); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php deleted file mode 100644 index 8fd44fd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; - -// This will extends OutOfRangeException instead of InvalidArgumentException since 3.0.0 -// use OutOfRangeException as BaseOutOfRangeException; - -class OutOfRangeException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * The unit or name of the value. - * - * @var string - */ - private $unit; - - /** - * The range minimum. - * - * @var mixed - */ - private $min; - - /** - * The range maximum. - * - * @var mixed - */ - private $max; - - /** - * The invalid value. - * - * @var mixed - */ - private $value; - - /** - * Constructor. - * - * @param string $unit - * @param mixed $min - * @param mixed $max - * @param mixed $value - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($unit, $min, $max, $value, $code = 0, ?Throwable $previous = null) - { - $this->unit = $unit; - $this->min = $min; - $this->max = $max; - $this->value = $value; - - parent::__construct("$unit must be between $min and $max, $value given", $code, $previous); - } - - /** - * @return mixed - */ - public function getMax() - { - return $this->max; - } - - /** - * @return mixed - */ - public function getMin() - { - return $this->min; - } - - /** - * @return mixed - */ - public function getUnit() - { - return $this->unit; - } - - /** - * @return mixed - */ - public function getValue() - { - return $this->value; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php deleted file mode 100644 index 556bfed..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; - -class ParseErrorException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * The expected. - * - * @var string - */ - protected $expected; - - /** - * The actual. - * - * @var string - */ - protected $actual; - - /** - * The help message. - * - * @var string - */ - protected $help; - - /** - * Constructor. - * - * @param string $expected - * @param string $actual - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($expected, $actual, $help = '', $code = 0, ?Throwable $previous = null) - { - $this->expected = $expected; - $this->actual = $actual; - $this->help = $help; - - $actual = $actual === '' ? 'data is missing' : "get '$actual'"; - - parent::__construct(trim("Format expected $expected but $actual\n$help"), $code, $previous); - } - - /** - * Get the expected. - * - * @return string - */ - public function getExpected(): string - { - return $this->expected; - } - - /** - * Get the actual. - * - * @return string - */ - public function getActual(): string - { - return $this->actual; - } - - /** - * Get the help message. - * - * @return string - */ - public function getHelp(): string - { - return $this->help; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php deleted file mode 100644 index 85bfb14..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -interface RuntimeException extends Exception -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php deleted file mode 100644 index 4f410c1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; - -class UnitException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php deleted file mode 100644 index b95784d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use Throwable; - -class UnitNotConfiguredException extends UnitException -{ - /** - * The unit. - * - * @var string - */ - protected $unit; - - /** - * Constructor. - * - * @param string $unit - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($unit, $code = 0, ?Throwable $previous = null) - { - $this->unit = $unit; - - parent::__construct("Unit $unit have no configuration to get total from other units.", $code, $previous); - } - - /** - * Get the unit. - * - * @return string - */ - public function getUnit(): string - { - return $this->unit; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php deleted file mode 100644 index 982a308..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; - -class UnknownGetterException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * The getter. - * - * @var string - */ - protected $getter; - - /** - * Constructor. - * - * @param string $getter getter name - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($getter, $code = 0, ?Throwable $previous = null) - { - $this->getter = $getter; - - parent::__construct("Unknown getter '$getter'", $code, $previous); - } - - /** - * Get the getter. - * - * @return string - */ - public function getGetter(): string - { - return $this->getter; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php deleted file mode 100644 index c72c368..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use BadMethodCallException as BaseBadMethodCallException; -use Throwable; - -class UnknownMethodException extends BaseBadMethodCallException implements BadMethodCallException -{ - /** - * The method. - * - * @var string - */ - protected $method; - - /** - * Constructor. - * - * @param string $method - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($method, $code = 0, ?Throwable $previous = null) - { - $this->method = $method; - - parent::__construct("Method $method does not exist.", $code, $previous); - } - - /** - * Get the method. - * - * @return string - */ - public function getMethod(): string - { - return $this->method; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php deleted file mode 100644 index e97db4b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; - -class UnknownSetterException extends BaseInvalidArgumentException implements BadMethodCallException -{ - /** - * The setter. - * - * @var string - */ - protected $setter; - - /** - * Constructor. - * - * @param string $setter setter name - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($setter, $code = 0, ?Throwable $previous = null) - { - $this->setter = $setter; - - parent::__construct("Unknown setter '$setter'", $code, $previous); - } - - /** - * Get the setter. - * - * @return string - */ - public function getSetter(): string - { - return $this->setter; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php deleted file mode 100644 index 833c4d7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use Throwable; - -class UnknownUnitException extends UnitException -{ - /** - * The unit. - * - * @var string - */ - protected $unit; - - /** - * Constructor. - * - * @param string $unit - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($unit, $code = 0, ?Throwable $previous = null) - { - $this->unit = $unit; - - parent::__construct("Unknown unit '$unit'.", $code, $previous); - } - - /** - * Get the unit. - * - * @return string - */ - public function getUnit(): string - { - return $this->unit; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php deleted file mode 100644 index c637d3b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use RuntimeException as BaseRuntimeException; - -class UnreachableException extends BaseRuntimeException implements RuntimeException -{ - // -} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php deleted file mode 100644 index 52a546c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Exceptions; - -use Exception; - -/** - * @codeCoverageIgnore - */ -class UnsupportedUnitException extends UnitException -{ - public function __construct(string $unit, int $code = 0, ?Exception $previous = null) - { - parent::__construct("Unsupported unit '$unit'", $code, $previous); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Factory.php b/vendor/nesbot/carbon/src/Carbon/Factory.php deleted file mode 100644 index 31273ba..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Factory.php +++ /dev/null @@ -1,846 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Closure; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use InvalidArgumentException; -use ReflectionMethod; -use RuntimeException; -use Symfony\Contracts\Translation\TranslatorInterface; -use Throwable; - -/** - * A factory to generate Carbon instances with common settings. - * - * - * - * @method bool canBeCreatedFromFormat(?string $date, string $format) Checks if the (date)time string is in a given format and valid to create a - * new instance. - * @method ?Carbon create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $timezone = null) Create a new Carbon instance from a specific date and time. - * If any of $year, $month or $day are set to null their now() values will - * be used. - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * If $hour is not null then the default values for $minute and $second - * will be 0. - * @method Carbon createFromDate($year = null, $month = null, $day = null, $timezone = null) Create a Carbon instance from just a date. The time portion is set to now. - * @method ?Carbon createFromFormat($format, $time, $timezone = null) Create a Carbon instance from a specific format. - * @method ?Carbon createFromIsoFormat(string $format, string $time, $timezone = null, ?string $locale = 'en', ?TranslatorInterface $translator = null) Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). - * @method ?Carbon createFromLocaleFormat(string $format, string $locale, string $time, $timezone = null) Create a Carbon instance from a specific format and a string in a given language. - * @method ?Carbon createFromLocaleIsoFormat(string $format, string $locale, string $time, $timezone = null) Create a Carbon instance from a specific ISO format and a string in a given language. - * @method Carbon createFromTime($hour = 0, $minute = 0, $second = 0, $timezone = null) Create a Carbon instance from just a time. The date portion is set to today. - * @method Carbon createFromTimeString(string $time, DateTimeZone|string|int|null $timezone = null) Create a Carbon instance from a time string. The date portion is set to today. - * @method Carbon createFromTimestamp(string|int|float $timestamp, DateTimeZone|string|int|null $timezone = null) Create a Carbon instance from a timestamp and set the timezone (UTC by default). - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method Carbon createFromTimestampMs(string|int|float $timestamp, DateTimeZone|string|int|null $timezone = null) Create a Carbon instance from a timestamp in milliseconds. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method Carbon createFromTimestampMsUTC($timestamp) Create a Carbon instance from a timestamp in milliseconds. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method Carbon createFromTimestampUTC(string|int|float $timestamp) Create a Carbon instance from a timestamp keeping the timezone to UTC. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method Carbon createMidnightDate($year = null, $month = null, $day = null, $timezone = null) Create a Carbon instance from just a date. The time portion is set to midnight. - * @method ?Carbon createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $timezone = null) Create a new safe Carbon instance from a specific date and time. - * If any of $year, $month or $day are set to null their now() values will - * be used. - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * If $hour is not null then the default values for $minute and $second - * will be 0. - * If one of the set values is not valid, an InvalidDateException - * will be thrown. - * @method Carbon createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $timezone = null) Create a new Carbon instance from a specific date and time using strict validation. - * @method mixed executeWithLocale(string $locale, callable $func) Set the current locale to the given, execute the passed function, reset the locale to previous one, - * then return the result of the closure (or null if the closure was void). - * @method Carbon fromSerialized($value) Create an instance from a serialized string. - * @method array getAvailableLocales() Returns the list of internally available locales and already loaded custom locales. - * (It will ignore custom translator dynamic loading.) - * @method Language[] getAvailableLocalesInfo() Returns list of Language object for each available locale. This object allow you to get the ISO name, native - * name, region and variant of the locale. - * @method array getDays() Get the days of the week. - * @method ?string getFallbackLocale() Get the fallback locale. - * @method array getFormatsToIsoReplacements() List of replacements from date() format to isoFormat(). - * @method array getIsoUnits() Returns list of locale units for ISO formatting. - * @method array|false getLastErrors() {@inheritdoc} - * @method string getLocale() Get the current translator locale. - * @method int getMidDayAt() get midday/noon hour - * @method string getTimeFormatByPrecision(string $unitPrecision) Return a format from H:i to H:i:s.u according to given unit precision. - * @method string|Closure|null getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null) Returns raw translation message for a given key. - * @method int getWeekEndsAt(?string $locale = null) Get the last day of week. - * @method int getWeekStartsAt(?string $locale = null) Get the first day of week. - * @method bool hasRelativeKeywords(?string $time) Determine if a time string will produce a relative date. - * @method Carbon instance(DateTimeInterface $date) Create a Carbon instance from a DateTime one. - * @method bool isImmutable() Returns true if the current class/instance is immutable. - * @method bool isModifiableUnit($unit) Returns true if a property can be changed via setter. - * @method bool isMutable() Returns true if the current class/instance is mutable. - * @method bool localeHasDiffOneDayWords(string $locale) Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). - * Support is considered enabled if the 3 words are translated in the given locale. - * @method bool localeHasDiffSyntax(string $locale) Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * @method bool localeHasDiffTwoDayWords(string $locale) Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). - * Support is considered enabled if the 2 words are translated in the given locale. - * @method bool localeHasPeriodSyntax($locale) Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * @method bool localeHasShortUnits(string $locale) Returns true if the given locale is internally supported and has short-units support. - * Support is considered enabled if either year, day or hour has a short variant translated. - * @method ?Carbon make($var, DateTimeZone|string|null $timezone = null) Make a Carbon instance from given variable if possible. - * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals - * and recurrences). Throw an exception for invalid format, but otherwise return null. - * @method void mixin(object|string $mixin) Mix another object into the class. - * @method Carbon now(DateTimeZone|string|int|null $timezone = null) Get a Carbon instance for the current date and time. - * @method Carbon parse(DateTimeInterface|WeekDay|Month|string|int|float|null $time, DateTimeZone|string|int|null $timezone = null) Create a carbon instance from a string. - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * @method Carbon parseFromLocale(string $time, ?string $locale = null, DateTimeZone|string|int|null $timezone = null) Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). - * @method string pluralUnit(string $unit) Returns standardized plural of a given singular/plural unit name (in English). - * @method ?Carbon rawCreateFromFormat(string $format, string $time, $timezone = null) Create a Carbon instance from a specific format. - * @method Carbon rawParse(DateTimeInterface|WeekDay|Month|string|int|float|null $time, DateTimeZone|string|int|null $timezone = null) Create a carbon instance from a string. - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * @method void setFallbackLocale(string $locale) Set the fallback locale. - * @method void setLocale(string $locale) Set the current translator locale and indicate if the source locale file exists. - * Pass 'auto' as locale to use the closest language to the current LC_TIME locale. - * @method void setMidDayAt($hour) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider mid-day is always 12pm, then if you need to test if it's an other - * hour, test it explicitly: - * $date->format('G') == 13 - * or to set explicitly to a given hour: - * $date->setTime(13, 0, 0, 0) - * Set midday/noon hour - * @method string singularUnit(string $unit) Returns standardized singular of a given singular/plural unit name (in English). - * @method void sleep(int|float $seconds) - * @method Carbon today(DateTimeZone|string|int|null $timezone = null) Create a Carbon instance for today. - * @method Carbon tomorrow(DateTimeZone|string|int|null $timezone = null) Create a Carbon instance for tomorrow. - * @method string translateTimeString(string $timeString, ?string $from = null, ?string $to = null, int $mode = CarbonInterface::TRANSLATE_ALL) Translate a time string from a locale to an other. - * @method string translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null) Translate using translation string or callback available. - * @method Carbon yesterday(DateTimeZone|string|int|null $timezone = null) Create a Carbon instance for yesterday. - * - * - */ -class Factory -{ - protected string $className = Carbon::class; - - protected array $settings = []; - - /** - * A test Carbon instance to be returned when now instances are created. - */ - protected Closure|CarbonInterface|null $testNow = null; - - /** - * The timezone to restore to when clearing the time mock. - */ - protected ?string $testDefaultTimezone = null; - - /** - * Is true when test-now is generated by a closure and timezone should be taken on the fly from it. - */ - protected bool $useTimezoneFromTestNow = false; - - /** - * Default translator. - */ - protected TranslatorInterface $translator; - - /** - * Days of weekend. - */ - protected array $weekendDays = [ - CarbonInterface::SATURDAY, - CarbonInterface::SUNDAY, - ]; - - /** - * Format regex patterns. - * - * @var array - */ - protected array $regexFormats = [ - 'd' => '(3[01]|[12][0-9]|0[1-9])', - 'D' => '(Sun|Mon|Tue|Wed|Thu|Fri|Sat)', - 'j' => '([123][0-9]|[1-9])', - 'l' => '([a-zA-Z]{2,})', - 'N' => '([1-7])', - 'S' => '(st|nd|rd|th)', - 'w' => '([0-6])', - 'z' => '(36[0-5]|3[0-5][0-9]|[12][0-9]{2}|[1-9]?[0-9])', - 'W' => '(5[012]|[1-4][0-9]|0?[1-9])', - 'F' => '([a-zA-Z]{2,})', - 'm' => '(1[012]|0[1-9])', - 'M' => '([a-zA-Z]{3})', - 'n' => '(1[012]|[1-9])', - 't' => '(2[89]|3[01])', - 'L' => '(0|1)', - 'o' => '([1-9][0-9]{0,4})', - 'Y' => '([1-9]?[0-9]{4})', - 'y' => '([0-9]{2})', - 'a' => '(am|pm)', - 'A' => '(AM|PM)', - 'B' => '([0-9]{3})', - 'g' => '(1[012]|[1-9])', - 'G' => '(2[0-3]|1?[0-9])', - 'h' => '(1[012]|0[1-9])', - 'H' => '(2[0-3]|[01][0-9])', - 'i' => '([0-5][0-9])', - 's' => '([0-5][0-9])', - 'u' => '([0-9]{1,6})', - 'v' => '([0-9]{1,3})', - 'e' => '([a-zA-Z]{1,5})|([a-zA-Z]*\\/[a-zA-Z]*)', - 'I' => '(0|1)', - 'O' => '([+-](1[0123]|0[0-9])[0134][05])', - 'P' => '([+-](1[0123]|0[0-9]):[0134][05])', - 'p' => '(Z|[+-](1[0123]|0[0-9]):[0134][05])', - 'T' => '([a-zA-Z]{1,5})', - 'Z' => '(-?[1-5]?[0-9]{1,4})', - 'U' => '([0-9]*)', - - // The formats below are combinations of the above formats. - 'c' => '(([1-9]?[0-9]{4})-(1[012]|0[1-9])-(3[01]|[12][0-9]|0[1-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])[+-](1[012]|0[0-9]):([0134][05]))', // Y-m-dTH:i:sP - 'r' => '(([a-zA-Z]{3}), ([123][0-9]|0[1-9]) ([a-zA-Z]{3}) ([1-9]?[0-9]{4}) (2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9]) [+-](1[012]|0[0-9])([0134][05]))', // D, d M Y H:i:s O - ]; - - /** - * Format modifiers (such as available in createFromFormat) regex patterns. - * - * @var array - */ - protected array $regexFormatModifiers = [ - '*' => '.+', - ' ' => '[ ]', - '#' => '[;:\\/.,()-]', - '?' => '([^a]|[a])', - '!' => '', - '|' => '', - '+' => '', - ]; - - public function __construct(array $settings = [], ?string $className = null) - { - if ($className) { - $this->className = $className; - } - - $this->settings = $settings; - } - - public function getClassName(): string - { - return $this->className; - } - - public function setClassName(string $className): self - { - $this->className = $className; - - return $this; - } - - public function className(?string $className = null): self|string - { - return $className === null ? $this->getClassName() : $this->setClassName($className); - } - - public function getSettings(): array - { - return $this->settings; - } - - public function setSettings(array $settings): self - { - $this->settings = $settings; - - return $this; - } - - public function settings(?array $settings = null): self|array - { - return $settings === null ? $this->getSettings() : $this->setSettings($settings); - } - - public function mergeSettings(array $settings): self - { - $this->settings = array_merge($this->settings, $settings); - - return $this; - } - - public function setHumanDiffOptions(int $humanDiffOptions): void - { - $this->mergeSettings([ - 'humanDiffOptions' => $humanDiffOptions, - ]); - } - - public function enableHumanDiffOption($humanDiffOption): void - { - $this->setHumanDiffOptions($this->getHumanDiffOptions() | $humanDiffOption); - } - - public function disableHumanDiffOption(int $humanDiffOption): void - { - $this->setHumanDiffOptions($this->getHumanDiffOptions() & ~$humanDiffOption); - } - - public function getHumanDiffOptions(): int - { - return (int) ($this->getSettings()['humanDiffOptions'] ?? 0); - } - - /** - * Register a custom macro. - * - * Pass null macro to remove it. - * - * @example - * ``` - * $userSettings = [ - * 'locale' => 'pt', - * 'timezone' => 'America/Sao_Paulo', - * ]; - * $factory->macro('userFormat', function () use ($userSettings) { - * return $this->copy()->locale($userSettings['locale'])->tz($userSettings['timezone'])->calendar(); - * }); - * echo $factory->yesterday()->hours(11)->userFormat(); - * ``` - */ - public function macro(string $name, ?callable $macro): void - { - $macros = $this->getSettings()['macros'] ?? []; - $macros[$name] = $macro; - - $this->mergeSettings([ - 'macros' => $macros, - ]); - } - - /** - * Remove all macros and generic macros. - */ - public function resetMacros(): void - { - $this->mergeSettings([ - 'macros' => null, - 'genericMacros' => null, - ]); - } - - /** - * Register a custom macro. - * - * @param callable $macro - * @param int $priority marco with higher priority is tried first - * - * @return void - */ - public function genericMacro(callable $macro, int $priority = 0): void - { - $genericMacros = $this->getSettings()['genericMacros'] ?? []; - - if (!isset($genericMacros[$priority])) { - $genericMacros[$priority] = []; - krsort($genericMacros, SORT_NUMERIC); - } - - $genericMacros[$priority][] = $macro; - - $this->mergeSettings([ - 'genericMacros' => $genericMacros, - ]); - } - - /** - * Checks if macro is registered globally. - */ - public function hasMacro(string $name): bool - { - return isset($this->getSettings()['macros'][$name]); - } - - /** - * Get the raw callable macro registered globally for a given name. - */ - public function getMacro(string $name): ?callable - { - return $this->getSettings()['macros'][$name] ?? null; - } - - /** - * Set the default translator instance to use. - */ - public function setTranslator(TranslatorInterface $translator): void - { - $this->translator = $translator; - } - - /** - * Initialize the default translator instance if necessary. - */ - public function getTranslator(): TranslatorInterface - { - return $this->translator ??= Translator::get(); - } - - /** - * Reset the format used to the default when type juggling a Carbon instance to a string - * - * @return void - */ - public function resetToStringFormat(): void - { - $this->setToStringFormat(null); - } - - /** - * Set the default format used when type juggling a Carbon instance to a string. - */ - public function setToStringFormat(string|Closure|null $format): void - { - $this->mergeSettings([ - 'toStringFormat' => $format, - ]); - } - - /** - * JSON serialize all Carbon instances using the given callback. - */ - public function serializeUsing(string|callable|null $format): void - { - $this->mergeSettings([ - 'toJsonFormat' => $format, - ]); - } - - /** - * Enable the strict mode (or disable with passing false). - */ - public function useStrictMode(bool $strictModeEnabled = true): void - { - $this->mergeSettings([ - 'strictMode' => $strictModeEnabled, - ]); - } - - /** - * Returns true if the strict mode is globally in use, false else. - * (It can be overridden in specific instances.) - */ - public function isStrictModeEnabled(): bool - { - return $this->getSettings()['strictMode'] ?? true; - } - - /** - * Indicates if months should be calculated with overflow. - */ - public function useMonthsOverflow(bool $monthsOverflow = true): void - { - $this->mergeSettings([ - 'monthOverflow' => $monthsOverflow, - ]); - } - - /** - * Reset the month overflow behavior. - */ - public function resetMonthsOverflow(): void - { - $this->useMonthsOverflow(); - } - - /** - * Get the month overflow global behavior (can be overridden in specific instances). - */ - public function shouldOverflowMonths(): bool - { - return $this->getSettings()['monthOverflow'] ?? true; - } - - /** - * Indicates if years should be calculated with overflow. - */ - public function useYearsOverflow(bool $yearsOverflow = true): void - { - $this->mergeSettings([ - 'yearOverflow' => $yearsOverflow, - ]); - } - - /** - * Reset the month overflow behavior. - */ - public function resetYearsOverflow(): void - { - $this->useYearsOverflow(); - } - - /** - * Get the month overflow global behavior (can be overridden in specific instances). - */ - public function shouldOverflowYears(): bool - { - return $this->getSettings()['yearOverflow'] ?? true; - } - - /** - * Get weekend days - * - * @return array - */ - public function getWeekendDays(): array - { - return $this->weekendDays; - } - - /** - * Set weekend days - */ - public function setWeekendDays(array $days): void - { - $this->weekendDays = $days; - } - - /** - * Checks if the (date)time string is in a given format. - * - * @example - * ``` - * Carbon::hasFormat('11:12:45', 'h:i:s'); // true - * Carbon::hasFormat('13:12:45', 'h:i:s'); // false - * ``` - */ - public function hasFormat(string $date, string $format): bool - { - // createFromFormat() is known to handle edge cases silently. - // E.g. "1975-5-1" (Y-n-j) will still be parsed correctly when "Y-m-d" is supplied as the format. - // To ensure we're really testing against our desired format, perform an additional regex validation. - - return $this->matchFormatPattern($date, preg_quote($format, '/'), $this->regexFormats); - } - - /** - * Checks if the (date)time string is in a given format. - * - * @example - * ``` - * Carbon::hasFormatWithModifiers('31/08/2015', 'd#m#Y'); // true - * Carbon::hasFormatWithModifiers('31/08/2015', 'm#d#Y'); // false - * ``` - */ - public function hasFormatWithModifiers(string $date, string $format): bool - { - return $this->matchFormatPattern($date, $format, array_merge($this->regexFormats, $this->regexFormatModifiers)); - } - - /** - * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * - * Note the timezone parameter was left out of the examples above and - * has no affect as the mock value will be returned regardless of its value. - * - * Only the moment is mocked with setTestNow(), the timezone will still be the one passed - * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). - * - * To clear the test instance call this method using the default - * parameter of null. - * - * /!\ Use this method for unit tests only. - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - */ - public function setTestNow(mixed $testNow = null): void - { - $this->useTimezoneFromTestNow = false; - $this->testNow = $testNow instanceof self || $testNow instanceof Closure - ? $testNow - : $this->make($testNow); - } - - /** - * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * - * It will also align default timezone (e.g. call date_default_timezone_set()) with - * the second argument or if null, with the timezone of the given date object. - * - * To clear the test instance call this method using the default - * parameter of null. - * - * /!\ Use this method for unit tests only. - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - */ - public function setTestNowAndTimezone(mixed $testNow = null, $timezone = null): void - { - if ($testNow) { - $this->testDefaultTimezone ??= date_default_timezone_get(); - } - - $useDateInstanceTimezone = $testNow instanceof DateTimeInterface; - - if ($useDateInstanceTimezone) { - $this->setDefaultTimezone($testNow->getTimezone()->getName(), $testNow); - } - - $this->setTestNow($testNow); - $this->useTimezoneFromTestNow = ($timezone === null && $testNow instanceof Closure); - - if (!$useDateInstanceTimezone) { - $now = $this->getMockedTestNow(\func_num_args() === 1 ? null : $timezone); - $this->setDefaultTimezone($now?->tzName ?? $this->testDefaultTimezone ?? 'UTC', $now); - } - - if (!$testNow) { - $this->testDefaultTimezone = null; - } - } - - /** - * Temporarily sets a static date to be used within the callback. - * Using setTestNow to set the date, executing the callback, then - * clearing the test instance. - * - * /!\ Use this method for unit tests only. - * - * @template T - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - * @param Closure(): T $callback - * - * @return T - */ - public function withTestNow(mixed $testNow, callable $callback): mixed - { - $this->setTestNow($testNow); - - try { - $result = $callback(); - } finally { - $this->setTestNow(); - } - - return $result; - } - - /** - * Get the Carbon instance (real or mock) to be returned when a "now" - * instance is created. - * - * @return Closure|CarbonInterface|null the current instance used for testing - */ - public function getTestNow(): Closure|CarbonInterface|null - { - if ($this->testNow === null) { - $factory = FactoryImmutable::getDefaultInstance(); - - if ($factory !== $this) { - return $factory->getTestNow(); - } - } - - return $this->testNow; - } - - public function handleTestNowClosure( - Closure|CarbonInterface|null $testNow, - DateTimeZone|string|int|null $timezone = null, - ): ?CarbonInterface { - if ($testNow instanceof Closure) { - $callback = Callback::fromClosure($testNow); - $realNow = new DateTimeImmutable('now'); - $testNow = $testNow($callback->prepareParameter($this->parse( - $realNow->format('Y-m-d H:i:s.u'), - $timezone ?? $realNow->getTimezone(), - ))); - - if ($testNow !== null && !($testNow instanceof DateTimeInterface)) { - $function = $callback->getReflectionFunction(); - $type = \is_object($testNow) ? $testNow::class : \gettype($testNow); - - throw new RuntimeException( - 'The test closure defined in '.$function->getFileName(). - ' at line '.$function->getStartLine().' returned '.$type. - '; expected '.CarbonInterface::class.'|null', - ); - } - - if (!($testNow instanceof CarbonInterface)) { - $timezone ??= $this->useTimezoneFromTestNow ? $testNow->getTimezone() : null; - $testNow = $this->__call('instance', [$testNow, $timezone]); - } - } - - return $testNow; - } - - /** - * Determine if there is a valid test instance set. A valid test instance - * is anything that is not null. - * - * @return bool true if there is a test instance, otherwise false - */ - public function hasTestNow(): bool - { - return $this->getTestNow() !== null; - } - - public function withTimeZone(DateTimeZone|string|int|null $timezone): static - { - $factory = clone $this; - $factory->settings['timezone'] = $timezone; - - return $factory; - } - - public function __call(string $name, array $arguments): mixed - { - $method = new ReflectionMethod($this->className, $name); - $settings = $this->settings; - - if ($settings && isset($settings['timezone'])) { - $timezoneParameters = array_filter($method->getParameters(), function ($parameter) { - return \in_array($parameter->getName(), ['tz', 'timezone'], true); - }); - $timezoneSetting = $settings['timezone']; - - if (isset($arguments[0]) && \in_array($name, ['instance', 'make', 'create', 'parse'], true)) { - if ($arguments[0] instanceof DateTimeInterface) { - $settings['innerTimezone'] = $settings['timezone']; - } elseif (\is_string($arguments[0]) && date_parse($arguments[0])['is_localtime']) { - unset($settings['timezone'], $settings['innerTimezone']); - } - } - - if (\count($timezoneParameters)) { - $index = key($timezoneParameters); - - if (!isset($arguments[$index])) { - array_splice($arguments, key($timezoneParameters), 0, [$timezoneSetting]); - } - - unset($settings['timezone']); - } - } - - $clock = FactoryImmutable::getCurrentClock(); - FactoryImmutable::setCurrentClock($this); - - try { - $result = $this->className::$name(...$arguments); - } finally { - FactoryImmutable::setCurrentClock($clock); - } - - if (isset($this->translator)) { - $settings['translator'] = $this->translator; - } - - return $result instanceof CarbonInterface && !empty($settings) - ? $result->settings($settings) - : $result; - } - - /** - * Get the mocked date passed in setTestNow() and if it's a Closure, execute it. - */ - protected function getMockedTestNow(DateTimeZone|string|int|null $timezone): ?CarbonInterface - { - $testNow = $this->handleTestNowClosure($this->getTestNow()); - - if ($testNow instanceof CarbonInterface) { - $testNow = $testNow->avoidMutation(); - - if ($timezone !== null) { - return $testNow->setTimezone($timezone); - } - } - - return $testNow; - } - - /** - * Checks if the (date)time string is in a given format with - * given list of pattern replacements. - * - * @example - * ``` - * Carbon::hasFormat('11:12:45', 'h:i:s'); // true - * Carbon::hasFormat('13:12:45', 'h:i:s'); // false - * ``` - * - * @param string $date - * @param string $format - * @param array $replacements - * - * @return bool - */ - private function matchFormatPattern(string $date, string $format, array $replacements): bool - { - // Preg quote, but remove escaped backslashes since we'll deal with escaped characters in the format string. - $regex = str_replace('\\\\', '\\', $format); - // Replace not-escaped letters - $regex = preg_replace_callback( - '/(? $match[1].strtr($match[2], $replacements), - $regex, - ); - // Replace escaped letters by the letter itself - $regex = preg_replace('/(?toRegionName($date); - - throw new InvalidArgumentException( - "Timezone ID '$timezone' is invalid". - ($suggestion && $suggestion !== $timezone ? ", did you mean '$suggestion'?" : '.')."\n". - "It must be one of the IDs from DateTimeZone::listIdentifiers(),\n". - 'For the record, hours/minutes offset are relevant only for a particular moment, '. - 'but not as a default timezone.', - 0, - $previous - ); - } - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php b/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php deleted file mode 100644 index e1d6f03..0000000 --- a/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php +++ /dev/null @@ -1,192 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Closure; -use DateTimeInterface; -use DateTimeZone; -use Symfony\Component\Clock\ClockInterface; -use Symfony\Component\Clock\NativeClock; -use Symfony\Contracts\Translation\TranslatorInterface; - -/** - * A factory to generate CarbonImmutable instances with common settings. - * - * - * - * @method bool canBeCreatedFromFormat(?string $date, string $format) Checks if the (date)time string is in a given format and valid to create a - * new instance. - * @method ?CarbonImmutable create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $timezone = null) Create a new Carbon instance from a specific date and time. - * If any of $year, $month or $day are set to null their now() values will - * be used. - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * If $hour is not null then the default values for $minute and $second - * will be 0. - * @method CarbonImmutable createFromDate($year = null, $month = null, $day = null, $timezone = null) Create a Carbon instance from just a date. The time portion is set to now. - * @method ?CarbonImmutable createFromFormat($format, $time, $timezone = null) Create a Carbon instance from a specific format. - * @method ?CarbonImmutable createFromIsoFormat(string $format, string $time, $timezone = null, ?string $locale = 'en', ?TranslatorInterface $translator = null) Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). - * @method ?CarbonImmutable createFromLocaleFormat(string $format, string $locale, string $time, $timezone = null) Create a Carbon instance from a specific format and a string in a given language. - * @method ?CarbonImmutable createFromLocaleIsoFormat(string $format, string $locale, string $time, $timezone = null) Create a Carbon instance from a specific ISO format and a string in a given language. - * @method CarbonImmutable createFromTime($hour = 0, $minute = 0, $second = 0, $timezone = null) Create a Carbon instance from just a time. The date portion is set to today. - * @method CarbonImmutable createFromTimeString(string $time, DateTimeZone|string|int|null $timezone = null) Create a Carbon instance from a time string. The date portion is set to today. - * @method CarbonImmutable createFromTimestamp(string|int|float $timestamp, DateTimeZone|string|int|null $timezone = null) Create a Carbon instance from a timestamp and set the timezone (UTC by default). - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method CarbonImmutable createFromTimestampMs(string|int|float $timestamp, DateTimeZone|string|int|null $timezone = null) Create a Carbon instance from a timestamp in milliseconds. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method CarbonImmutable createFromTimestampMsUTC($timestamp) Create a Carbon instance from a timestamp in milliseconds. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method CarbonImmutable createFromTimestampUTC(string|int|float $timestamp) Create a Carbon instance from a timestamp keeping the timezone to UTC. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method CarbonImmutable createMidnightDate($year = null, $month = null, $day = null, $timezone = null) Create a Carbon instance from just a date. The time portion is set to midnight. - * @method ?CarbonImmutable createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $timezone = null) Create a new safe Carbon instance from a specific date and time. - * If any of $year, $month or $day are set to null their now() values will - * be used. - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * If $hour is not null then the default values for $minute and $second - * will be 0. - * If one of the set values is not valid, an InvalidDateException - * will be thrown. - * @method CarbonImmutable createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $timezone = null) Create a new Carbon instance from a specific date and time using strict validation. - * @method mixed executeWithLocale(string $locale, callable $func) Set the current locale to the given, execute the passed function, reset the locale to previous one, - * then return the result of the closure (or null if the closure was void). - * @method CarbonImmutable fromSerialized($value) Create an instance from a serialized string. - * @method array getAvailableLocales() Returns the list of internally available locales and already loaded custom locales. - * (It will ignore custom translator dynamic loading.) - * @method Language[] getAvailableLocalesInfo() Returns list of Language object for each available locale. This object allow you to get the ISO name, native - * name, region and variant of the locale. - * @method array getDays() Get the days of the week. - * @method ?string getFallbackLocale() Get the fallback locale. - * @method array getFormatsToIsoReplacements() List of replacements from date() format to isoFormat(). - * @method array getIsoUnits() Returns list of locale units for ISO formatting. - * @method array|false getLastErrors() {@inheritdoc} - * @method string getLocale() Get the current translator locale. - * @method int getMidDayAt() get midday/noon hour - * @method string getTimeFormatByPrecision(string $unitPrecision) Return a format from H:i to H:i:s.u according to given unit precision. - * @method string|Closure|null getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null) Returns raw translation message for a given key. - * @method int getWeekEndsAt(?string $locale = null) Get the last day of week. - * @method int getWeekStartsAt(?string $locale = null) Get the first day of week. - * @method bool hasRelativeKeywords(?string $time) Determine if a time string will produce a relative date. - * @method CarbonImmutable instance(DateTimeInterface $date) Create a Carbon instance from a DateTime one. - * @method bool isImmutable() Returns true if the current class/instance is immutable. - * @method bool isModifiableUnit($unit) Returns true if a property can be changed via setter. - * @method bool isMutable() Returns true if the current class/instance is mutable. - * @method bool localeHasDiffOneDayWords(string $locale) Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). - * Support is considered enabled if the 3 words are translated in the given locale. - * @method bool localeHasDiffSyntax(string $locale) Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * @method bool localeHasDiffTwoDayWords(string $locale) Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). - * Support is considered enabled if the 2 words are translated in the given locale. - * @method bool localeHasPeriodSyntax($locale) Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * @method bool localeHasShortUnits(string $locale) Returns true if the given locale is internally supported and has short-units support. - * Support is considered enabled if either year, day or hour has a short variant translated. - * @method ?CarbonImmutable make($var, DateTimeZone|string|null $timezone = null) Make a Carbon instance from given variable if possible. - * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals - * and recurrences). Throw an exception for invalid format, but otherwise return null. - * @method void mixin(object|string $mixin) Mix another object into the class. - * @method CarbonImmutable parse(DateTimeInterface|WeekDay|Month|string|int|float|null $time, DateTimeZone|string|int|null $timezone = null) Create a carbon instance from a string. - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * @method CarbonImmutable parseFromLocale(string $time, ?string $locale = null, DateTimeZone|string|int|null $timezone = null) Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). - * @method string pluralUnit(string $unit) Returns standardized plural of a given singular/plural unit name (in English). - * @method ?CarbonImmutable rawCreateFromFormat(string $format, string $time, $timezone = null) Create a Carbon instance from a specific format. - * @method CarbonImmutable rawParse(DateTimeInterface|WeekDay|Month|string|int|float|null $time, DateTimeZone|string|int|null $timezone = null) Create a carbon instance from a string. - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * @method void setFallbackLocale(string $locale) Set the fallback locale. - * @method void setLocale(string $locale) Set the current translator locale and indicate if the source locale file exists. - * Pass 'auto' as locale to use the closest language to the current LC_TIME locale. - * @method void setMidDayAt($hour) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider mid-day is always 12pm, then if you need to test if it's an other - * hour, test it explicitly: - * $date->format('G') == 13 - * or to set explicitly to a given hour: - * $date->setTime(13, 0, 0, 0) - * Set midday/noon hour - * @method string singularUnit(string $unit) Returns standardized singular of a given singular/plural unit name (in English). - * @method CarbonImmutable today(DateTimeZone|string|int|null $timezone = null) Create a Carbon instance for today. - * @method CarbonImmutable tomorrow(DateTimeZone|string|int|null $timezone = null) Create a Carbon instance for tomorrow. - * @method string translateTimeString(string $timeString, ?string $from = null, ?string $to = null, int $mode = CarbonInterface::TRANSLATE_ALL) Translate a time string from a locale to an other. - * @method string translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null) Translate using translation string or callback available. - * @method CarbonImmutable yesterday(DateTimeZone|string|int|null $timezone = null) Create a Carbon instance for yesterday. - * - * - */ -class FactoryImmutable extends Factory implements ClockInterface -{ - protected string $className = CarbonImmutable::class; - - private static ?self $defaultInstance = null; - - private static ?WrapperClock $currentClock = null; - - /** - * @internal Instance used for static calls, such as Carbon::getTranslator(), CarbonImmutable::setTestNow(), etc. - */ - public static function getDefaultInstance(): self - { - return self::$defaultInstance ??= new self(); - } - - /** - * @internal Instance used for static calls possibly called by non-static methods. - */ - public static function getInstance(): Factory - { - return self::$currentClock?->getFactory() ?? self::getDefaultInstance(); - } - - /** - * @internal Set instance before creating new dates. - */ - public static function setCurrentClock(ClockInterface|Factory|DateTimeInterface|null $currentClock): void - { - if ($currentClock && !($currentClock instanceof WrapperClock)) { - $currentClock = new WrapperClock($currentClock); - } - - self::$currentClock = $currentClock; - } - - /** - * @internal Instance used to link new object to their factory creator. - */ - public static function getCurrentClock(): ?WrapperClock - { - return self::$currentClock; - } - - /** - * Get a Carbon instance for the current date and time. - */ - public function now(DateTimeZone|string|int|null $timezone = null): CarbonImmutable - { - return $this->__call('now', [$timezone]); - } - - public function sleep(int|float $seconds): void - { - if ($this->hasTestNow()) { - $this->setTestNow($this->getTestNow()->avoidMutation()->addSeconds($seconds)); - - return; - } - - (new NativeClock('UTC'))->sleep($seconds); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/aa.php b/vendor/nesbot/carbon/src/Carbon/Lang/aa.php deleted file mode 100644 index f3431e4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/aa.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/aa_DJ.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php deleted file mode 100644 index c6e23c0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Qunxa Garablu', 'Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Liiqen', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], - 'months_short' => ['qun', 'nah', 'cig', 'agd', 'cax', 'qas', 'qad', 'leq', 'way', 'dit', 'xim', 'kax'], - 'weekdays' => ['Acaada', 'Etleeni', 'Talaata', 'Arbaqa', 'Kamiisi', 'Gumqata', 'Sabti'], - 'weekdays_short' => ['aca', 'etl', 'tal', 'arb', 'kam', 'gum', 'sab'], - 'weekdays_min' => ['aca', 'etl', 'tal', 'arb', 'kam', 'gum', 'sab'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['saaku', 'carra'], - - 'year' => ':count gaqambo', // less reliable - 'y' => ':count gaqambo', // less reliable - 'a_year' => ':count gaqambo', // less reliable - - 'month' => ':count àlsa', - 'm' => ':count àlsa', - 'a_month' => ':count àlsa', - - 'day' => ':count saaku', // less reliable - 'd' => ':count saaku', // less reliable - 'a_day' => ':count saaku', // less reliable - - 'hour' => ':count ayti', // less reliable - 'h' => ':count ayti', // less reliable - 'a_hour' => ':count ayti', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php deleted file mode 100644 index f8f395b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Qunxa Garablu', 'Naharsi Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Leqeeni', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], - 'months_short' => ['Qun', 'Nah', 'Cig', 'Agd', 'Cax', 'Qas', 'Qad', 'Leq', 'Way', 'Dit', 'Xim', 'Kax'], - 'weekdays' => ['Acaada', 'Etleeni', 'Talaata', 'Arbaqa', 'Kamiisi', 'Gumqata', 'Sabti'], - 'weekdays_short' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], - 'weekdays_min' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['saaku', 'carra'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php b/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php deleted file mode 100644 index 6461225..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Qunxa Garablu', 'Naharsi Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Leqeeni', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], - 'months_short' => ['Qun', 'Nah', 'Cig', 'Agd', 'Cax', 'Qas', 'Qad', 'Leq', 'Way', 'Dit', 'Xim', 'Kax'], - 'weekdays' => ['Naba Sambat', 'Sani', 'Salus', 'Rabuq', 'Camus', 'Jumqata', 'Qunxa Sambat'], - 'weekdays_short' => ['Nab', 'San', 'Sal', 'Rab', 'Cam', 'Jum', 'Qun'], - 'weekdays_min' => ['Nab', 'San', 'Sal', 'Rab', 'Cam', 'Jum', 'Qun'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['saaku', 'carra'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php deleted file mode 100644 index b6f7d0b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Qunxa Garablu', 'Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Liiqen', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], - 'months_short' => ['Qun', 'Kud', 'Cig', 'Agd', 'Cax', 'Qas', 'Qad', 'Leq', 'Way', 'Dit', 'Xim', 'Kax'], - 'weekdays' => ['Acaada', 'Etleeni', 'Talaata', 'Arbaqa', 'Kamiisi', 'Gumqata', 'Sabti'], - 'weekdays_short' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], - 'weekdays_min' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['saaku', 'carra'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/af.php b/vendor/nesbot/carbon/src/Carbon/Lang/af.php deleted file mode 100644 index 87592fe..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/af.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - JD Isaacks - * - Pierre du Plessis - */ -return [ - 'year' => ':count jaar', - 'a_year' => '\'n jaar|:count jaar', - 'y' => ':count j.', - 'month' => ':count maand|:count maande', - 'a_month' => '\'n maand|:count maande', - 'm' => ':count maa.', - 'week' => ':count week|:count weke', - 'a_week' => '\'n week|:count weke', - 'w' => ':count w.', - 'day' => ':count dag|:count dae', - 'a_day' => '\'n dag|:count dae', - 'd' => ':count d.', - 'hour' => ':count uur', - 'a_hour' => '\'n uur|:count uur', - 'h' => ':count u.', - 'minute' => ':count minuut|:count minute', - 'a_minute' => '\'n minuut|:count minute', - 'min' => ':count min.', - 'second' => ':count sekond|:count sekondes', - 'a_second' => '\'n paar sekondes|:count sekondes', - 's' => ':count s.', - 'ago' => ':time gelede', - 'from_now' => 'oor :time', - 'after' => ':time na', - 'before' => ':time voor', - 'diff_now' => 'Nou', - 'diff_today' => 'Vandag', - 'diff_today_regexp' => 'Vandag(?:\\s+om)?', - 'diff_yesterday' => 'Gister', - 'diff_yesterday_regexp' => 'Gister(?:\\s+om)?', - 'diff_tomorrow' => 'Môre', - 'diff_tomorrow_regexp' => 'Môre(?:\\s+om)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Vandag om] LT', - 'nextDay' => '[Môre om] LT', - 'nextWeek' => 'dddd [om] LT', - 'lastDay' => '[Gister om] LT', - 'lastWeek' => '[Laas] dddd [om] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static fn ($number) => $number.(($number === 1 || $number === 8 || $number >= 20) ? 'ste' : 'de'), - 'meridiem' => ['VM', 'NM'], - 'months' => ['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'], - 'months_short' => ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], - 'weekdays_short' => ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'], - 'weekdays_min' => ['So', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' en '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php b/vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php deleted file mode 100644 index f2fcf05..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/af.php', [ - 'meridiem' => ['v', 'n'], - 'weekdays' => ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], - 'weekdays_short' => ['So.', 'Ma.', 'Di.', 'Wo.', 'Do.', 'Vr.', 'Sa.'], - 'weekdays_min' => ['So.', 'Ma.', 'Di.', 'Wo.', 'Do.', 'Vr.', 'Sa.'], - 'months' => ['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'], - 'months_short' => ['Jan.', 'Feb.', 'Mrt.', 'Apr.', 'Mei', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Des.'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'DD MMM YYYY', - 'LLL' => 'DD MMMM YYYY HH:mm', - 'LLLL' => 'dddd, DD MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php deleted file mode 100644 index 27896bd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/af.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/agq.php b/vendor/nesbot/carbon/src/Carbon/Lang/agq.php deleted file mode 100644 index 7011464..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/agq.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['a.g', 'a.k'], - 'weekdays' => ['tsuʔntsɨ', 'tsuʔukpà', 'tsuʔughɔe', 'tsuʔutɔ̀mlò', 'tsuʔumè', 'tsuʔughɨ̂m', 'tsuʔndzɨkɔʔɔ'], - 'weekdays_short' => ['nts', 'kpa', 'ghɔ', 'tɔm', 'ume', 'ghɨ', 'dzk'], - 'weekdays_min' => ['nts', 'kpa', 'ghɔ', 'tɔm', 'ume', 'ghɨ', 'dzk'], - 'months' => ['ndzɔ̀ŋɔ̀nùm', 'ndzɔ̀ŋɔ̀kƗ̀zùʔ', 'ndzɔ̀ŋɔ̀tƗ̀dʉ̀ghà', 'ndzɔ̀ŋɔ̀tǎafʉ̄ghā', 'ndzɔ̀ŋèsèe', 'ndzɔ̀ŋɔ̀nzùghò', 'ndzɔ̀ŋɔ̀dùmlo', 'ndzɔ̀ŋɔ̀kwîfɔ̀e', 'ndzɔ̀ŋɔ̀tƗ̀fʉ̀ghàdzughù', 'ndzɔ̀ŋɔ̀ghǔuwelɔ̀m', 'ndzɔ̀ŋɔ̀chwaʔàkaa wo', 'ndzɔ̀ŋèfwòo'], - 'months_short' => ['nùm', 'kɨz', 'tɨd', 'taa', 'see', 'nzu', 'dum', 'fɔe', 'dzu', 'lɔm', 'kaa', 'fwo'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/agr.php b/vendor/nesbot/carbon/src/Carbon/Lang/agr.php deleted file mode 100644 index 8f036ae..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/agr.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/agr_PE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php b/vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php deleted file mode 100644 index 54a326a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - somosazucar.org libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Petsatin', 'Kupitin', 'Uyaitin', 'Tayutin', 'Kegketin', 'Tegmatin', 'Kuntutin', 'Yagkujutin', 'Daiktatin', 'Ipamtatin', 'Shinutin', 'Sakamtin'], - 'months_short' => ['Pet', 'Kup', 'Uya', 'Tay', 'Keg', 'Teg', 'Kun', 'Yag', 'Dait', 'Ipam', 'Shin', 'Sak'], - 'weekdays' => ['Tuntuamtin', 'Achutin', 'Kugkuktin', 'Saketin', 'Shimpitin', 'Imaptin', 'Bataetin'], - 'weekdays_short' => ['Tun', 'Ach', 'Kug', 'Sak', 'Shim', 'Im', 'Bat'], - 'weekdays_min' => ['Tun', 'Ach', 'Kug', 'Sak', 'Shim', 'Im', 'Bat'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 7, - 'meridiem' => ['VM', 'NM'], - - 'year' => ':count yaya', // less reliable - 'y' => ':count yaya', // less reliable - 'a_year' => ':count yaya', // less reliable - - 'month' => ':count nantu', // less reliable - 'm' => ':count nantu', // less reliable - 'a_month' => ':count nantu', // less reliable - - 'day' => ':count nayaim', // less reliable - 'd' => ':count nayaim', // less reliable - 'a_day' => ':count nayaim', // less reliable - - 'hour' => ':count kuwiš', // less reliable - 'h' => ':count kuwiš', // less reliable - 'a_hour' => ':count kuwiš', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ak.php b/vendor/nesbot/carbon/src/Carbon/Lang/ak.php deleted file mode 100644 index 5a64be3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ak.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ak_GH.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php b/vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php deleted file mode 100644 index 1381946..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sugar Labs // OLPC sugarlabs.org libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY/MM/DD', - ], - 'months' => ['Sanda-Ɔpɛpɔn', 'Kwakwar-Ɔgyefuo', 'Ebɔw-Ɔbenem', 'Ebɔbira-Oforisuo', 'Esusow Aketseaba-Kɔtɔnimba', 'Obirade-Ayɛwohomumu', 'Ayɛwoho-Kitawonsa', 'Difuu-Ɔsandaa', 'Fankwa-Ɛbɔ', 'Ɔbɛsɛ-Ahinime', 'Ɔberɛfɛw-Obubuo', 'Mumu-Ɔpɛnimba'], - 'months_short' => ['S-Ɔ', 'K-Ɔ', 'E-Ɔ', 'E-O', 'E-K', 'O-A', 'A-K', 'D-Ɔ', 'F-Ɛ', 'Ɔ-A', 'Ɔ-O', 'M-Ɔ'], - 'weekdays' => ['Kwesida', 'Dwowda', 'Benada', 'Wukuda', 'Yawda', 'Fida', 'Memeneda'], - 'weekdays_short' => ['Kwe', 'Dwo', 'Ben', 'Wuk', 'Yaw', 'Fia', 'Mem'], - 'weekdays_min' => ['Kwe', 'Dwo', 'Ben', 'Wuk', 'Yaw', 'Fia', 'Mem'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['AN', 'EW'], - - 'year' => ':count afe', - 'y' => ':count afe', - 'a_year' => ':count afe', - - 'month' => ':count bosume', - 'm' => ':count bosume', - 'a_month' => ':count bosume', - - 'day' => ':count ɛda', - 'd' => ':count ɛda', - 'a_day' => ':count ɛda', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/am.php b/vendor/nesbot/carbon/src/Carbon/Lang/am.php deleted file mode 100644 index 63bf72d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/am.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/am_ET.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php deleted file mode 100644 index 7cc676b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕሪል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክቶበር', 'ኖቬምበር', 'ዲሴምበር'], - 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], - 'weekdays' => ['እሑድ', 'ሰኞ', 'ማክሰኞ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'], - 'weekdays_short' => ['እሑድ', 'ሰኞ ', 'ማክሰ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'], - 'weekdays_min' => ['እሑድ', 'ሰኞ ', 'ማክሰ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ጡዋት', 'ከሰዓት'], - - 'year' => ':count አመት', - 'y' => ':count አመት', - 'a_year' => ':count አመት', - - 'month' => ':count ወር', - 'm' => ':count ወር', - 'a_month' => ':count ወር', - - 'week' => ':count ሳምንት', - 'w' => ':count ሳምንት', - 'a_week' => ':count ሳምንት', - - 'day' => ':count ቀን', - 'd' => ':count ቀን', - 'a_day' => ':count ቀን', - - 'hour' => ':count ሰዓት', - 'h' => ':count ሰዓት', - 'a_hour' => ':count ሰዓት', - - 'minute' => ':count ደቂቃ', - 'min' => ':count ደቂቃ', - 'a_minute' => ':count ደቂቃ', - - 'second' => ':count ሴኮንድ', - 's' => ':count ሴኮንድ', - 'a_second' => ':count ሴኮንድ', - - 'ago' => 'ከ:time በፊት', - 'from_now' => 'በ:time ውስጥ', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/an.php b/vendor/nesbot/carbon/src/Carbon/Lang/an.php deleted file mode 100644 index 565abf2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/an.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/an_ES.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php deleted file mode 100644 index faf8ae0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Softaragones Jordi Mallach Pérez, Juan Pablo Martínez bug-glibc-locales@gnu.org, softaragones@softaragones.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['chinero', 'febrero', 'marzo', 'abril', 'mayo', 'chunyo', 'chuliol', 'agosto', 'setiembre', 'octubre', 'noviembre', 'aviento'], - 'months_short' => ['chi', 'feb', 'mar', 'abr', 'may', 'chn', 'chl', 'ago', 'set', 'oct', 'nov', 'avi'], - 'weekdays' => ['domingo', 'luns', 'martes', 'mierques', 'chueves', 'viernes', 'sabado'], - 'weekdays_short' => ['dom', 'lun', 'mar', 'mie', 'chu', 'vie', 'sab'], - 'weekdays_min' => ['dom', 'lun', 'mar', 'mie', 'chu', 'vie', 'sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count año', - 'y' => ':count año', - 'a_year' => ':count año', - - 'month' => ':count mes', - 'm' => ':count mes', - 'a_month' => ':count mes', - - 'week' => ':count semana', - 'w' => ':count semana', - 'a_week' => ':count semana', - - 'day' => ':count día', - 'd' => ':count día', - 'a_day' => ':count día', - - 'hour' => ':count reloch', // less reliable - 'h' => ':count reloch', // less reliable - 'a_hour' => ':count reloch', // less reliable - - 'minute' => ':count minuto', - 'min' => ':count minuto', - 'a_minute' => ':count minuto', - - 'second' => ':count segundo', - 's' => ':count segundo', - 'a_second' => ':count segundo', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/anp.php b/vendor/nesbot/carbon/src/Carbon/Lang/anp.php deleted file mode 100644 index b56c67b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/anp.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/anp_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php deleted file mode 100644 index 00baa98..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bhashaghar@googlegroups.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्टूबर', 'नवंबर', 'दिसंबर"'], - 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्टूबर', 'नवंबर', 'दिसंबर'], - 'weekdays' => ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'बृहस्पतिवार', 'शुक्रवार', 'शनिवार'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], - 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar.php deleted file mode 100644 index 5f73f63..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Atef Ben Ali (atefBB) - * - Ibrahim AshShohail - * - MLTDev - * - Mohamed Sabil (mohamedsabil83) - * - Yazan Alnugnugh (yazan-alnugnugh) - */ -$months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => ':time من الآن', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدًا(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'اث', 'ثل', 'أر', 'خم', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم عند الساعة] LT', - 'nextDay' => '[غدًا عند الساعة] LT', - 'nextWeek' => 'dddd [عند الساعة] LT', - 'lastDay' => '[أمس عند الساعة] LT', - 'lastWeek' => 'dddd [عند الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php deleted file mode 100644 index 35a22b1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت '], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php deleted file mode 100644 index 3518096..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php deleted file mode 100644 index e790b99..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php deleted file mode 100644 index aea4eee..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - Josh Soref - * - Noureddine LOUAHEDJ - * - JD Isaacks - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - */ -$months = [ - 'جانفي', - 'فيفري', - 'مارس', - 'أفريل', - 'ماي', - 'جوان', - 'جويلية', - 'أوت', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => 'في :time', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['أح', 'إث', 'ثلا', 'أر', 'خم', 'جم', 'سب'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 4, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم على الساعة] LT', - 'nextDay' => '[غدا على الساعة] LT', - 'nextWeek' => 'dddd [على الساعة] LT', - 'lastDay' => '[أمس على الساعة] LT', - 'lastWeek' => 'dddd [على الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php deleted file mode 100644 index 3518096..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php deleted file mode 100644 index e790b99..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php deleted file mode 100644 index e790b99..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php deleted file mode 100644 index e790b99..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php deleted file mode 100644 index 5fecf70..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php deleted file mode 100644 index 2d42008..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php deleted file mode 100644 index 2d42008..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php deleted file mode 100644 index e790b99..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php deleted file mode 100644 index b3fb1cf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - Josh Soref - * - Nusret Parlak - * - JD Isaacks - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - * - Abdullah-Alhariri - */ -$months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'ماي', - 'يونيو', - 'يوليوز', - 'غشت', - 'شتنبر', - 'أكتوبر', - 'نونبر', - 'دجنبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => 'في :time', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم على الساعة] LT', - 'nextDay' => '[غدا على الساعة] LT', - 'nextWeek' => 'dddd [على الساعة] LT', - 'lastDay' => '[أمس على الساعة] LT', - 'lastWeek' => 'dddd [على الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php deleted file mode 100644 index 2792745..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php deleted file mode 100644 index 1f0af49..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Atef Ben Ali (atefBB) - * - Ibrahim AshShohail - * - MLTDev - */ - -$months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', [':count سنة', 'سنة', 'سنتين', ':count سنوات', ':count سنة']), - 'a_year' => implode('|', [':count سنة', 'سنة', 'سنتين', ':count سنوات', ':count سنة']), - 'month' => implode('|', [':count شهر', 'شهر', 'شهرين', ':count أشهر', ':count شهر']), - 'a_month' => implode('|', [':count شهر', 'شهر', 'شهرين', ':count أشهر', ':count شهر']), - 'week' => implode('|', [':count أسبوع', 'أسبوع', 'أسبوعين', ':count أسابيع', ':count أسبوع']), - 'a_week' => implode('|', [':count أسبوع', 'أسبوع', 'أسبوعين', ':count أسابيع', ':count أسبوع']), - 'day' => implode('|', [':count يوم', 'يوم', 'يومين', ':count أيام', ':count يوم']), - 'a_day' => implode('|', [':count يوم', 'يوم', 'يومين', ':count أيام', ':count يوم']), - 'hour' => implode('|', [':count ساعة', 'ساعة', 'ساعتين', ':count ساعات', ':count ساعة']), - 'a_hour' => implode('|', [':count ساعة', 'ساعة', 'ساعتين', ':count ساعات', ':count ساعة']), - 'minute' => implode('|', [':count دقيقة', 'دقيقة', 'دقيقتين', ':count دقائق', ':count دقيقة']), - 'a_minute' => implode('|', [':count دقيقة', 'دقيقة', 'دقيقتين', ':count دقائق', ':count دقيقة']), - 'second' => implode('|', [':count ثانية', 'ثانية', 'ثانيتين', ':count ثواني', ':count ثانية']), - 'a_second' => implode('|', [':count ثانية', 'ثانية', 'ثانيتين', ':count ثواني', ':count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => ':time من الآن', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدًا(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['مرة', 'مرة', ':count مرتين', ':count مرات', ':count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'اث', 'ثل', 'أر', 'خم', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم عند الساعة] LT', - 'nextDay' => '[غدًا عند الساعة] LT', - 'nextWeek' => 'dddd [عند الساعة] LT', - 'lastDay' => '[أمس عند الساعة] LT', - 'lastWeek' => 'dddd [عند الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php deleted file mode 100644 index 047ae05..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - Josh Soref - * - JD Isaacks - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - */ -$months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'ماي', - 'يونيو', - 'يوليوز', - 'غشت', - 'شتنبر', - 'أكتوبر', - 'نونبر', - 'دجنبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => 'في :time', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم على الساعة] LT', - 'nextDay' => '[غدا على الساعة] LT', - 'nextWeek' => 'dddd [على الساعة] LT', - 'lastDay' => '[أمس على الساعة] LT', - 'lastWeek' => 'dddd [على الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php deleted file mode 100644 index e790b99..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php deleted file mode 100644 index 3518096..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php deleted file mode 100644 index 503c60d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php deleted file mode 100644 index 3518096..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php deleted file mode 100644 index 550b0c7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - Josh Soref - * - JD Isaacks - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - * - Abdullah-Alhariri - */ -$months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => 'في :time', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم على الساعة] LT', - 'nextDay' => '[غدا على الساعة] LT', - 'nextWeek' => 'dddd [على الساعة] LT', - 'lastDay' => '[أمس على الساعة] LT', - 'lastWeek' => 'dddd [على الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php deleted file mode 100644 index 3518096..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php deleted file mode 100644 index e790b99..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php deleted file mode 100644 index 32f3282..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php deleted file mode 100644 index 2d42008..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php deleted file mode 100644 index c2d4b43..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Abdellah Chadidi - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - */ -// Same for long and short -$months = [ - // @TODO add shakl to months - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سَنَة', '{1}سَنَة', '{2}سَنَتَيْن', ']2,11[:count سَنَوَات', ']10,Inf[:count سَنَة']), - 'a_year' => implode('|', ['{0}:count سَنَة', '{1}سَنَة', '{2}سَنَتَيْن', ']2,11[:count سَنَوَات', ']10,Inf[:count سَنَة']), - 'month' => implode('|', ['{0}:count شَهْرَ', '{1}شَهْرَ', '{2}شَهْرَيْن', ']2,11[:count أَشْهُر', ']10,Inf[:count شَهْرَ']), - 'a_month' => implode('|', ['{0}:count شَهْرَ', '{1}شَهْرَ', '{2}شَهْرَيْن', ']2,11[:count أَشْهُر', ']10,Inf[:count شَهْرَ']), - 'week' => implode('|', ['{0}:count أُسْبُوع', '{1}أُسْبُوع', '{2}أُسْبُوعَيْن', ']2,11[:count أَسَابِيع', ']10,Inf[:count أُسْبُوع']), - 'a_week' => implode('|', ['{0}:count أُسْبُوع', '{1}أُسْبُوع', '{2}أُسْبُوعَيْن', ']2,11[:count أَسَابِيع', ']10,Inf[:count أُسْبُوع']), - 'day' => implode('|', ['{0}:count يَوْم', '{1}يَوْم', '{2}يَوْمَيْن', ']2,11[:count أَيَّام', ']10,Inf[:count يَوْم']), - 'a_day' => implode('|', ['{0}:count يَوْم', '{1}يَوْم', '{2}يَوْمَيْن', ']2,11[:count أَيَّام', ']10,Inf[:count يَوْم']), - 'hour' => implode('|', ['{0}:count سَاعَة', '{1}سَاعَة', '{2}سَاعَتَيْن', ']2,11[:count سَاعَات', ']10,Inf[:count سَاعَة']), - 'a_hour' => implode('|', ['{0}:count سَاعَة', '{1}سَاعَة', '{2}سَاعَتَيْن', ']2,11[:count سَاعَات', ']10,Inf[:count سَاعَة']), - 'minute' => implode('|', ['{0}:count دَقِيقَة', '{1}دَقِيقَة', '{2}دَقِيقَتَيْن', ']2,11[:count دَقَائِق', ']10,Inf[:count دَقِيقَة']), - 'a_minute' => implode('|', ['{0}:count دَقِيقَة', '{1}دَقِيقَة', '{2}دَقِيقَتَيْن', ']2,11[:count دَقَائِق', ']10,Inf[:count دَقِيقَة']), - 'second' => implode('|', ['{0}:count ثَانِيَة', '{1}ثَانِيَة', '{2}ثَانِيَتَيْن', ']2,11[:count ثَوَان', ']10,Inf[:count ثَانِيَة']), - 'a_second' => implode('|', ['{0}:count ثَانِيَة', '{1}ثَانِيَة', '{2}ثَانِيَتَيْن', ']2,11[:count ثَوَان', ']10,Inf[:count ثَانِيَة']), - 'ago' => 'مُنْذُ :time', - 'from_now' => 'مِنَ الْآن :time', - 'after' => 'بَعْدَ :time', - 'before' => 'قَبْلَ :time', - - // @TODO add shakl to translations below - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدًا(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'اث', 'ثل', 'أر', 'خم', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم عند الساعة] LT', - 'nextDay' => '[غدًا عند الساعة] LT', - 'nextWeek' => 'dddd [عند الساعة] LT', - 'lastDay' => '[أمس عند الساعة] LT', - 'lastWeek' => 'dddd [عند الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php deleted file mode 100644 index e790b99..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php deleted file mode 100644 index f096678..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - JD Isaacks - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - */ -$months = [ - 'جانفي', - 'فيفري', - 'مارس', - 'أفريل', - 'ماي', - 'جوان', - 'جويلية', - 'أوت', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => 'في :time', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم على الساعة] LT', - 'nextDay' => '[غدا على الساعة] LT', - 'nextWeek' => 'dddd [على الساعة] LT', - 'lastDay' => '[أمس على الساعة] LT', - 'lastWeek' => 'dddd [على الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php deleted file mode 100644 index 169fe88..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/as.php b/vendor/nesbot/carbon/src/Carbon/Lang/as.php deleted file mode 100644 index 04bc3df..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/as.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/as_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php deleted file mode 100644 index f2499ab..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Amitakhya Phukan, Red Hat bug-glibc@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D-MM-YYYY', - ], - 'months' => ['জানুৱাৰী', 'ফেব্ৰুৱাৰী', 'মাৰ্চ', 'এপ্ৰিল', 'মে', 'জুন', 'জুলাই', 'আগষ্ট', 'ছেপ্তেম্বৰ', 'অক্টোবৰ', 'নৱেম্বৰ', 'ডিচেম্বৰ'], - 'months_short' => ['জানু', 'ফেব্ৰু', 'মাৰ্চ', 'এপ্ৰিল', 'মে', 'জুন', 'জুলাই', 'আগ', 'সেপ্ট', 'অক্টো', 'নভে', 'ডিসে'], - 'weekdays' => ['দেওবাৰ', 'সোমবাৰ', 'মঙ্গলবাৰ', 'বুধবাৰ', 'বৃহষ্পতিবাৰ', 'শুক্ৰবাৰ', 'শনিবাৰ'], - 'weekdays_short' => ['দেও', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহষ্পতি', 'শুক্ৰ', 'শনি'], - 'weekdays_min' => ['দেও', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহষ্পতি', 'শুক্ৰ', 'শনি'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['পূৰ্ব্বাহ্ন', 'অপৰাহ্ন'], - - 'year' => ':count বছৰ', - 'y' => ':count বছৰ', - 'a_year' => ':count বছৰ', - - 'month' => ':count মাহ', - 'm' => ':count মাহ', - 'a_month' => ':count মাহ', - - 'week' => ':count সপ্তাহ', - 'w' => ':count সপ্তাহ', - 'a_week' => ':count সপ্তাহ', - - 'day' => ':count বাৰ', - 'd' => ':count বাৰ', - 'a_day' => ':count বাৰ', - - 'hour' => ':count ঘণ্টা', - 'h' => ':count ঘণ্টা', - 'a_hour' => ':count ঘণ্টা', - - 'minute' => ':count মিনিট', - 'min' => ':count মিনিট', - 'a_minute' => ':count মিনিট', - - 'second' => ':count দ্বিতীয়', - 's' => ':count দ্বিতীয়', - 'a_second' => ':count দ্বিতীয়', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/asa.php b/vendor/nesbot/carbon/src/Carbon/Lang/asa.php deleted file mode 100644 index 03bb483..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/asa.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['icheheavo', 'ichamthi'], - 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Ijm', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Ijm', 'Jmo'], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Dec'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ast.php b/vendor/nesbot/carbon/src/Carbon/Lang/ast.php deleted file mode 100644 index d9bdebe..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ast.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Jordi Mallach jordi@gnu.org - * - Adolfo Jayme-Barrientos (fitojb) - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['de xineru', 'de febreru', 'de marzu', 'd’abril', 'de mayu', 'de xunu', 'de xunetu', 'd’agostu', 'de setiembre', 'd’ochobre', 'de payares', 'd’avientu'], - 'months_short' => ['xin', 'feb', 'mar', 'abr', 'may', 'xun', 'xnt', 'ago', 'set', 'och', 'pay', 'avi'], - 'weekdays' => ['domingu', 'llunes', 'martes', 'miércoles', 'xueves', 'vienres', 'sábadu'], - 'weekdays_short' => ['dom', 'llu', 'mar', 'mié', 'xue', 'vie', 'sáb'], - 'weekdays_min' => ['dom', 'llu', 'mar', 'mié', 'xue', 'vie', 'sáb'], - - 'year' => ':count añu|:count años', - 'y' => ':count añu|:count años', - 'a_year' => 'un añu|:count años', - - 'month' => ':count mes', - 'm' => ':count mes', - 'a_month' => 'un mes|:count mes', - - 'week' => ':count selmana|:count selmanes', - 'w' => ':count selmana|:count selmanes', - 'a_week' => 'una selmana|:count selmanes', - - 'day' => ':count día|:count díes', - 'd' => ':count día|:count díes', - 'a_day' => 'un día|:count díes', - - 'hour' => ':count hora|:count hores', - 'h' => ':count hora|:count hores', - 'a_hour' => 'una hora|:count hores', - - 'minute' => ':count minutu|:count minutos', - 'min' => ':count minutu|:count minutos', - 'a_minute' => 'un minutu|:count minutos', - - 'second' => ':count segundu|:count segundos', - 's' => ':count segundu|:count segundos', - 'a_second' => 'un segundu|:count segundos', - - 'ago' => 'hai :time', - 'from_now' => 'en :time', - 'after' => ':time dempués', - 'before' => ':time enantes', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php deleted file mode 100644 index 04d7562..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ast.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ayc.php b/vendor/nesbot/carbon/src/Carbon/Lang/ayc.php deleted file mode 100644 index d6a6f63..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ayc.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ayc_PE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php deleted file mode 100644 index 22374e0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - runasimipi.org libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['inïru', 'phiwriru', 'marsu', 'awrila', 'mayu', 'junyu', 'julyu', 'awustu', 'sitimri', 'uktuwri', 'nuwimri', 'risimri'], - 'months_short' => ['ini', 'phi', 'mar', 'awr', 'may', 'jun', 'jul', 'awu', 'sit', 'ukt', 'nuw', 'ris'], - 'weekdays' => ['tuminku', 'lunisa', 'martisa', 'mirkulisa', 'juywisa', 'wirnisa', 'sawäru'], - 'weekdays_short' => ['tum', 'lun', 'mar', 'mir', 'juy', 'wir', 'saw'], - 'weekdays_min' => ['tum', 'lun', 'mar', 'mir', 'juy', 'wir', 'saw'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['VM', 'NM'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/az.php b/vendor/nesbot/carbon/src/Carbon/Lang/az.php deleted file mode 100644 index 1b5ded0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/az.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Kunal Marwaha - * - François B - * - JD Isaacks - * - Orxan - * - Şəhriyar İmanov - * - Baran Şengül - * - Novruz Rahimov - */ -return [ - 'year' => ':count il', - 'a_year' => '{1}bir il|]1,Inf[:count il', - 'y' => ':count il', - 'month' => ':count ay', - 'a_month' => '{1}bir ay|]1,Inf[:count ay', - 'm' => ':count ay', - 'week' => ':count həftə', - 'a_week' => '{1}bir həftə|]1,Inf[:count həftə', - 'w' => ':count h.', - 'day' => ':count gün', - 'a_day' => '{1}bir gün|]1,Inf[:count gün', - 'd' => ':count g.', - 'hour' => ':count saat', - 'a_hour' => '{1}bir saat|]1,Inf[:count saat', - 'h' => ':count s.', - 'minute' => ':count dəqiqə', - 'a_minute' => '{1}bir dəqiqə|]1,Inf[:count dəqiqə', - 'min' => ':count d.', - 'second' => ':count saniyə', - 'a_second' => '{1}birneçə saniyə|]1,Inf[:count saniyə', - 's' => ':count san.', - 'ago' => ':time əvvəl', - 'from_now' => ':time sonra', - 'after' => ':time sonra', - 'before' => ':time əvvəl', - 'diff_now' => 'indi', - 'diff_today' => 'bugün', - 'diff_today_regexp' => 'bugün(?:\\s+saat)?', - 'diff_yesterday' => 'dünən', - 'diff_tomorrow' => 'sabah', - 'diff_tomorrow_regexp' => 'sabah(?:\\s+saat)?', - 'diff_before_yesterday' => 'srağagün', - 'diff_after_tomorrow' => 'birisi gün', - 'period_recurrences' => ':count dəfədən bir', - 'period_interval' => 'hər :interval', - 'period_start_date' => ':date tarixindən başlayaraq', - 'period_end_date' => ':date tarixinədək', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[bugün saat] LT', - 'nextDay' => '[sabah saat] LT', - 'nextWeek' => '[gələn həftə] dddd [saat] LT', - 'lastDay' => '[dünən] LT', - 'lastWeek' => '[keçən həftə] dddd [saat] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - if ($number === 0) { // special case for zero - return "$number-ıncı"; - } - - static $suffixes = [ - 1 => '-inci', - 5 => '-inci', - 8 => '-inci', - 70 => '-inci', - 80 => '-inci', - 2 => '-nci', - 7 => '-nci', - 20 => '-nci', - 50 => '-nci', - 3 => '-üncü', - 4 => '-üncü', - 100 => '-üncü', - 6 => '-ncı', - 9 => '-uncu', - 10 => '-uncu', - 30 => '-uncu', - 60 => '-ıncı', - 90 => '-ıncı', - ]; - - $lastDigit = $number % 10; - - return $number.($suffixes[$lastDigit] ?? $suffixes[$number % 100 - $lastDigit] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); - }, - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'gecə'; - } - if ($hour < 12) { - return 'səhər'; - } - if ($hour < 17) { - return 'gündüz'; - } - - return 'axşam'; - }, - 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], - 'months_short' => ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'], - 'months_standalone' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'İyun', 'İyul', 'Avqust', 'Sentyabr', 'Oktyabr', 'Noyabr', 'Dekabr'], - 'weekdays' => ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'], - 'weekdays_short' => ['baz', 'bze', 'çax', 'çər', 'cax', 'cüm', 'şən'], - 'weekdays_min' => ['bz', 'be', 'ça', 'çə', 'ca', 'cü', 'şə'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' və '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php deleted file mode 100644 index 2acf881..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pablo Saratxaga pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/az.php', [ - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avq', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['bazar günü', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'], - 'weekdays_short' => ['baz', 'ber', 'çax', 'çər', 'cax', 'cüm', 'şnb'], - 'weekdays_min' => ['baz', 'ber', 'çax', 'çər', 'cax', 'cüm', 'şnb'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php b/vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php deleted file mode 100644 index 28fc62f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/az.php', [ - 'weekdays' => ['базар', 'базар ертәси', 'чәршәнбә ахшамы', 'чәршәнбә', 'ҹүмә ахшамы', 'ҹүмә', 'шәнбә'], - 'weekdays_short' => ['Б.', 'Б.Е.', 'Ч.А.', 'Ч.', 'Ҹ.А.', 'Ҹ.', 'Ш.'], - 'weekdays_min' => ['Б.', 'Б.Е.', 'Ч.А.', 'Ч.', 'Ҹ.А.', 'Ҹ.', 'Ш.'], - 'months' => ['јанвар', 'феврал', 'март', 'апрел', 'май', 'ијун', 'ијул', 'август', 'сентјабр', 'октјабр', 'нојабр', 'декабр'], - 'months_short' => ['јан', 'фев', 'мар', 'апр', 'май', 'ијн', 'ијл', 'авг', 'сен', 'окт', 'ној', 'дек'], - 'months_standalone' => ['Јанвар', 'Феврал', 'Март', 'Апрел', 'Май', 'Ијун', 'Ијул', 'Август', 'Сентјабр', 'Октјабр', 'Нојабр', 'Декабр'], - 'meridiem' => ['а', 'п'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php b/vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php deleted file mode 100644 index 991a0ef..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Mousa Moradi mousamk@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'OY/OM/OD', - ], - 'months' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مئی', 'ژوئن', 'جولای', 'آقۇست', 'سپتامبر', 'اوْکتوْبر', 'نوْوامبر', 'دسامبر'], - 'months_short' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مئی', 'ژوئن', 'جولای', 'آقۇست', 'سپتامبر', 'اوْکتوْبر', 'نوْوامبر', 'دسامبر'], - 'weekdays' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چارشنبه', 'جۆمعه آخشامی', 'جۆمعه', 'شنبه'], - 'weekdays_short' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چارشنبه', 'جۆمعه آخشامی', 'جۆمعه', 'شنبه'], - 'weekdays_min' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چارشنبه', 'جۆمعه آخشامی', 'جۆمعه', 'شنبه'], - 'first_day_of_week' => 6, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰۴', '۰۵', '۰۶', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱۴', '۱۵', '۱۶', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲۴', '۲۵', '۲۶', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳۴', '۳۵', '۳۶', '۳۷', '۳۸', '۳۹', '۴۰', '۴۱', '۴۲', '۴۳', '۴۴', '۴۵', '۴۶', '۴۷', '۴۸', '۴۹', '۵۰', '۵۱', '۵۲', '۵۳', '۵۴', '۵۵', '۵۶', '۵۷', '۵۸', '۵۹', '۶۰', '۶۱', '۶۲', '۶۳', '۶۴', '۶۵', '۶۶', '۶۷', '۶۸', '۶۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷۴', '۷۵', '۷۶', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸۴', '۸۵', '۸۶', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹۴', '۹۵', '۹۶', '۹۷', '۹۸', '۹۹'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php deleted file mode 100644 index 0be3391..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/az.php', [ - 'meridiem' => ['a', 'p'], - 'weekdays' => ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'], - 'weekdays_short' => ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'], - 'weekdays_min' => ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'], - 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], - 'months_short' => ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'], - 'months_standalone' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'İyun', 'İyul', 'Avqust', 'Sentyabr', 'Oktyabr', 'Noyabr', 'Dekabr'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'D MMMM YYYY, dddd HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bas.php b/vendor/nesbot/carbon/src/Carbon/Lang/bas.php deleted file mode 100644 index 41bfa1d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bas.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['I bikɛ̂glà', 'I ɓugajɔp'], - 'weekdays' => ['ŋgwà nɔ̂y', 'ŋgwà njaŋgumba', 'ŋgwà ûm', 'ŋgwà ŋgê', 'ŋgwà mbɔk', 'ŋgwà kɔɔ', 'ŋgwà jôn'], - 'weekdays_short' => ['nɔy', 'nja', 'uum', 'ŋge', 'mbɔ', 'kɔɔ', 'jon'], - 'weekdays_min' => ['nɔy', 'nja', 'uum', 'ŋge', 'mbɔ', 'kɔɔ', 'jon'], - 'months' => ['Kɔndɔŋ', 'Màcɛ̂l', 'Màtùmb', 'Màtop', 'M̀puyɛ', 'Hìlòndɛ̀', 'Njèbà', 'Hìkaŋ', 'Dìpɔ̀s', 'Bìòôm', 'Màyɛsèp', 'Lìbuy li ńyèe'], - 'months_short' => ['kɔn', 'mac', 'mat', 'mto', 'mpu', 'hil', 'nje', 'hik', 'dip', 'bio', 'may', 'liɓ'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'second' => ':count móndî', // less reliable - 's' => ':count móndî', // less reliable - 'a_second' => ':count móndî', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/be.php b/vendor/nesbot/carbon/src/Carbon/Lang/be.php deleted file mode 100644 index 06f4043..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/be.php +++ /dev/null @@ -1,160 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Carbon\CarbonInterface; -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); - }, 'be'); -} -// @codeCoverageIgnoreEnd - -/* - * Authors: - * - Josh Soref - * - SobakaSlava - * - François B - * - Serhan Apaydın - * - JD Isaacks - * - AbadonnaAbbys - * - Siomkin Alexander - */ -return [ - 'year' => ':count год|:count гады|:count гадоў', - 'a_year' => '{1}год|:count год|:count гады|:count гадоў', - 'y' => ':count год|:count гады|:count гадоў', - 'month' => ':count месяц|:count месяцы|:count месяцаў', - 'a_month' => '{1}месяц|:count месяц|:count месяцы|:count месяцаў', - 'm' => ':count месяц|:count месяцы|:count месяцаў', - 'week' => ':count тыдзень|:count тыдні|:count тыдняў', - 'a_week' => '{1}тыдзень|:count тыдзень|:count тыдні|:count тыдняў', - 'w' => ':count тыдзень|:count тыдні|:count тыдняў', - 'day' => ':count дзень|:count дні|:count дзён', - 'a_day' => '{1}дзень|:count дзень|:count дні|:count дзён', - 'd' => ':count дн', - 'hour' => ':count гадзіну|:count гадзіны|:count гадзін', - 'a_hour' => '{1}гадзіна|:count гадзіна|:count гадзіны|:count гадзін', - 'h' => ':count гадзіна|:count гадзіны|:count гадзін', - 'minute' => ':count хвіліна|:count хвіліны|:count хвілін', - 'a_minute' => '{1}хвіліна|:count хвіліна|:count хвіліны|:count хвілін', - 'min' => ':count хв', - 'second' => ':count секунда|:count секунды|:count секунд', - 'a_second' => '{1}некалькі секунд|:count секунда|:count секунды|:count секунд', - 's' => ':count сек', - - 'hour_ago' => ':count гадзіну|:count гадзіны|:count гадзін', - 'a_hour_ago' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', - 'h_ago' => ':count гадзіну|:count гадзіны|:count гадзін', - 'minute_ago' => ':count хвіліну|:count хвіліны|:count хвілін', - 'a_minute_ago' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', - 'min_ago' => ':count хвіліну|:count хвіліны|:count хвілін', - 'second_ago' => ':count секунду|:count секунды|:count секунд', - 'a_second_ago' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', - 's_ago' => ':count секунду|:count секунды|:count секунд', - - 'hour_from_now' => ':count гадзіну|:count гадзіны|:count гадзін', - 'a_hour_from_now' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', - 'h_from_now' => ':count гадзіну|:count гадзіны|:count гадзін', - 'minute_from_now' => ':count хвіліну|:count хвіліны|:count хвілін', - 'a_minute_from_now' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', - 'min_from_now' => ':count хвіліну|:count хвіліны|:count хвілін', - 'second_from_now' => ':count секунду|:count секунды|:count секунд', - 'a_second_from_now' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', - 's_from_now' => ':count секунду|:count секунды|:count секунд', - - 'hour_after' => ':count гадзіну|:count гадзіны|:count гадзін', - 'a_hour_after' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', - 'h_after' => ':count гадзіну|:count гадзіны|:count гадзін', - 'minute_after' => ':count хвіліну|:count хвіліны|:count хвілін', - 'a_minute_after' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', - 'min_after' => ':count хвіліну|:count хвіліны|:count хвілін', - 'second_after' => ':count секунду|:count секунды|:count секунд', - 'a_second_after' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', - 's_after' => ':count секунду|:count секунды|:count секунд', - - 'hour_before' => ':count гадзіну|:count гадзіны|:count гадзін', - 'a_hour_before' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', - 'h_before' => ':count гадзіну|:count гадзіны|:count гадзін', - 'minute_before' => ':count хвіліну|:count хвіліны|:count хвілін', - 'a_minute_before' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', - 'min_before' => ':count хвіліну|:count хвіліны|:count хвілін', - 'second_before' => ':count секунду|:count секунды|:count секунд', - 'a_second_before' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', - 's_before' => ':count секунду|:count секунды|:count секунд', - - 'ago' => ':time таму', - 'from_now' => 'праз :time', - 'after' => ':time пасля', - 'before' => ':time да', - 'diff_now' => 'цяпер', - 'diff_today' => 'Сёння', - 'diff_today_regexp' => 'Сёння(?:\\s+ў)?', - 'diff_yesterday' => 'учора', - 'diff_yesterday_regexp' => 'Учора(?:\\s+ў)?', - 'diff_tomorrow' => 'заўтра', - 'diff_tomorrow_regexp' => 'Заўтра(?:\\s+ў)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY г.', - 'LLL' => 'D MMMM YYYY г., HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY г., HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Сёння ў] LT', - 'nextDay' => '[Заўтра ў] LT', - 'nextWeek' => '[У] dddd [ў] LT', - 'lastDay' => '[Учора ў] LT', - 'lastWeek' => static fn (CarbonInterface $current) => match ($current->dayOfWeek) { - 1, 2, 4 => '[У мінулы] dddd [ў] LT', - default => '[У мінулую] dddd [ў] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => static fn ($number, $period) => match ($period) { - 'M', 'd', 'DDD', 'w', 'W' => ($number % 10 === 2 || $number % 10 === 3) && - ($number % 100 !== 12 && $number % 100 !== 13) ? $number.'-і' : $number.'-ы', - 'D' => $number.'-га', - default => $number, - }, - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'ночы'; - } - - if ($hour < 12) { - return 'раніцы'; - } - - if ($hour < 17) { - return 'дня'; - } - - return 'вечара'; - }, - 'months' => ['студзеня', 'лютага', 'сакавіка', 'красавіка', 'траўня', 'чэрвеня', 'ліпеня', 'жніўня', 'верасня', 'кастрычніка', 'лістапада', 'снежня'], - 'months_standalone' => ['студзень', 'люты', 'сакавік', 'красавік', 'травень', 'чэрвень', 'ліпень', 'жнівень', 'верасень', 'кастрычнік', 'лістапад', 'снежань'], - 'months_short' => ['студ', 'лют', 'сак', 'крас', 'трав', 'чэрв', 'ліп', 'жнів', 'вер', 'каст', 'ліст', 'снеж'], - 'months_regexp' => '/(DD?o?\.?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['нядзелю', 'панядзелак', 'аўторак', 'сераду', 'чацвер', 'пятніцу', 'суботу'], - 'weekdays_standalone' => ['нядзеля', 'панядзелак', 'аўторак', 'серада', 'чацвер', 'пятніца', 'субота'], - 'weekdays_short' => ['нд', 'пн', 'ат', 'ср', 'чц', 'пт', 'сб'], - 'weekdays_min' => ['нд', 'пн', 'ат', 'ср', 'чц', 'пт', 'сб'], - 'weekdays_regexp' => '/\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' і '], - 'months_short_standalone' => ['сту', 'лют', 'сак', 'кра', 'май', 'чэр', 'ліп', 'жні', 'вер', 'кас', 'ліс', 'сне'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php b/vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php deleted file mode 100644 index 26684b4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/be.php', [ - 'months' => ['студзеня', 'лютага', 'сакавіка', 'красавіка', 'мая', 'чэрвеня', 'ліпеня', 'жніўня', 'верасня', 'кастрычніка', 'лістапада', 'снежня'], - 'months_short' => ['сту', 'лют', 'сак', 'кра', 'мая', 'чэр', 'ліп', 'жні', 'вер', 'кас', 'ліс', 'сне'], - 'weekdays' => ['Нядзеля', 'Панядзелак', 'Аўторак', 'Серада', 'Чацвер', 'Пятніца', 'Субота'], - 'weekdays_short' => ['Няд', 'Пан', 'Аўт', 'Срд', 'Чцв', 'Пят', 'Суб'], - 'weekdays_min' => ['Няд', 'Пан', 'Аўт', 'Срд', 'Чцв', 'Пят', 'Суб'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php b/vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php deleted file mode 100644 index 517ce83..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['studzienia', 'lutaha', 'sakavika', 'krasavika', 'maja', 'červienia', 'lipienia', 'žniŭnia', 'vieraśnia', 'kastryčnika', 'listapada', 'śniežnia'], - 'months_short' => ['Stu', 'Lut', 'Sak', 'Kra', 'Maj', 'Čer', 'Lip', 'Žni', 'Vie', 'Kas', 'Lis', 'Śni'], - 'weekdays' => ['Niadziela', 'Paniadziełak', 'Aŭtorak', 'Sierada', 'Čaćvier', 'Piatnica', 'Subota'], - 'weekdays_short' => ['Nia', 'Pan', 'Aŭt', 'Sie', 'Čać', 'Pia', 'Sub'], - 'weekdays_min' => ['Nia', 'Pan', 'Aŭt', 'Sie', 'Čać', 'Pia', 'Sub'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bem.php b/vendor/nesbot/carbon/src/Carbon/Lang/bem.php deleted file mode 100644 index 1c3ef03..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bem.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/bem_ZM.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php b/vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php deleted file mode 100644 index 620b579..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - ANLoc Martin Benjamin locales@africanlocalization.net - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'MM/DD/YYYY', - ], - 'months' => ['Januari', 'Februari', 'Machi', 'Epreo', 'Mei', 'Juni', 'Julai', 'Ogasti', 'Septemba', 'Oktoba', 'Novemba', 'Disemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Epr', 'Mei', 'Jun', 'Jul', 'Oga', 'Sep', 'Okt', 'Nov', 'Dis'], - 'weekdays' => ['Pa Mulungu', 'Palichimo', 'Palichibuli', 'Palichitatu', 'Palichine', 'Palichisano', 'Pachibelushi'], - 'weekdays_short' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - 'weekdays_min' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['uluchelo', 'akasuba'], - - 'year' => 'myaka :count', - 'y' => 'myaka :count', - 'a_year' => 'myaka :count', - - 'month' => 'myeshi :count', - 'm' => 'myeshi :count', - 'a_month' => 'myeshi :count', - - 'week' => 'umulungu :count', - 'w' => 'umulungu :count', - 'a_week' => 'umulungu :count', - - 'day' => 'inshiku :count', - 'd' => 'inshiku :count', - 'a_day' => 'inshiku :count', - - 'hour' => 'awala :count', - 'h' => 'awala :count', - 'a_hour' => 'awala :count', - - 'minute' => 'miniti :count', - 'min' => 'miniti :count', - 'a_minute' => 'miniti :count', - - 'second' => 'sekondi :count', - 's' => 'sekondi :count', - 'a_second' => 'sekondi :count', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ber.php b/vendor/nesbot/carbon/src/Carbon/Lang/ber.php deleted file mode 100644 index 685603c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ber.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ber_DZ.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php deleted file mode 100644 index 38de10a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pablo Saratxaga pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avq', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['bazar günü', 'birinci gün', 'ikinci gün', 'üçüncü gün', 'dördüncü gün', 'beşinci gün', 'altıncı gün'], - 'weekdays_short' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], - 'weekdays_min' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php deleted file mode 100644 index 38de10a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pablo Saratxaga pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avq', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['bazar günü', 'birinci gün', 'ikinci gün', 'üçüncü gün', 'dördüncü gün', 'beşinci gün', 'altıncı gün'], - 'weekdays_short' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], - 'weekdays_min' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bez.php b/vendor/nesbot/carbon/src/Carbon/Lang/bez.php deleted file mode 100644 index d59c5ef..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bez.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['pamilau', 'pamunyi'], - 'weekdays' => ['pa mulungu', 'pa shahuviluha', 'pa hivili', 'pa hidatu', 'pa hitayi', 'pa hihanu', 'pa shahulembela'], - 'weekdays_short' => ['Mul', 'Vil', 'Hiv', 'Hid', 'Hit', 'Hih', 'Lem'], - 'weekdays_min' => ['Mul', 'Vil', 'Hiv', 'Hid', 'Hit', 'Hih', 'Lem'], - 'months' => ['pa mwedzi gwa hutala', 'pa mwedzi gwa wuvili', 'pa mwedzi gwa wudatu', 'pa mwedzi gwa wutai', 'pa mwedzi gwa wuhanu', 'pa mwedzi gwa sita', 'pa mwedzi gwa saba', 'pa mwedzi gwa nane', 'pa mwedzi gwa tisa', 'pa mwedzi gwa kumi', 'pa mwedzi gwa kumi na moja', 'pa mwedzi gwa kumi na mbili'], - 'months_short' => ['Hut', 'Vil', 'Dat', 'Tai', 'Han', 'Sit', 'Sab', 'Nan', 'Tis', 'Kum', 'Kmj', 'Kmb'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bg.php b/vendor/nesbot/carbon/src/Carbon/Lang/bg.php deleted file mode 100644 index c793ab7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bg.php +++ /dev/null @@ -1,108 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Serhan Apaydın - * - JD Isaacks - * - Glavić - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count година|:count години', - 'a_year' => 'година|:count години', - 'y' => ':count година|:count години', - 'month' => ':count месец|:count месеца', - 'a_month' => 'месец|:count месеца', - 'm' => ':count месец|:count месеца', - 'week' => ':count седмица|:count седмици', - 'a_week' => 'седмица|:count седмици', - 'w' => ':count седмица|:count седмици', - 'day' => ':count ден|:count дни', - 'a_day' => 'ден|:count дни', - 'd' => ':count ден|:count дни', - 'hour' => ':count час|:count часа', - 'a_hour' => 'час|:count часа', - 'h' => ':count час|:count часа', - 'minute' => ':count минута|:count минути', - 'a_minute' => 'минута|:count минути', - 'min' => ':count минута|:count минути', - 'second' => ':count секунда|:count секунди', - 'a_second' => 'няколко секунди|:count секунди', - 's' => ':count секунда|:count секунди', - 'ago' => 'преди :time', - 'from_now' => 'след :time', - 'after' => 'след :time', - 'before' => 'преди :time', - 'diff_now' => 'сега', - 'diff_today' => 'Днес', - 'diff_today_regexp' => 'Днес(?:\\s+в)?', - 'diff_yesterday' => 'вчера', - 'diff_yesterday_regexp' => 'Вчера(?:\\s+в)?', - 'diff_tomorrow' => 'утре', - 'diff_tomorrow_regexp' => 'Утре(?:\\s+в)?', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'D.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY H:mm', - 'LLLL' => 'dddd, D MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[Днес в] LT', - 'nextDay' => '[Утре в] LT', - 'nextWeek' => 'dddd [в] LT', - 'lastDay' => '[Вчера в] LT', - 'lastWeek' => static fn (CarbonInterface $current) => match ($current->dayOfWeek) { - 0, 3, 6 => '[В изминалата] dddd [в] LT', - default => '[В изминалия] dddd [в] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - $lastDigit = $number % 10; - $last2Digits = $number % 100; - if ($number === 0) { - return "$number-ев"; - } - if ($last2Digits === 0) { - return "$number-ен"; - } - if ($last2Digits > 10 && $last2Digits < 20) { - return "$number-ти"; - } - if ($lastDigit === 1) { - return "$number-ви"; - } - if ($lastDigit === 2) { - return "$number-ри"; - } - if ($lastDigit === 7 || $lastDigit === 8) { - return "$number-ми"; - } - - return "$number-ти"; - }, - 'months' => ['януари', 'февруари', 'март', 'април', 'май', 'юни', 'юли', 'август', 'септември', 'октомври', 'ноември', 'декември'], - 'months_short' => ['яну', 'фев', 'мар', 'апр', 'май', 'юни', 'юли', 'авг', 'сеп', 'окт', 'ное', 'дек'], - 'weekdays' => ['неделя', 'понеделник', 'вторник', 'сряда', 'четвъртък', 'петък', 'събота'], - 'weekdays_short' => ['нед', 'пон', 'вто', 'сря', 'чет', 'пет', 'съб'], - 'weekdays_min' => ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' и '], - 'meridiem' => ['преди обяд', 'следобед'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php b/vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php deleted file mode 100644 index b53874d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/bg.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bhb.php b/vendor/nesbot/carbon/src/Carbon/Lang/bhb.php deleted file mode 100644 index 49f0803..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bhb.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/bhb_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php deleted file mode 100644 index fadbf77..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. alexey.merzlyakov@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - 'weekdays' => ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - 'weekdays_short' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - 'weekdays_min' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bho.php b/vendor/nesbot/carbon/src/Carbon/Lang/bho.php deleted file mode 100644 index e9ed0b6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bho.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/bho_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php deleted file mode 100644 index 2f4cdfa..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bhashaghar@googlegroups.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर"'], - 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर"'], - 'weekdays' => ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'], - 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], - - 'hour' => ':count मौसम', - 'h' => ':count मौसम', - 'a_hour' => ':count मौसम', - - 'minute' => ':count कला', - 'min' => ':count कला', - 'a_minute' => ':count कला', - - 'second' => ':count सोमार', - 's' => ':count सोमार', - 'a_second' => ':count सोमार', - - 'year' => ':count साल', - 'y' => ':count साल', - 'a_year' => ':count साल', - - 'month' => ':count महिना', - 'm' => ':count महिना', - 'a_month' => ':count महिना', - - 'week' => ':count सप्ताह', - 'w' => ':count सप्ताह', - 'a_week' => ':count सप्ताह', - - 'day' => ':count दिन', - 'd' => ':count दिन', - 'a_day' => ':count दिन', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bi.php b/vendor/nesbot/carbon/src/Carbon/Lang/bi.php deleted file mode 100644 index dd08128..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bi.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/bi_VU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php b/vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php deleted file mode 100644 index 15d335c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com & maninder1.s@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'formats' => [ - 'L' => 'dddd DD MMM YYYY', - ], - 'months' => ['jenuware', 'febwari', 'maj', 'epril', 'mei', 'jun', 'julae', 'ogis', 'septemba', 'oktoba', 'novemba', 'disemba'], - 'months_short' => ['jen', 'feb', 'maj', 'epr', 'mei', 'jun', 'jul', 'ogi', 'sep', 'okt', 'nov', 'dis'], - 'weekdays' => ['sande', 'mande', 'maj', 'wota', 'fraede', 'sarede'], - 'weekdays_short' => ['san', 'man', 'maj', 'wot', 'fra', 'sar'], - 'weekdays_min' => ['san', 'man', 'maj', 'wot', 'fra', 'sar'], - - 'year' => ':count seven', // less reliable - 'y' => ':count seven', // less reliable - 'a_year' => ':count seven', // less reliable - - 'month' => ':count mi', // less reliable - 'm' => ':count mi', // less reliable - 'a_month' => ':count mi', // less reliable - - 'week' => ':count sarede', // less reliable - 'w' => ':count sarede', // less reliable - 'a_week' => ':count sarede', // less reliable - - 'day' => ':count betde', // less reliable - 'd' => ':count betde', // less reliable - 'a_day' => ':count betde', // less reliable - - 'hour' => ':count klok', // less reliable - 'h' => ':count klok', // less reliable - 'a_hour' => ':count klok', // less reliable - - 'minute' => ':count smol', // less reliable - 'min' => ':count smol', // less reliable - 'a_minute' => ':count smol', // less reliable - - 'second' => ':count tu', // less reliable - 's' => ':count tu', // less reliable - 'a_second' => ':count tu', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bm.php b/vendor/nesbot/carbon/src/Carbon/Lang/bm.php deleted file mode 100644 index 92822d2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bm.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Estelle Comment - */ -return [ - 'year' => 'san :count', - 'a_year' => '{1}san kelen|san :count', - 'y' => 'san :count', - 'month' => 'kalo :count', - 'a_month' => '{1}kalo kelen|kalo :count', - 'm' => 'k. :count', - 'week' => 'dɔgɔkun :count', - 'a_week' => 'dɔgɔkun kelen', - 'w' => 'd. :count', - 'day' => 'tile :count', - 'd' => 't. :count', - 'a_day' => '{1}tile kelen|tile :count', - 'hour' => 'lɛrɛ :count', - 'a_hour' => '{1}lɛrɛ kelen|lɛrɛ :count', - 'h' => 'l. :count', - 'minute' => 'miniti :count', - 'a_minute' => '{1}miniti kelen|miniti :count', - 'min' => 'm. :count', - 'second' => 'sekondi :count', - 'a_second' => '{1}sanga dama dama|sekondi :count', - 's' => 'sek. :count', - 'ago' => 'a bɛ :time bɔ', - 'from_now' => ':time kɔnɔ', - 'diff_today' => 'Bi', - 'diff_yesterday' => 'Kunu', - 'diff_yesterday_regexp' => 'Kunu(?:\\s+lɛrɛ)?', - 'diff_tomorrow' => 'Sini', - 'diff_tomorrow_regexp' => 'Sini(?:\\s+lɛrɛ)?', - 'diff_today_regexp' => 'Bi(?:\\s+lɛrɛ)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'MMMM [tile] D [san] YYYY', - 'LLL' => 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', - 'LLLL' => 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Bi lɛrɛ] LT', - 'nextDay' => '[Sini lɛrɛ] LT', - 'nextWeek' => 'dddd [don lɛrɛ] LT', - 'lastDay' => '[Kunu lɛrɛ] LT', - 'lastWeek' => 'dddd [tɛmɛnen lɛrɛ] LT', - 'sameElse' => 'L', - ], - 'months' => ['Zanwuyekalo', 'Fewuruyekalo', 'Marisikalo', 'Awirilikalo', 'Mɛkalo', 'Zuwɛnkalo', 'Zuluyekalo', 'Utikalo', 'Sɛtanburukalo', 'ɔkutɔburukalo', 'Nowanburukalo', 'Desanburukalo'], - 'months_short' => ['Zan', 'Few', 'Mar', 'Awi', 'Mɛ', 'Zuw', 'Zul', 'Uti', 'Sɛt', 'ɔku', 'Now', 'Des'], - 'weekdays' => ['Kari', 'Ntɛnɛn', 'Tarata', 'Araba', 'Alamisa', 'Juma', 'Sibiri'], - 'weekdays_short' => ['Kar', 'Ntɛ', 'Tar', 'Ara', 'Ala', 'Jum', 'Sib'], - 'weekdays_min' => ['Ka', 'Nt', 'Ta', 'Ar', 'Al', 'Ju', 'Si'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' ni '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bn.php b/vendor/nesbot/carbon/src/Carbon/Lang/bn.php deleted file mode 100644 index 663cf25..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bn.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Shakib Hossain - * - Raju - * - Aniruddha Adhikary - * - JD Isaacks - * - Saiful Islam - * - Faisal Islam - */ -return [ - 'year' => ':count বছর', - 'a_year' => 'এক বছর|:count বছর', - 'y' => '১ বছর|:count বছর', - 'month' => ':count মাস', - 'a_month' => 'এক মাস|:count মাস', - 'm' => '১ মাস|:count মাস', - 'week' => ':count সপ্তাহ', - 'a_week' => '১ সপ্তাহ|:count সপ্তাহ', - 'w' => '১ সপ্তাহ|:count সপ্তাহ', - 'day' => ':count দিন', - 'a_day' => 'এক দিন|:count দিন', - 'd' => '১ দিন|:count দিন', - 'hour' => ':count ঘন্টা', - 'a_hour' => 'এক ঘন্টা|:count ঘন্টা', - 'h' => '১ ঘন্টা|:count ঘন্টা', - 'minute' => ':count মিনিট', - 'a_minute' => 'এক মিনিট|:count মিনিট', - 'min' => '১ মিনিট|:count মিনিট', - 'second' => ':count সেকেন্ড', - 'a_second' => 'কয়েক সেকেন্ড|:count সেকেন্ড', - 's' => '১ সেকেন্ড|:count সেকেন্ড', - 'ago' => ':time আগে', - 'from_now' => ':time পরে', - 'after' => ':time পরে', - 'before' => ':time আগে', - 'diff_now' => 'এখন', - 'diff_today' => 'আজ', - 'diff_yesterday' => 'গতকাল', - 'diff_tomorrow' => 'আগামীকাল', - 'period_recurrences' => ':count বার|:count বার', - 'period_interval' => 'প্রতি :interval', - 'period_start_date' => ':date থেকে', - 'period_end_date' => ':date পর্যন্ত', - 'formats' => [ - 'LT' => 'A Oh:Om সময়', - 'LTS' => 'A Oh:Om:Os সময়', - 'L' => 'OD/OM/OY', - 'LL' => 'OD MMMM OY', - 'LLL' => 'OD MMMM OY, A Oh:Om সময়', - 'LLLL' => 'dddd, OD MMMM OY, A Oh:Om সময়', - ], - 'calendar' => [ - 'sameDay' => '[আজ] LT', - 'nextDay' => '[আগামীকাল] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[গতকাল] LT', - 'lastWeek' => '[গত] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'রাত'; - } - if ($hour < 10) { - return 'সকাল'; - } - if ($hour < 17) { - return 'দুপুর'; - } - if ($hour < 20) { - return 'বিকাল'; - } - - return 'রাত'; - }, - 'months' => ['জানুয়ারী', 'ফেব্রুয়ারি', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'months_short' => ['জানু', 'ফেব', 'মার্চ', 'এপ্র', 'মে', 'জুন', 'জুল', 'আগ', 'সেপ্ট', 'অক্টো', 'নভে', 'ডিসে'], - 'weekdays' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'], - 'weekdays_short' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'], - 'weekdays_min' => ['রবি', 'সোম', 'মঙ্গ', 'বুধ', 'বৃহঃ', 'শুক্র', 'শনি'], - 'list' => [', ', ' এবং '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekdays_standalone' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহষ্পতিবার', 'শুক্রবার', 'শনিবার'], - 'weekdays_min_standalone' => ['রঃ', 'সোঃ', 'মঃ', 'বুঃ', 'বৃঃ', 'শুঃ', 'শনি'], - 'months_short_standalone' => ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'alt_numbers' => ['০', '১', '২', '৩', '৪', '৫', '৬', '৭', '৮', '৯'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php b/vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php deleted file mode 100644 index b5b28dd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ankur Group, Taneem Ahmed, Jamil Ahmed - */ -return array_replace_recursive(require __DIR__.'/bn.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'months_short' => ['জানু', 'ফেব', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'weekdays' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'], - 'weekdays_short' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহঃ', 'শুক্র', 'শনি'], - 'weekdays_min' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহঃ', 'শুক্র', 'শনি'], - 'first_day_of_week' => 5, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php deleted file mode 100644 index 8b3a50e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/bn.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'months_short' => ['জানু', 'ফেব', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'weekdays' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'], - 'weekdays_short' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'], - 'weekdays_min' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bo.php b/vendor/nesbot/carbon/src/Carbon/Lang/bo.php deleted file mode 100644 index 9739f46..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bo.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - JD Isaacks - */ -return [ - 'year' => '{1}ལོ་གཅིག|]1,Inf[:count ལོ', - 'month' => '{1}ཟླ་བ་གཅིག|]1,Inf[:count ཟླ་བ', - 'week' => ':count བདུན་ཕྲག', - 'day' => '{1}ཉིན་གཅིག|]1,Inf[:count ཉིན་', - 'hour' => '{1}ཆུ་ཚོད་གཅིག|]1,Inf[:count ཆུ་ཚོད', - 'minute' => '{1}སྐར་མ་གཅིག|]1,Inf[:count སྐར་མ', - 'second' => '{1}ལམ་སང|]1,Inf[:count སྐར་ཆ།', - 'ago' => ':time སྔན་ལ', - 'from_now' => ':time ལ་', - 'diff_yesterday' => 'ཁ་སང', - 'diff_today' => 'དི་རིང', - 'diff_tomorrow' => 'སང་ཉིན', - 'formats' => [ - 'LT' => 'A h:mm', - 'LTS' => 'A h:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm', - ], - 'calendar' => [ - 'sameDay' => '[དི་རིང] LT', - 'nextDay' => '[སང་ཉིན] LT', - 'nextWeek' => '[བདུན་ཕྲག་རྗེས་མ], LT', - 'lastDay' => '[ཁ་སང] LT', - 'lastWeek' => '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'མཚན་མོ'; - } - if ($hour < 10) { - return 'ཞོགས་ཀས'; - } - if ($hour < 17) { - return 'ཉིན་གུང'; - } - if ($hour < 20) { - return 'དགོང་དག'; - } - - return 'མཚན་མོ'; - }, - 'months' => ['ཟླ་བ་དང་པོ', 'ཟླ་བ་གཉིས་པ', 'ཟླ་བ་གསུམ་པ', 'ཟླ་བ་བཞི་པ', 'ཟླ་བ་ལྔ་པ', 'ཟླ་བ་དྲུག་པ', 'ཟླ་བ་བདུན་པ', 'ཟླ་བ་བརྒྱད་པ', 'ཟླ་བ་དགུ་པ', 'ཟླ་བ་བཅུ་པ', 'ཟླ་བ་བཅུ་གཅིག་པ', 'ཟླ་བ་བཅུ་གཉིས་པ'], - 'months_short' => ['ཟླ་བ་དང་པོ', 'ཟླ་བ་གཉིས་པ', 'ཟླ་བ་གསུམ་པ', 'ཟླ་བ་བཞི་པ', 'ཟླ་བ་ལྔ་པ', 'ཟླ་བ་དྲུག་པ', 'ཟླ་བ་བདུན་པ', 'ཟླ་བ་བརྒྱད་པ', 'ཟླ་བ་དགུ་པ', 'ཟླ་བ་བཅུ་པ', 'ཟླ་བ་བཅུ་གཅིག་པ', 'ཟླ་བ་བཅུ་གཉིས་པ'], - 'weekdays' => ['གཟའ་ཉི་མ་', 'གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་'], - 'weekdays_short' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ', 'པ་སངས་', 'སྤེན་པ་'], - 'weekdays_min' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ', 'པ་སངས་', 'སྤེན་པ་'], - 'list' => [', ', ' ཨནད་ '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'months_standalone' => ['ཟླ་བ་དང་པོ་', 'ཟླ་བ་གཉིས་པ་', 'ཟླ་བ་གསུམ་པ་', 'ཟླ་བ་བཞི་པ་', 'ཟླ་བ་ལྔ་པ་', 'ཟླ་བ་དྲུག་པ་', 'ཟླ་བ་བདུན་པ་', 'ཟླ་བ་བརྒྱད་པ་', 'ཟླ་བ་དགུ་པ་', 'ཟླ་བ་བཅུ་པ་', 'ཟླ་བ་བཅུ་གཅིག་པ་', 'ཟླ་བ་བཅུ་གཉིས་པ་'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php b/vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php deleted file mode 100644 index 380abb1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/bo.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php deleted file mode 100644 index ca50d04..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/bo.php', [ - 'meridiem' => ['སྔ་དྲོ་', 'ཕྱི་དྲོ་'], - 'weekdays' => ['གཟའ་ཉི་མ་', 'གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་'], - 'weekdays_short' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ་', 'པ་སངས་', 'སྤེན་པ་'], - 'weekdays_min' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ་', 'པ་སངས་', 'སྤེན་པ་'], - 'months' => ['ཟླ་བ་དང་པོ', 'ཟླ་བ་གཉིས་པ', 'ཟླ་བ་གསུམ་པ', 'ཟླ་བ་བཞི་པ', 'ཟླ་བ་ལྔ་པ', 'ཟླ་བ་དྲུག་པ', 'ཟླ་བ་བདུན་པ', 'ཟླ་བ་བརྒྱད་པ', 'ཟླ་བ་དགུ་པ', 'ཟླ་བ་བཅུ་པ', 'ཟླ་བ་བཅུ་གཅིག་པ', 'ཟླ་བ་བཅུ་གཉིས་པ'], - 'months_short' => ['ཟླ་༡', 'ཟླ་༢', 'ཟླ་༣', 'ཟླ་༤', 'ཟླ་༥', 'ཟླ་༦', 'ཟླ་༧', 'ཟླ་༨', 'ཟླ་༩', 'ཟླ་༡༠', 'ཟླ་༡༡', 'ཟླ་༡༢'], - 'months_standalone' => ['ཟླ་བ་དང་པོ་', 'ཟླ་བ་གཉིས་པ་', 'ཟླ་བ་གསུམ་པ་', 'ཟླ་བ་བཞི་པ་', 'ཟླ་བ་ལྔ་པ་', 'ཟླ་བ་དྲུག་པ་', 'ཟླ་བ་བདུན་པ་', 'ཟླ་བ་བརྒྱད་པ་', 'ཟླ་བ་དགུ་པ་', 'ཟླ་བ་བཅུ་པ་', 'ཟླ་བ་བཅུ་གཅིག་པ་', 'ཟླ་བ་བཅུ་གཉིས་པ་'], - 'weekend' => [0, 0], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'YYYY-MM-DD', - 'LL' => 'YYYY ལོའི་MMMཚེས་D', - 'LLL' => 'སྤྱི་ལོ་YYYY MMMMའི་ཚེས་D h:mm a', - 'LLLL' => 'YYYY MMMMའི་ཚེས་D, dddd h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/br.php b/vendor/nesbot/carbon/src/Carbon/Lang/br.php deleted file mode 100644 index cdc0545..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/br.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Serhan Apaydın - * - JD Isaacks - */ -return [ - 'year' => '{1}:count bloaz|{3,4,5,9}:count bloaz|[0,Inf[:count vloaz', - 'a_year' => '{1}ur bloaz|{3,4,5,9}:count bloaz|[0,Inf[:count vloaz', - 'month' => '{1}:count miz|{2}:count viz|[0,Inf[:count miz', - 'a_month' => '{1}ur miz|{2}:count viz|[0,Inf[:count miz', - 'week' => ':count sizhun', - 'a_week' => '{1}ur sizhun|:count sizhun', - 'day' => '{1}:count devezh|{2}:count zevezh|[0,Inf[:count devezh', - 'a_day' => '{1}un devezh|{2}:count zevezh|[0,Inf[:count devezh', - 'hour' => ':count eur', - 'a_hour' => '{1}un eur|:count eur', - 'minute' => '{1}:count vunutenn|{2}:count vunutenn|[0,Inf[:count munutenn', - 'a_minute' => '{1}ur vunutenn|{2}:count vunutenn|[0,Inf[:count munutenn', - 'second' => ':count eilenn', - 'a_second' => '{1}un nebeud segondennoù|[0,Inf[:count eilenn', - 'ago' => ':time \'zo', - 'from_now' => 'a-benn :time', - 'diff_now' => 'bremañ', - 'diff_today' => 'Hiziv', - 'diff_today_regexp' => 'Hiziv(?:\\s+da)?', - 'diff_yesterday' => 'decʼh', - 'diff_yesterday_regexp' => 'Dec\'h(?:\\s+da)?', - 'diff_tomorrow' => 'warcʼhoazh', - 'diff_tomorrow_regexp' => 'Warc\'hoazh(?:\\s+da)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D [a viz] MMMM YYYY', - 'LLL' => 'D [a viz] MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D [a viz] MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Hiziv da] LT', - 'nextDay' => '[Warc\'hoazh da] LT', - 'nextWeek' => 'dddd [da] LT', - 'lastDay' => '[Dec\'h da] LT', - 'lastWeek' => 'dddd [paset da] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static fn ($number) => $number.($number === 1 ? 'añ' : 'vet'), - 'months' => ['Genver', 'C\'hwevrer', 'Meurzh', 'Ebrel', 'Mae', 'Mezheven', 'Gouere', 'Eost', 'Gwengolo', 'Here', 'Du', 'Kerzu'], - 'months_short' => ['Gen', 'C\'hwe', 'Meu', 'Ebr', 'Mae', 'Eve', 'Gou', 'Eos', 'Gwe', 'Her', 'Du', 'Ker'], - 'weekdays' => ['Sul', 'Lun', 'Meurzh', 'Merc\'her', 'Yaou', 'Gwener', 'Sadorn'], - 'weekdays_short' => ['Sul', 'Lun', 'Meu', 'Mer', 'Yao', 'Gwe', 'Sad'], - 'weekdays_min' => ['Su', 'Lu', 'Me', 'Mer', 'Ya', 'Gw', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' hag '], - 'meridiem' => ['A.M.', 'G.M.'], - - 'y' => ':count bl.', - 'd' => ':count d', - 'h' => ':count e', - 'min' => ':count min', - 's' => ':count s', -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php deleted file mode 100644 index 7f54185..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/br.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/brx.php b/vendor/nesbot/carbon/src/Carbon/Lang/brx.php deleted file mode 100644 index a0a7bf9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/brx.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/brx_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php deleted file mode 100644 index e678aa9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'M/D/YY', - ], - 'months' => ['जानुवारी', 'फेब्रुवारी', 'मार्स', 'एफ्रिल', 'मे', 'जुन', 'जुलाइ', 'आगस्थ', 'सेबथेज्ब़र', 'अखथबर', 'नबेज्ब़र', 'दिसेज्ब़र'], - 'months_short' => ['जानुवारी', 'फेब्रुवारी', 'मार्स', 'एप्रिल', 'मे', 'जुन', 'जुलाइ', 'आगस्थ', 'सेबथेज्ब़र', 'अखथबर', 'नबेज्ब़र', 'दिसेज्ब़र'], - 'weekdays' => ['रबिबार', 'सोबार', 'मंगलबार', 'बुदबार', 'बिसथिबार', 'सुखुरबार', 'सुनिबार'], - 'weekdays_short' => ['रबि', 'सम', 'मंगल', 'बुद', 'बिसथि', 'सुखुर', 'सुनि'], - 'weekdays_min' => ['रबि', 'सम', 'मंगल', 'बुद', 'बिसथि', 'सुखुर', 'सुनि'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['फुं.', 'बेलासे.'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bs.php b/vendor/nesbot/carbon/src/Carbon/Lang/bs.php deleted file mode 100644 index 52b6d12..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bs.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bokideckonja - * - Josh Soref - * - François B - * - shaishavgandhi05 - * - Serhan Apaydın - * - JD Isaacks - * - Ademir Šehić - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count godina|:count godine|:count godina', - 'y' => ':count godina|:count godine|:count godina', - 'month' => ':count mjesec|:count mjeseca|:count mjeseci', - 'm' => ':count mjesec|:count mjeseca|:count mjeseci', - 'week' => ':count sedmica|:count sedmice|:count sedmica', - 'w' => ':count sedmica|:count sedmice|:count sedmica', - 'day' => ':count dan|:count dana|:count dana', - 'd' => ':count dan|:count dana|:count dana', - 'hour' => ':count sat|:count sata|:count sati', - 'h' => ':count sat|:count sata|:count sati', - 'minute' => ':count minut|:count minuta|:count minuta', - 'min' => ':count minut|:count minuta|:count minuta', - 'second' => ':count sekund|:count sekunda|:count sekundi', - 's' => ':count sekund|:count sekunda|:count sekundi', - - 'ago' => 'prije :time', - 'from_now' => 'za :time', - 'after' => 'nakon :time', - 'before' => ':time ranije', - - 'year_ago' => ':count godinu|:count godine|:count godina', - 'year_from_now' => ':count godinu|:count godine|:count godina', - 'week_ago' => ':count sedmicu|:count sedmice|:count sedmica', - 'week_from_now' => ':count sedmicu|:count sedmice|:count sedmica', - - 'diff_now' => 'sada', - 'diff_today' => 'danas', - 'diff_today_regexp' => 'danas(?:\\s+u)?', - 'diff_yesterday' => 'jučer', - 'diff_yesterday_regexp' => 'jučer(?:\\s+u)?', - 'diff_tomorrow' => 'sutra', - 'diff_tomorrow_regexp' => 'sutra(?:\\s+u)?', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[danas u] LT', - 'nextDay' => '[sutra u] LT', - 'nextWeek' => static fn (CarbonInterface $current) => match ($current->dayOfWeek) { - 0 => '[u] [nedjelju] [u] LT', - 3 => '[u] [srijedu] [u] LT', - 6 => '[u] [subotu] [u] LT', - default => '[u] dddd [u] LT', - }, - 'lastDay' => '[jučer u] LT', - 'lastWeek' => static fn (CarbonInterface $current) => match ($current->dayOfWeek) { - 0, 3 => '[prošlu] dddd [u] LT', - 6 => '[prošle] [subote] [u] LT', - default => '[prošli] dddd [u] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['januar', 'februar', 'mart', 'april', 'maj', 'juni', 'juli', 'august', 'septembar', 'oktobar', 'novembar', 'decembar'], - 'months_short' => ['jan.', 'feb.', 'mar.', 'apr.', 'maj.', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'], - 'weekdays' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sri.', 'čet.', 'pet.', 'sub.'], - 'weekdays_min' => ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' i '], - 'meridiem' => ['prijepodne', 'popodne'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php b/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php deleted file mode 100644 index 0a59117..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/bs.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php b/vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php deleted file mode 100644 index e1a1744..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/bs.php', [ - 'meridiem' => ['пре подне', 'поподне'], - 'weekdays' => ['недјеља', 'понедјељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'], - 'weekdays_short' => ['нед', 'пон', 'уто', 'сри', 'чет', 'пет', 'суб'], - 'weekdays_min' => ['нед', 'пон', 'уто', 'сри', 'чет', 'пет', 'суб'], - 'months' => ['јануар', 'фебруар', 'март', 'април', 'мај', 'јуни', 'јули', 'аугуст', 'септембар', 'октобар', 'новембар', 'децембар'], - 'months_short' => ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'ауг', 'сеп', 'окт', 'нов', 'дец'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D.M.YYYY.', - 'LL' => 'DD.MM.YYYY.', - 'LLL' => 'DD. MMMM YYYY. HH:mm', - 'LLLL' => 'dddd, DD. MMMM YYYY. HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php deleted file mode 100644 index b4e363e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/bs.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/byn.php b/vendor/nesbot/carbon/src/Carbon/Lang/byn.php deleted file mode 100644 index 7125f3d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/byn.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/byn_ER.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php deleted file mode 100644 index ad67533..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ልደትሪ', 'ካብኽብቲ', 'ክብላ', 'ፋጅኺሪ', 'ክቢቅሪ', 'ምኪኤል ትጓ̅ኒሪ', 'ኰርኩ', 'ማርያም ትሪ', 'ያኸኒ መሳቅለሪ', 'መተሉ', 'ምኪኤል መሽወሪ', 'ተሕሳስሪ'], - 'months_short' => ['ልደት', 'ካብኽ', 'ክብላ', 'ፋጅኺ', 'ክቢቅ', 'ም/ት', 'ኰር', 'ማርያ', 'ያኸኒ', 'መተሉ', 'ም/ም', 'ተሕሳ'], - 'weekdays' => ['ሰንበር ቅዳዅ', 'ሰኑ', 'ሰሊጝ', 'ለጓ ወሪ ለብዋ', 'ኣምድ', 'ኣርብ', 'ሰንበር ሽጓዅ'], - 'weekdays_short' => ['ሰ/ቅ', 'ሰኑ', 'ሰሊጝ', 'ለጓ', 'ኣምድ', 'ኣርብ', 'ሰ/ሽ'], - 'weekdays_min' => ['ሰ/ቅ', 'ሰኑ', 'ሰሊጝ', 'ለጓ', 'ኣምድ', 'ኣርብ', 'ሰ/ሽ'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ፋዱስ ጃብ', 'ፋዱስ ደምቢ'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca.php deleted file mode 100644 index 824c9ce..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ca.php +++ /dev/null @@ -1,117 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - mestremuten - * - François B - * - Marc Ordinas i Llopis - * - Pere Orga - * - JD Isaacks - * - Quentí - * - Víctor Díaz - * - Xavi - * - qcardona - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count any|:count anys', - 'a_year' => 'un any|:count anys', - 'y' => ':count any|:count anys', - 'month' => ':count mes|:count mesos', - 'a_month' => 'un mes|:count mesos', - 'm' => ':count mes|:count mesos', - 'week' => ':count setmana|:count setmanes', - 'a_week' => 'una setmana|:count setmanes', - 'w' => ':count setmana|:count setmanes', - 'day' => ':count dia|:count dies', - 'a_day' => 'un dia|:count dies', - 'd' => ':count d', - 'hour' => ':count hora|:count hores', - 'a_hour' => 'una hora|:count hores', - 'h' => ':count h', - 'minute' => ':count minut|:count minuts', - 'a_minute' => 'un minut|:count minuts', - 'min' => ':count min', - 'second' => ':count segon|:count segons', - 'a_second' => 'uns segons|:count segons', - 's' => ':count s', - 'ago' => 'fa :time', - 'from_now' => 'd\'aquí a :time', - 'after' => ':time després', - 'before' => ':time abans', - 'diff_now' => 'ara mateix', - 'diff_today' => 'avui', - 'diff_today_regexp' => 'avui(?:\\s+a)?(?:\\s+les)?', - 'diff_yesterday' => 'ahir', - 'diff_yesterday_regexp' => 'ahir(?:\\s+a)?(?:\\s+les)?', - 'diff_tomorrow' => 'demà', - 'diff_tomorrow_regexp' => 'demà(?:\\s+a)?(?:\\s+les)?', - 'diff_before_yesterday' => 'abans d\'ahir', - 'diff_after_tomorrow' => 'demà passat', - 'period_recurrences' => ':count cop|:count cops', - 'period_interval' => 'cada :interval', - 'period_start_date' => 'de :date', - 'period_end_date' => 'fins a :date', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM [de] YYYY', - 'LLL' => 'D MMMM [de] YYYY [a les] H:mm', - 'LLLL' => 'dddd D MMMM [de] YYYY [a les] H:mm', - ], - 'calendar' => [ - 'sameDay' => static function (CarbonInterface $current) { - return '[avui a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; - }, - 'nextDay' => static function (CarbonInterface $current) { - return '[demà a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; - }, - 'nextWeek' => static function (CarbonInterface $current) { - return 'dddd [a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; - }, - 'lastDay' => static function (CarbonInterface $current) { - return '[ahir a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; - }, - 'lastWeek' => static function (CarbonInterface $current) { - return '[el] dddd [passat a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; - }, - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number, $period) { - return $number.( - ($period === 'w' || $period === 'W') ? 'a' : ( - ($number === 1) ? 'r' : ( - ($number === 2) ? 'n' : ( - ($number === 3) ? 'r' : ( - ($number === 4) ? 't' : 'è' - ) - ) - ) - ) - ); - }, - 'months' => ['de gener', 'de febrer', 'de març', 'd\'abril', 'de maig', 'de juny', 'de juliol', 'd\'agost', 'de setembre', 'd\'octubre', 'de novembre', 'de desembre'], - 'months_standalone' => ['gener', 'febrer', 'març', 'abril', 'maig', 'juny', 'juliol', 'agost', 'setembre', 'octubre', 'novembre', 'desembre'], - 'months_short' => ['de gen.', 'de febr.', 'de març', 'd\'abr.', 'de maig', 'de juny', 'de jul.', 'd\'ag.', 'de set.', 'd\'oct.', 'de nov.', 'de des.'], - 'months_short_standalone' => ['gen.', 'febr.', 'març', 'abr.', 'maig', 'juny', 'jul.', 'ag.', 'set.', 'oct.', 'nov.', 'des.'], - 'months_regexp' => '/(D[oD]?[\s,]+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['diumenge', 'dilluns', 'dimarts', 'dimecres', 'dijous', 'divendres', 'dissabte'], - 'weekdays_short' => ['dg.', 'dl.', 'dt.', 'dc.', 'dj.', 'dv.', 'ds.'], - 'weekdays_min' => ['dg', 'dl', 'dt', 'dc', 'dj', 'dv', 'ds'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' i '], - 'meridiem' => ['a. m.', 'p. m.'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php deleted file mode 100644 index 861acd2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ca.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php deleted file mode 100644 index 5004978..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ca.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php deleted file mode 100644 index 1c16421..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'ca'); - }, 'ca_ES_Valencia'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/ca.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php deleted file mode 100644 index 861acd2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ca.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php deleted file mode 100644 index 861acd2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ca.php', [ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ccp.php b/vendor/nesbot/carbon/src/Carbon/Lang/ccp.php deleted file mode 100644 index b536d4b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ccp.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['𑄢𑄧𑄝𑄨𑄝𑄢𑄴', '𑄥𑄧𑄟𑄴𑄝𑄢𑄴', '𑄟𑄧𑄁𑄉𑄧𑄣𑄴𑄝𑄢𑄴', '𑄝𑄪𑄖𑄴𑄝𑄢𑄴', '𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴𑄝𑄢𑄴', '𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴𑄝𑄢𑄴', '𑄥𑄧𑄚𑄨𑄝𑄢𑄴'], - 'weekdays_short' => ['𑄢𑄧𑄝𑄨', '𑄥𑄧𑄟𑄴', '𑄟𑄧𑄁𑄉𑄧𑄣𑄴', '𑄝𑄪𑄖𑄴', '𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴', '𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴', '𑄥𑄧𑄚𑄨'], - 'weekdays_min' => ['𑄢𑄧𑄝𑄨', '𑄥𑄧𑄟𑄴', '𑄟𑄧𑄁𑄉𑄧𑄣𑄴', '𑄝𑄪𑄖𑄴', '𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴', '𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴', '𑄥𑄧𑄚𑄨'], - 'months' => ['𑄎𑄚𑄪𑄠𑄢𑄨', '𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨', '𑄟𑄢𑄴𑄌𑄧', '𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴', '𑄟𑄬', '𑄎𑄪𑄚𑄴', '𑄎𑄪𑄣𑄭', '𑄃𑄉𑄧𑄌𑄴𑄑𑄴', '𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄃𑄧𑄇𑄴𑄑𑄬𑄝𑄧𑄢𑄴', '𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴'], - 'months_short' => ['𑄎𑄚𑄪', '𑄜𑄬𑄛𑄴', '𑄟𑄢𑄴𑄌𑄧', '𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴', '𑄟𑄬', '𑄎𑄪𑄚𑄴', '𑄎𑄪𑄣𑄭', '𑄃𑄉𑄧𑄌𑄴𑄑𑄴', '𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴', '𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄢𑄴'], - 'months_short_standalone' => ['𑄎𑄚𑄪𑄠𑄢𑄨', '𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨', '𑄟𑄢𑄴𑄌𑄧', '𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴', '𑄟𑄬', '𑄎𑄪𑄚𑄴', '𑄎𑄪𑄣𑄭', '𑄃𑄉𑄧𑄌𑄴𑄑𑄴', '𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴', '𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴'], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM, YYYY h:mm a', - 'LLLL' => 'dddd, D MMMM, YYYY h:mm a', - ], - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php deleted file mode 100644 index c1fa8af..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ccp.php', [ - 'weekend' => [0, 0], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ce.php b/vendor/nesbot/carbon/src/Carbon/Lang/ce.php deleted file mode 100644 index f99f6ff..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ce.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ce_RU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php deleted file mode 100644 index f769856..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - ANCHR - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY.DD.MM', - ], - 'months' => ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'], - 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'weekdays' => ['КӀиранан де', 'Оршотан де', 'Шинарин де', 'Кхаарин де', 'Еарин де', 'ПӀераскан де', 'Шот де'], - 'weekdays_short' => ['КӀ', 'Ор', 'Ши', 'Кх', 'Еа', 'ПӀ', 'Шо'], - 'weekdays_min' => ['КӀ', 'Ор', 'Ши', 'Кх', 'Еа', 'ПӀ', 'Шо'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count шо', - 'y' => ':count шо', - 'a_year' => ':count шо', - - 'month' => ':count бутт', - 'm' => ':count бутт', - 'a_month' => ':count бутт', - - 'week' => ':count кӏира', - 'w' => ':count кӏира', - 'a_week' => ':count кӏира', - - 'day' => ':count де', - 'd' => ':count де', - 'a_day' => ':count де', - - 'hour' => ':count сахьт', - 'h' => ':count сахьт', - 'a_hour' => ':count сахьт', - - 'minute' => ':count минот', - 'min' => ':count минот', - 'a_minute' => ':count минот', - - 'second' => ':count секунд', - 's' => ':count секунд', - 'a_second' => ':count секунд', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cgg.php b/vendor/nesbot/carbon/src/Carbon/Lang/cgg.php deleted file mode 100644 index 09bcc1c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cgg.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['Sande', 'Orwokubanza', 'Orwakabiri', 'Orwakashatu', 'Orwakana', 'Orwakataano', 'Orwamukaaga'], - 'weekdays_short' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], - 'weekdays_min' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], - 'months' => ['Okwokubanza', 'Okwakabiri', 'Okwakashatu', 'Okwakana', 'Okwakataana', 'Okwamukaaga', 'Okwamushanju', 'Okwamunaana', 'Okwamwenda', 'Okwaikumi', 'Okwaikumi na kumwe', 'Okwaikumi na ibiri'], - 'months_short' => ['KBZ', 'KBR', 'KST', 'KKN', 'KTN', 'KMK', 'KMS', 'KMN', 'KMW', 'KKM', 'KNK', 'KNB'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'day' => ':count ruhanga', // less reliable - 'd' => ':count ruhanga', // less reliable - 'a_day' => ':count ruhanga', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/chr.php b/vendor/nesbot/carbon/src/Carbon/Lang/chr.php deleted file mode 100644 index e26190f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/chr.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/chr_US.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php b/vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php deleted file mode 100644 index 3fb0221..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Cherokee Nation Joseph Erb josepherb7@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'MM/DD/YYYY', - ], - 'months' => ['ᎤᏃᎸᏔᏅ', 'ᎧᎦᎵ', 'ᎠᏅᏱ', 'ᎧᏬᏂ', 'ᎠᏂᏍᎬᏘ', 'ᏕᎭᎷᏱ', 'ᎫᏰᏉᏂ', 'ᎦᎶᏂ', 'ᏚᎵᏍᏗ', 'ᏚᏂᏅᏗ', 'ᏅᏓᏕᏆ', 'ᎥᏍᎩᏱ'], - 'months_short' => ['ᎤᏃ', 'ᎧᎦ', 'ᎠᏅ', 'ᎧᏬ', 'ᎠᏂ', 'ᏕᎭ', 'ᎫᏰ', 'ᎦᎶ', 'ᏚᎵ', 'ᏚᏂ', 'ᏅᏓ', 'ᎥᏍ'], - 'weekdays' => ['ᎤᎾᏙᏓᏆᏍᎬ', 'ᎤᎾᏙᏓᏉᏅᎯ', 'ᏔᎵᏁᎢᎦ', 'ᏦᎢᏁᎢᎦ', 'ᏅᎩᏁᎢᎦ', 'ᏧᎾᎩᎶᏍᏗ', 'ᎤᎾᏙᏓᏈᏕᎾ'], - 'weekdays_short' => ['ᏆᏍᎬ', 'ᏉᏅᎯ', 'ᏔᎵᏁ', 'ᏦᎢᏁ', 'ᏅᎩᏁ', 'ᏧᎾᎩ', 'ᏈᏕᎾ'], - 'weekdays_min' => ['ᏆᏍᎬ', 'ᏉᏅᎯ', 'ᏔᎵᏁ', 'ᏦᎢᏁ', 'ᏅᎩᏁ', 'ᏧᎾᎩ', 'ᏈᏕᎾ'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ᏌᎾᎴ', 'ᏒᎯᏱᎢᏗᏢ', 'ꮜꮎꮄ', 'ꮢꭿᏹꭲꮧꮲ'], - - 'second' => ':count ᏐᎢ', // less reliable - 's' => ':count ᏐᎢ', // less reliable - 'a_second' => ':count ᏐᎢ', // less reliable - - 'year' => ':count ᏑᏕᏘᏴᏓ', - 'y' => ':count ᏑᏕᏘᏴᏓ', - 'a_year' => ':count ᏑᏕᏘᏴᏓ', - - 'month' => ':count ᏏᏅᏙ', - 'm' => ':count ᏏᏅᏙ', - 'a_month' => ':count ᏏᏅᏙ', - - 'week' => ':count ᏑᎾᏙᏓᏆᏍᏗ', - 'w' => ':count ᏑᎾᏙᏓᏆᏍᏗ', - 'a_week' => ':count ᏑᎾᏙᏓᏆᏍᏗ', - - 'day' => ':count ᎢᎦ', - 'd' => ':count ᎢᎦ', - 'a_day' => ':count ᎢᎦ', - - 'hour' => ':count ᏑᏟᎶᏛ', - 'h' => ':count ᏑᏟᎶᏛ', - 'a_hour' => ':count ᏑᏟᎶᏛ', - - 'minute' => ':count ᎢᏯᏔᏬᏍᏔᏅ', - 'min' => ':count ᎢᏯᏔᏬᏍᏔᏅ', - 'a_minute' => ':count ᎢᏯᏔᏬᏍᏔᏅ', - - 'ago' => ':time ᏥᎨᏒ', - 'from_now' => 'ᎾᎿ :time', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php b/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php deleted file mode 100644 index 35ac60a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Swara Mohammed - * - Kawan Pshtiwan - */ -$months = [ - 'کانونی دووەم', - 'شوبات', - 'ئازار', - 'نیسان', - 'ئایار', - 'حوزەیران', - 'تەمموز', - 'ئاب', - 'ئەیلوول', - 'تشرینی یەکەم', - 'تشرینی دووەم', - 'کانونی یەکەم', -]; - -return [ - 'year' => implode('|', ['{0}:count ساڵێک', '{1}ساڵێک', '{2}دوو ساڵ', ']2,11[:count ساڵ', ']10,Inf[:count ساڵ']), - 'a_year' => implode('|', ['{0}:count ساڵێک', '{1}ساڵێک', '{2}دوو ساڵ', ']2,11[:count ساڵ', ']10,Inf[:count ساڵ']), - 'month' => implode('|', ['{0}:count مانگێک', '{1}مانگێک', '{2}دوو مانگ', ']2,11[:count مانگ', ']10,Inf[:count مانگ']), - 'a_month' => implode('|', ['{0}:count مانگێک', '{1}مانگێک', '{2}دوو مانگ', ']2,11[:count مانگ', ']10,Inf[:count مانگ']), - 'week' => implode('|', ['{0}:count هەفتەیەک', '{1}هەفتەیەک', '{2}دوو هەفتە', ']2,11[:count هەفتە', ']10,Inf[:count هەفتە']), - 'a_week' => implode('|', ['{0}:count هەفتەیەک', '{1}هەفتەیەک', '{2}دوو هەفتە', ']2,11[:count هەفتە', ']10,Inf[:count هەفتە']), - 'day' => implode('|', ['{0}:count ڕۆژێک', '{1}ڕۆژێک', '{2}دوو ڕۆژ', ']2,11[:count ڕۆژ', ']10,Inf[:count ڕۆژ']), - 'a_day' => implode('|', ['{0}:count ڕۆژێک', '{1}ڕۆژێک', '{2}دوو ڕۆژ', ']2,11[:count ڕۆژ', ']10,Inf[:count ڕۆژ']), - 'hour' => implode('|', ['{0}:count کاتژمێرێک', '{1}کاتژمێرێک', '{2}دوو کاتژمێر', ']2,11[:count کاتژمێر', ']10,Inf[:count کاتژمێر']), - 'a_hour' => implode('|', ['{0}:count کاتژمێرێک', '{1}کاتژمێرێک', '{2}دوو کاتژمێر', ']2,11[:count کاتژمێر', ']10,Inf[:count کاتژمێر']), - 'minute' => implode('|', ['{0}:count خولەکێک', '{1}خولەکێک', '{2}دوو خولەک', ']2,11[:count خولەک', ']10,Inf[:count خولەک']), - 'a_minute' => implode('|', ['{0}:count خولەکێک', '{1}خولەکێک', '{2}دوو خولەک', ']2,11[:count خولەک', ']10,Inf[:count خولەک']), - 'second' => implode('|', ['{0}:count چرکەیەک', '{1}چرکەیەک', '{2}دوو چرکە', ']2,11[:count چرکە', ']10,Inf[:count چرکە']), - 'a_second' => implode('|', ['{0}:count چرکەیەک', '{1}چرکەیەک', '{2}دوو چرکە', ']2,11[:count چرکە', ']10,Inf[:count چرکە']), - 'ago' => 'پێش :time', - 'from_now' => ':time لە ئێستاوە', - 'after' => 'دوای :time', - 'before' => 'پێش :time', - 'diff_now' => 'ئێستا', - 'diff_today' => 'ئەمڕۆ', - 'diff_today_regexp' => 'ڕۆژ(?:\\s+لە)?(?:\\s+کاتژمێر)?', - 'diff_yesterday' => 'دوێنێ', - 'diff_yesterday_regexp' => 'دوێنێ(?:\\s+لە)?(?:\\s+کاتژمێر)?', - 'diff_tomorrow' => 'سبەینێ', - 'diff_tomorrow_regexp' => 'سبەینێ(?:\\s+لە)?(?:\\s+کاتژمێر)?', - 'diff_before_yesterday' => 'پێش دوێنێ', - 'diff_after_tomorrow' => 'دوای سبەینێ', - 'period_recurrences' => implode('|', ['{0}جار', '{1}جار', '{2}:count دووجار', ']2,11[:count جار', ']10,Inf[:count جار']), - 'period_interval' => 'هەموو :interval', - 'period_start_date' => 'لە :date', - 'period_end_date' => 'بۆ :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], - 'weekdays_short' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], - 'weekdays_min' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[ئەمڕۆ لە کاتژمێر] LT', - 'nextDay' => '[سبەینێ لە کاتژمێر] LT', - 'nextWeek' => 'dddd [لە کاتژمێر] LT', - 'lastDay' => '[دوێنێ لە کاتژمێر] LT', - 'lastWeek' => 'dddd [لە کاتژمێر] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['پ.ن', 'د.ن'], - 'weekend' => [5, 6], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cmn.php b/vendor/nesbot/carbon/src/Carbon/Lang/cmn.php deleted file mode 100644 index 80b1d69..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cmn.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/cmn_TW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php deleted file mode 100644 index eee9c80..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'formats' => [ - 'L' => 'YYYY年MM月DD號', - ], - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => [' 1月', ' 2月', ' 3月', ' 4月', ' 5月', ' 6月', ' 7月', ' 8月', ' 9月', '10月', '11月', '12月'], - 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'meridiem' => ['上午', '下午'], - - 'year' => ':count 年', - 'y' => ':count 年', - 'a_year' => ':count 年', - - 'month' => ':count 月', - 'm' => ':count 月', - 'a_month' => ':count 月', - - 'week' => ':count 周', - 'w' => ':count 周', - 'a_week' => ':count 周', - - 'day' => ':count 白天', - 'd' => ':count 白天', - 'a_day' => ':count 白天', - - 'hour' => ':count 小时', - 'h' => ':count 小时', - 'a_hour' => ':count 小时', - - 'minute' => ':count 分钟', - 'min' => ':count 分钟', - 'a_minute' => ':count 分钟', - - 'second' => ':count 秒', - 's' => ':count 秒', - 'a_second' => ':count 秒', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/crh.php b/vendor/nesbot/carbon/src/Carbon/Lang/crh.php deleted file mode 100644 index a1d7ce6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/crh.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/crh_UA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php b/vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php deleted file mode 100644 index 0513933..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Reşat SABIQ tilde.birlik@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'Mayıs', 'İyun', 'İyul', 'Avgust', 'Sentâbr', 'Oktâbr', 'Noyabr', 'Dekabr'], - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avg', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['Bazar', 'Bazarertesi', 'Salı', 'Çarşembe', 'Cumaaqşamı', 'Cuma', 'Cumaertesi'], - 'weekdays_short' => ['Baz', 'Ber', 'Sal', 'Çar', 'Caq', 'Cum', 'Cer'], - 'weekdays_min' => ['Baz', 'Ber', 'Sal', 'Çar', 'Caq', 'Cum', 'Cer'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ÜE', 'ÜS'], - - 'year' => ':count yıl', - 'y' => ':count yıl', - 'a_year' => ':count yıl', - - 'month' => ':count ay', - 'm' => ':count ay', - 'a_month' => ':count ay', - - 'week' => ':count afta', - 'w' => ':count afta', - 'a_week' => ':count afta', - - 'day' => ':count kün', - 'd' => ':count kün', - 'a_day' => ':count kün', - - 'hour' => ':count saat', - 'h' => ':count saat', - 'a_hour' => ':count saat', - - 'minute' => ':count daqqa', - 'min' => ':count daqqa', - 'a_minute' => ':count daqqa', - - 'second' => ':count ekinci', - 's' => ':count ekinci', - 'a_second' => ':count ekinci', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cs.php b/vendor/nesbot/carbon/src/Carbon/Lang/cs.php deleted file mode 100644 index 9530d36..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cs.php +++ /dev/null @@ -1,124 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Jakub Tesinsky - * - Martin Suja - * - Nikos Timiopulos - * - Bohuslav Blín - * - Tsutomu Kuroda - * - tjku - * - Lukas Svoboda - * - Max Melentiev - * - Juanito Fatas - * - Akira Matsuda - * - Christopher Dell - * - Václav Pávek - * - CodeSkills - * - Tlapi - * - newman101 - * - Petr Kadlec - * - tommaskraus - * - Karel Sommer (calvera) - */ -$za = function ($time) { - return 'za '.strtr($time, [ - 'hodina' => 'hodinu', - 'minuta' => 'minutu', - 'sekunda' => 'sekundu', - ]); -}; - -$pred = function ($time) { - $time = strtr($time, [ - 'hodina' => 'hodinou', - 'minuta' => 'minutou', - 'sekunda' => 'sekundou', - ]); - $time = preg_replace('/hodiny?(?!\w)/', 'hodinami', $time); - $time = preg_replace('/minuty?(?!\w)/', 'minutami', $time); - $time = preg_replace('/sekundy?(?!\w)/', 'sekundami', $time); - - return "před $time"; -}; - -return [ - 'year' => ':count rok|:count roky|:count let', - 'y' => ':count rok|:count roky|:count let', - 'a_year' => 'rok|:count roky|:count let', - 'month' => ':count měsíc|:count měsíce|:count měsíců', - 'm' => ':count měs.', - 'a_month' => 'měsíc|:count měsíce|:count měsíců', - 'week' => ':count týden|:count týdny|:count týdnů', - 'w' => ':count týd.', - 'a_week' => 'týden|:count týdny|:count týdnů', - 'day' => ':count den|:count dny|:count dní', - 'd' => ':count den|:count dny|:count dní', - 'a_day' => 'den|:count dny|:count dní', - 'hour' => ':count hodina|:count hodiny|:count hodin', - 'h' => ':count hod.', - 'a_hour' => 'hodina|:count hodiny|:count hodin', - 'minute' => ':count minuta|:count minuty|:count minut', - 'min' => ':count min.', - 'a_minute' => 'minuta|:count minuty|:count minut', - 'second' => ':count sekunda|:count sekundy|:count sekund', - 's' => ':count sek.', - 'a_second' => 'pár sekund|:count sekundy|:count sekund', - - 'month_ago' => ':count měsícem|:count měsíci|:count měsíci', - 'a_month_ago' => 'měsícem|:count měsíci|:count měsíci', - 'day_ago' => ':count dnem|:count dny|:count dny', - 'a_day_ago' => 'dnem|:count dny|:count dny', - 'week_ago' => ':count týdnem|:count týdny|:count týdny', - 'a_week_ago' => 'týdnem|:count týdny|:count týdny', - 'year_ago' => ':count rokem|:count roky|:count lety', - 'y_ago' => ':count rok.|:count rok.|:count let.', - 'a_year_ago' => 'rokem|:count roky|:count lety', - - 'month_before' => ':count měsícem|:count měsíci|:count měsíci', - 'a_month_before' => 'měsícem|:count měsíci|:count měsíci', - 'day_before' => ':count dnem|:count dny|:count dny', - 'a_day_before' => 'dnem|:count dny|:count dny', - 'week_before' => ':count týdnem|:count týdny|:count týdny', - 'a_week_before' => 'týdnem|:count týdny|:count týdny', - 'year_before' => ':count rokem|:count roky|:count lety', - 'y_before' => ':count rok.|:count rok.|:count let.', - 'a_year_before' => 'rokem|:count roky|:count lety', - - 'ago' => $pred, - 'from_now' => $za, - 'before' => $pred, - 'after' => $za, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'months' => ['ledna', 'února', 'března', 'dubna', 'května', 'června', 'července', 'srpna', 'září', 'října', 'listopadu', 'prosince'], - 'months_standalone' => ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'], - 'months_short' => ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'], - 'months_regexp' => '/(DD?o?\.?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'], - 'weekdays_short' => ['ned', 'pon', 'úte', 'stř', 'čtv', 'pát', 'sob'], - 'weekdays_min' => ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'], - 'list' => [', ', ' a '], - 'diff_now' => 'nyní', - 'diff_yesterday' => 'včera', - 'diff_tomorrow' => 'zítra', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD. MM. YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd D. MMMM YYYY HH:mm', - ], - 'meridiem' => ['dopoledne', 'odpoledne'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php deleted file mode 100644 index ea2517e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/cs.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/csb.php b/vendor/nesbot/carbon/src/Carbon/Lang/csb.php deleted file mode 100644 index a35d281..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/csb.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/csb_PL.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php b/vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php deleted file mode 100644 index 25e0ca8..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - csb_PL locale Michal Ostrowski bug-glibc-locales@gnu.org - */ -return [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'MMMM DD, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], - 'months' => ['stëcznika', 'gromicznika', 'strëmiannika', 'łżëkwiata', 'maja', 'czerwińca', 'lëpińca', 'zélnika', 'séwnika', 'rujana', 'lëstopadnika', 'gòdnika'], - 'months_short' => ['stë', 'gro', 'str', 'łżë', 'maj', 'cze', 'lëp', 'zél', 'séw', 'ruj', 'lës', 'gòd'], - 'weekdays' => ['niedzela', 'pòniedzôłk', 'wtórk', 'strzoda', 'czwiôrtk', 'piątk', 'sobòta'], - 'weekdays_short' => ['nie', 'pòn', 'wtó', 'str', 'czw', 'pią', 'sob'], - 'weekdays_min' => ['nie', 'pòn', 'wtó', 'str', 'czw', 'pią', 'sob'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' a téż '], - 'two_words_connector' => ' a téż ', - 'year' => ':count rok', - 'month' => ':count miesiąc', - 'week' => ':count tidzéń', - 'day' => ':count dzéń', - 'hour' => ':count gòdzëna', - 'minute' => ':count minuta', - 'second' => ':count sekunda', -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cu.php b/vendor/nesbot/carbon/src/Carbon/Lang/cu.php deleted file mode 100644 index d6d1312..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cu.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'months' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'months_short' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], - - 'year' => ':count лѣто', - 'y' => ':count лѣто', - 'a_year' => ':count лѣто', - - 'month' => ':count мѣсѧць', - 'm' => ':count мѣсѧць', - 'a_month' => ':count мѣсѧць', - - 'week' => ':count сєдмица', - 'w' => ':count сєдмица', - 'a_week' => ':count сєдмица', - - 'day' => ':count дьнь', - 'd' => ':count дьнь', - 'a_day' => ':count дьнь', - - 'hour' => ':count година', - 'h' => ':count година', - 'a_hour' => ':count година', - - 'minute' => ':count малъ', // less reliable - 'min' => ':count малъ', // less reliable - 'a_minute' => ':count малъ', // less reliable - - 'second' => ':count въторъ', - 's' => ':count въторъ', - 'a_second' => ':count въторъ', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cv.php b/vendor/nesbot/carbon/src/Carbon/Lang/cv.php deleted file mode 100644 index fe76968..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cv.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - JD Isaacks - */ -return [ - 'year' => ':count ҫул', - 'a_year' => '{1}пӗр ҫул|:count ҫул', - 'month' => ':count уйӑх', - 'a_month' => '{1}пӗр уйӑх|:count уйӑх', - 'week' => ':count эрне', - 'a_week' => '{1}пӗр эрне|:count эрне', - 'day' => ':count кун', - 'a_day' => '{1}пӗр кун|:count кун', - 'hour' => ':count сехет', - 'a_hour' => '{1}пӗр сехет|:count сехет', - 'minute' => ':count минут', - 'a_minute' => '{1}пӗр минут|:count минут', - 'second' => ':count ҫеккунт', - 'a_second' => '{1}пӗр-ик ҫеккунт|:count ҫеккунт', - 'ago' => ':time каялла', - 'from_now' => static function ($time) { - return $time.(preg_match('/сехет$/u', $time) ? 'рен' : (preg_match('/ҫул/', $time) ? 'тан' : 'ран')); - }, - 'diff_yesterday' => 'Ӗнер', - 'diff_today' => 'Паян', - 'diff_tomorrow' => 'Ыран', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD-MM-YYYY', - 'LL' => 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', - 'LLL' => 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', - 'LLLL' => 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Паян] LT [сехетре]', - 'nextDay' => '[Ыран] LT [сехетре]', - 'nextWeek' => '[Ҫитес] dddd LT [сехетре]', - 'lastDay' => '[Ӗнер] LT [сехетре]', - 'lastWeek' => '[Иртнӗ] dddd LT [сехетре]', - 'sameElse' => 'L', - ], - 'ordinal' => ':number-мӗш', - 'months' => ['кӑрлач', 'нарӑс', 'пуш', 'ака', 'май', 'ҫӗртме', 'утӑ', 'ҫурла', 'авӑн', 'юпа', 'чӳк', 'раштав'], - 'months_short' => ['кӑр', 'нар', 'пуш', 'ака', 'май', 'ҫӗр', 'утӑ', 'ҫур', 'авн', 'юпа', 'чӳк', 'раш'], - 'weekdays' => ['вырсарникун', 'тунтикун', 'ытларикун', 'юнкун', 'кӗҫнерникун', 'эрнекун', 'шӑматкун'], - 'weekdays_short' => ['выр', 'тун', 'ытл', 'юн', 'кӗҫ', 'эрн', 'шӑм'], - 'weekdays_min' => ['вр', 'тн', 'ыт', 'юн', 'кҫ', 'эр', 'шм'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' тата '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php deleted file mode 100644 index 197bd8d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/cv.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cy.php b/vendor/nesbot/carbon/src/Carbon/Lang/cy.php deleted file mode 100644 index 783ac71..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cy.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - JD Isaacks - * - Daniel Monaghan - */ -return [ - 'year' => '{1}blwyddyn|]1,Inf[:count flynedd', - 'y' => ':countbl', - 'month' => '{1}mis|]1,Inf[:count mis', - 'm' => ':countmi', - 'week' => ':count wythnos', - 'w' => ':countw', - 'day' => '{1}diwrnod|]1,Inf[:count diwrnod', - 'd' => ':countd', - 'hour' => '{1}awr|]1,Inf[:count awr', - 'h' => ':counth', - 'minute' => '{1}munud|]1,Inf[:count munud', - 'min' => ':countm', - 'second' => '{1}ychydig eiliadau|]1,Inf[:count eiliad', - 's' => ':counts', - 'ago' => ':time yn ôl', - 'from_now' => 'mewn :time', - 'after' => ':time ar ôl', - 'before' => ':time o\'r blaen', - 'diff_now' => 'nawr', - 'diff_today' => 'Heddiw', - 'diff_today_regexp' => 'Heddiw(?:\\s+am)?', - 'diff_yesterday' => 'ddoe', - 'diff_yesterday_regexp' => 'Ddoe(?:\\s+am)?', - 'diff_tomorrow' => 'yfory', - 'diff_tomorrow_regexp' => 'Yfory(?:\\s+am)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Heddiw am] LT', - 'nextDay' => '[Yfory am] LT', - 'nextWeek' => 'dddd [am] LT', - 'lastDay' => '[Ddoe am] LT', - 'lastWeek' => 'dddd [diwethaf am] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - return $number.( - $number > 20 - ? (\in_array((int) $number, [40, 50, 60, 80, 100], true) ? 'fed' : 'ain') - : ([ - '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed - 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed', // 11eg to 20fed - ])[$number] ?? '' - ); - }, - 'months' => ['Ionawr', 'Chwefror', 'Mawrth', 'Ebrill', 'Mai', 'Mehefin', 'Gorffennaf', 'Awst', 'Medi', 'Hydref', 'Tachwedd', 'Rhagfyr'], - 'months_short' => ['Ion', 'Chwe', 'Maw', 'Ebr', 'Mai', 'Meh', 'Gor', 'Aws', 'Med', 'Hyd', 'Tach', 'Rhag'], - 'weekdays' => ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'], - 'weekdays_short' => ['Sul', 'Llun', 'Maw', 'Mer', 'Iau', 'Gwe', 'Sad'], - 'weekdays_min' => ['Su', 'Ll', 'Ma', 'Me', 'Ia', 'Gw', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' a '], - 'meridiem' => ['yb', 'yh'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php b/vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php deleted file mode 100644 index 2c8148d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/cy.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/da.php b/vendor/nesbot/carbon/src/Carbon/Lang/da.php deleted file mode 100644 index 322f91d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/da.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Rune Mønnike - * - François B - * - codenhagen - * - JD Isaacks - * - Jens Herlevsen - * - Ulrik McArdle (mcardle) - * - Frederik Sauer (FrittenKeeZ) - * - Janus Bahs Jacquet (kokoshneta) - */ -return [ - 'year' => ':count år|:count år', - 'a_year' => 'et år|:count år', - 'y' => ':count år|:count år', - 'month' => ':count måned|:count måneder', - 'a_month' => 'en måned|:count måneder', - 'm' => ':count mdr.', - 'week' => ':count uge|:count uger', - 'a_week' => 'en uge|:count uger', - 'w' => ':count u.', - 'day' => ':count dag|:count dage', - 'a_day' => ':count dag|:count dage', - 'd' => ':count d.', - 'hour' => ':count time|:count timer', - 'a_hour' => 'en time|:count timer', - 'h' => ':count t.', - 'minute' => ':count minut|:count minutter', - 'a_minute' => 'et minut|:count minutter', - 'min' => ':count min.', - 'second' => ':count sekund|:count sekunder', - 'a_second' => 'få sekunder|:count sekunder', - 's' => ':count s.', - 'ago' => 'for :time siden', - 'from_now' => 'om :time', - 'after' => ':time efter', - 'before' => ':time før', - 'diff_now' => 'nu', - 'diff_today' => 'i dag', - 'diff_today_regexp' => 'i dag(?:\\s+kl.)?', - 'diff_yesterday' => 'i går', - 'diff_yesterday_regexp' => 'i går(?:\\s+kl.)?', - 'diff_tomorrow' => 'i morgen', - 'diff_tomorrow_regexp' => 'i morgen(?:\\s+kl.)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd [d.] D. MMMM YYYY [kl.] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[i dag kl.] LT', - 'nextDay' => '[i morgen kl.] LT', - 'nextWeek' => 'på dddd [kl.] LT', - 'lastDay' => '[i går kl.] LT', - 'lastWeek' => '[i] dddd[s kl.] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan.', 'feb.', 'mar.', 'apr.', 'maj.', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'], - 'weekdays' => ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'], - 'weekdays_short' => ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'], - 'weekdays_min' => ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' og '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php b/vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php deleted file mode 100644 index 392c484..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/da.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php b/vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php deleted file mode 100644 index ea5698b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/da.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - 'LL' => 'D. MMM YYYY', - 'LLL' => 'D. MMMM YYYY HH.mm', - 'LLLL' => 'dddd [den] D. MMMM YYYY HH.mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dav.php b/vendor/nesbot/carbon/src/Carbon/Lang/dav.php deleted file mode 100644 index 4f8d1e7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/dav.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['Luma lwa K', 'luma lwa p'], - 'weekdays' => ['Ituku ja jumwa', 'Kuramuka jimweri', 'Kuramuka kawi', 'Kuramuka kadadu', 'Kuramuka kana', 'Kuramuka kasanu', 'Kifula nguwo'], - 'weekdays_short' => ['Jum', 'Jim', 'Kaw', 'Kad', 'Kan', 'Kas', 'Ngu'], - 'weekdays_min' => ['Jum', 'Jim', 'Kaw', 'Kad', 'Kan', 'Kas', 'Ngu'], - 'months' => ['Mori ghwa imbiri', 'Mori ghwa kawi', 'Mori ghwa kadadu', 'Mori ghwa kana', 'Mori ghwa kasanu', 'Mori ghwa karandadu', 'Mori ghwa mfungade', 'Mori ghwa wunyanya', 'Mori ghwa ikenda', 'Mori ghwa ikumi', 'Mori ghwa ikumi na imweri', 'Mori ghwa ikumi na iwi'], - 'months_short' => ['Imb', 'Kaw', 'Kad', 'Kan', 'Kas', 'Kar', 'Mfu', 'Wun', 'Ike', 'Iku', 'Imw', 'Iwi'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de.php b/vendor/nesbot/carbon/src/Carbon/Lang/de.php deleted file mode 100644 index 90b1e35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/de.php +++ /dev/null @@ -1,135 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Michael Hohl - * - sheriffmarley - * - dennisoderwald - * - Timo - * - Karag2006 - * - Pete Scopes (pdscopes) - */ -return [ - 'year' => ':count Jahr|:count Jahre', - 'a_year' => 'ein Jahr|:count Jahre', - 'y' => ':count J.', - 'month' => ':count Monat|:count Monate', - 'a_month' => 'ein Monat|:count Monate', - 'm' => ':count Mon.', - 'week' => ':count Woche|:count Wochen', - 'a_week' => 'eine Woche|:count Wochen', - 'w' => ':count Wo.', - 'day' => ':count Tag|:count Tage', - 'a_day' => 'ein Tag|:count Tage', - 'd' => ':count Tg.', - 'hour' => ':count Stunde|:count Stunden', - 'a_hour' => 'eine Stunde|:count Stunden', - 'h' => ':count Std.', - 'minute' => ':count Minute|:count Minuten', - 'a_minute' => 'eine Minute|:count Minuten', - 'min' => ':count Min.', - 'second' => ':count Sekunde|:count Sekunden', - 'a_second' => 'ein paar Sekunden|:count Sekunden', - 's' => ':count Sek.', - 'millisecond' => ':count Millisekunde|:count Millisekunden', - 'a_millisecond' => 'eine Millisekunde|:count Millisekunden', - 'ms' => ':countms', - 'microsecond' => ':count Mikrosekunde|:count Mikrosekunden', - 'a_microsecond' => 'eine Mikrosekunde|:count Mikrosekunden', - 'µs' => ':countµs', - 'ago' => 'vor :time', - 'from_now' => 'in :time', - 'after' => ':time später', - 'before' => ':time zuvor', - - 'year_from_now' => ':count Jahr|:count Jahren', - 'month_from_now' => ':count Monat|:count Monaten', - 'week_from_now' => ':count Woche|:count Wochen', - 'day_from_now' => ':count Tag|:count Tagen', - 'year_ago' => ':count Jahr|:count Jahren', - 'month_ago' => ':count Monat|:count Monaten', - 'week_ago' => ':count Woche|:count Wochen', - 'day_ago' => ':count Tag|:count Tagen', - 'a_year_from_now' => 'ein Jahr|:count Jahren', - 'a_month_from_now' => 'ein Monat|:count Monaten', - 'a_week_from_now' => 'eine Woche|:count Wochen', - 'a_day_from_now' => 'ein Tag|:count Tagen', - 'a_year_ago' => 'ein Jahr|:count Jahren', - 'a_month_ago' => 'ein Monat|:count Monaten', - 'a_week_ago' => 'eine Woche|:count Wochen', - 'a_day_ago' => 'ein Tag|:count Tagen', - - 'diff_now' => 'Gerade eben', - 'diff_today' => 'heute', - 'diff_today_regexp' => 'heute(?:\\s+um)?', - 'diff_yesterday' => 'Gestern', - 'diff_yesterday_regexp' => 'gestern(?:\\s+um)?', - 'diff_tomorrow' => 'Morgen', - 'diff_tomorrow_regexp' => 'morgen(?:\\s+um)?', - 'diff_before_yesterday' => 'Vorgestern', - 'diff_after_tomorrow' => 'Übermorgen', - - 'period_recurrences' => 'einmal|:count mal', - 'period_interval' => static function (string $interval = '') { - /** @var string $output */ - $output = preg_replace('/^(ein|eine|1)\s+/u', '', $interval); - - if (preg_match('/^(ein|1)( Monat| Mon.| Tag| Tg.)/u', $interval)) { - return "jeden $output"; - } - - if (preg_match('/^(ein|1)( Jahr| J.)/u', $interval)) { - return "jedes $output"; - } - - return "jede $output"; - }, - 'period_start_date' => 'von :date', - 'period_end_date' => 'bis :date', - - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D. MMMM YYYY HH:mm', - ], - - 'calendar' => [ - 'sameDay' => '[heute um] LT [Uhr]', - 'nextDay' => '[morgen um] LT [Uhr]', - 'nextWeek' => 'dddd [um] LT [Uhr]', - 'lastDay' => '[gestern um] LT [Uhr]', - 'lastWeek' => '[letzten] dddd [um] LT [Uhr]', - 'sameElse' => 'L', - ], - - 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], - 'months_short' => ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], - 'weekdays' => ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'], - 'weekdays_short' => ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'], - 'weekdays_min' => ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], - 'ordinal' => ':number.', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' und '], - 'ordinal_words' => [ - 'of' => 'im', - 'first' => 'erster', - 'second' => 'zweiter', - 'third' => 'dritter', - 'fourth' => 'vierten', - 'fifth' => 'fünfter', - 'last' => 'letzten', - ], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php deleted file mode 100644 index a2ea4c0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - sheriffmarley - * - Timo - * - Michael Hohl - * - Namoshek - * - Bernhard Baumrock (BernhardBaumrock) - */ -return array_replace_recursive(require __DIR__.'/de.php', [ - 'months' => [ - 0 => 'Jänner', - ], - 'months_short' => [ - 0 => 'Jän', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php deleted file mode 100644 index 8ed8dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/de.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php deleted file mode 100644 index a869ab4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - sheriffmarley - * - Timo - * - Michael Hohl - */ -return array_replace_recursive(require __DIR__.'/de.php', [ - 'weekdays_short' => ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php deleted file mode 100644 index fb1209d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return require __DIR__.'/de.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php deleted file mode 100644 index 604a856..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Matthias Dieter Wallno:fer libc-locales@sourceware.org - */ -return require __DIR__.'/de.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php deleted file mode 100644 index 03e606a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/de.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php deleted file mode 100644 index 8ed8dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/de.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dje.php b/vendor/nesbot/carbon/src/Carbon/Lang/dje.php deleted file mode 100644 index 74b7ac1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/dje.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Subbaahi', 'Zaarikay b'], - 'weekdays' => ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamisi', 'Alzuma', 'Asibti'], - 'weekdays_short' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], - 'weekdays_min' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], - 'months' => ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'], - 'months_short' => ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'year' => ':count hari', // less reliable - 'y' => ':count hari', // less reliable - 'a_year' => ':count hari', // less reliable - - 'week' => ':count alzuma', // less reliable - 'w' => ':count alzuma', // less reliable - 'a_week' => ':count alzuma', // less reliable - - 'second' => ':count atinni', // less reliable - 's' => ':count atinni', // less reliable - 'a_second' => ':count atinni', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/doi.php b/vendor/nesbot/carbon/src/Carbon/Lang/doi.php deleted file mode 100644 index cb679c5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/doi.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/doi_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php deleted file mode 100644 index f3d43ce..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat Pune libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'एप्रैल', 'मेई', 'जून', 'जूलै', 'अगस्त', 'सितंबर', 'अक्तूबर', 'नवंबर', 'दिसंबर'], - 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'एप्रैल', 'मेई', 'जून', 'जूलै', 'अगस्त', 'सितंबर', 'अक्तूबर', 'नवंबर', 'दिसंबर'], - 'weekdays' => ['ऐतबार', 'सोमबार', 'मंगलबर', 'बुधबार', 'बीरबार', 'शुक्करबार', 'श्नीचरबार'], - 'weekdays_short' => ['ऐत', 'सोम', 'मंगल', 'बुध', 'बीर', 'शुक्कर', 'श्नीचर'], - 'weekdays_min' => ['ऐत', 'सोम', 'मंगल', 'बुध', 'बीर', 'शुक्कर', 'श्नीचर'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['सञं', 'सबेर'], - - 'second' => ':count सङार', // less reliable - 's' => ':count सङार', // less reliable - 'a_second' => ':count सङार', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dsb.php b/vendor/nesbot/carbon/src/Carbon/Lang/dsb.php deleted file mode 100644 index 1d214d5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/dsb.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/dsb_DE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php deleted file mode 100644 index 1b94187..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Information from Michael Wolf bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'DD. MMMM YYYY', - 'LLL' => 'DD. MMMM, HH:mm [góź.]', - 'LLLL' => 'dddd, DD. MMMM YYYY, HH:mm [góź.]', - ], - 'months' => ['januara', 'februara', 'měrca', 'apryla', 'maja', 'junija', 'julija', 'awgusta', 'septembra', 'oktobra', 'nowembra', 'decembra'], - 'months_short' => ['Jan', 'Feb', 'Měr', 'Apr', 'Maj', 'Jun', 'Jul', 'Awg', 'Sep', 'Okt', 'Now', 'Dec'], - 'weekdays' => ['Njeźela', 'Pónjeźele', 'Wałtora', 'Srjoda', 'Stwórtk', 'Pětk', 'Sobota'], - 'weekdays_short' => ['Nj', 'Pó', 'Wa', 'Sr', 'St', 'Pě', 'So'], - 'weekdays_min' => ['Nj', 'Pó', 'Wa', 'Sr', 'St', 'Pě', 'So'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count lěto', - 'y' => ':count lěto', - 'a_year' => ':count lěto', - - 'month' => ':count mjasec', - 'm' => ':count mjasec', - 'a_month' => ':count mjasec', - - 'week' => ':count tyźeń', - 'w' => ':count tyźeń', - 'a_week' => ':count tyźeń', - - 'day' => ':count źeń', - 'd' => ':count źeń', - 'a_day' => ':count źeń', - - 'hour' => ':count góźina', - 'h' => ':count góźina', - 'a_hour' => ':count góźina', - - 'minute' => ':count minuta', - 'min' => ':count minuta', - 'a_minute' => ':count minuta', - - 'second' => ':count drugi', - 's' => ':count drugi', - 'a_second' => ':count drugi', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dua.php b/vendor/nesbot/carbon/src/Carbon/Lang/dua.php deleted file mode 100644 index 55e5c7c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/dua.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['idiɓa', 'ebyámu'], - 'weekdays' => ['éti', 'mɔ́sú', 'kwasú', 'mukɔ́sú', 'ŋgisú', 'ɗónɛsú', 'esaɓasú'], - 'weekdays_short' => ['ét', 'mɔ́s', 'kwa', 'muk', 'ŋgi', 'ɗón', 'esa'], - 'weekdays_min' => ['ét', 'mɔ́s', 'kwa', 'muk', 'ŋgi', 'ɗón', 'esa'], - 'months' => ['dimɔ́di', 'ŋgɔndɛ', 'sɔŋɛ', 'diɓáɓá', 'emiasele', 'esɔpɛsɔpɛ', 'madiɓɛ́díɓɛ́', 'diŋgindi', 'nyɛtɛki', 'mayésɛ́', 'tiníní', 'eláŋgɛ́'], - 'months_short' => ['di', 'ŋgɔn', 'sɔŋ', 'diɓ', 'emi', 'esɔ', 'mad', 'diŋ', 'nyɛt', 'may', 'tin', 'elá'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'year' => ':count ma mbu', // less reliable - 'y' => ':count ma mbu', // less reliable - 'a_year' => ':count ma mbu', // less reliable - - 'month' => ':count myo̱di', // less reliable - 'm' => ':count myo̱di', // less reliable - 'a_month' => ':count myo̱di', // less reliable - - 'week' => ':count woki', // less reliable - 'w' => ':count woki', // less reliable - 'a_week' => ':count woki', // less reliable - - 'day' => ':count buńa', // less reliable - 'd' => ':count buńa', // less reliable - 'a_day' => ':count buńa', // less reliable - - 'hour' => ':count ma awa', // less reliable - 'h' => ':count ma awa', // less reliable - 'a_hour' => ':count ma awa', // less reliable - - 'minute' => ':count minuti', // less reliable - 'min' => ':count minuti', // less reliable - 'a_minute' => ':count minuti', // less reliable - - 'second' => ':count maba', // less reliable - 's' => ':count maba', // less reliable - 'a_second' => ':count maba', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dv.php b/vendor/nesbot/carbon/src/Carbon/Lang/dv.php deleted file mode 100644 index 4b8d7e1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/dv.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -$months = [ - 'ޖެނުއަރީ', - 'ފެބްރުއަރީ', - 'މާރިޗު', - 'އޭޕްރީލު', - 'މޭ', - 'ޖޫން', - 'ޖުލައި', - 'އޯގަސްޓު', - 'ސެޕްޓެމްބަރު', - 'އޮކްޓޯބަރު', - 'ނޮވެމްބަރު', - 'ޑިސެމްބަރު', -]; - -$weekdays = [ - 'އާދިއްތަ', - 'ހޯމަ', - 'އަންގާރަ', - 'ބުދަ', - 'ބުރާސްފަތި', - 'ހުކުރު', - 'ހޮނިހިރު', -]; - -/* - * Authors: - * - Josh Soref - * - Jawish Hameed - */ -return [ - 'year' => ':count '.'އަހަރު', - 'a_year' => '{1}'.'އަހަރެއް'.'|:count '.'އަހަރު', - 'month' => ':count '.'މަސް', - 'a_month' => '{1}'.'މަހެއް'.'|:count '.'މަސް', - 'week' => ':count '.'ހަފްތާ', - 'a_week' => '{1}'.'ސިކުންތުކޮޅެއް'.'|:count '.'ހަފްތާ', - 'day' => ':count '.'ދުވަސް', - 'a_day' => '{1}'.'ދުވަހެއް'.'|:count '.'ދުވަސް', - 'hour' => ':count '.'ގަޑިއިރު', - 'a_hour' => '{1}'.'ގަޑިއިރެއް'.'|:count '.'ގަޑިއިރު', - 'minute' => ':count '.'މިނިޓު', - 'a_minute' => '{1}'.'މިނިޓެއް'.'|:count '.'މިނިޓު', - 'second' => ':count '.'ސިކުންތު', - 'a_second' => '{1}'.'ސިކުންތުކޮޅެއް'.'|:count '.'ސިކުންތު', - 'ago' => 'ކުރިން :time', - 'from_now' => 'ތެރޭގައި :time', - 'after' => ':time ފަހުން', - 'before' => ':time ކުރި', - 'diff_yesterday' => 'އިއްޔެ', - 'diff_today' => 'މިއަދު', - 'diff_tomorrow' => 'މާދަމާ', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[މިއަދު] LT', - 'nextDay' => '[މާދަމާ] LT', - 'nextWeek' => 'dddd LT', - 'lastDay' => '[އިއްޔެ] LT', - 'lastWeek' => '[ފާއިތުވި] dddd LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['މކ', 'މފ'], - 'months' => $months, - 'months_short' => $months, - 'weekdays' => $weekdays, - 'weekdays_short' => $weekdays, - 'weekdays_min' => ['އާދި', 'ހޯމަ', 'އަން', 'ބުދަ', 'ބުރާ', 'ހުކު', 'ހޮނި'], - 'list' => [', ', ' އަދި '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php b/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php deleted file mode 100644 index 2668d5b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ahmed Ali - */ - -$months = [ - 'ޖެނުއަރީ', - 'ފެބްރުއަރީ', - 'މާރިޗު', - 'އޭޕްރީލު', - 'މޭ', - 'ޖޫން', - 'ޖުލައި', - 'އޯގަސްޓު', - 'ސެޕްޓެމްބަރު', - 'އޮކްޓޯބަރު', - 'ނޮވެމްބަރު', - 'ޑިސެމްބަރު', -]; - -$weekdays = [ - 'އާދިއްތަ', - 'ހޯމަ', - 'އަންގާރަ', - 'ބުދަ', - 'ބުރާސްފަތި', - 'ހުކުރު', - 'ހޮނިހިރު', -]; - -return [ - 'year' => '{0}އަހަރެއް|[1,Inf]:count އަހަރު', - 'y' => '{0}އަހަރެއް|[1,Inf]:count އަހަރު', - 'month' => '{0}މައްސަރެއް|[1,Inf]:count މަސް', - 'm' => '{0}މައްސަރެއް|[1,Inf]:count މަސް', - 'week' => '{0}ހަފްތާއެއް|[1,Inf]:count ހަފްތާ', - 'w' => '{0}ހަފްތާއެއް|[1,Inf]:count ހަފްތާ', - 'day' => '{0}ދުވަސް|[1,Inf]:count ދުވަސް', - 'd' => '{0}ދުވަސް|[1,Inf]:count ދުވަސް', - 'hour' => '{0}ގަޑިއިރެއް|[1,Inf]:count ގަޑި', - 'h' => '{0}ގަޑިއިރެއް|[1,Inf]:count ގަޑި', - 'minute' => '{0}މިނެޓެއް|[1,Inf]:count މިނެޓް', - 'min' => '{0}މިނެޓެއް|[1,Inf]:count މިނެޓް', - 'second' => '{0}ސިކުންތެއް|[1,Inf]:count ސިކުންތު', - 's' => '{0}ސިކުންތެއް|[1,Inf]:count ސިކުންތު', - 'ago' => ':time ކުރިން', - 'from_now' => ':time ފަހުން', - 'after' => ':time ފަހުން', - 'before' => ':time ކުރި', - 'diff_yesterday' => 'އިއްޔެ', - 'diff_today' => 'މިއަދު', - 'diff_tomorrow' => 'މާދަމާ', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[މިއަދު] LT', - 'nextDay' => '[މާދަމާ] LT', - 'nextWeek' => 'dddd LT', - 'lastDay' => '[އިއްޔެ] LT', - 'lastWeek' => '[ފާއިތުވި] dddd LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['މކ', 'މފ'], - 'months' => $months, - 'months_short' => $months, - 'weekdays' => $weekdays, - 'weekdays_short' => $weekdays, - 'weekdays_min' => ['އާދި', 'ހޯމަ', 'އަން', 'ބުދަ', 'ބުރާ', 'ހުކު', 'ހޮނި'], - 'list' => [', ', ' އަދި '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dyo.php b/vendor/nesbot/carbon/src/Carbon/Lang/dyo.php deleted file mode 100644 index 33082e6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/dyo.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['Dimas', 'Teneŋ', 'Talata', 'Alarbay', 'Aramisay', 'Arjuma', 'Sibiti'], - 'weekdays_short' => ['Dim', 'Ten', 'Tal', 'Ala', 'Ara', 'Arj', 'Sib'], - 'weekdays_min' => ['Dim', 'Ten', 'Tal', 'Ala', 'Ara', 'Arj', 'Sib'], - 'months' => ['Sanvie', 'Fébirie', 'Mars', 'Aburil', 'Mee', 'Sueŋ', 'Súuyee', 'Ut', 'Settembar', 'Oktobar', 'Novembar', 'Disambar'], - 'months_short' => ['Sa', 'Fe', 'Ma', 'Ab', 'Me', 'Su', 'Sú', 'Ut', 'Se', 'Ok', 'No', 'De'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dz.php b/vendor/nesbot/carbon/src/Carbon/Lang/dz.php deleted file mode 100644 index cc17e69..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/dz.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/dz_BT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php b/vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php deleted file mode 100644 index 5c40142..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sherubtse College bug-glibc@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'པསྱི་ལོYYཟལMMཚེསDD', - ], - 'months' => ['ཟླ་བ་དང་པ་', 'ཟླ་བ་གཉིས་པ་', 'ཟླ་བ་གསུམ་པ་', 'ཟླ་བ་བཞི་པ་', 'ཟླ་བ་ལྔ་ཕ་', 'ཟླ་བ་དྲུག་པ་', 'ཟླ་བ་བདུནཔ་', 'ཟླ་བ་བརྒྱད་པ་', 'ཟླ་བ་དགུ་པ་', 'ཟླ་བ་བཅུ་པ་', 'ཟླ་བ་བཅུ་གཅིག་པ་', 'ཟླ་བ་བཅུ་གཉིས་པ་'], - 'months_short' => ['ཟླ་༡', 'ཟླ་༢', 'ཟླ་༣', 'ཟླ་༤', 'ཟླ་༥', 'ཟླ་༦', 'ཟླ་༧', 'ཟླ་༨', 'ཟླ་༩', 'ཟླ་༡༠', 'ཟླ་༡༡', 'ཟླ་༡༢'], - 'weekdays' => ['གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་ཕ་', 'གཟའ་པུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་ཕ་', 'གཟའ་ཉི་མ་'], - 'weekdays_short' => ['ཟླ་', 'མིར་', 'ལྷག་', 'པུར་', 'སངས་', 'སྤེན་', 'ཉི་'], - 'weekdays_min' => ['ཟླ་', 'མིར་', 'ལྷག་', 'པུར་', 'སངས་', 'སྤེན་', 'ཉི་'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ངས་ཆ', 'ཕྱི་ཆ'], - - 'year' => ':count ཆརཔ', // less reliable - 'y' => ':count ཆརཔ', // less reliable - 'a_year' => ':count ཆརཔ', // less reliable - - 'month' => ':count ཟླ་བ', // less reliable - 'm' => ':count ཟླ་བ', // less reliable - 'a_month' => ':count ཟླ་བ', // less reliable - - 'day' => ':count ཉི', // less reliable - 'd' => ':count ཉི', // less reliable - 'a_day' => ':count ཉི', // less reliable - - 'second' => ':count ཆ', // less reliable - 's' => ':count ཆ', // less reliable - 'a_second' => ':count ཆ', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ebu.php b/vendor/nesbot/carbon/src/Carbon/Lang/ebu.php deleted file mode 100644 index 9e7d957..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ebu.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['KI', 'UT'], - 'weekdays' => ['Kiumia', 'Njumatatu', 'Njumaine', 'Njumatano', 'Aramithi', 'Njumaa', 'NJumamothii'], - 'weekdays_short' => ['Kma', 'Tat', 'Ine', 'Tan', 'Arm', 'Maa', 'NMM'], - 'weekdays_min' => ['Kma', 'Tat', 'Ine', 'Tan', 'Arm', 'Maa', 'NMM'], - 'months' => ['Mweri wa mbere', 'Mweri wa kaĩri', 'Mweri wa kathatũ', 'Mweri wa kana', 'Mweri wa gatano', 'Mweri wa gatantatũ', 'Mweri wa mũgwanja', 'Mweri wa kanana', 'Mweri wa kenda', 'Mweri wa ikũmi', 'Mweri wa ikũmi na ũmwe', 'Mweri wa ikũmi na Kaĩrĩ'], - 'months_short' => ['Mbe', 'Kai', 'Kat', 'Kan', 'Gat', 'Gan', 'Mug', 'Knn', 'Ken', 'Iku', 'Imw', 'Igi'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ee.php b/vendor/nesbot/carbon/src/Carbon/Lang/ee.php deleted file mode 100644 index f96c5c9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ee.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['ŋ', 'ɣ'], - 'weekdays' => ['kɔsiɖa', 'dzoɖa', 'blaɖa', 'kuɖa', 'yawoɖa', 'fiɖa', 'memleɖa'], - 'weekdays_short' => ['kɔs', 'dzo', 'bla', 'kuɖ', 'yaw', 'fiɖ', 'mem'], - 'weekdays_min' => ['kɔs', 'dzo', 'bla', 'kuɖ', 'yaw', 'fiɖ', 'mem'], - 'months' => ['dzove', 'dzodze', 'tedoxe', 'afɔfĩe', 'dama', 'masa', 'siamlɔm', 'deasiamime', 'anyɔnyɔ', 'kele', 'adeɛmekpɔxe', 'dzome'], - 'months_short' => ['dzv', 'dzd', 'ted', 'afɔ', 'dam', 'mas', 'sia', 'dea', 'any', 'kel', 'ade', 'dzm'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'a [ga] h:mm', - 'LTS' => 'a [ga] h:mm:ss', - 'L' => 'M/D/YYYY', - 'LL' => 'MMM D [lia], YYYY', - 'LLL' => 'a [ga] h:mm MMMM D [lia] YYYY', - 'LLLL' => 'a [ga] h:mm dddd, MMMM D [lia] YYYY', - ], - - 'year' => 'ƒe :count', - 'y' => 'ƒe :count', - 'a_year' => 'ƒe :count', - - 'month' => 'ɣleti :count', - 'm' => 'ɣleti :count', - 'a_month' => 'ɣleti :count', - - 'week' => 'kwasiɖa :count', - 'w' => 'kwasiɖa :count', - 'a_week' => 'kwasiɖa :count', - - 'day' => 'ŋkeke :count', - 'd' => 'ŋkeke :count', - 'a_day' => 'ŋkeke :count', - - 'hour' => 'gaƒoƒo :count', - 'h' => 'gaƒoƒo :count', - 'a_hour' => 'gaƒoƒo :count', - - 'minute' => 'miniti :count', // less reliable - 'min' => 'miniti :count', // less reliable - 'a_minute' => 'miniti :count', // less reliable - - 'second' => 'sɛkɛnd :count', // less reliable - 's' => 'sɛkɛnd :count', // less reliable - 'a_second' => 'sɛkɛnd :count', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php deleted file mode 100644 index 7a8b36c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ee.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'LLL' => 'HH:mm MMMM D [lia] YYYY', - 'LLLL' => 'HH:mm dddd, MMMM D [lia] YYYY', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/el.php b/vendor/nesbot/carbon/src/Carbon/Lang/el.php deleted file mode 100644 index 8711fa2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/el.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Alessandro Di Felice - * - François B - * - Tim Fish - * - Gabriel Monteagudo - * - JD Isaacks - * - yiannisdesp - * - Ilias Kasmeridis (iliaskasm) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count χρόνος|:count χρόνια', - 'a_year' => 'ένας χρόνος|:count χρόνια', - 'y' => ':count χρ.', - 'month' => ':count μήνας|:count μήνες', - 'a_month' => 'ένας μήνας|:count μήνες', - 'm' => ':count μήν.', - 'week' => ':count εβδομάδα|:count εβδομάδες', - 'a_week' => 'μια εβδομάδα|:count εβδομάδες', - 'w' => ':count εβδ.', - 'day' => ':count μέρα|:count μέρες', - 'a_day' => 'μία μέρα|:count μέρες', - 'd' => ':count μέρ.', - 'hour' => ':count ώρα|:count ώρες', - 'a_hour' => 'μία ώρα|:count ώρες', - 'h' => ':count ώρα|:count ώρες', - 'minute' => ':count λεπτό|:count λεπτά', - 'a_minute' => 'ένα λεπτό|:count λεπτά', - 'min' => ':count λεπ.', - 'second' => ':count δευτερόλεπτο|:count δευτερόλεπτα', - 'a_second' => 'λίγα δευτερόλεπτα|:count δευτερόλεπτα', - 's' => ':count δευ.', - 'ago' => 'πριν :time', - 'from_now' => 'σε :time', - 'after' => ':time μετά', - 'before' => ':time πριν', - 'diff_now' => 'τώρα', - 'diff_today' => 'Σήμερα', - 'diff_today_regexp' => 'Σήμερα(?:\\s+{})?', - 'diff_yesterday' => 'χθες', - 'diff_yesterday_regexp' => 'Χθες(?:\\s+{})?', - 'diff_tomorrow' => 'αύριο', - 'diff_tomorrow_regexp' => 'Αύριο(?:\\s+{})?', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm A', - 'LLLL' => 'dddd, D MMMM YYYY h:mm A', - ], - 'calendar' => [ - 'sameDay' => '[Σήμερα {}] LT', - 'nextDay' => '[Αύριο {}] LT', - 'nextWeek' => 'dddd [{}] LT', - 'lastDay' => '[Χθες {}] LT', - 'lastWeek' => static fn (CarbonInterface $current) => match ($current->dayOfWeek) { - 6 => '[το προηγούμενο] dddd [{}] LT', - default => '[την προηγούμενη] dddd [{}] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':numberη', - 'meridiem' => ['ΠΜ', 'ΜΜ', 'πμ', 'μμ'], - 'months' => ['Ιανουαρίου', 'Φεβρουαρίου', 'Μαρτίου', 'Απριλίου', 'Μαΐου', 'Ιουνίου', 'Ιουλίου', 'Αυγούστου', 'Σεπτεμβρίου', 'Οκτωβρίου', 'Νοεμβρίου', 'Δεκεμβρίου'], - 'months_standalone' => ['Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος', 'Μάιος', 'Ιούνιος', 'Ιούλιος', 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'], - 'months_regexp' => '/(D[oD]?[\s,]+MMMM|L{2,4}|l{2,4})/', - 'months_short' => ['Ιαν', 'Φεβ', 'Μαρ', 'Απρ', 'Μαϊ', 'Ιουν', 'Ιουλ', 'Αυγ', 'Σεπ', 'Οκτ', 'Νοε', 'Δεκ'], - 'weekdays' => ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'], - 'weekdays_short' => ['Κυρ', 'Δευ', 'Τρι', 'Τετ', 'Πεμ', 'Παρ', 'Σαβ'], - 'weekdays_min' => ['Κυ', 'Δε', 'Τρ', 'Τε', 'Πε', 'Πα', 'Σα'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' και '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php b/vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php deleted file mode 100644 index 8a693c1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Greek Debian Translation Team bug-glibc@gnu.org - */ -return array_replace_recursive(require __DIR__.'/el.php', [ - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php b/vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php deleted file mode 100644 index df196af..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/el.php', [ - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en.php b/vendor/nesbot/carbon/src/Carbon/Lang/en.php deleted file mode 100644 index 346a622..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Milos Sakovic - * - Paul - * - Pete Scopes (pdscopes) - */ -return [ - /* - * {1}, {0} and ]1,Inf[ are not needed as it's the default for English pluralization. - * But as some languages are using en.php as a fallback, it's better to specify it - * explicitly so those languages also fallback to English pluralization when a unit - * is missing. - */ - 'year' => '{1}:count year|{0}:count years|]1,Inf[:count years', - 'a_year' => '{1}a year|{0}:count years|]1,Inf[:count years', - 'y' => '{1}:countyr|{0}:countyrs|]1,Inf[:countyrs', - 'month' => '{1}:count month|{0}:count months|]1,Inf[:count months', - 'a_month' => '{1}a month|{0}:count months|]1,Inf[:count months', - 'm' => '{1}:countmo|{0}:countmos|]1,Inf[:countmos', - 'week' => '{1}:count week|{0}:count weeks|]1,Inf[:count weeks', - 'a_week' => '{1}a week|{0}:count weeks|]1,Inf[:count weeks', - 'w' => ':countw', - 'day' => '{1}:count day|{0}:count days|]1,Inf[:count days', - 'a_day' => '{1}a day|{0}:count days|]1,Inf[:count days', - 'd' => ':countd', - 'hour' => '{1}:count hour|{0}:count hours|]1,Inf[:count hours', - 'a_hour' => '{1}an hour|{0}:count hours|]1,Inf[:count hours', - 'h' => ':counth', - 'minute' => '{1}:count minute|{0}:count minutes|]1,Inf[:count minutes', - 'a_minute' => '{1}a minute|{0}:count minutes|]1,Inf[:count minutes', - 'min' => ':countm', - 'second' => '{1}:count second|{0}:count seconds|]1,Inf[:count seconds', - 'a_second' => '{1}a few seconds|{0}:count seconds|]1,Inf[:count seconds', - 's' => ':counts', - 'millisecond' => '{1}:count millisecond|{0}:count milliseconds|]1,Inf[:count milliseconds', - 'a_millisecond' => '{1}a millisecond|{0}:count milliseconds|]1,Inf[:count milliseconds', - 'ms' => ':countms', - 'microsecond' => '{1}:count microsecond|{0}:count microseconds|]1,Inf[:count microseconds', - 'a_microsecond' => '{1}a microsecond|{0}:count microseconds|]1,Inf[:count microseconds', - 'µs' => ':countµs', - 'ago' => ':time ago', - 'from_now' => ':time from now', - 'after' => ':time after', - 'before' => ':time before', - 'diff_now' => 'just now', - 'diff_today' => 'today', - 'diff_yesterday' => 'yesterday', - 'diff_tomorrow' => 'tomorrow', - 'diff_before_yesterday' => 'before yesterday', - 'diff_after_tomorrow' => 'after tomorrow', - 'period_recurrences' => '{1}once|{0}:count times|]1,Inf[:count times', - 'period_interval' => 'every :interval', - 'period_start_date' => 'from :date', - 'period_end_date' => 'to :date', - 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - 'weekdays' => ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - 'weekdays_short' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - 'weekdays_min' => ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], - 'ordinal' => static function ($number) { - $lastDigit = $number % 10; - - return $number.( - ((int) ($number % 100 / 10) === 1) ? 'th' : ( - ($lastDigit === 1) ? 'st' : ( - ($lastDigit === 2) ? 'nd' : ( - ($lastDigit === 3) ? 'rd' : 'th' - ) - ) - ) - ); - }, - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'MM/DD/YYYY', - 'LL' => 'MMMM D, YYYY', - 'LLL' => 'MMMM D, YYYY h:mm A', - 'LLLL' => 'dddd, MMMM D, YYYY h:mm A', - ], - 'list' => [', ', ' and '], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_001.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_001.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_001.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_150.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_150.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_150.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php deleted file mode 100644 index 06c6e1a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php deleted file mode 100644 index d1df614..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - François B - * - Mayank Badola - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm A', - 'LLLL' => 'dddd, D MMMM YYYY h:mm A', - ], - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php deleted file mode 100644 index 824571e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Zhan Tong Zhang - * - Mayank Badola - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'YYYY-MM-DD', - 'LL' => 'MMMM D, YYYY', - 'LLL' => 'MMMM D, YYYY h:mm A', - 'LLLL' => 'dddd, MMMM D, YYYY h:mm A', - ], - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php deleted file mode 100644 index 16668ff..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php deleted file mode 100644 index 7dfb721..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - NehaGautam - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD-MM-YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php deleted file mode 100644 index 9615e04..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Danish Standards Association bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php deleted file mode 100644 index 6ba7101..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Mayank Badola - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php deleted file mode 100644 index d0963b4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php deleted file mode 100644 index 62e5092..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Martin McWhorter - * - François B - * - Chris Cartlidge - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD-MM-YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php deleted file mode 100644 index b6107a9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Yoav Amit - * - François B - * - Mayank Badola - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php deleted file mode 100644 index 4a3f031..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YY', - 'LL' => 'MMMM DD, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php deleted file mode 100644 index 6688b13..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'dddd, YYYY MMMM DD HH:mm', - ], - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php deleted file mode 100644 index c337cfc..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php deleted file mode 100644 index be65cd3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Mayank Badola - * - Luke McGregor - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm A', - 'LLLL' => 'dddd, D MMMM YYYY h:mm A', - ], - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php deleted file mode 100644 index d0963b4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php deleted file mode 100644 index c4e2557..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 6, - 'weekend' => [5, 6], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php deleted file mode 100644 index e31e826..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_US.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_US.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_US.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php deleted file mode 100644 index 135bc0c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en_US.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php deleted file mode 100644 index f086dc6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php deleted file mode 100644 index 54d8d88..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YY', - 'LL' => 'MMMM DD, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php deleted file mode 100644 index c6bc0b2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - ANLoc Martin Benjamin locales@africanlocalization.net - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/eo.php b/vendor/nesbot/carbon/src/Carbon/Lang/eo.php deleted file mode 100644 index 7c2efba..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/eo.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Mia Nordentoft - * - JD Isaacks - */ -return [ - 'year' => ':count jaro|:count jaroj', - 'a_year' => 'jaro|:count jaroj', - 'y' => ':count j.', - 'month' => ':count monato|:count monatoj', - 'a_month' => 'monato|:count monatoj', - 'm' => ':count mo.', - 'week' => ':count semajno|:count semajnoj', - 'a_week' => 'semajno|:count semajnoj', - 'w' => ':count sem.', - 'day' => ':count tago|:count tagoj', - 'a_day' => 'tago|:count tagoj', - 'd' => ':count t.', - 'hour' => ':count horo|:count horoj', - 'a_hour' => 'horo|:count horoj', - 'h' => ':count h.', - 'minute' => ':count minuto|:count minutoj', - 'a_minute' => 'minuto|:count minutoj', - 'min' => ':count min.', - 'second' => ':count sekundo|:count sekundoj', - 'a_second' => 'sekundoj|:count sekundoj', - 's' => ':count sek.', - 'ago' => 'antaŭ :time', - 'from_now' => 'post :time', - 'after' => ':time poste', - 'before' => ':time antaŭe', - 'diff_yesterday' => 'Hieraŭ', - 'diff_yesterday_regexp' => 'Hieraŭ(?:\\s+je)?', - 'diff_today' => 'Hodiaŭ', - 'diff_today_regexp' => 'Hodiaŭ(?:\\s+je)?', - 'diff_tomorrow' => 'Morgaŭ', - 'diff_tomorrow_regexp' => 'Morgaŭ(?:\\s+je)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'D[-a de] MMMM, YYYY', - 'LLL' => 'D[-a de] MMMM, YYYY HH:mm', - 'LLLL' => 'dddd, [la] D[-a de] MMMM, YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Hodiaŭ je] LT', - 'nextDay' => '[Morgaŭ je] LT', - 'nextWeek' => 'dddd [je] LT', - 'lastDay' => '[Hieraŭ je] LT', - 'lastWeek' => '[pasinta] dddd [je] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numbera', - 'meridiem' => ['a.t.m.', 'p.t.m.'], - 'months' => ['januaro', 'februaro', 'marto', 'aprilo', 'majo', 'junio', 'julio', 'aŭgusto', 'septembro', 'oktobro', 'novembro', 'decembro'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aŭg', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['dimanĉo', 'lundo', 'mardo', 'merkredo', 'ĵaŭdo', 'vendredo', 'sabato'], - 'weekdays_short' => ['dim', 'lun', 'mard', 'merk', 'ĵaŭ', 'ven', 'sab'], - 'weekdays_min' => ['di', 'lu', 'ma', 'me', 'ĵa', 've', 'sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' kaj '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es.php b/vendor/nesbot/carbon/src/Carbon/Lang/es.php deleted file mode 100644 index dc24945..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es.php +++ /dev/null @@ -1,125 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - kostas - * - François B - * - Tim Fish - * - Claire Coloma - * - Steven Heinrich - * - JD Isaacks - * - Raphael Amorim - * - Jorge Y. Castillo - * - Víctor Díaz - * - Diego - * - Sebastian Thierer - * - quinterocesar - * - Daniel Commesse Liévanos (danielcommesse) - * - Pete Scopes (pdscopes) - * - gam04 - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count año|:count años', - 'a_year' => 'un año|:count años', - 'y' => ':count año|:count años', - 'month' => ':count mes|:count meses', - 'a_month' => 'un mes|:count meses', - 'm' => ':count mes|:count meses', - 'week' => ':count semana|:count semanas', - 'a_week' => 'una semana|:count semanas', - 'w' => ':countsem', - 'day' => ':count día|:count días', - 'a_day' => 'un día|:count días', - 'd' => ':countd', - 'hour' => ':count hora|:count horas', - 'a_hour' => 'una hora|:count horas', - 'h' => ':counth', - 'minute' => ':count minuto|:count minutos', - 'a_minute' => 'un minuto|:count minutos', - 'min' => ':countm', - 'second' => ':count segundo|:count segundos', - 'a_second' => 'unos segundos|:count segundos', - 's' => ':counts', - 'millisecond' => ':count milisegundo|:count milisegundos', - 'a_millisecond' => 'un milisegundo|:count milisegundos', - 'ms' => ':countms', - 'microsecond' => ':count microsegundo|:count microsegundos', - 'a_microsecond' => 'un microsegundo|:count microsegundos', - 'µs' => ':countµs', - 'ago' => 'hace :time', - 'from_now' => 'en :time', - 'after' => ':time después', - 'before' => ':time antes', - 'diff_now' => 'ahora mismo', - 'diff_today' => 'hoy', - 'diff_today_regexp' => 'hoy(?:\\s+a)?(?:\\s+las)?', - 'diff_yesterday' => 'ayer', - 'diff_yesterday_regexp' => 'ayer(?:\\s+a)?(?:\\s+las)?', - 'diff_tomorrow' => 'mañana', - 'diff_tomorrow_regexp' => 'mañana(?:\\s+a)?(?:\\s+las)?', - 'diff_before_yesterday' => 'anteayer', - 'diff_after_tomorrow' => 'pasado mañana', - 'period_recurrences' => 'una vez|:count veces', - 'period_interval' => 'cada :interval', - 'period_start_date' => 'de :date', - 'period_end_date' => 'a :date', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D [de] MMMM [de] YYYY', - 'LLL' => 'D [de] MMMM [de] YYYY H:mm', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => static function (CarbonInterface $current) { - return '[hoy a la'.($current->hour !== 1 ? 's' : '').'] LT'; - }, - 'nextDay' => static function (CarbonInterface $current) { - return '[mañana a la'.($current->hour !== 1 ? 's' : '').'] LT'; - }, - 'nextWeek' => static function (CarbonInterface $current) { - return 'dddd [a la'.($current->hour !== 1 ? 's' : '').'] LT'; - }, - 'lastDay' => static function (CarbonInterface $current) { - return '[ayer a la'.($current->hour !== 1 ? 's' : '').'] LT'; - }, - 'lastWeek' => static function (CarbonInterface $current) { - return '[el] dddd [pasado a la'.($current->hour !== 1 ? 's' : '').'] LT'; - }, - 'sameElse' => 'L', - ], - 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'], - 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'], - 'mmm_suffix' => '.', - 'ordinal' => ':numberº', - 'weekdays' => ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'], - 'weekdays_short' => ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'], - 'weekdays_min' => ['do', 'lu', 'ma', 'mi', 'ju', 'vi', 'sá'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' y '], - 'meridiem' => ['a. m.', 'p. m.'], - 'ordinal_words' => [ - 'of' => 'de', - 'first' => 'primer', - 'second' => 'segundo', - 'third' => 'tercer', - 'fourth' => 'cuarto', - 'fifth' => 'quinto', - 'last' => 'último', - ], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_419.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_419.php deleted file mode 100644 index a74806e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_419.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php deleted file mode 100644 index a74806e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php deleted file mode 100644 index c9b8432..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php deleted file mode 100644 index 378d054..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php deleted file mode 100644 index 378d054..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php deleted file mode 100644 index a74806e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php deleted file mode 100644 index a74806e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php deleted file mode 100644 index 553fc09..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php deleted file mode 100644 index f02e1a6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php deleted file mode 100644 index 0f855ba..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - kostas - * - François B - * - Tim Fish - * - Chiel Robben - * - Claire Coloma - * - Steven Heinrich - * - JD Isaacks - * - Raphael Amorim - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'diff_before_yesterday' => 'anteayer', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'LLL' => 'D [de] MMMM [de] YYYY h:mm A', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY h:mm A', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php deleted file mode 100644 index f02e1a6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php deleted file mode 100644 index a74806e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php deleted file mode 100644 index 19217c2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return require __DIR__.'/es.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php deleted file mode 100644 index f02e1a6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php deleted file mode 100644 index a74806e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php deleted file mode 100644 index a74806e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php deleted file mode 100644 index f02e1a6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php deleted file mode 100644 index 61e14cf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'diff_before_yesterday' => 'antier', - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php deleted file mode 100644 index 6b964c1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php deleted file mode 100644 index a74806e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php deleted file mode 100644 index a74806e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php deleted file mode 100644 index deae06a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/M/yy', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D [de] MMMM [de] YYYY h:mm a', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php deleted file mode 100644 index 6b964c1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php deleted file mode 100644 index a74806e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php deleted file mode 100644 index 00db08e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'], - 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_US.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_US.php deleted file mode 100644 index f333136..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_US.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - Josh Soref - * - Jørn Ølmheim - * - Craig Patik - * - bustta - * - François B - * - Tim Fish - * - Claire Coloma - * - Steven Heinrich - * - JD Isaacks - * - Raphael Amorim - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'diff_before_yesterday' => 'anteayer', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'MM/DD/YYYY', - 'LL' => 'MMMM [de] D [de] YYYY', - 'LLL' => 'MMMM [de] D [de] YYYY h:mm A', - 'LLLL' => 'dddd, MMMM [de] D [de] YYYY h:mm A', - ], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php deleted file mode 100644 index 39baff8..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'setiembre', 'octubre', 'noviembre', 'diciembre'], - 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'set', 'oct', 'nov', 'dic'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php deleted file mode 100644 index a74806e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/et.php b/vendor/nesbot/carbon/src/Carbon/Lang/et.php deleted file mode 100644 index f49c880..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/et.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Andres Ivanov - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Juanito Fatas - * - RM87 - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Esko Lehtme - * - Mart Karu - * - Nicolás Hock Isaza - * - Kevin Valdek - * - Zahhar Kirillov - * - João Magalhães - * - Ingmar - * - Illimar Tambek - * - Mihkel - */ -return [ - 'year' => ':count aasta|:count aastat', - 'y' => ':count a', - 'month' => ':count kuu|:count kuud', - 'm' => ':count k', - 'week' => ':count nädal|:count nädalat', - 'w' => ':count näd', - 'day' => ':count päev|:count päeva', - 'd' => ':count p', - 'hour' => ':count tund|:count tundi', - 'h' => ':count t', - 'minute' => ':count minut|:count minutit', - 'min' => ':count min', - 'second' => ':count sekund|:count sekundit', - 's' => ':count s', - 'ago' => ':time tagasi', - 'from_now' => ':time pärast', - 'after' => ':time pärast', - 'before' => ':time enne', - 'year_from_now' => ':count aasta', - 'month_from_now' => ':count kuu', - 'week_from_now' => ':count nädala', - 'day_from_now' => ':count päeva', - 'hour_from_now' => ':count tunni', - 'minute_from_now' => ':count minuti', - 'second_from_now' => ':count sekundi', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'diff_now' => 'nüüd', - 'diff_today' => 'täna', - 'diff_yesterday' => 'eile', - 'diff_tomorrow' => 'homme', - 'diff_before_yesterday' => 'üleeile', - 'diff_after_tomorrow' => 'ülehomme', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D. MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[täna] LT', - 'nextDay' => '[homme] LT', - 'lastDay' => '[eile] LT', - 'nextWeek' => 'dddd LT', - 'lastWeek' => '[eelmine] dddd LT', - 'sameElse' => 'L', - ], - 'months' => ['jaanuar', 'veebruar', 'märts', 'aprill', 'mai', 'juuni', 'juuli', 'august', 'september', 'oktoober', 'november', 'detsember'], - 'months_short' => ['jaan', 'veebr', 'märts', 'apr', 'mai', 'juuni', 'juuli', 'aug', 'sept', 'okt', 'nov', 'dets'], - 'weekdays' => ['pühapäev', 'esmaspäev', 'teisipäev', 'kolmapäev', 'neljapäev', 'reede', 'laupäev'], - 'weekdays_short' => ['P', 'E', 'T', 'K', 'N', 'R', 'L'], - 'weekdays_min' => ['P', 'E', 'T', 'K', 'N', 'R', 'L'], - 'list' => [', ', ' ja '], - 'meridiem' => ['enne lõunat', 'pärast lõunat'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php b/vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php deleted file mode 100644 index 0f112b3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/et.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/eu.php b/vendor/nesbot/carbon/src/Carbon/Lang/eu.php deleted file mode 100644 index a543f1a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/eu.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - JD Isaacks - */ -return [ - 'year' => 'urte bat|:count urte', - 'y' => 'Urte 1|:count urte', - 'month' => 'hilabete bat|:count hilabete', - 'm' => 'Hile 1|:count hile', - 'week' => 'Aste 1|:count aste', - 'w' => 'Aste 1|:count aste', - 'day' => 'egun bat|:count egun', - 'd' => 'Egun 1|:count egun', - 'hour' => 'ordu bat|:count ordu', - 'h' => 'Ordu 1|:count ordu', - 'minute' => 'minutu bat|:count minutu', - 'min' => 'Minutu 1|:count minutu', - 'second' => 'segundo batzuk|:count segundo', - 's' => 'Segundu 1|:count segundu', - 'ago' => 'duela :time', - 'from_now' => ':time barru', - 'after' => ':time geroago', - 'before' => ':time lehenago', - 'diff_now' => 'orain', - 'diff_today' => 'gaur', - 'diff_yesterday' => 'atzo', - 'diff_tomorrow' => 'bihar', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'YYYY[ko] MMMM[ren] D[a]', - 'LLL' => 'YYYY[ko] MMMM[ren] D[a] HH:mm', - 'LLLL' => 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[gaur] LT[etan]', - 'nextDay' => '[bihar] LT[etan]', - 'nextWeek' => 'dddd LT[etan]', - 'lastDay' => '[atzo] LT[etan]', - 'lastWeek' => '[aurreko] dddd LT[etan]', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['urtarrila', 'otsaila', 'martxoa', 'apirila', 'maiatza', 'ekaina', 'uztaila', 'abuztua', 'iraila', 'urria', 'azaroa', 'abendua'], - 'months_short' => ['urt.', 'ots.', 'mar.', 'api.', 'mai.', 'eka.', 'uzt.', 'abu.', 'ira.', 'urr.', 'aza.', 'abe.'], - 'weekdays' => ['igandea', 'astelehena', 'asteartea', 'asteazkena', 'osteguna', 'ostirala', 'larunbata'], - 'weekdays_short' => ['ig.', 'al.', 'ar.', 'az.', 'og.', 'ol.', 'lr.'], - 'weekdays_min' => ['ig', 'al', 'ar', 'az', 'og', 'ol', 'lr'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' eta '], - 'meridiem' => ['g', 'a'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php deleted file mode 100644 index 0d1e82a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/eu.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ewo.php b/vendor/nesbot/carbon/src/Carbon/Lang/ewo.php deleted file mode 100644 index 7808ab5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ewo.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['kíkíríg', 'ngəgógəle'], - 'weekdays' => ['sɔ́ndɔ', 'mɔ́ndi', 'sɔ́ndɔ məlú mə́bɛ̌', 'sɔ́ndɔ məlú mə́lɛ́', 'sɔ́ndɔ məlú mə́nyi', 'fúladé', 'séradé'], - 'weekdays_short' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'fúl', 'sér'], - 'weekdays_min' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'fúl', 'sér'], - 'months' => ['ngɔn osú', 'ngɔn bɛ̌', 'ngɔn lála', 'ngɔn nyina', 'ngɔn tána', 'ngɔn saməna', 'ngɔn zamgbála', 'ngɔn mwom', 'ngɔn ebulú', 'ngɔn awóm', 'ngɔn awóm ai dziá', 'ngɔn awóm ai bɛ̌'], - 'months_short' => ['ngo', 'ngb', 'ngl', 'ngn', 'ngt', 'ngs', 'ngz', 'ngm', 'nge', 'nga', 'ngad', 'ngab'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - // Too unreliable - /* - 'year' => ':count mbu', // less reliable - 'y' => ':count mbu', // less reliable - 'a_year' => ':count mbu', // less reliable - - 'month' => ':count ngòn', // less reliable - 'm' => ':count ngòn', // less reliable - 'a_month' => ':count ngòn', // less reliable - - 'week' => ':count mësë', // less reliable - 'w' => ':count mësë', // less reliable - 'a_week' => ':count mësë', // less reliable - - 'day' => ':count mësë', // less reliable - 'd' => ':count mësë', // less reliable - 'a_day' => ':count mësë', // less reliable - - 'hour' => ':count awola', // less reliable - 'h' => ':count awola', // less reliable - 'a_hour' => ':count awola', // less reliable - - 'minute' => ':count awola', // less reliable - 'min' => ':count awola', // less reliable - 'a_minute' => ':count awola', // less reliable - */ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fa.php b/vendor/nesbot/carbon/src/Carbon/Lang/fa.php deleted file mode 100644 index 72e0308..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fa.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Nasser Ghiasi - * - JD Isaacks - * - Hossein Jabbari - * - nimamo - * - hafezdivandari - * - Hassan Pezeshk (hpez) - */ -return [ - 'year' => ':count سال', - 'a_year' => 'یک سال'.'|:count '.'سال', - 'y' => ':count سال', - 'month' => ':count ماه', - 'a_month' => 'یک ماه'.'|:count '.'ماه', - 'm' => ':count ماه', - 'week' => ':count هفته', - 'a_week' => 'یک هفته'.'|:count '.'هفته', - 'w' => ':count هفته', - 'day' => ':count روز', - 'a_day' => 'یک روز'.'|:count '.'روز', - 'd' => ':count روز', - 'hour' => ':count ساعت', - 'a_hour' => 'یک ساعت'.'|:count '.'ساعت', - 'h' => ':count ساعت', - 'minute' => ':count دقیقه', - 'a_minute' => 'یک دقیقه'.'|:count '.'دقیقه', - 'min' => ':count دقیقه', - 'second' => ':count ثانیه', - 's' => ':count ثانیه', - 'ago' => ':time پیش', - 'from_now' => ':time دیگر', - 'after' => ':time پس از', - 'before' => ':time پیش از', - 'diff_now' => 'اکنون', - 'diff_today' => 'امروز', - 'diff_today_regexp' => 'امروز(?:\\s+ساعت)?', - 'diff_yesterday' => 'دیروز', - 'diff_yesterday_regexp' => 'دیروز(?:\\s+ساعت)?', - 'diff_tomorrow' => 'فردا', - 'diff_tomorrow_regexp' => 'فردا(?:\\s+ساعت)?', - 'formats' => [ - 'LT' => 'OH:Om', - 'LTS' => 'OH:Om:Os', - 'L' => 'OD/OM/OY', - 'LL' => 'OD MMMM OY', - 'LLL' => 'OD MMMM OY OH:Om', - 'LLLL' => 'dddd, OD MMMM OY OH:Om', - ], - 'calendar' => [ - 'sameDay' => '[امروز ساعت] LT', - 'nextDay' => '[فردا ساعت] LT', - 'nextWeek' => 'dddd [ساعت] LT', - 'lastDay' => '[دیروز ساعت] LT', - 'lastWeek' => 'dddd [پیش] [ساعت] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':timeم', - 'meridiem' => ['قبل از ظهر', 'بعد از ظهر'], - 'months' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], - 'months_short' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], - 'weekdays' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'], - 'weekdays_short' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'], - 'weekdays_min' => ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'list' => ['، ', ' و '], - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰۴', '۰۵', '۰۶', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱۴', '۱۵', '۱۶', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲۴', '۲۵', '۲۶', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳۴', '۳۵', '۳۶', '۳۷', '۳۸', '۳۹', '۴۰', '۴۱', '۴۲', '۴۳', '۴۴', '۴۵', '۴۶', '۴۷', '۴۸', '۴۹', '۵۰', '۵۱', '۵۲', '۵۳', '۵۴', '۵۵', '۵۶', '۵۷', '۵۸', '۵۹', '۶۰', '۶۱', '۶۲', '۶۳', '۶۴', '۶۵', '۶۶', '۶۷', '۶۸', '۶۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷۴', '۷۵', '۷۶', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸۴', '۸۵', '۸۶', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹۴', '۹۵', '۹۶', '۹۷', '۹۸', '۹۹'], - 'months_short_standalone' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], - 'weekend' => [5, 5], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php deleted file mode 100644 index 6947100..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fa.php', [ - 'meridiem' => ['ق', 'ب'], - 'weekend' => [4, 5], - 'formats' => [ - 'L' => 'OY/OM/OD', - 'LL' => 'OD MMM OY', - 'LLL' => 'OD MMMM OY،‏ H:mm', - 'LLLL' => 'dddd OD MMMM OY،‏ H:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php b/vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php deleted file mode 100644 index 08d0182..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fa.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ff.php b/vendor/nesbot/carbon/src/Carbon/Lang/ff.php deleted file mode 100644 index 9525c95..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ff.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'months' => ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'], - 'months_short' => ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'], - 'weekdays' => ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'], - 'weekdays_short' => ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'], - 'weekdays_min' => ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['subaka', 'kikiiɗe'], - - 'year' => ':count baret', // less reliable - 'y' => ':count baret', // less reliable - 'a_year' => ':count baret', // less reliable - - 'month' => ':count lewru', // less reliable - 'm' => ':count lewru', // less reliable - 'a_month' => ':count lewru', // less reliable - - 'week' => ':count naange', // less reliable - 'w' => ':count naange', // less reliable - 'a_week' => ':count naange', // less reliable - - 'day' => ':count dian', // less reliable - 'd' => ':count dian', // less reliable - 'a_day' => ':count dian', // less reliable - - 'hour' => ':count montor', // less reliable - 'h' => ':count montor', // less reliable - 'a_hour' => ':count montor', // less reliable - - 'minute' => ':count tokossuoum', // less reliable - 'min' => ':count tokossuoum', // less reliable - 'a_minute' => ':count tokossuoum', // less reliable - - 'second' => ':count tenen', // less reliable - 's' => ':count tenen', // less reliable - 'a_second' => ':count tenen', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php b/vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php deleted file mode 100644 index b797ac0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ff.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php deleted file mode 100644 index b797ac0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ff.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php deleted file mode 100644 index 2f4c29f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ff.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php deleted file mode 100644 index 1e4c8b6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pular-Fulfulde.org Ibrahima Sarr admin@pulaar-fulfulde.org - */ -return require __DIR__.'/ff.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fi.php b/vendor/nesbot/carbon/src/Carbon/Lang/fi.php deleted file mode 100644 index edf2d6d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fi.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Janne Warén - * - digitalfrost - * - Tsutomu Kuroda - * - Roope Salmi - * - tjku - * - Max Melentiev - * - Sami Haahtinen - * - Teemu Leisti - * - Artem Ignatyev - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Robert Bjarnason - * - Aaron Patterson - * - Nicolás Hock Isaza - * - Tom Hughes - * - Sven Fuchs - * - Petri Kivikangas - * - Nizar Jouini - * - Marko Seppae - * - Tomi Mynttinen (Pikseli) - * - Petteri (powergrip) - */ -return [ - 'year' => ':count vuosi|:count vuotta', - 'y' => ':count v', - 'month' => ':count kuukausi|:count kuukautta', - 'm' => ':count kk', - 'week' => ':count viikko|:count viikkoa', - 'w' => ':count vk', - 'day' => ':count päivä|:count päivää', - 'd' => ':count pv', - 'hour' => ':count tunti|:count tuntia', - 'h' => ':count t', - 'minute' => ':count minuutti|:count minuuttia', - 'min' => ':count min', - 'second' => ':count sekunti|:count sekuntia', - 'a_second' => 'muutama sekunti|:count sekuntia', - 's' => ':count s', - 'ago' => ':time sitten', - 'from_now' => ':time päästä', - 'year_from_now' => ':count vuoden', - 'month_from_now' => ':count kuukauden', - 'week_from_now' => ':count viikon', - 'day_from_now' => ':count päivän', - 'hour_from_now' => ':count tunnin', - 'minute_from_now' => ':count minuutin', - 'second_from_now' => ':count sekunnin', - 'after' => ':time sen jälkeen', - 'before' => ':time ennen', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' ja '], - 'diff_now' => 'nyt', - 'diff_yesterday' => 'eilen', - 'diff_tomorrow' => 'huomenna', - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm:ss', - 'L' => 'D.M.YYYY', - 'LL' => 'dddd D. MMMM[ta] YYYY', - 'll' => 'ddd D. MMM YYYY', - 'LLL' => 'D.MM. HH.mm', - 'LLLL' => 'D. MMMM[ta] YYYY HH.mm', - 'llll' => 'D. MMM YY HH.mm', - ], - 'weekdays' => ['sunnuntai', 'maanantai', 'tiistai', 'keskiviikko', 'torstai', 'perjantai', 'lauantai'], - 'weekdays_short' => ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'], - 'weekdays_min' => ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'], - 'months' => ['tammikuu', 'helmikuu', 'maaliskuu', 'huhtikuu', 'toukokuu', 'kesäkuu', 'heinäkuu', 'elokuu', 'syyskuu', 'lokakuu', 'marraskuu', 'joulukuu'], - 'months_short' => ['tammi', 'helmi', 'maalis', 'huhti', 'touko', 'kesä', 'heinä', 'elo', 'syys', 'loka', 'marras', 'joulu'], - 'meridiem' => ['aamupäivä', 'iltapäivä'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php b/vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php deleted file mode 100644 index 920f1ca..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fi.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fil.php b/vendor/nesbot/carbon/src/Carbon/Lang/fil.php deleted file mode 100644 index 61114e3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fil.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/fil_PH.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php b/vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php deleted file mode 100644 index 60751dd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Rene Torres Rene Torres, Pablo Saratxaga rgtorre@rocketmail.com, pablo@mandrakesoft.com - * - Jaycee Mariano (alohajaycee) - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'MM/DD/YY', - ], - 'months' => ['Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'], - 'months_short' => ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'], - 'weekdays' => ['Linggo', 'Lunes', 'Martes', 'Miyerkoles', 'Huwebes', 'Biyernes', 'Sabado'], - 'weekdays_short' => ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'], - 'weekdays_min' => ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['N.U.', 'N.H.'], - - 'before' => ':time bago', - 'after' => ':time pagkatapos', - - 'year' => ':count taon', - 'y' => ':count taon', - 'a_year' => ':count taon', - - 'month' => ':count buwan', - 'm' => ':count buwan', - 'a_month' => ':count buwan', - - 'week' => ':count linggo', - 'w' => ':count linggo', - 'a_week' => ':count linggo', - - 'day' => ':count araw', - 'd' => ':count araw', - 'a_day' => ':count araw', - - 'hour' => ':count oras', - 'h' => ':count oras', - 'a_hour' => ':count oras', - - 'minute' => ':count minuto', - 'min' => ':count minuto', - 'a_minute' => ':count minuto', - - 'second' => ':count segundo', - 's' => ':count segundo', - 'a_second' => ':count segundo', - - 'ago' => ':time ang nakalipas', - 'from_now' => 'sa :time', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fo.php b/vendor/nesbot/carbon/src/Carbon/Lang/fo.php deleted file mode 100644 index 6a14a6f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fo.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kristian Sakarisson - * - François B - * - JD Isaacks - * - Sverri Mohr Olsen - */ -return [ - 'year' => 'eitt ár|:count ár', - 'y' => ':count ár|:count ár', - 'month' => 'ein mánaði|:count mánaðir', - 'm' => ':count mánaður|:count mánaðir', - 'week' => ':count vika|:count vikur', - 'w' => ':count vika|:count vikur', - 'day' => 'ein dagur|:count dagar', - 'd' => ':count dag|:count dagar', - 'hour' => 'ein tími|:count tímar', - 'h' => ':count tími|:count tímar', - 'minute' => 'ein minutt|:count minuttir', - 'min' => ':count minutt|:count minuttir', - 'second' => 'fá sekund|:count sekundir', - 's' => ':count sekund|:count sekundir', - 'ago' => ':time síðani', - 'from_now' => 'um :time', - 'after' => ':time aftaná', - 'before' => ':time áðrenn', - 'diff_today' => 'Í', - 'diff_yesterday' => 'Í', - 'diff_yesterday_regexp' => 'Í(?:\\s+gjár)?(?:\\s+kl.)?', - 'diff_tomorrow' => 'Í', - 'diff_tomorrow_regexp' => 'Í(?:\\s+morgin)?(?:\\s+kl.)?', - 'diff_today_regexp' => 'Í(?:\\s+dag)?(?:\\s+kl.)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D. MMMM, YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Í dag kl.] LT', - 'nextDay' => '[Í morgin kl.] LT', - 'nextWeek' => 'dddd [kl.] LT', - 'lastDay' => '[Í gjár kl.] LT', - 'lastWeek' => '[síðstu] dddd [kl] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['januar', 'februar', 'mars', 'apríl', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['sunnudagur', 'mánadagur', 'týsdagur', 'mikudagur', 'hósdagur', 'fríggjadagur', 'leygardagur'], - 'weekdays_short' => ['sun', 'mán', 'týs', 'mik', 'hós', 'frí', 'ley'], - 'weekdays_min' => ['su', 'má', 'tý', 'mi', 'hó', 'fr', 'le'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' og '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php b/vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php deleted file mode 100644 index 657f2c5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fo.php', [ - 'formats' => [ - 'L' => 'DD.MM.yy', - 'LL' => 'DD.MM.YYYY', - 'LLL' => 'D. MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D. MMMM YYYY, HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php b/vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php deleted file mode 100644 index 6d73616..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fo.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr.php deleted file mode 100644 index da696e7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Dieter Sting - * - François B - * - Maxime VALY - * - JD Isaacks - * - Dieter Sting - * - François B - * - JD Isaacks - * - Sebastian Thierer - * - Fastfuel - * - Pete Scopes (pdscopes) - */ -return [ - 'millennium' => ':count millénaire|:count millénaires', - 'a_millennium' => 'un millénaire|:count millénaires', - 'century' => ':count siècle|:count siècles', - 'a_century' => 'un siècle|:count siècles', - 'decade' => ':count décennie|:count décennies', - 'a_decade' => 'une décennie|:count décennies', - 'year' => ':count an|:count ans', - 'a_year' => 'un an|:count ans', - 'y' => ':count an|:count ans', - 'month' => ':count mois|:count mois', - 'a_month' => 'un mois|:count mois', - 'm' => ':count mois', - 'week' => ':count semaine|:count semaines', - 'a_week' => 'une semaine|:count semaines', - 'w' => ':count sem.', - 'day' => ':count jour|:count jours', - 'a_day' => 'un jour|:count jours', - 'd' => ':count j', - 'hour' => ':count heure|:count heures', - 'a_hour' => 'une heure|:count heures', - 'h' => ':count h', - 'minute' => ':count minute|:count minutes', - 'a_minute' => 'une minute|:count minutes', - 'min' => ':count min', - 'second' => ':count seconde|:count secondes', - 'a_second' => 'quelques secondes|:count secondes', - 's' => ':count s', - 'millisecond' => ':count milliseconde|:count millisecondes', - 'a_millisecond' => 'une milliseconde|:count millisecondes', - 'ms' => ':countms', - 'microsecond' => ':count microseconde|:count microsecondes', - 'a_microsecond' => 'une microseconde|:count microsecondes', - 'µs' => ':countµs', - 'ago' => 'il y a :time', - 'from_now' => 'dans :time', - 'after' => ':time après', - 'before' => ':time avant', - 'diff_now' => "à l'instant", - 'diff_today' => "aujourd'hui", - 'diff_today_regexp' => "aujourd'hui(?:\s+à)?", - 'diff_yesterday' => 'hier', - 'diff_yesterday_regexp' => 'hier(?:\s+à)?', - 'diff_tomorrow' => 'demain', - 'diff_tomorrow_regexp' => 'demain(?:\s+à)?', - 'diff_before_yesterday' => 'avant-hier', - 'diff_after_tomorrow' => 'après-demain', - 'period_recurrences' => ':count fois', - 'period_interval' => 'tous les :interval', - 'period_start_date' => 'de :date', - 'period_end_date' => 'à :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Aujourd’hui à] LT', - 'nextDay' => '[Demain à] LT', - 'nextWeek' => 'dddd [à] LT', - 'lastDay' => '[Hier à] LT', - 'lastWeek' => 'dddd [dernier à] LT', - 'sameElse' => 'L', - ], - 'months' => ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'], - 'months_short' => ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'], - 'weekdays' => ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'], - 'weekdays_short' => ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'], - 'weekdays_min' => ['di', 'lu', 'ma', 'me', 'je', 've', 'sa'], - 'ordinal' => static function ($number, $period) { - return match ($period) { - // In French, only the first has to be ordinal, other number remains cardinal - // @link https://fr.wikihow.com/%C3%A9crire-la-date-en-fran%C3%A7ais - 'D' => $number.($number === 1 ? 'er' : ''), - default => $number.($number === 1 ? 'er' : 'e'), - 'w', 'W' => $number.($number === 1 ? 're' : 'e'), - }; - }, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' et '], - 'ordinal_words' => [ - 'of' => 'de', - 'first' => 'premier', - 'second' => 'deuxième', - 'third' => 'troisième', - 'fourth' => 'quatrième', - 'fifth' => 'cinquième', - 'last' => 'dernier', - ], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php deleted file mode 100644 index 8ed0328..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php deleted file mode 100644 index c9f6346..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Dieter Sting - * - François B - * - Maxime VALY - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php deleted file mode 100644 index 8674c27..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Dieter Sting - * - François B - * - Gaspard Bucher - * - Maxime VALY - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php deleted file mode 100644 index 67d3787..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'meridiem' => ['mat.', 'soir'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php deleted file mode 100644 index 2f06086..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'first_day_of_week' => 6, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php deleted file mode 100644 index ae8db5f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'first_day_of_week' => 6, - 'weekend' => [5, 6], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php deleted file mode 100644 index 6dda772..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php deleted file mode 100644 index 1bf034d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'first_day_of_week' => 6, - 'weekend' => [5, 6], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php deleted file mode 100644 index 37cf83f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php deleted file mode 100644 index ae8db5f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'first_day_of_week' => 6, - 'weekend' => [5, 6], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php deleted file mode 100644 index 37cf83f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php deleted file mode 100644 index 6905e7a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'weekend' => [5, 6], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php deleted file mode 100644 index 37cf83f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php deleted file mode 100644 index ec3ee35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fur.php b/vendor/nesbot/carbon/src/Carbon/Lang/fur.php deleted file mode 100644 index 36c2564..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fur.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/fur_IT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php deleted file mode 100644 index 0147a59..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pablo Saratxaga pablo@mandrakesoft.com - */ -return [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD. MM. YY', - 'LL' => 'DD di MMMM dal YYYY', - 'LLL' => 'DD di MMM HH:mm', - 'LLLL' => 'DD di MMMM dal YYYY HH:mm', - ], - 'months' => ['zenâr', 'fevrâr', 'març', 'avrîl', 'mai', 'jugn', 'lui', 'avost', 'setembar', 'otubar', 'novembar', 'dicembar'], - 'months_short' => ['zen', 'fev', 'mar', 'avr', 'mai', 'jug', 'lui', 'avo', 'set', 'otu', 'nov', 'dic'], - 'weekdays' => ['domenie', 'lunis', 'martars', 'miercus', 'joibe', 'vinars', 'sabide'], - 'weekdays_short' => ['dom', 'lun', 'mar', 'mie', 'joi', 'vin', 'sab'], - 'weekdays_min' => ['dom', 'lun', 'mar', 'mie', 'joi', 'vin', 'sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'year' => ':count an', - 'month' => ':count mês', - 'week' => ':count setemane', - 'day' => ':count zornade', - 'hour' => ':count ore', - 'minute' => ':count minût', - 'second' => ':count secont', -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fy.php b/vendor/nesbot/carbon/src/Carbon/Lang/fy.php deleted file mode 100644 index 42ecaed..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fy.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Tim Fish - * - JD Isaacks - */ -return [ - 'year' => ':count jier|:count jierren', - 'a_year' => 'ien jier|:count jierren', - 'y' => ':count j', - 'month' => ':count moanne|:count moannen', - 'a_month' => 'ien moanne|:count moannen', - 'm' => ':count moa.', - 'week' => ':count wike|:count wiken', - 'a_week' => 'in wike|:count wiken', - 'a' => ':count w.', - 'day' => ':count dei|:count dagen', - 'a_day' => 'ien dei|:count dagen', - 'd' => ':count d.', - 'hour' => ':count oere|:count oeren', - 'a_hour' => 'ien oere|:count oeren', - 'h' => ':count o.', - 'minute' => ':count minút|:count minuten', - 'a_minute' => 'ien minút|:count minuten', - 'min' => ':count min.', - 'second' => ':count sekonde|:count sekonden', - 'a_second' => 'in pear sekonden|:count sekonden', - 's' => ':count s.', - 'ago' => ':time lyn', - 'from_now' => 'oer :time', - 'diff_yesterday' => 'juster', - 'diff_yesterday_regexp' => 'juster(?:\\s+om)?', - 'diff_today' => 'hjoed', - 'diff_today_regexp' => 'hjoed(?:\\s+om)?', - 'diff_tomorrow' => 'moarn', - 'diff_tomorrow_regexp' => 'moarn(?:\\s+om)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD-MM-YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[hjoed om] LT', - 'nextDay' => '[moarn om] LT', - 'nextWeek' => 'dddd [om] LT', - 'lastDay' => '[juster om] LT', - 'lastWeek' => '[ôfrûne] dddd [om] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - return $number.(($number === 1 || $number === 8 || $number >= 20) ? 'ste' : 'de'); - }, - 'months' => ['jannewaris', 'febrewaris', 'maart', 'april', 'maaie', 'juny', 'july', 'augustus', 'septimber', 'oktober', 'novimber', 'desimber'], - 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], - 'mmm_suffix' => '.', - 'weekdays' => ['snein', 'moandei', 'tiisdei', 'woansdei', 'tongersdei', 'freed', 'sneon'], - 'weekdays_short' => ['si.', 'mo.', 'ti.', 'wo.', 'to.', 'fr.', 'so.'], - 'weekdays_min' => ['Si', 'Mo', 'Ti', 'Wo', 'To', 'Fr', 'So'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' en '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php deleted file mode 100644 index 8559d5c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Jaunuwoa', 'Februwoa', 'Moaz', 'Aprell', 'Mai', 'Juni', 'Juli', 'August', 'Septamba', 'Oktoba', 'Nowamba', 'Dezamba'], - 'months_short' => ['Jan', 'Feb', 'Moz', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Now', 'Dez'], - 'weekdays' => ['Sinndag', 'Mondag', 'Dingsdag', 'Meddwäakj', 'Donnadag', 'Friedag', 'Sinnowend'], - 'weekdays_short' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], - 'weekdays_min' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php b/vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php deleted file mode 100644 index 01cc96c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/fy.php', [ - 'formats' => [ - 'L' => 'DD-MM-YY', - ], - 'months' => ['Jannewaris', 'Febrewaris', 'Maart', 'April', 'Maaie', 'Juny', 'July', 'Augustus', 'Septimber', 'Oktober', 'Novimber', 'Desimber'], - 'months_short' => ['Jan', 'Feb', 'Mrt', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Snein', 'Moandei', 'Tiisdei', 'Woansdei', 'Tongersdei', 'Freed', 'Sneon'], - 'weekdays_short' => ['Sn', 'Mo', 'Ti', 'Wo', 'To', 'Fr', 'Sn'], - 'weekdays_min' => ['Sn', 'Mo', 'Ti', 'Wo', 'To', 'Fr', 'Sn'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ga.php b/vendor/nesbot/carbon/src/Carbon/Lang/ga.php deleted file mode 100644 index 013367b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ga.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Thanks to André Silva : https://github.com/askpt - */ - -return [ - 'year' => ':count bliain', - 'a_year' => '{1}bliain|:count bliain', - 'y' => ':countb', - 'month' => ':count mí', - 'a_month' => '{1}mí|:count mí', - 'm' => ':countm', - 'week' => ':count sheachtain', - 'a_week' => '{1}sheachtain|:count sheachtain', - 'w' => ':countsh', - 'day' => ':count lá', - 'a_day' => '{1}lá|:count lá', - 'd' => ':countl', - 'hour' => ':count uair an chloig', - 'a_hour' => '{1}uair an chloig|:count uair an chloig', - 'h' => ':countu', - 'minute' => ':count nóiméad', - 'a_minute' => '{1}nóiméad|:count nóiméad', - 'min' => ':countn', - 'second' => ':count soicind', - 'a_second' => '{1}cúpla soicind|:count soicind', - 's' => ':countso', - 'ago' => ':time ó shin', - 'from_now' => 'i :time', - 'after' => ':time tar éis', - 'before' => ':time roimh', - 'diff_now' => 'anois', - 'diff_today' => 'Inniu', - 'diff_today_regexp' => 'Inniu(?:\\s+ag)?', - 'diff_yesterday' => 'inné', - 'diff_yesterday_regexp' => 'Inné(?:\\s+aig)?', - 'diff_tomorrow' => 'amárach', - 'diff_tomorrow_regexp' => 'Amárach(?:\\s+ag)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Inniu ag] LT', - 'nextDay' => '[Amárach ag] LT', - 'nextWeek' => 'dddd [ag] LT', - 'lastDay' => '[Inné aig] LT', - 'lastWeek' => 'dddd [seo caite] [ag] LT', - 'sameElse' => 'L', - ], - 'months' => ['Eanáir', 'Feabhra', 'Márta', 'Aibreán', 'Bealtaine', 'Méitheamh', 'Iúil', 'Lúnasa', 'Meán Fómhair', 'Deaireadh Fómhair', 'Samhain', 'Nollaig'], - 'months_short' => ['Eaná', 'Feab', 'Márt', 'Aibr', 'Beal', 'Méit', 'Iúil', 'Lúna', 'Meán', 'Deai', 'Samh', 'Noll'], - 'weekdays' => ['Dé Domhnaigh', 'Dé Luain', 'Dé Máirt', 'Dé Céadaoin', 'Déardaoin', 'Dé hAoine', 'Dé Satharn'], - 'weekdays_short' => ['Dom', 'Lua', 'Mái', 'Céa', 'Déa', 'hAo', 'Sat'], - 'weekdays_min' => ['Do', 'Lu', 'Má', 'Ce', 'Dé', 'hA', 'Sa'], - 'ordinal' => static fn ($number) => $number.($number === 1 ? 'd' : ($number % 10 === 2 ? 'na' : 'mh')), - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' agus '], - 'meridiem' => ['r.n.', 'i.n.'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php deleted file mode 100644 index 57b0c4f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ga.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gd.php b/vendor/nesbot/carbon/src/Carbon/Lang/gd.php deleted file mode 100644 index 05437bf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gd.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Jon Ashdown - */ -return [ - 'year' => ':count bliadhna', - 'a_year' => '{1}bliadhna|:count bliadhna', - 'y' => ':count b.', - 'month' => ':count mìosan', - 'a_month' => '{1}mìos|:count mìosan', - 'm' => ':count ms.', - 'week' => ':count seachdainean', - 'a_week' => '{1}seachdain|:count seachdainean', - 'w' => ':count s.', - 'day' => ':count latha', - 'a_day' => '{1}latha|:count latha', - 'd' => ':count l.', - 'hour' => ':count uairean', - 'a_hour' => '{1}uair|:count uairean', - 'h' => ':count u.', - 'minute' => ':count mionaidean', - 'a_minute' => '{1}mionaid|:count mionaidean', - 'min' => ':count md.', - 'second' => ':count diogan', - 'a_second' => '{1}beagan diogan|:count diogan', - 's' => ':count d.', - 'ago' => 'bho chionn :time', - 'from_now' => 'ann an :time', - 'diff_yesterday' => 'An-dè', - 'diff_yesterday_regexp' => 'An-dè(?:\\s+aig)?', - 'diff_today' => 'An-diugh', - 'diff_today_regexp' => 'An-diugh(?:\\s+aig)?', - 'diff_tomorrow' => 'A-màireach', - 'diff_tomorrow_regexp' => 'A-màireach(?:\\s+aig)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[An-diugh aig] LT', - 'nextDay' => '[A-màireach aig] LT', - 'nextWeek' => 'dddd [aig] LT', - 'lastDay' => '[An-dè aig] LT', - 'lastWeek' => 'dddd [seo chaidh] [aig] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - return $number.($number === 1 ? 'd' : ($number % 10 === 2 ? 'na' : 'mh')); - }, - 'months' => ['Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'], - 'months_short' => ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'], - 'weekdays' => ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'], - 'weekdays_short' => ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'], - 'weekdays_min' => ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' agus '], - 'meridiem' => ['m', 'f'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php b/vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php deleted file mode 100644 index 4fc26b3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/gd.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gez.php b/vendor/nesbot/carbon/src/Carbon/Lang/gez.php deleted file mode 100644 index b8a2f0e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gez.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/gez_ER.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php deleted file mode 100644 index f19d1df..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጠሐረ', 'ከተተ', 'መገበ', 'አኀዘ', 'ግንባት', 'ሠንየ', 'ሐመለ', 'ነሐሰ', 'ከረመ', 'ጠቀመ', 'ኀደረ', 'ኀሠሠ'], - 'months_short' => ['ጠሐረ', 'ከተተ', 'መገበ', 'አኀዘ', 'ግንባ', 'ሠንየ', 'ሐመለ', 'ነሐሰ', 'ከረመ', 'ጠቀመ', 'ኀደረ', 'ኀሠሠ'], - 'weekdays' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚት'], - 'weekdays_short' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], - 'weekdays_min' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ጽባሕ', 'ምሴት'], - - 'month' => ':count ወርሕ', // less reliable - 'm' => ':count ወርሕ', // less reliable - 'a_month' => ':count ወርሕ', // less reliable - - 'week' => ':count ሰብዑ', // less reliable - 'w' => ':count ሰብዑ', // less reliable - 'a_week' => ':count ሰብዑ', // less reliable - - 'hour' => ':count አንትሙ', // less reliable - 'h' => ':count አንትሙ', // less reliable - 'a_hour' => ':count አንትሙ', // less reliable - - 'minute' => ':count ንኡስ', // less reliable - 'min' => ':count ንኡስ', // less reliable - 'a_minute' => ':count ንኡስ', // less reliable - - 'year' => ':count ዓመት', - 'y' => ':count ዓመት', - 'a_year' => ':count ዓመት', - - 'day' => ':count ዕለት', - 'd' => ':count ዕለት', - 'a_day' => ':count ዕለት', - - 'second' => ':count ካልእ', - 's' => ':count ካልእ', - 'a_second' => ':count ካልእ', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php deleted file mode 100644 index 8579549..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕረል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክተውበር', 'ኖቬምበር', 'ዲሴምበር'], - 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], - 'weekdays' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚት'], - 'weekdays_short' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], - 'weekdays_min' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ጽባሕ', 'ምሴት'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gl.php b/vendor/nesbot/carbon/src/Carbon/Lang/gl.php deleted file mode 100644 index 96bf145..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gl.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Fidel Pita - * - JD Isaacks - * - Diego Vilariño - * - Sebastian Thierer - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count ano|:count anos', - 'a_year' => 'un ano|:count anos', - 'y' => ':count a.', - 'month' => ':count mes|:count meses', - 'a_month' => 'un mes|:count meses', - 'm' => ':count mes.', - 'week' => ':count semana|:count semanas', - 'a_week' => 'unha semana|:count semanas', - 'w' => ':count sem.', - 'day' => ':count día|:count días', - 'a_day' => 'un día|:count días', - 'd' => ':count d.', - 'hour' => ':count hora|:count horas', - 'a_hour' => 'unha hora|:count horas', - 'h' => ':count h.', - 'minute' => ':count minuto|:count minutos', - 'a_minute' => 'un minuto|:count minutos', - 'min' => ':count min.', - 'second' => ':count segundo|:count segundos', - 'a_second' => 'uns segundos|:count segundos', - 's' => ':count seg.', - 'ago' => 'hai :time', - 'from_now' => static function ($time) { - if (str_starts_with($time, 'un')) { - return "n$time"; - } - - return "en $time"; - }, - 'diff_now' => 'agora', - 'diff_today' => 'hoxe', - 'diff_today_regexp' => 'hoxe(?:\\s+ás)?', - 'diff_yesterday' => 'onte', - 'diff_yesterday_regexp' => 'onte(?:\\s+á)?', - 'diff_tomorrow' => 'mañá', - 'diff_tomorrow_regexp' => 'mañá(?:\\s+ás)?', - 'after' => ':time despois', - 'before' => ':time antes', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D [de] MMMM [de] YYYY', - 'LLL' => 'D [de] MMMM [de] YYYY H:mm', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => static function (CarbonInterface $current) { - return '[hoxe '.($current->hour !== 1 ? 'ás' : 'á').'] LT'; - }, - 'nextDay' => static function (CarbonInterface $current) { - return '[mañá '.($current->hour !== 1 ? 'ás' : 'á').'] LT'; - }, - 'nextWeek' => static function (CarbonInterface $current) { - return 'dddd ['.($current->hour !== 1 ? 'ás' : 'á').'] LT'; - }, - 'lastDay' => static function (CarbonInterface $current) { - return '[onte '.($current->hour !== 1 ? 'á' : 'a').'] LT'; - }, - 'lastWeek' => static function (CarbonInterface $current) { - return '[o] dddd [pasado '.($current->hour !== 1 ? 'ás' : 'á').'] LT'; - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['xaneiro', 'febreiro', 'marzo', 'abril', 'maio', 'xuño', 'xullo', 'agosto', 'setembro', 'outubro', 'novembro', 'decembro'], - 'months_short' => ['xan.', 'feb.', 'mar.', 'abr.', 'mai.', 'xuñ.', 'xul.', 'ago.', 'set.', 'out.', 'nov.', 'dec.'], - 'weekdays' => ['domingo', 'luns', 'martes', 'mércores', 'xoves', 'venres', 'sábado'], - 'weekdays_short' => ['dom.', 'lun.', 'mar.', 'mér.', 'xov.', 'ven.', 'sáb.'], - 'weekdays_min' => ['do', 'lu', 'ma', 'mé', 'xo', 've', 'sá'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' e '], - 'meridiem' => ['a.m.', 'p.m.'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php deleted file mode 100644 index 9d6c1d9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/gl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gom.php b/vendor/nesbot/carbon/src/Carbon/Lang/gom.php deleted file mode 100644 index 2a0584f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gom.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/gom_Latn.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php deleted file mode 100644 index ef50d96..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return [ - 'year' => ':count voros|:count vorsam', - 'y' => ':countv', - 'month' => ':count mhoino|:count mhoine', - 'm' => ':countmh', - 'week' => ':count satolleacho|:count satolleache', - 'w' => ':countsa|:countsa', - 'day' => ':count dis', - 'd' => ':countd', - 'hour' => ':count hor|:count horam', - 'h' => ':counth', - 'minute' => ':count minute|:count mintam', - 'min' => ':countm', - 'second' => ':count second', - 's' => ':counts', - - 'diff_today' => 'Aiz', - 'diff_yesterday' => 'Kal', - 'diff_tomorrow' => 'Faleam', - 'formats' => [ - 'LT' => 'A h:mm [vazta]', - 'LTS' => 'A h:mm:ss [vazta]', - 'L' => 'DD-MM-YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY A h:mm [vazta]', - 'LLLL' => 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', - 'llll' => 'ddd, D MMM YYYY, A h:mm [vazta]', - ], - - 'calendar' => [ - 'sameDay' => '[Aiz] LT', - 'nextDay' => '[Faleam] LT', - 'nextWeek' => '[Ieta to] dddd[,] LT', - 'lastDay' => '[Kal] LT', - 'lastWeek' => '[Fatlo] dddd[,] LT', - 'sameElse' => 'L', - ], - - 'months' => ['Janer', 'Febrer', 'Mars', 'Abril', 'Mai', 'Jun', 'Julai', 'Agost', 'Setembr', 'Otubr', 'Novembr', 'Dezembr'], - 'months_short' => ['Jan.', 'Feb.', 'Mars', 'Abr.', 'Mai', 'Jun', 'Jul.', 'Ago.', 'Set.', 'Otu.', 'Nov.', 'Dez.'], - 'weekdays' => ['Aitar', 'Somar', 'Mongllar', 'Budvar', 'Brestar', 'Sukrar', 'Son\'var'], - 'weekdays_short' => ['Ait.', 'Som.', 'Mon.', 'Bud.', 'Bre.', 'Suk.', 'Son.'], - 'weekdays_min' => ['Ai', 'Sm', 'Mo', 'Bu', 'Br', 'Su', 'Sn'], - - 'ordinal' => static fn ($number, $period) => $number.($period === 'D' ? 'er' : ''), - - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'rati'; - } - if ($hour < 12) { - return 'sokalli'; - } - if ($hour < 16) { - return 'donparam'; - } - if ($hour < 20) { - return 'sanje'; - } - - return 'rati'; - }, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' ani '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gsw.php b/vendor/nesbot/carbon/src/Carbon/Lang/gsw.php deleted file mode 100644 index c5c850e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gsw.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Christopher Dell - * - Akira Matsuda - * - Enrique Vidal - * - Simone Carletti - * - Henning Kiel - * - Aaron Patterson - * - Florian Hanke - */ -return [ - 'year' => ':count Johr', - 'month' => ':count Monet', - 'week' => ':count Woche', - 'day' => ':count Tag', - 'hour' => ':count Schtund', - 'minute' => ':count Minute', - 'second' => ':count Sekunde', - 'weekdays' => ['Sunntig', 'Mäntig', 'Ziischtig', 'Mittwuch', 'Dunschtig', 'Friitig', 'Samschtig'], - 'weekdays_short' => ['Su', 'Mä', 'Zi', 'Mi', 'Du', 'Fr', 'Sa'], - 'weekdays_min' => ['Su', 'Mä', 'Zi', 'Mi', 'Du', 'Fr', 'Sa'], - 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Auguscht', 'September', 'Oktober', 'November', 'Dezember'], - 'months_short' => ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], - 'meridiem' => ['am Vormittag', 'am Namittag'], - 'ordinal' => ':number.', - 'list' => [', ', ' und '], - 'diff_now' => 'now', - 'diff_yesterday' => 'geschter', - 'diff_tomorrow' => 'moorn', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'Do MMMM YYYY', - 'LLL' => 'Do MMMM, HH:mm [Uhr]', - 'LLLL' => 'dddd, Do MMMM YYYY, HH:mm [Uhr]', - ], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php deleted file mode 100644 index 594eb25..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/gsw.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php deleted file mode 100644 index 3581dcf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/gsw.php', [ - 'meridiem' => ['vorm.', 'nam.'], - 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Auguscht', 'Septämber', 'Oktoober', 'Novämber', 'Dezämber'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LLL' => 'Do MMMM YYYY HH:mm', - 'LLLL' => 'dddd, Do MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php b/vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php deleted file mode 100644 index 3581dcf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/gsw.php', [ - 'meridiem' => ['vorm.', 'nam.'], - 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Auguscht', 'Septämber', 'Oktoober', 'Novämber', 'Dezämber'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LLL' => 'Do MMMM YYYY HH:mm', - 'LLLL' => 'dddd, Do MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gu.php b/vendor/nesbot/carbon/src/Carbon/Lang/gu.php deleted file mode 100644 index 16455ed..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gu.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Kaushik Thanki - * - Josh Soref - */ -return [ - 'year' => 'એક વર્ષ|:count વર્ષ', - 'y' => ':countવર્ષ|:countવર્ષો', - 'month' => 'એક મહિનો|:count મહિના', - 'm' => ':countમહિનો|:countમહિના', - 'week' => ':count અઠવાડિયું|:count અઠવાડિયા', - 'w' => ':countઅઠ.|:countઅઠ.', - 'day' => 'એક દિવસ|:count દિવસ', - 'd' => ':countદિ.|:countદિ.', - 'hour' => 'એક કલાક|:count કલાક', - 'h' => ':countક.|:countક.', - 'minute' => 'એક મિનિટ|:count મિનિટ', - 'min' => ':countમિ.|:countમિ.', - 'second' => 'અમુક પળો|:count સેકંડ', - 's' => ':countસે.|:countસે.', - 'ago' => ':time પેહલા', - 'from_now' => ':time મા', - 'after' => ':time પછી', - 'before' => ':time પહેલા', - 'diff_now' => 'હમણાં', - 'diff_today' => 'આજ', - 'diff_yesterday' => 'ગઇકાલે', - 'diff_tomorrow' => 'કાલે', - 'formats' => [ - 'LT' => 'A h:mm વાગ્યે', - 'LTS' => 'A h:mm:ss વાગ્યે', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm વાગ્યે', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm વાગ્યે', - ], - 'calendar' => [ - 'sameDay' => '[આજ] LT', - 'nextDay' => '[કાલે] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[ગઇકાલે] LT', - 'lastWeek' => '[પાછલા] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'રાત'; - } - if ($hour < 10) { - return 'સવાર'; - } - if ($hour < 17) { - return 'બપોર'; - } - if ($hour < 20) { - return 'સાંજ'; - } - - return 'રાત'; - }, - 'months' => ['જાન્યુઆરી', 'ફેબ્રુઆરી', 'માર્ચ', 'એપ્રિલ', 'મે', 'જૂન', 'જુલાઈ', 'ઑગસ્ટ', 'સપ્ટેમ્બર', 'ઑક્ટ્બર', 'નવેમ્બર', 'ડિસેમ્બર'], - 'months_short' => ['જાન્યુ.', 'ફેબ્રુ.', 'માર્ચ', 'એપ્રિ.', 'મે', 'જૂન', 'જુલા.', 'ઑગ.', 'સપ્ટે.', 'ઑક્ટ્.', 'નવે.', 'ડિસે.'], - 'weekdays' => ['રવિવાર', 'સોમવાર', 'મંગળવાર', 'બુધ્વાર', 'ગુરુવાર', 'શુક્રવાર', 'શનિવાર'], - 'weekdays_short' => ['રવિ', 'સોમ', 'મંગળ', 'બુધ્', 'ગુરુ', 'શુક્ર', 'શનિ'], - 'weekdays_min' => ['ર', 'સો', 'મં', 'બુ', 'ગુ', 'શુ', 'શ'], - 'list' => [', ', ' અને '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekend' => [0, 0], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php deleted file mode 100644 index 02654b1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/gu.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/guz.php b/vendor/nesbot/carbon/src/Carbon/Lang/guz.php deleted file mode 100644 index d39e9ca..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/guz.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['Ma', 'Mo'], - 'weekdays' => ['Chumapiri', 'Chumatato', 'Chumaine', 'Chumatano', 'Aramisi', 'Ichuma', 'Esabato'], - 'weekdays_short' => ['Cpr', 'Ctt', 'Cmn', 'Cmt', 'Ars', 'Icm', 'Est'], - 'weekdays_min' => ['Cpr', 'Ctt', 'Cmn', 'Cmt', 'Ars', 'Icm', 'Est'], - 'months' => ['Chanuari', 'Feburari', 'Machi', 'Apiriri', 'Mei', 'Juni', 'Chulai', 'Agosti', 'Septemba', 'Okitoba', 'Nobemba', 'Disemba'], - 'months_short' => ['Can', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Cul', 'Agt', 'Sep', 'Okt', 'Nob', 'Dis'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'month' => ':count omotunyi', // less reliable - 'm' => ':count omotunyi', // less reliable - 'a_month' => ':count omotunyi', // less reliable - - 'week' => ':count isano naibere', // less reliable - 'w' => ':count isano naibere', // less reliable - 'a_week' => ':count isano naibere', // less reliable - - 'second' => ':count ibere', // less reliable - 's' => ':count ibere', // less reliable - 'a_second' => ':count ibere', // less reliable - - 'year' => ':count omwaka', - 'y' => ':count omwaka', - 'a_year' => ':count omwaka', - - 'day' => ':count rituko', - 'd' => ':count rituko', - 'a_day' => ':count rituko', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gv.php b/vendor/nesbot/carbon/src/Carbon/Lang/gv.php deleted file mode 100644 index 7c52b94..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gv.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/gv_GB.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php b/vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php deleted file mode 100644 index 6b1168f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Alastair McKinstry bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Jerrey-geuree', 'Toshiaght-arree', 'Mayrnt', 'Averil', 'Boaldyn', 'Mean-souree', 'Jerrey-souree', 'Luanistyn', 'Mean-fouyir', 'Jerrey-fouyir', 'Mee Houney', 'Mee ny Nollick'], - 'months_short' => ['J-guer', 'T-arree', 'Mayrnt', 'Avrril', 'Boaldyn', 'M-souree', 'J-souree', 'Luanistyn', 'M-fouyir', 'J-fouyir', 'M.Houney', 'M.Nollick'], - 'weekdays' => ['Jedoonee', 'Jelhein', 'Jemayrt', 'Jercean', 'Jerdein', 'Jeheiney', 'Jesarn'], - 'weekdays_short' => ['Jed', 'Jel', 'Jem', 'Jerc', 'Jerd', 'Jeh', 'Jes'], - 'weekdays_min' => ['Jed', 'Jel', 'Jem', 'Jerc', 'Jerd', 'Jeh', 'Jes'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count blein', - 'y' => ':count blein', - 'a_year' => ':count blein', - - 'month' => ':count mee', - 'm' => ':count mee', - 'a_month' => ':count mee', - - 'week' => ':count shiaghtin', - 'w' => ':count shiaghtin', - 'a_week' => ':count shiaghtin', - - 'day' => ':count laa', - 'd' => ':count laa', - 'a_day' => ':count laa', - - 'hour' => ':count oor', - 'h' => ':count oor', - 'a_hour' => ':count oor', - - 'minute' => ':count feer veg', - 'min' => ':count feer veg', - 'a_minute' => ':count feer veg', - - 'second' => ':count derrey', - 's' => ':count derrey', - 'a_second' => ':count derrey', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ha.php b/vendor/nesbot/carbon/src/Carbon/Lang/ha.php deleted file mode 100644 index cd8e34d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ha.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM, YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM, YYYY HH:mm', - ], - 'months' => ['Janairu', 'Faburairu', 'Maris', 'Afirilu', 'Mayu', 'Yuni', 'Yuli', 'Agusta', 'Satumba', 'Oktoba', 'Nuwamba', 'Disamba'], - 'months_short' => ['Jan', 'Fab', 'Mar', 'Afi', 'May', 'Yun', 'Yul', 'Agu', 'Sat', 'Okt', 'Nuw', 'Dis'], - 'weekdays' => ['Lahadi', 'Litini', 'Talata', 'Laraba', 'Alhamis', 'Jumaʼa', 'Asabar'], - 'weekdays_short' => ['Lah', 'Lit', 'Tal', 'Lar', 'Alh', 'Jum', 'Asa'], - 'weekdays_min' => ['Lh', 'Li', 'Ta', 'Lr', 'Al', 'Ju', 'As'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => 'shekara :count', - 'y' => 'shekara :count', - 'a_year' => 'shekara :count', - - 'month' => ':count wátàa', - 'm' => ':count wátàa', - 'a_month' => ':count wátàa', - - 'week' => ':count mako', - 'w' => ':count mako', - 'a_week' => ':count mako', - - 'day' => ':count rana', - 'd' => ':count rana', - 'a_day' => ':count rana', - - 'hour' => ':count áwàa', - 'h' => ':count áwàa', - 'a_hour' => ':count áwàa', - - 'minute' => 'minti :count', - 'min' => 'minti :count', - 'a_minute' => 'minti :count', - - 'second' => ':count ná bíyú', - 's' => ':count ná bíyú', - 'a_second' => ':count ná bíyú', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php b/vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php deleted file mode 100644 index f9f99a7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ha.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php deleted file mode 100644 index f9f99a7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ha.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php deleted file mode 100644 index f9f99a7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ha.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hak.php b/vendor/nesbot/carbon/src/Carbon/Lang/hak.php deleted file mode 100644 index 6c3260e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hak.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/hak_TW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php deleted file mode 100644 index 2a3bc96..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY年MM月DD日', - ], - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => [' 1月', ' 2月', ' 3月', ' 4月', ' 5月', ' 6月', ' 7月', ' 8月', ' 9月', '10月', '11月', '12月'], - 'weekdays' => ['禮拜日', '禮拜一', '禮拜二', '禮拜三', '禮拜四', '禮拜五', '禮拜六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['上晝', '下晝'], - - 'year' => ':count ngien11', - 'y' => ':count ngien11', - 'a_year' => ':count ngien11', - - 'month' => ':count ngie̍t', - 'm' => ':count ngie̍t', - 'a_month' => ':count ngie̍t', - - 'week' => ':count lî-pai', - 'w' => ':count lî-pai', - 'a_week' => ':count lî-pai', - - 'day' => ':count ngit', - 'd' => ':count ngit', - 'a_day' => ':count ngit', - - 'hour' => ':count sṳ̀', - 'h' => ':count sṳ̀', - 'a_hour' => ':count sṳ̀', - - 'minute' => ':count fûn', - 'min' => ':count fûn', - 'a_minute' => ':count fûn', - - 'second' => ':count miéu', - 's' => ':count miéu', - 'a_second' => ':count miéu', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/haw.php b/vendor/nesbot/carbon/src/Carbon/Lang/haw.php deleted file mode 100644 index e46993a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/haw.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'months' => ['Ianuali', 'Pepeluali', 'Malaki', 'ʻApelila', 'Mei', 'Iune', 'Iulai', 'ʻAukake', 'Kepakemapa', 'ʻOkakopa', 'Nowemapa', 'Kekemapa'], - 'months_short' => ['Ian.', 'Pep.', 'Mal.', 'ʻAp.', 'Mei', 'Iun.', 'Iul.', 'ʻAu.', 'Kep.', 'ʻOk.', 'Now.', 'Kek.'], - 'weekdays' => ['Lāpule', 'Poʻakahi', 'Poʻalua', 'Poʻakolu', 'Poʻahā', 'Poʻalima', 'Poʻaono'], - 'weekdays_short' => ['LP', 'P1', 'P2', 'P3', 'P4', 'P5', 'P6'], - 'weekdays_min' => ['S', 'M', 'T', 'W', 'T', 'F', 'S'], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY h:mm a', - ], - - 'year' => ':count makahiki', - 'y' => ':count makahiki', - 'a_year' => ':count makahiki', - - 'month' => ':count mahina', - 'm' => ':count mahina', - 'a_month' => ':count mahina', - - 'week' => ':count pule', - 'w' => ':count pule', - 'a_week' => ':count pule', - - 'day' => ':count lā', - 'd' => ':count lā', - 'a_day' => ':count lā', - - 'hour' => ':count hola', - 'h' => ':count hola', - 'a_hour' => ':count hola', - - 'minute' => ':count minuke', - 'min' => ':count minuke', - 'a_minute' => ':count minuke', - - 'second' => ':count lua', - 's' => ':count lua', - 'a_second' => ':count lua', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/he.php b/vendor/nesbot/carbon/src/Carbon/Lang/he.php deleted file mode 100644 index 6d8f01e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/he.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Daniel Cohen Gindi - * - JD Isaacks - * - Itai Nathaniel - * - GabMic - * - Yaakov Dahan (yakidahan) - */ -return [ - 'year' => 'שנה|{2}שנתיים|:count שנים', - 'y' => 'שנה|:count שנ׳', - 'month' => 'חודש|{2}חודשיים|:count חודשים', - 'm' => 'חודש|:count חו׳', - 'week' => 'שבוע|{2}שבועיים|:count שבועות', - 'w' => 'שבוע|:count שב׳', - 'day' => 'יום|{2}יומיים|:count ימים', - 'd' => 'יום|:count ימ׳', - 'hour' => 'שעה|{2}שעתיים|:count שעות', - 'h' => 'שעה|:count שע׳', - 'minute' => 'דקה|{2}שתי דקות|:count דקות', - 'min' => 'דקה|:count דק׳', - 'second' => 'שנייה|:count שניות', - 'a_second' => 'כמה שניות|:count שניות', - 's' => 'שניה|:count שנ׳', - 'ago' => 'לפני :time', - 'from_now' => 'בעוד :time מעכשיו', - 'after' => 'אחרי :time', - 'before' => 'לפני :time', - 'diff_now' => 'עכשיו', - 'diff_today' => 'היום', - 'diff_today_regexp' => 'היום(?:\\s+ב־)?', - 'diff_yesterday' => 'אתמול', - 'diff_yesterday_regexp' => 'אתמול(?:\\s+ב־)?', - 'diff_tomorrow' => 'מחר', - 'diff_tomorrow_regexp' => 'מחר(?:\\s+ב־)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D [ב]MMMM YYYY', - 'LLL' => 'D [ב]MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D [ב]MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[היום ב־]LT', - 'nextDay' => '[מחר ב־]LT', - 'nextWeek' => 'dddd [בשעה] LT', - 'lastDay' => '[אתמול ב־]LT', - 'lastWeek' => '[ביום] dddd [האחרון בשעה] LT', - 'sameElse' => 'L', - ], - 'meridiem' => static function ($hour, $minute, $isLower) { - if ($hour < 5) { - return 'לפנות בוקר'; - } - if ($hour < 10) { - return 'בבוקר'; - } - if ($hour < 12) { - return $isLower ? 'לפנה"צ' : 'לפני הצהריים'; - } - if ($hour < 18) { - return $isLower ? 'אחה"צ' : 'אחרי הצהריים'; - } - - return 'בערב'; - }, - 'months' => ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'], - 'months_short' => ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'], - 'weekdays' => ['ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת'], - 'weekdays_short' => ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'], - 'weekdays_min' => ['א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ש'], - 'list' => [', ', ' ו -'], - 'weekend' => [5, 6], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php b/vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php deleted file mode 100644 index 14fab3e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/he.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hi.php b/vendor/nesbot/carbon/src/Carbon/Lang/hi.php deleted file mode 100644 index 1fc1801..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hi.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - abhimanyu003 - * - Josh Soref - * - JD Isaacks - */ -return [ - 'year' => 'एक वर्ष|:count वर्ष', - 'y' => '1 वर्ष|:count वर्षों', - 'month' => 'एक महीने|:count महीने', - 'm' => '1 माह|:count महीने', - 'week' => '1 सप्ताह|:count सप्ताह', - 'w' => '1 सप्ताह|:count सप्ताह', - 'day' => 'एक दिन|:count दिन', - 'd' => '1 दिन|:count दिनों', - 'hour' => 'एक घंटा|:count घंटे', - 'h' => '1 घंटा|:count घंटे', - 'minute' => 'एक मिनट|:count मिनट', - 'min' => '1 मिनट|:count मिनटों', - 'second' => 'कुछ ही क्षण|:count सेकंड', - 's' => '1 सेकंड|:count सेकंड', - 'ago' => ':time पहले', - 'from_now' => ':time में', - 'after' => ':time के बाद', - 'before' => ':time के पहले', - 'diff_now' => 'अब', - 'diff_today' => 'आज', - 'diff_yesterday' => 'कल', - 'diff_tomorrow' => 'कल', - 'formats' => [ - 'LT' => 'A h:mm बजे', - 'LTS' => 'A h:mm:ss बजे', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm बजे', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm बजे', - ], - 'calendar' => [ - 'sameDay' => '[आज] LT', - 'nextDay' => '[कल] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[कल] LT', - 'lastWeek' => '[पिछले] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'रात'; - } - if ($hour < 10) { - return 'सुबह'; - } - if ($hour < 17) { - return 'दोपहर'; - } - if ($hour < 20) { - return 'शाम'; - } - - return 'रात'; - }, - 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जन.', 'फ़र.', 'मार्च', 'अप्रै.', 'मई', 'जून', 'जुल.', 'अग.', 'सित.', 'अक्टू.', 'नव.', 'दिस.'], - 'weekdays' => ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरूवार', 'शुक्रवार', 'शनिवार'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरू', 'शुक्र', 'शनि'], - 'weekdays_min' => ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'], - 'list' => [', ', ' और '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekend' => [0, 0], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php deleted file mode 100644 index 749dd97..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/hi.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hif.php b/vendor/nesbot/carbon/src/Carbon/Lang/hif.php deleted file mode 100644 index 65791dd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hif.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/hif_FJ.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php deleted file mode 100644 index 54e880e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'formats' => [ - 'L' => 'dddd DD MMM YYYY', - ], - 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - 'weekdays' => ['Ravivar', 'Somvar', 'Mangalvar', 'Budhvar', 'Guruvar', 'Shukravar', 'Shanivar'], - 'weekdays_short' => ['Ravi', 'Som', 'Mangal', 'Budh', 'Guru', 'Shukra', 'Shani'], - 'weekdays_min' => ['Ravi', 'Som', 'Mangal', 'Budh', 'Guru', 'Shukra', 'Shani'], - 'meridiem' => ['Purvahan', 'Aparaahna'], - - 'hour' => ':count minit', // less reliable - 'h' => ':count minit', // less reliable - 'a_hour' => ':count minit', // less reliable - - 'year' => ':count saal', - 'y' => ':count saal', - 'a_year' => ':count saal', - - 'month' => ':count Mahina', - 'm' => ':count Mahina', - 'a_month' => ':count Mahina', - - 'week' => ':count Hafta', - 'w' => ':count Hafta', - 'a_week' => ':count Hafta', - - 'day' => ':count Din', - 'd' => ':count Din', - 'a_day' => ':count Din', - - 'minute' => ':count Minit', - 'min' => ':count Minit', - 'a_minute' => ':count Minit', - - 'second' => ':count Second', - 's' => ':count Second', - 'a_second' => ':count Second', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hne.php b/vendor/nesbot/carbon/src/Carbon/Lang/hne.php deleted file mode 100644 index 4bcb05c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hne.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/hne_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php deleted file mode 100644 index 27b3b39..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अपरेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितमबर', 'अकटूबर', 'नवमबर', 'दिसमबर'], - 'months_short' => ['जन', 'फर', 'मार्च', 'अप', 'मई', 'जून', 'जुला', 'अग', 'सित', 'अकटू', 'नव', 'दिस'], - 'weekdays' => ['इतवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'बिरसपत', 'सुकरवार', 'सनिवार'], - 'weekdays_short' => ['इत', 'सोम', 'मंग', 'बुध', 'बिर', 'सुक', 'सनि'], - 'weekdays_min' => ['इत', 'सोम', 'मंग', 'बुध', 'बिर', 'सुक', 'सनि'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['बिहिनियाँ', 'मंझनियाँ'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hr.php b/vendor/nesbot/carbon/src/Carbon/Lang/hr.php deleted file mode 100644 index dcf7756..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hr.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Tim Fish - * - shaishavgandhi05 - * - Serhan Apaydın - * - JD Isaacks - * - tomhorvat - * - Josh Soref - * - François B - * - shaishavgandhi05 - * - Serhan Apaydın - * - JD Isaacks - * - tomhorvat - * - Stjepan Majdak - * - Vanja Retkovac (vr00) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count godinu|:count godine|:count godina', - 'y' => ':count god.|:count god.|:count god.', - 'month' => ':count mjesec|:count mjeseca|:count mjeseci', - 'm' => ':count mj.|:count mj.|:count mj.', - 'week' => ':count tjedan|:count tjedna|:count tjedana', - 'w' => ':count tj.|:count tj.|:count tj.', - 'day' => ':count dan|:count dana|:count dana', - 'd' => ':count d.|:count d.|:count d.', - 'hour' => ':count sat|:count sata|:count sati', - 'h' => ':count sat|:count sata|:count sati', - 'minute' => ':count minutu|:count minute|:count minuta', - 'min' => ':count min.|:count min.|:count min.', - 'second' => ':count sekundu|:count sekunde|:count sekundi', - 'a_second' => 'nekoliko sekundi|:count sekunde|:count sekundi', - 's' => ':count sek.|:count sek.|:count sek.', - 'ago' => 'prije :time', - 'from_now' => 'za :time', - 'after' => ':time poslije', - 'before' => ':time prije', - 'diff_now' => 'sad', - 'diff_today' => 'danas', - 'diff_today_regexp' => 'danas(?:\\s+u)?', - 'diff_yesterday' => 'jučer', - 'diff_yesterday_regexp' => 'jučer(?:\\s+u)?', - 'diff_tomorrow' => 'sutra', - 'diff_tomorrow_regexp' => 'sutra(?:\\s+u)?', - 'diff_before_yesterday' => 'prekjučer', - 'diff_after_tomorrow' => 'prekosutra', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'D. M. YYYY.', - 'LL' => 'D. MMMM YYYY.', - 'LLL' => 'D. MMMM YYYY. H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY. H:mm', - ], - 'calendar' => [ - 'sameDay' => '[danas u] LT', - 'nextDay' => '[sutra u] LT', - 'nextWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[u] [nedjelju] [u] LT', - 3 => '[u] [srijedu] [u] LT', - 6 => '[u] [subotu] [u] LT', - default => '[u] dddd [u] LT', - }, - 'lastDay' => '[jučer u] LT', - 'lastWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0, 3 => '[prošlu] dddd [u] LT', - 6 => '[prošle] [subote] [u] LT', - default => '[prošli] dddd [u] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['siječnja', 'veljače', 'ožujka', 'travnja', 'svibnja', 'lipnja', 'srpnja', 'kolovoza', 'rujna', 'listopada', 'studenoga', 'prosinca'], - 'months_standalone' => ['siječanj', 'veljača', 'ožujak', 'travanj', 'svibanj', 'lipanj', 'srpanj', 'kolovoz', 'rujan', 'listopad', 'studeni', 'prosinac'], - 'months_short' => ['sij.', 'velj.', 'ožu.', 'tra.', 'svi.', 'lip.', 'srp.', 'kol.', 'ruj.', 'lis.', 'stu.', 'pro.'], - 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['nedjelju', 'ponedjeljak', 'utorak', 'srijedu', 'četvrtak', 'petak', 'subotu'], - 'weekdays_standalone' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sri.', 'čet.', 'pet.', 'sub.'], - 'weekdays_min' => ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' i '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php b/vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php deleted file mode 100644 index 7763a45..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - DarkoDevelop - */ -return array_replace_recursive(require __DIR__.'/hr.php', [ - 'weekdays' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'], - 'weekdays_min' => ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'], - 'months' => ['siječnja', 'veljače', 'ožujka', 'travnja', 'svibnja', 'lipnja', 'srpnja', 'kolovoza', 'rujna', 'listopada', 'studenoga', 'prosinca'], - 'months_short' => ['sij', 'velj', 'ožu', 'tra', 'svi', 'lip', 'srp', 'kol', 'ruj', 'lis', 'stu', 'pro'], - 'months_standalone' => ['siječanj', 'veljača', 'ožujak', 'travanj', 'svibanj', 'lipanj', 'srpanj', 'kolovoz', 'rujan', 'listopad', 'studeni', 'prosinac'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D. M. yy.', - 'LL' => 'D. MMM YYYY.', - 'LLL' => 'D. MMMM YYYY. HH:mm', - 'LLLL' => 'dddd, D. MMMM YYYY. HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php b/vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php deleted file mode 100644 index db74d8c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/hr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hsb.php b/vendor/nesbot/carbon/src/Carbon/Lang/hsb.php deleted file mode 100644 index 3537b8b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hsb.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/hsb_DE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php deleted file mode 100644 index 6ba2271..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Information from Michael Wolf Andrzej Krzysztofowicz ankry@mif.pg.gda.pl - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'DD. MMMM YYYY', - 'LLL' => 'DD. MMMM, HH:mm [hodź.]', - 'LLLL' => 'dddd, DD. MMMM YYYY, HH:mm [hodź.]', - ], - 'months' => ['januara', 'februara', 'měrca', 'apryla', 'meje', 'junija', 'julija', 'awgusta', 'septembra', 'oktobra', 'nowembra', 'decembra'], - 'months_short' => ['Jan', 'Feb', 'Měr', 'Apr', 'Mej', 'Jun', 'Jul', 'Awg', 'Sep', 'Okt', 'Now', 'Dec'], - 'weekdays' => ['Njedźela', 'Póndźela', 'Wutora', 'Srjeda', 'Štvórtk', 'Pjatk', 'Sobota'], - 'weekdays_short' => ['Nj', 'Pó', 'Wu', 'Sr', 'Št', 'Pj', 'So'], - 'weekdays_min' => ['Nj', 'Pó', 'Wu', 'Sr', 'Št', 'Pj', 'So'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count lěto', - 'y' => ':count lěto', - 'a_year' => ':count lěto', - - 'month' => ':count měsac', - 'm' => ':count měsac', - 'a_month' => ':count měsac', - - 'week' => ':count tydźeń', - 'w' => ':count tydźeń', - 'a_week' => ':count tydźeń', - - 'day' => ':count dźeń', - 'd' => ':count dźeń', - 'a_day' => ':count dźeń', - - 'hour' => ':count hodźina', - 'h' => ':count hodźina', - 'a_hour' => ':count hodźina', - - 'minute' => ':count chwila', - 'min' => ':count chwila', - 'a_minute' => ':count chwila', - - 'second' => ':count druhi', - 's' => ':count druhi', - 'a_second' => ':count druhi', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ht.php b/vendor/nesbot/carbon/src/Carbon/Lang/ht.php deleted file mode 100644 index ebd12ad..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ht.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ht_HT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php b/vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php deleted file mode 100644 index 139b813..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sugar Labs // OLPC sugarlabs.org libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['janvye', 'fevriye', 'mas', 'avril', 'me', 'jen', 'jiyè', 'out', 'septanm', 'oktòb', 'novanm', 'desanm'], - 'months_short' => ['jan', 'fev', 'mas', 'avr', 'me', 'jen', 'jiy', 'out', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['dimanch', 'lendi', 'madi', 'mèkredi', 'jedi', 'vandredi', 'samdi'], - 'weekdays_short' => ['dim', 'len', 'mad', 'mèk', 'jed', 'van', 'sam'], - 'weekdays_min' => ['dim', 'len', 'mad', 'mèk', 'jed', 'van', 'sam'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count lane', - 'y' => ':count lane', - 'a_year' => ':count lane', - - 'month' => 'mwa :count', - 'm' => 'mwa :count', - 'a_month' => 'mwa :count', - - 'week' => 'semèn :count', - 'w' => 'semèn :count', - 'a_week' => 'semèn :count', - - 'day' => ':count jou', - 'd' => ':count jou', - 'a_day' => ':count jou', - - 'hour' => ':count lè', - 'h' => ':count lè', - 'a_hour' => ':count lè', - - 'minute' => ':count minit', - 'min' => ':count minit', - 'a_minute' => ':count minit', - - 'second' => ':count segonn', - 's' => ':count segonn', - 'a_second' => ':count segonn', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hu.php b/vendor/nesbot/carbon/src/Carbon/Lang/hu.php deleted file mode 100644 index 635a30c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hu.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Adam Brunner - * - Brett Johnson - * - balping - */ - -use Carbon\CarbonInterface; - -$huWeekEndings = ['vasárnap', 'hétfőn', 'kedden', 'szerdán', 'csütörtökön', 'pénteken', 'szombaton']; - -return [ - 'year' => ':count év', - 'y' => ':count év', - 'month' => ':count hónap', - 'm' => ':count hónap', - 'week' => ':count hét', - 'w' => ':count hét', - 'day' => ':count nap', - 'd' => ':count nap', - 'hour' => ':count óra', - 'h' => ':count óra', - 'minute' => ':count perc', - 'min' => ':count perc', - 'second' => ':count másodperc', - 's' => ':count másodperc', - 'ago' => ':time', - 'from_now' => ':time múlva', - 'after' => ':time később', - 'before' => ':time korábban', - 'year_ago' => ':count éve', - 'y_ago' => ':count éve', - 'month_ago' => ':count hónapja', - 'm_ago' => ':count hónapja', - 'week_ago' => ':count hete', - 'w_ago' => ':count hete', - 'day_ago' => ':count napja', - 'd_ago' => ':count napja', - 'hour_ago' => ':count órája', - 'h_ago' => ':count órája', - 'minute_ago' => ':count perce', - 'min_ago' => ':count perce', - 'second_ago' => ':count másodperce', - 's_ago' => ':count másodperce', - 'year_after' => ':count évvel', - 'y_after' => ':count évvel', - 'month_after' => ':count hónappal', - 'm_after' => ':count hónappal', - 'week_after' => ':count héttel', - 'w_after' => ':count héttel', - 'day_after' => ':count nappal', - 'd_after' => ':count nappal', - 'hour_after' => ':count órával', - 'h_after' => ':count órával', - 'minute_after' => ':count perccel', - 'min_after' => ':count perccel', - 'second_after' => ':count másodperccel', - 's_after' => ':count másodperccel', - 'year_before' => ':count évvel', - 'y_before' => ':count évvel', - 'month_before' => ':count hónappal', - 'm_before' => ':count hónappal', - 'week_before' => ':count héttel', - 'w_before' => ':count héttel', - 'day_before' => ':count nappal', - 'd_before' => ':count nappal', - 'hour_before' => ':count órával', - 'h_before' => ':count órával', - 'minute_before' => ':count perccel', - 'min_before' => ':count perccel', - 'second_before' => ':count másodperccel', - 's_before' => ':count másodperccel', - 'months' => ['január', 'február', 'március', 'április', 'május', 'június', 'július', 'augusztus', 'szeptember', 'október', 'november', 'december'], - 'months_short' => ['jan.', 'febr.', 'márc.', 'ápr.', 'máj.', 'jún.', 'júl.', 'aug.', 'szept.', 'okt.', 'nov.', 'dec.'], - 'weekdays' => ['vasárnap', 'hétfő', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat'], - 'weekdays_short' => ['vas', 'hét', 'kedd', 'sze', 'csüt', 'pén', 'szo'], - 'weekdays_min' => ['v', 'h', 'k', 'sze', 'cs', 'p', 'sz'], - 'ordinal' => ':number.', - 'diff_now' => 'most', - 'diff_today' => 'ma', - 'diff_yesterday' => 'tegnap', - 'diff_tomorrow' => 'holnap', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'YYYY.MM.DD.', - 'LL' => 'YYYY. MMMM D.', - 'LLL' => 'YYYY. MMMM D. H:mm', - 'LLLL' => 'YYYY. MMMM D., dddd H:mm', - ], - 'calendar' => [ - 'sameDay' => '[ma] LT[-kor]', - 'nextDay' => '[holnap] LT[-kor]', - 'nextWeek' => static function (CarbonInterface $date) use ($huWeekEndings) { - return '['.$huWeekEndings[$date->dayOfWeek].'] LT[-kor]'; - }, - 'lastDay' => '[tegnap] LT[-kor]', - 'lastWeek' => static function (CarbonInterface $date) use ($huWeekEndings) { - return '[múlt '.$huWeekEndings[$date->dayOfWeek].'] LT[-kor]'; - }, - 'sameElse' => 'L', - ], - 'meridiem' => ['DE', 'DU'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' és '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php b/vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php deleted file mode 100644 index b1c4854..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/hu.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hy.php b/vendor/nesbot/carbon/src/Carbon/Lang/hy.php deleted file mode 100644 index 8145ba3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hy.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - mhamlet - */ -return [ - 'year' => ':count տարի', - 'a_year' => 'տարի|:count տարի', - 'y' => ':countտ', - 'month' => ':count ամիս', - 'a_month' => 'ամիս|:count ամիս', - 'm' => ':countամ', - 'week' => ':count շաբաթ', - 'a_week' => 'շաբաթ|:count շաբաթ', - 'w' => ':countշ', - 'day' => ':count օր', - 'a_day' => 'օր|:count օր', - 'd' => ':countօր', - 'hour' => ':count ժամ', - 'a_hour' => 'ժամ|:count ժամ', - 'h' => ':countժ', - 'minute' => ':count րոպե', - 'a_minute' => 'րոպե|:count րոպե', - 'min' => ':countր', - 'second' => ':count վայրկյան', - 'a_second' => 'մի քանի վայրկյան|:count վայրկյան', - 's' => ':countվրկ', - 'ago' => ':time առաջ', - 'from_now' => ':timeից', - 'after' => ':time հետո', - 'before' => ':time առաջ', - 'diff_now' => 'հիմա', - 'diff_today' => 'այսօր', - 'diff_yesterday' => 'երեկ', - 'diff_tomorrow' => 'վաղը', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY թ.', - 'LLL' => 'D MMMM YYYY թ., HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY թ., HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[այսօր] LT', - 'nextDay' => '[վաղը] LT', - 'nextWeek' => 'dddd [օրը ժամը] LT', - 'lastDay' => '[երեկ] LT', - 'lastWeek' => '[անցած] dddd [օրը ժամը] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number, $period) { - return match ($period) { - 'DDD', 'w', 'W', 'DDDo' => $number.($number === 1 ? '-ին' : '-րդ'), - default => $number, - }; - }, - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'գիշերվա'; - } - if ($hour < 12) { - return 'առավոտվա'; - } - if ($hour < 17) { - return 'ցերեկվա'; - } - - return 'երեկոյան'; - }, - 'months' => ['հունվարի', 'փետրվարի', 'մարտի', 'ապրիլի', 'մայիսի', 'հունիսի', 'հուլիսի', 'օգոստոսի', 'սեպտեմբերի', 'հոկտեմբերի', 'նոյեմբերի', 'դեկտեմբերի'], - 'months_standalone' => ['հունվար', 'փետրվար', 'մարտ', 'ապրիլ', 'մայիս', 'հունիս', 'հուլիս', 'օգոստոս', 'սեպտեմբեր', 'հոկտեմբեր', 'նոյեմբեր', 'դեկտեմբեր'], - 'months_short' => ['հնվ', 'փտր', 'մրտ', 'ապր', 'մյս', 'հնս', 'հլս', 'օգս', 'սպտ', 'հկտ', 'նմբ', 'դկտ'], - 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['կիրակի', 'երկուշաբթի', 'երեքշաբթի', 'չորեքշաբթի', 'հինգշաբթի', 'ուրբաթ', 'շաբաթ'], - 'weekdays_short' => ['կրկ', 'երկ', 'երք', 'չրք', 'հնգ', 'ուրբ', 'շբթ'], - 'weekdays_min' => ['կրկ', 'երկ', 'երք', 'չրք', 'հնգ', 'ուրբ', 'շբթ'], - 'list' => [', ', ' եւ '], - 'first_day_of_week' => 1, -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php b/vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php deleted file mode 100644 index 4587df5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Tim Fish - * - Serhan Apaydın - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/hy.php', [ - 'from_now' => ':time հետո', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/i18n.php b/vendor/nesbot/carbon/src/Carbon/Lang/i18n.php deleted file mode 100644 index e65449b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/i18n.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], - 'months' => ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'], - 'months_short' => ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'], - 'weekdays' => ['1', '2', '3', '4', '5', '6', '7'], - 'weekdays_short' => ['1', '2', '3', '4', '5', '6', '7'], - 'weekdays_min' => ['1', '2', '3', '4', '5', '6', '7'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ia.php b/vendor/nesbot/carbon/src/Carbon/Lang/ia.php deleted file mode 100644 index 0a0d5e6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ia.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ia_FR.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php deleted file mode 100644 index de4b2fa..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Fedora Project Nik Kalach nikka@fedoraproject.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['januario', 'februario', 'martio', 'april', 'maio', 'junio', 'julio', 'augusto', 'septembre', 'octobre', 'novembre', 'decembre'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'], - 'weekdays' => ['dominica', 'lunedi', 'martedi', 'mercuridi', 'jovedi', 'venerdi', 'sabbato'], - 'weekdays_short' => ['dom', 'lun', 'mar', 'mer', 'jov', 'ven', 'sab'], - 'weekdays_min' => ['dom', 'lun', 'mar', 'mer', 'jov', 'ven', 'sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => 'anno :count', - 'y' => 'anno :count', - 'a_year' => 'anno :count', - - 'month' => ':count mense', - 'm' => ':count mense', - 'a_month' => ':count mense', - - 'week' => ':count septimana', - 'w' => ':count septimana', - 'a_week' => ':count septimana', - - 'day' => ':count die', - 'd' => ':count die', - 'a_day' => ':count die', - - 'hour' => ':count hora', - 'h' => ':count hora', - 'a_hour' => ':count hora', - - 'minute' => ':count minuscule', - 'min' => ':count minuscule', - 'a_minute' => ':count minuscule', - - 'second' => ':count secunda', - 's' => ':count secunda', - 'a_second' => ':count secunda', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/id.php b/vendor/nesbot/carbon/src/Carbon/Lang/id.php deleted file mode 100644 index b96f996..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/id.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - du - * - JD Isaacks - * - Nafies Luthfi - * - Raymundus Jati Primanda (mundusjp) - * - diankur313 - * - a-wip0 - */ -return [ - 'year' => ':count tahun', - 'a_year' => '{1}setahun|]1,Inf[:count tahun', - 'y' => ':countthn', - 'month' => ':count bulan', - 'a_month' => '{1}sebulan|]1,Inf[:count bulan', - 'm' => ':countbln', - 'week' => ':count minggu', - 'a_week' => '{1}seminggu|]1,Inf[:count minggu', - 'w' => ':countmgg', - 'day' => ':count hari', - 'a_day' => '{1}sehari|]1,Inf[:count hari', - 'd' => ':counthr', - 'hour' => ':count jam', - 'a_hour' => '{1}sejam|]1,Inf[:count jam', - 'h' => ':countj', - 'minute' => ':count menit', - 'a_minute' => '{1}semenit|]1,Inf[:count menit', - 'min' => ':countmnt', - 'second' => ':count detik', - 'a_second' => '{1}beberapa detik|]1,Inf[:count detik', - 's' => ':countdt', - 'ago' => ':time yang lalu', - 'from_now' => ':time dari sekarang', - 'after' => ':time setelahnya', - 'before' => ':time sebelumnya', - 'diff_now' => 'sekarang', - 'diff_today' => 'Hari', - 'diff_today_regexp' => 'Hari(?:\\s+ini)?(?:\\s+pukul)?', - 'diff_yesterday' => 'kemarin', - 'diff_yesterday_regexp' => 'Kemarin(?:\\s+pukul)?', - 'diff_tomorrow' => 'besok', - 'diff_tomorrow_regexp' => 'Besok(?:\\s+pukul)?', - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm.ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY [pukul] HH.mm', - 'LLLL' => 'dddd, D MMMM YYYY [pukul] HH.mm', - ], - 'calendar' => [ - 'sameDay' => '[Hari ini pukul] LT', - 'nextDay' => '[Besok pukul] LT', - 'nextWeek' => 'dddd [pukul] LT', - 'lastDay' => '[Kemarin pukul] LT', - 'lastWeek' => 'dddd [lalu pukul] LT', - 'sameElse' => 'L', - ], - 'meridiem' => static function ($hour) { - if ($hour < 11) { - return 'pagi'; - } - if ($hour < 15) { - return 'siang'; - } - if ($hour < 19) { - return 'sore'; - } - - return 'malam'; - }, - 'months' => ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agt', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'], - 'weekdays_short' => ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'], - 'weekdays_min' => ['Mg', 'Sn', 'Sl', 'Rb', 'Km', 'Jm', 'Sb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' dan '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php b/vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php deleted file mode 100644 index d5953a1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/id.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ig.php b/vendor/nesbot/carbon/src/Carbon/Lang/ig.php deleted file mode 100644 index de51e9c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ig.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ig_NG.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php deleted file mode 100644 index 0034e35..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Jenụwarị', 'Febrụwarị', 'Maachị', 'Eprel', 'Mee', 'Juun', 'Julaị', 'Ọgọọst', 'Septemba', 'Ọktoba', 'Novemba', 'Disemba'], - 'months_short' => ['Jen', 'Feb', 'Maa', 'Epr', 'Mee', 'Juu', 'Jul', 'Ọgọ', 'Sep', 'Ọkt', 'Nov', 'Dis'], - 'weekdays' => ['sọnde', 'mọnde', 'tuzde', 'wenzde', 'tọsde', 'fraịde', 'satọde'], - 'weekdays_short' => ['sọn', 'mọn', 'tuz', 'wen', 'tọs', 'fra', 'sat'], - 'weekdays_min' => ['sọn', 'mọn', 'tuz', 'wen', 'tọs', 'fra', 'sat'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => 'afo :count', - 'y' => 'afo :count', - 'a_year' => 'afo :count', - - 'month' => 'önwa :count', - 'm' => 'önwa :count', - 'a_month' => 'önwa :count', - - 'week' => 'izu :count', - 'w' => 'izu :count', - 'a_week' => 'izu :count', - - 'day' => 'ụbọchị :count', - 'd' => 'ụbọchị :count', - 'a_day' => 'ụbọchị :count', - - 'hour' => 'awa :count', - 'h' => 'awa :count', - 'a_hour' => 'awa :count', - - 'minute' => 'minit :count', - 'min' => 'minit :count', - 'a_minute' => 'minit :count', - - 'second' => 'sekọnd :count', - 's' => 'sekọnd :count', - 'a_second' => 'sekọnd :count', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ii.php b/vendor/nesbot/carbon/src/Carbon/Lang/ii.php deleted file mode 100644 index 592a53f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ii.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['ꎸꄑ', 'ꁯꋒ'], - 'weekdays' => ['ꑭꆏꑍ', 'ꆏꊂꋍ', 'ꆏꊂꑍ', 'ꆏꊂꌕ', 'ꆏꊂꇖ', 'ꆏꊂꉬ', 'ꆏꊂꃘ'], - 'weekdays_short' => ['ꑭꆏ', 'ꆏꋍ', 'ꆏꑍ', 'ꆏꌕ', 'ꆏꇖ', 'ꆏꉬ', 'ꆏꃘ'], - 'weekdays_min' => ['ꑭꆏ', 'ꆏꋍ', 'ꆏꑍ', 'ꆏꌕ', 'ꆏꇖ', 'ꆏꉬ', 'ꆏꃘ'], - 'months' => null, - 'months_short' => ['ꋍꆪ', 'ꑍꆪ', 'ꌕꆪ', 'ꇖꆪ', 'ꉬꆪ', 'ꃘꆪ', 'ꏃꆪ', 'ꉆꆪ', 'ꈬꆪ', 'ꊰꆪ', 'ꊰꊪꆪ', 'ꊰꑋꆪ'], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D h:mm a', - 'LLLL' => 'YYYY MMMM D, dddd h:mm a', - ], - - 'year' => ':count ꒉ', // less reliable - 'y' => ':count ꒉ', // less reliable - 'a_year' => ':count ꒉ', // less reliable - - 'month' => ':count ꆪ', - 'm' => ':count ꆪ', - 'a_month' => ':count ꆪ', - - 'week' => ':count ꏃ', // less reliable - 'w' => ':count ꏃ', // less reliable - 'a_week' => ':count ꏃ', // less reliable - - 'day' => ':count ꏜ', // less reliable - 'd' => ':count ꏜ', // less reliable - 'a_day' => ':count ꏜ', // less reliable - - 'hour' => ':count ꄮꈉ', - 'h' => ':count ꄮꈉ', - 'a_hour' => ':count ꄮꈉ', - - 'minute' => ':count ꀄꊭ', // less reliable - 'min' => ':count ꀄꊭ', // less reliable - 'a_minute' => ':count ꀄꊭ', // less reliable - - 'second' => ':count ꇅ', // less reliable - 's' => ':count ꇅ', // less reliable - 'a_second' => ':count ꇅ', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ik.php b/vendor/nesbot/carbon/src/Carbon/Lang/ik.php deleted file mode 100644 index 7a13aa2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ik.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ik_CA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php deleted file mode 100644 index 02dbbef..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Siqiññaatchiaq', 'Siqiññaasrugruk', 'Paniqsiqsiivik', 'Qilġich Tatqiat', 'Suppivik', 'Iġñivik', 'Itchavik', 'Tiññivik', 'Amiġaiqsivik', 'Sikkuvik', 'Nippivik', 'Siqiñġiḷaq'], - 'months_short' => ['Sñt', 'Sñs', 'Pan', 'Qil', 'Sup', 'Iġñ', 'Itc', 'Tiñ', 'Ami', 'Sik', 'Nip', 'Siq'], - 'weekdays' => ['Minġuiqsioiq', 'Savałłiq', 'Ilaqtchiioiq', 'Qitchiioiq', 'Sisamiioiq', 'Tallimmiioiq', 'Maqinġuoiq'], - 'weekdays_short' => ['Min', 'Sav', 'Ila', 'Qit', 'Sis', 'Tal', 'Maq'], - 'weekdays_min' => ['Min', 'Sav', 'Ila', 'Qit', 'Sis', 'Tal', 'Maq'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count ukiuq', - 'y' => ':count ukiuq', - 'a_year' => ':count ukiuq', - - 'month' => ':count Tatqiat', - 'm' => ':count Tatqiat', - 'a_month' => ':count Tatqiat', - - 'week' => ':count tatqiat', // less reliable - 'w' => ':count tatqiat', // less reliable - 'a_week' => ':count tatqiat', // less reliable - - 'day' => ':count siqiñiq', // less reliable - 'd' => ':count siqiñiq', // less reliable - 'a_day' => ':count siqiñiq', // less reliable - - 'hour' => ':count Siḷa', // less reliable - 'h' => ':count Siḷa', // less reliable - 'a_hour' => ':count Siḷa', // less reliable - - 'second' => ':count iġñiq', // less reliable - 's' => ':count iġñiq', // less reliable - 'a_second' => ':count iġñiq', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/in.php b/vendor/nesbot/carbon/src/Carbon/Lang/in.php deleted file mode 100644 index d5953a1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/in.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/id.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/is.php b/vendor/nesbot/carbon/src/Carbon/Lang/is.php deleted file mode 100644 index 9990168..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/is.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kristján Ingi Geirsson - */ -return [ - 'year' => '1 ár|:count ár', - 'y' => '1 ár|:count ár', - 'month' => '1 mánuður|:count mánuðir', - 'm' => '1 mánuður|:count mánuðir', - 'week' => '1 vika|:count vikur', - 'w' => '1 vika|:count vikur', - 'day' => '1 dagur|:count dagar', - 'd' => '1 dagur|:count dagar', - 'hour' => '1 klukkutími|:count klukkutímar', - 'h' => '1 klukkutími|:count klukkutímar', - 'minute' => '1 mínúta|:count mínútur', - 'min' => '1 mínúta|:count mínútur', - 'second' => '1 sekúnda|:count sekúndur', - 's' => '1 sekúnda|:count sekúndur', - 'ago' => ':time síðan', - 'from_now' => ':time síðan', - 'after' => ':time eftir', - 'before' => ':time fyrir', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' og '], - 'meridiem' => ['fh', 'eh'], - 'diff_now' => 'núna', - 'diff_yesterday' => 'í gær', - 'diff_tomorrow' => 'á morgun', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM [kl.] HH:mm', - 'LLLL' => 'dddd D. MMMM YYYY [kl.] HH:mm', - ], - 'weekdays' => ['sunnudaginn', 'mánudaginn', 'þriðjudaginn', 'miðvikudaginn', 'fimmtudaginn', 'föstudaginn', 'laugardaginn'], - 'weekdays_short' => ['sun', 'mán', 'þri', 'mið', 'fim', 'fös', 'lau'], - 'weekdays_min' => ['sun', 'mán', 'þri', 'mið', 'fim', 'fös', 'lau'], - 'months' => ['janúar', 'febrúar', 'mars', 'apríl', 'maí', 'júní', 'júlí', 'ágúst', 'september', 'október', 'nóvember', 'desember'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maí', 'jún', 'júl', 'ágú', 'sep', 'okt', 'nóv', 'des'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php b/vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php deleted file mode 100644 index 4d35c44..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/is.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it.php b/vendor/nesbot/carbon/src/Carbon/Lang/it.php deleted file mode 100644 index c483695..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/it.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ash - * - François B - * - Marco Perrando - * - Massimiliano Caniparoli - * - JD Isaacks - * - Andrea Martini - * - Francesco Marasco - * - Tizianoz93 - * - Davide Casiraghi (davide-casiraghi) - * - Pete Scopes (pdscopes) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count anno|:count anni', - 'a_year' => 'un anno|:count anni', - 'y' => ':count anno|:count anni', - 'month' => ':count mese|:count mesi', - 'a_month' => 'un mese|:count mesi', - 'm' => ':count mese|:count mesi', - 'week' => ':count settimana|:count settimane', - 'a_week' => 'una settimana|:count settimane', - 'w' => ':count set.', - 'day' => ':count giorno|:count giorni', - 'a_day' => 'un giorno|:count giorni', - 'd' => ':count g|:count gg', - 'hour' => ':count ora|:count ore', - 'a_hour' => 'un\'ora|:count ore', - 'h' => ':count h', - 'minute' => ':count minuto|:count minuti', - 'a_minute' => 'un minuto|:count minuti', - 'min' => ':count min.', - 'second' => ':count secondo|:count secondi', - 'a_second' => 'alcuni secondi|:count secondi', - 's' => ':count sec.', - 'millisecond' => ':count millisecondo|:count millisecondi', - 'a_millisecond' => 'un millisecondo|:count millisecondi', - 'ms' => ':countms', - 'microsecond' => ':count microsecondo|:count microsecondi', - 'a_microsecond' => 'un microsecondo|:count microsecondi', - 'µs' => ':countµs', - 'ago' => ':time fa', - 'from_now' => static function ($time) { - return (preg_match('/^\d.+$/', $time) ? 'tra' : 'in')." $time"; - }, - 'after' => ':time dopo', - 'before' => ':time prima', - 'diff_now' => 'proprio ora', - 'diff_today' => 'Oggi', - 'diff_today_regexp' => 'Oggi(?:\\s+alle)?', - 'diff_yesterday' => 'ieri', - 'diff_yesterday_regexp' => 'Ieri(?:\\s+alle)?', - 'diff_tomorrow' => 'domani', - 'diff_tomorrow_regexp' => 'Domani(?:\\s+alle)?', - 'diff_before_yesterday' => 'l\'altro ieri', - 'diff_after_tomorrow' => 'dopodomani', - 'period_interval' => 'ogni :interval', - 'period_start_date' => 'dal :date', - 'period_end_date' => 'al :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Oggi alle] LT', - 'nextDay' => '[Domani alle] LT', - 'nextWeek' => 'dddd [alle] LT', - 'lastDay' => '[Ieri alle] LT', - 'lastWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[la scorsa] dddd [alle] LT', - default => '[lo scorso] dddd [alle] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'], - 'months_short' => ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'], - 'weekdays' => ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'], - 'weekdays_short' => ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'], - 'weekdays_min' => ['do', 'lu', 'ma', 'me', 'gi', 've', 'sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' e '], - 'ordinal_words' => [ - 'of' => 'di', - 'first' => 'primo', - 'second' => 'secondo', - 'third' => 'terzo', - 'fourth' => 'quarto', - 'fifth' => 'quinto', - 'last' => 'ultimo', - ], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php deleted file mode 100644 index c23cc50..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Propaganistas - */ -return array_replace_recursive(require __DIR__.'/it.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php deleted file mode 100644 index a5d1981..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return require __DIR__.'/it.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php b/vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php deleted file mode 100644 index 5e8fc92..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/it.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php b/vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php deleted file mode 100644 index 5e8fc92..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/it.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/iu.php b/vendor/nesbot/carbon/src/Carbon/Lang/iu.php deleted file mode 100644 index 4fa9742..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/iu.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/iu_CA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php b/vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php deleted file mode 100644 index 5acee93..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pablo Saratxaga pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'MM/DD/YY', - ], - 'months' => ['ᔮᓄᐊᓕ', 'ᕕᕗᐊᓕ', 'ᒪᔅᓯ', 'ᐃᐳᓗ', 'ᒪᐃ', 'ᔪᓂ', 'ᔪᓚᐃ', 'ᐊᒋᓯ', 'ᓯᑎᕙ', 'ᐊᑦᑐᕙ', 'ᓄᕕᕙ', 'ᑎᓯᕝᕙ'], - 'months_short' => ['ᔮᓄ', 'ᕕᕗ', 'ᒪᔅ', 'ᐃᐳ', 'ᒪᐃ', 'ᔪᓂ', 'ᔪᓚ', 'ᐊᒋ', 'ᓯᑎ', 'ᐊᑦ', 'ᓄᕕ', 'ᑎᓯ'], - 'weekdays' => ['ᓈᑦᑎᖑᔭᕐᕕᒃ', 'ᓇᒡᒐᔾᔭᐅ', 'ᓇᒡᒐᔾᔭᐅᓕᖅᑭᑦ', 'ᐱᖓᓲᓕᖅᓯᐅᑦ', 'ᕿᑎᖅᑰᑦ', 'ᐅᓪᓗᕈᓘᑐᐃᓇᖅ', 'ᓯᕙᑖᕕᒃ'], - 'weekdays_short' => ['ᓈ', 'ᓇ', 'ᓕ', 'ᐱ', 'ᕿ', 'ᐅ', 'ᓯ'], - 'weekdays_min' => ['ᓈ', 'ᓇ', 'ᓕ', 'ᐱ', 'ᕿ', 'ᐅ', 'ᓯ'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count ᐅᑭᐅᖅ', - 'y' => ':count ᐅᑭᐅᖅ', - 'a_year' => ':count ᐅᑭᐅᖅ', - - 'month' => ':count qaammat', - 'm' => ':count qaammat', - 'a_month' => ':count qaammat', - - 'week' => ':count sapaatip akunnera', - 'w' => ':count sapaatip akunnera', - 'a_week' => ':count sapaatip akunnera', - - 'day' => ':count ulloq', - 'd' => ':count ulloq', - 'a_day' => ':count ulloq', - - 'hour' => ':count ikarraq', - 'h' => ':count ikarraq', - 'a_hour' => ':count ikarraq', - - 'minute' => ':count titiqqaralaaq', // less reliable - 'min' => ':count titiqqaralaaq', // less reliable - 'a_minute' => ':count titiqqaralaaq', // less reliable - - 'second' => ':count marluk', // less reliable - 's' => ':count marluk', // less reliable - 'a_second' => ':count marluk', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/iw.php b/vendor/nesbot/carbon/src/Carbon/Lang/iw.php deleted file mode 100644 index 5dedd3c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/iw.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'months' => ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'], - 'months_short' => ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'], - 'weekdays' => ['יום ראשון', 'יום שני', 'יום שלישי', 'יום רביעי', 'יום חמישי', 'יום שישי', 'יום שבת'], - 'weekdays_short' => ['יום א׳', 'יום ב׳', 'יום ג׳', 'יום ד׳', 'יום ה׳', 'יום ו׳', 'שבת'], - 'weekdays_min' => ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'], - 'meridiem' => ['לפנה״צ', 'אחה״צ'], - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'D.M.YYYY', - 'LL' => 'D בMMM YYYY', - 'LLL' => 'D בMMMM YYYY H:mm', - 'LLLL' => 'dddd, D בMMMM YYYY H:mm', - ], - - 'year' => ':count שנה', - 'y' => ':count שנה', - 'a_year' => ':count שנה', - - 'month' => ':count חודש', - 'm' => ':count חודש', - 'a_month' => ':count חודש', - - 'week' => ':count שבוע', - 'w' => ':count שבוע', - 'a_week' => ':count שבוע', - - 'day' => ':count יום', - 'd' => ':count יום', - 'a_day' => ':count יום', - - 'hour' => ':count שעה', - 'h' => ':count שעה', - 'a_hour' => ':count שעה', - - 'minute' => ':count דקה', - 'min' => ':count דקה', - 'a_minute' => ':count דקה', - - 'second' => ':count שניה', - 's' => ':count שניה', - 'a_second' => ':count שניה', - - 'ago' => 'לפני :time', - 'from_now' => 'בעוד :time', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ja.php b/vendor/nesbot/carbon/src/Carbon/Lang/ja.php deleted file mode 100644 index e8646bd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ja.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Takuya Sawada - * - Atsushi Tanaka - * - François B - * - Jason Katz-Brown - * - Serhan Apaydın - * - XueWei - * - JD Isaacks - * - toyama satoshi - * - atakigawa - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count年', - 'y' => ':count年', - 'month' => ':countヶ月', - 'm' => ':countヶ月', - 'week' => ':count週間', - 'w' => ':count週間', - 'day' => ':count日', - 'd' => ':count日', - 'hour' => ':count時間', - 'h' => ':count時間', - 'minute' => ':count分', - 'min' => ':count分', - 'second' => ':count秒', - 'a_second' => '{1}数秒|]1,Inf[:count秒', - 's' => ':count秒', - 'ago' => ':time前', - 'from_now' => ':time後', - 'after' => ':time後', - 'before' => ':time前', - 'diff_now' => '今', - 'diff_today' => '今日', - 'diff_yesterday' => '昨日', - 'diff_tomorrow' => '明日', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY年M月D日', - 'LLL' => 'YYYY年M月D日 HH:mm', - 'LLLL' => 'YYYY年M月D日 dddd HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[今日] LT', - 'nextDay' => '[明日] LT', - 'nextWeek' => static function (CarbonInterface $current, \Carbon\CarbonInterface $other) { - if ($other->week !== $current->week) { - return '[来週]dddd LT'; - } - - return 'dddd LT'; - }, - 'lastDay' => '[昨日] LT', - 'lastWeek' => static function (CarbonInterface $current, \Carbon\CarbonInterface $other) { - if ($other->week !== $current->week) { - return '[先週]dddd LT'; - } - - return 'dddd LT'; - }, - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number, $period) { - return match ($period) { - 'd', 'D', 'DDD' => $number.'日', - default => $number, - }; - }, - 'meridiem' => ['午前', '午後'], - 'months' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'weekdays' => ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'], - 'weekdays_short' => ['日', '月', '火', '水', '木', '金', '土'], - 'weekdays_min' => ['日', '月', '火', '水', '木', '金', '土'], - 'list' => '、', - 'alt_numbers' => ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十', '二十一', '二十二', '二十三', '二十四', '二十五', '二十六', '二十七', '二十八', '二十九', '三十', '三十一', '三十二', '三十三', '三十四', '三十五', '三十六', '三十七', '三十八', '三十九', '四十', '四十一', '四十二', '四十三', '四十四', '四十五', '四十六', '四十七', '四十八', '四十九', '五十', '五十一', '五十二', '五十三', '五十四', '五十五', '五十六', '五十七', '五十八', '五十九', '六十', '六十一', '六十二', '六十三', '六十四', '六十五', '六十六', '六十七', '六十八', '六十九', '七十', '七十一', '七十二', '七十三', '七十四', '七十五', '七十六', '七十七', '七十八', '七十九', '八十', '八十一', '八十二', '八十三', '八十四', '八十五', '八十六', '八十七', '八十八', '八十九', '九十', '九十一', '九十二', '九十三', '九十四', '九十五', '九十六', '九十七', '九十八', '九十九'], - 'alt_numbers_pow' => [ - 10000 => '万', - 1000 => '千', - 100 => '百', - ], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php b/vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php deleted file mode 100644 index c283625..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ja.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/jgo.php b/vendor/nesbot/carbon/src/Carbon/Lang/jgo.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/jgo.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/jmc.php b/vendor/nesbot/carbon/src/Carbon/Lang/jmc.php deleted file mode 100644 index ed92e8e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/jmc.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['utuko', 'kyiukonyi'], - 'weekdays' => ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/jv.php b/vendor/nesbot/carbon/src/Carbon/Lang/jv.php deleted file mode 100644 index 696087f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/jv.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - tgfjt - * - JD Isaacks - */ -return [ - 'year' => '{1}setaun|]1,Inf[:count taun', - 'month' => '{1}sewulan|]1,Inf[:count wulan', - 'week' => '{1}sakminggu|]1,Inf[:count minggu', - 'day' => '{1}sedinten|]1,Inf[:count dinten', - 'hour' => '{1}setunggal jam|]1,Inf[:count jam', - 'minute' => '{1}setunggal menit|]1,Inf[:count menit', - 'second' => '{1}sawetawis detik|]1,Inf[:count detik', - 'ago' => ':time ingkang kepengker', - 'from_now' => 'wonten ing :time', - 'diff_today' => 'Dinten', - 'diff_yesterday' => 'Kala', - 'diff_yesterday_regexp' => 'Kala(?:\\s+wingi)?(?:\\s+pukul)?', - 'diff_tomorrow' => 'Mbenjang', - 'diff_tomorrow_regexp' => 'Mbenjang(?:\\s+pukul)?', - 'diff_today_regexp' => 'Dinten(?:\\s+puniko)?(?:\\s+pukul)?', - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm.ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY [pukul] HH.mm', - 'LLLL' => 'dddd, D MMMM YYYY [pukul] HH.mm', - ], - 'calendar' => [ - 'sameDay' => '[Dinten puniko pukul] LT', - 'nextDay' => '[Mbenjang pukul] LT', - 'nextWeek' => 'dddd [pukul] LT', - 'lastDay' => '[Kala wingi pukul] LT', - 'lastWeek' => 'dddd [kepengker pukul] LT', - 'sameElse' => 'L', - ], - 'meridiem' => static function ($hour) { - if ($hour < 11) { - return 'enjing'; - } - if ($hour < 15) { - return 'siyang'; - } - if ($hour < 19) { - return 'sonten'; - } - - return 'ndalu'; - }, - 'months' => ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'Nopember', 'Desember'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ags', 'Sep', 'Okt', 'Nop', 'Des'], - 'weekdays' => ['Minggu', 'Senen', 'Seloso', 'Rebu', 'Kemis', 'Jemuwah', 'Septu'], - 'weekdays_short' => ['Min', 'Sen', 'Sel', 'Reb', 'Kem', 'Jem', 'Sep'], - 'weekdays_min' => ['Mg', 'Sn', 'Sl', 'Rb', 'Km', 'Jm', 'Sp'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' lan '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ka.php b/vendor/nesbot/carbon/src/Carbon/Lang/ka.php deleted file mode 100644 index 05752aa..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ka.php +++ /dev/null @@ -1,204 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Tornike Razmadze - * - François B - * - Lasha Dolidze - * - Tim Fish - * - JD Isaacks - * - Tornike Razmadze - * - François B - * - Lasha Dolidze - * - JD Isaacks - * - LONGMAN - * - Avtandil Kikabidze (akalongman) - * - Levan Velijanashvili (Stichoza) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count წელი', - 'y' => ':count წელი', - 'a_year' => '{1}წელი|]1,Inf[:count წელი', - 'month' => ':count თვე', - 'm' => ':count თვე', - 'a_month' => '{1}თვე|]1,Inf[:count თვე', - 'week' => ':count კვირა', - 'w' => ':count კვირა', - 'a_week' => '{1}კვირა|]1,Inf[:count კვირა', - 'day' => ':count დღე', - 'd' => ':count დღე', - 'a_day' => '{1}დღე|]1,Inf[:count დღე', - 'hour' => ':count საათი', - 'h' => ':count საათი', - 'a_hour' => '{1}საათი|]1,Inf[:count საათი', - 'minute' => ':count წუთი', - 'min' => ':count წუთი', - 'a_minute' => '{1}წუთი|]1,Inf[:count წუთი', - 'second' => ':count წამი', - 's' => ':count წამი', - 'a_second' => '{1}რამდენიმე წამი|]1,Inf[:count წამი', - 'ago' => static function ($time) { - $replacements = [ - // year - 'წელი' => 'წლის', - // month - 'თვე' => 'თვის', - // week - 'კვირა' => 'კვირის', - // day - 'დღე' => 'დღის', - // hour - 'საათი' => 'საათის', - // minute - 'წუთი' => 'წუთის', - // second - 'წამი' => 'წამის', - ]; - $time = strtr($time, array_flip($replacements)); - $time = strtr($time, $replacements); - - return "$time წინ"; - }, - 'from_now' => static function ($time) { - $replacements = [ - // year - 'წელი' => 'წელიწადში', - // week - 'კვირა' => 'კვირაში', - // day - 'დღე' => 'დღეში', - // month - 'თვე' => 'თვეში', - // hour - 'საათი' => 'საათში', - // minute - 'წუთი' => 'წუთში', - // second - 'წამი' => 'წამში', - ]; - $time = strtr($time, array_flip($replacements)); - $time = strtr($time, $replacements); - - return $time; - }, - 'after' => static function ($time) { - $replacements = [ - // year - 'წელი' => 'წლის', - // month - 'თვე' => 'თვის', - // week - 'კვირა' => 'კვირის', - // day - 'დღე' => 'დღის', - // hour - 'საათი' => 'საათის', - // minute - 'წუთი' => 'წუთის', - // second - 'წამი' => 'წამის', - ]; - $time = strtr($time, array_flip($replacements)); - $time = strtr($time, $replacements); - - return "$time შემდეგ"; - }, - 'before' => static function ($time) { - $replacements = [ - // year - 'წელი' => 'წლით', - // month - 'თვე' => 'თვით', - // week - 'კვირა' => 'კვირით', - // day - 'დღე' => 'დღით', - // hour - 'საათი' => 'საათით', - // minute - 'წუთი' => 'წუთით', - // second - 'წამი' => 'წამით', - ]; - $time = strtr($time, array_flip($replacements)); - $time = strtr($time, $replacements); - - return "$time ადრე"; - }, - 'diff_now' => 'ახლა', - 'diff_today' => 'დღეს', - 'diff_yesterday' => 'გუშინ', - 'diff_tomorrow' => 'ხვალ', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[დღეს], LT[-ზე]', - 'nextDay' => '[ხვალ], LT[-ზე]', - 'nextWeek' => static function (CarbonInterface $current, \Carbon\CarbonInterface $other) { - return ($current->isSameWeek($other) ? '' : '[შემდეგ] ').'dddd, LT[-ზე]'; - }, - 'lastDay' => '[გუშინ], LT[-ზე]', - 'lastWeek' => '[წინა] dddd, LT-ზე', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - if ($number === 0) { - return $number; - } - if ($number === 1) { - return $number.'-ლი'; - } - if (($number < 20) || ($number <= 100 && ($number % 20 === 0)) || ($number % 100 === 0)) { - return 'მე-'.$number; - } - - return $number.'-ე'; - }, - 'months' => ['იანვარი', 'თებერვალი', 'მარტი', 'აპრილი', 'მაისი', 'ივნისი', 'ივლისი', 'აგვისტო', 'სექტემბერი', 'ოქტომბერი', 'ნოემბერი', 'დეკემბერი'], - 'months_standalone' => ['იანვარს', 'თებერვალს', 'მარტს', 'აპრილს', 'მაისს', 'ივნისს', 'ივლისს', 'აგვისტოს', 'სექტემბერს', 'ოქტომბერს', 'ნოემბერს', 'დეკემბერს'], - 'months_short' => ['იან', 'თებ', 'მარ', 'აპრ', 'მაი', 'ივნ', 'ივლ', 'აგვ', 'სექ', 'ოქტ', 'ნოე', 'დეკ'], - 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['კვირას', 'ორშაბათს', 'სამშაბათს', 'ოთხშაბათს', 'ხუთშაბათს', 'პარასკევს', 'შაბათს'], - 'weekdays_standalone' => ['კვირა', 'ორშაბათი', 'სამშაბათი', 'ოთხშაბათი', 'ხუთშაბათი', 'პარასკევი', 'შაბათი'], - 'weekdays_short' => ['კვი', 'ორშ', 'სამ', 'ოთხ', 'ხუთ', 'პარ', 'შაბ'], - 'weekdays_min' => ['კვ', 'ორ', 'სა', 'ოთ', 'ხუ', 'პა', 'შა'], - 'weekdays_regexp' => '/^([^d].*|.*[^d])$/', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' და '], - 'meridiem' => static function ($hour) { - if ($hour >= 4) { - if ($hour < 11) { - return 'დილის'; - } - - if ($hour < 16) { - return 'შუადღის'; - } - - if ($hour < 22) { - return 'საღამოს'; - } - } - - return 'ღამის'; - }, -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php deleted file mode 100644 index a26d930..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ka.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kab.php b/vendor/nesbot/carbon/src/Carbon/Lang/kab.php deleted file mode 100644 index 94d6473..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kab.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/kab_DZ.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php deleted file mode 100644 index 796660b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - belkacem77@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Yennayer', 'Fuṛar', 'Meɣres', 'Yebrir', 'Mayyu', 'Yunyu', 'Yulyu', 'ɣuct', 'Ctembeṛ', 'Tubeṛ', 'Wambeṛ', 'Dujembeṛ'], - 'months_short' => ['Yen', 'Fur', 'Meɣ', 'Yeb', 'May', 'Yun', 'Yul', 'ɣuc', 'Cte', 'Tub', 'Wam', 'Duj'], - 'weekdays' => ['Acer', 'Arim', 'Aram', 'Ahad', 'Amhad', 'Sem', 'Sed'], - 'weekdays_short' => ['Ace', 'Ari', 'Ara', 'Aha', 'Amh', 'Sem', 'Sed'], - 'weekdays_min' => ['Ace', 'Ari', 'Ara', 'Aha', 'Amh', 'Sem', 'Sed'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['FT', 'MD'], - - 'year' => ':count n yiseggasen', - 'y' => ':count n yiseggasen', - 'a_year' => ':count n yiseggasen', - - 'month' => ':count n wayyuren', - 'm' => ':count n wayyuren', - 'a_month' => ':count n wayyuren', - - 'week' => ':count n ledwaṛ', // less reliable - 'w' => ':count n ledwaṛ', // less reliable - 'a_week' => ':count n ledwaṛ', // less reliable - - 'day' => ':count n wussan', - 'd' => ':count n wussan', - 'a_day' => ':count n wussan', - - 'hour' => ':count n tsaɛtin', - 'h' => ':count n tsaɛtin', - 'a_hour' => ':count n tsaɛtin', - - 'minute' => ':count n tedqiqin', - 'min' => ':count n tedqiqin', - 'a_minute' => ':count n tedqiqin', - - 'second' => ':count tasdidt', // less reliable - 's' => ':count tasdidt', // less reliable - 'a_second' => ':count tasdidt', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kam.php b/vendor/nesbot/carbon/src/Carbon/Lang/kam.php deleted file mode 100644 index 4d3a3b2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kam.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['Ĩyakwakya', 'Ĩyawĩoo'], - 'weekdays' => ['Wa kyumwa', 'Wa kwambĩlĩlya', 'Wa kelĩ', 'Wa katatũ', 'Wa kana', 'Wa katano', 'Wa thanthatũ'], - 'weekdays_short' => ['Wky', 'Wkw', 'Wkl', 'Wtũ', 'Wkn', 'Wtn', 'Wth'], - 'weekdays_min' => ['Wky', 'Wkw', 'Wkl', 'Wtũ', 'Wkn', 'Wtn', 'Wth'], - 'months' => ['Mwai wa mbee', 'Mwai wa kelĩ', 'Mwai wa katatũ', 'Mwai wa kana', 'Mwai wa katano', 'Mwai wa thanthatũ', 'Mwai wa muonza', 'Mwai wa nyaanya', 'Mwai wa kenda', 'Mwai wa ĩkumi', 'Mwai wa ĩkumi na ĩmwe', 'Mwai wa ĩkumi na ilĩ'], - 'months_short' => ['Mbe', 'Kel', 'Ktũ', 'Kan', 'Ktn', 'Tha', 'Moo', 'Nya', 'Knd', 'Ĩku', 'Ĩkm', 'Ĩkl'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - // Too unreliable - /* - 'year' => ':count mbua', // less reliable - 'y' => ':count mbua', // less reliable - 'a_year' => ':count mbua', // less reliable - - 'month' => ':count ndakitali', // less reliable - 'm' => ':count ndakitali', // less reliable - 'a_month' => ':count ndakitali', // less reliable - - 'day' => ':count wia', // less reliable - 'd' => ':count wia', // less reliable - 'a_day' => ':count wia', // less reliable - - 'hour' => ':count orasan', // less reliable - 'h' => ':count orasan', // less reliable - 'a_hour' => ':count orasan', // less reliable - - 'minute' => ':count orasan', // less reliable - 'min' => ':count orasan', // less reliable - 'a_minute' => ':count orasan', // less reliable - */ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kde.php b/vendor/nesbot/carbon/src/Carbon/Lang/kde.php deleted file mode 100644 index fbcc9f3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kde.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Muhi', 'Chilo'], - 'weekdays' => ['Liduva lyapili', 'Liduva lyatatu', 'Liduva lyanchechi', 'Liduva lyannyano', 'Liduva lyannyano na linji', 'Liduva lyannyano na mavili', 'Liduva litandi'], - 'weekdays_short' => ['Ll2', 'Ll3', 'Ll4', 'Ll5', 'Ll6', 'Ll7', 'Ll1'], - 'weekdays_min' => ['Ll2', 'Ll3', 'Ll4', 'Ll5', 'Ll6', 'Ll7', 'Ll1'], - 'months' => ['Mwedi Ntandi', 'Mwedi wa Pili', 'Mwedi wa Tatu', 'Mwedi wa Nchechi', 'Mwedi wa Nnyano', 'Mwedi wa Nnyano na Umo', 'Mwedi wa Nnyano na Mivili', 'Mwedi wa Nnyano na Mitatu', 'Mwedi wa Nnyano na Nchechi', 'Mwedi wa Nnyano na Nnyano', 'Mwedi wa Nnyano na Nnyano na U', 'Mwedi wa Nnyano na Nnyano na M'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kea.php b/vendor/nesbot/carbon/src/Carbon/Lang/kea.php deleted file mode 100644 index 8b6c21b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kea.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['a', 'p'], - 'weekdays' => ['dumingu', 'sigunda-fera', 'tersa-fera', 'kuarta-fera', 'kinta-fera', 'sesta-fera', 'sabadu'], - 'weekdays_short' => ['dum', 'sig', 'ter', 'kua', 'kin', 'ses', 'sab'], - 'weekdays_min' => ['du', 'si', 'te', 'ku', 'ki', 'se', 'sa'], - 'weekdays_standalone' => ['dumingu', 'sigunda-fera', 'tersa-fera', 'kuarta-fera', 'kinta-fera', 'sesta-fera', 'sábadu'], - 'months' => ['Janeru', 'Febreru', 'Marsu', 'Abril', 'Maiu', 'Junhu', 'Julhu', 'Agostu', 'Setenbru', 'Otubru', 'Nuvenbru', 'Dizenbru'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Otu', 'Nuv', 'Diz'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D [di] MMMM [di] YYYY HH:mm', - 'LLLL' => 'dddd, D [di] MMMM [di] YYYY HH:mm', - ], - - 'year' => ':count otunu', // less reliable - 'y' => ':count otunu', // less reliable - 'a_year' => ':count otunu', // less reliable - - 'week' => ':count día dumingu', // less reliable - 'w' => ':count día dumingu', // less reliable - 'a_week' => ':count día dumingu', // less reliable - - 'day' => ':count diâ', // less reliable - 'd' => ':count diâ', // less reliable - 'a_day' => ':count diâ', // less reliable - - 'minute' => ':count sugundu', // less reliable - 'min' => ':count sugundu', // less reliable - 'a_minute' => ':count sugundu', // less reliable - - 'second' => ':count dós', // less reliable - 's' => ':count dós', // less reliable - 'a_second' => ':count dós', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/khq.php b/vendor/nesbot/carbon/src/Carbon/Lang/khq.php deleted file mode 100644 index 7a834cf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/khq.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Adduha', 'Aluula'], - 'weekdays' => ['Alhadi', 'Atini', 'Atalata', 'Alarba', 'Alhamiisa', 'Aljuma', 'Assabdu'], - 'weekdays_short' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alj', 'Ass'], - 'weekdays_min' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alj', 'Ass'], - 'months' => ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'], - 'months_short' => ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ki.php b/vendor/nesbot/carbon/src/Carbon/Lang/ki.php deleted file mode 100644 index 868fd61..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ki.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['Kiroko', 'Hwaĩ-inĩ'], - 'weekdays' => ['Kiumia', 'Njumatatũ', 'Njumaine', 'Njumatana', 'Aramithi', 'Njumaa', 'Njumamothi'], - 'weekdays_short' => ['KMA', 'NTT', 'NMN', 'NMT', 'ART', 'NMA', 'NMM'], - 'weekdays_min' => ['KMA', 'NTT', 'NMN', 'NMT', 'ART', 'NMA', 'NMM'], - 'months' => ['Njenuarĩ', 'Mwere wa kerĩ', 'Mwere wa gatatũ', 'Mwere wa kana', 'Mwere wa gatano', 'Mwere wa gatandatũ', 'Mwere wa mũgwanja', 'Mwere wa kanana', 'Mwere wa kenda', 'Mwere wa ikũmi', 'Mwere wa ikũmi na ũmwe', 'Ndithemba'], - 'months_short' => ['JEN', 'WKR', 'WGT', 'WKN', 'WTN', 'WTD', 'WMJ', 'WNN', 'WKD', 'WIK', 'WMW', 'DIT'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => ':count mĩaka', // less reliable - 'y' => ':count mĩaka', // less reliable - 'a_year' => ':count mĩaka', // less reliable - - 'month' => ':count mweri', // less reliable - 'm' => ':count mweri', // less reliable - 'a_month' => ':count mweri', // less reliable - - 'week' => ':count kiumia', // less reliable - 'w' => ':count kiumia', // less reliable - 'a_week' => ':count kiumia', // less reliable - - 'day' => ':count mũthenya', // less reliable - 'd' => ':count mũthenya', // less reliable - 'a_day' => ':count mũthenya', // less reliable - - 'hour' => ':count thaa', // less reliable - 'h' => ':count thaa', // less reliable - 'a_hour' => ':count thaa', // less reliable - - 'minute' => ':count mundu', // less reliable - 'min' => ':count mundu', // less reliable - 'a_minute' => ':count mundu', // less reliable - - 'second' => ':count igego', // less reliable - 's' => ':count igego', // less reliable - 'a_second' => ':count igego', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kk.php b/vendor/nesbot/carbon/src/Carbon/Lang/kk.php deleted file mode 100644 index 23452dd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kk.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Talat Uspanov - * - Нурлан Рахимжанов - * - Toleugazy Kali - */ -return [ - 'year' => ':count жыл', - 'a_year' => '{1}бір жыл|:count жыл', - 'y' => ':count ж.', - 'month' => ':count ай', - 'a_month' => '{1}бір ай|:count ай', - 'm' => ':count ай', - 'week' => ':count апта', - 'a_week' => '{1}бір апта', - 'w' => ':count ап.', - 'day' => ':count күн', - 'a_day' => '{1}бір күн|:count күн', - 'd' => ':count к.', - 'hour' => ':count сағат', - 'a_hour' => '{1}бір сағат|:count сағат', - 'h' => ':count са.', - 'minute' => ':count минут', - 'a_minute' => '{1}бір минут|:count минут', - 'min' => ':count м.', - 'second' => ':count секунд', - 'a_second' => '{1}бірнеше секунд|:count секунд', - 's' => ':count се.', - 'ago' => ':time бұрын', - 'from_now' => ':time ішінде', - 'after' => ':time кейін', - 'before' => ':time бұрын', - 'diff_now' => 'қазір', - 'diff_today' => 'Бүгін', - 'diff_today_regexp' => 'Бүгін(?:\\s+сағат)?', - 'diff_yesterday' => 'кеше', - 'diff_yesterday_regexp' => 'Кеше(?:\\s+сағат)?', - 'diff_tomorrow' => 'ертең', - 'diff_tomorrow_regexp' => 'Ертең(?:\\s+сағат)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Бүгін сағат] LT', - 'nextDay' => '[Ертең сағат] LT', - 'nextWeek' => 'dddd [сағат] LT', - 'lastDay' => '[Кеше сағат] LT', - 'lastWeek' => '[Өткен аптаның] dddd [сағат] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - static $suffixes = [ - 0 => '-ші', - 1 => '-ші', - 2 => '-ші', - 3 => '-ші', - 4 => '-ші', - 5 => '-ші', - 6 => '-шы', - 7 => '-ші', - 8 => '-ші', - 9 => '-шы', - 10 => '-шы', - 20 => '-шы', - 30 => '-шы', - 40 => '-шы', - 50 => '-ші', - 60 => '-шы', - 70 => '-ші', - 80 => '-ші', - 90 => '-шы', - 100 => '-ші', - ]; - - return $number.($suffixes[$number] ?? $suffixes[$number % 10] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); - }, - 'months' => ['қаңтар', 'ақпан', 'наурыз', 'сәуір', 'мамыр', 'маусым', 'шілде', 'тамыз', 'қыркүйек', 'қазан', 'қараша', 'желтоқсан'], - 'months_short' => ['қаң', 'ақп', 'нау', 'сәу', 'мам', 'мау', 'шіл', 'там', 'қыр', 'қаз', 'қар', 'жел'], - 'weekdays' => ['жексенбі', 'дүйсенбі', 'сейсенбі', 'сәрсенбі', 'бейсенбі', 'жұма', 'сенбі'], - 'weekdays_short' => ['жек', 'дүй', 'сей', 'сәр', 'бей', 'жұм', 'сен'], - 'weekdays_min' => ['жк', 'дй', 'сй', 'ср', 'бй', 'жм', 'сн'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' және '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php deleted file mode 100644 index 7dc5ebc..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/kk.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kkj.php b/vendor/nesbot/carbon/src/Carbon/Lang/kkj.php deleted file mode 100644 index f4cdb67..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kkj.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kl.php b/vendor/nesbot/carbon/src/Carbon/Lang/kl.php deleted file mode 100644 index 7329a07..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kl.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/kl_GL.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php b/vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php deleted file mode 100644 index 4fed720..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Danish Standards Association bug-glibc-locales@gnu.org - * - John Eyðstein Johannesen (mashema) - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd [d.] D. MMMM YYYY [kl.] HH:mm', - ], - 'months' => ['januaarip', 'februaarip', 'marsip', 'apriilip', 'maajip', 'juunip', 'juulip', 'aggustip', 'septembarip', 'oktobarip', 'novembarip', 'decembarip'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['sapaat', 'ataasinngorneq', 'marlunngorneq', 'pingasunngorneq', 'sisamanngorneq', 'tallimanngorneq', 'arfininngorneq'], - 'weekdays_short' => ['sap', 'ata', 'mar', 'pin', 'sis', 'tal', 'arf'], - 'weekdays_min' => ['sap', 'ata', 'mar', 'pin', 'sis', 'tal', 'arf'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => '{1}ukioq :count|{0}:count ukiut|]1,Inf[ukiut :count', - 'a_year' => '{1}ukioq|{0}:count ukiut|]1,Inf[ukiut :count', - 'y' => '{1}:countyr|{0}:countyrs|]1,Inf[:countyrs', - - 'month' => '{1}qaammat :count|{0}:count qaammatit|]1,Inf[qaammatit :count', - 'a_month' => '{1}qaammat|{0}:count qaammatit|]1,Inf[qaammatit :count', - 'm' => '{1}:countmo|{0}:countmos|]1,Inf[:countmos', - - 'week' => '{1}:count sap. ak.|{0}:count sap. ak.|]1,Inf[:count sap. ak.', - 'a_week' => '{1}a sap. ak.|{0}:count sap. ak.|]1,Inf[:count sap. ak.', - 'w' => ':countw', - - 'day' => '{1}:count ulloq|{0}:count ullut|]1,Inf[:count ullut', - 'a_day' => '{1}a ulloq|{0}:count ullut|]1,Inf[:count ullut', - 'd' => ':countd', - - 'hour' => '{1}:count tiimi|{0}:count tiimit|]1,Inf[:count tiimit', - 'a_hour' => '{1}tiimi|{0}:count tiimit|]1,Inf[:count tiimit', - 'h' => ':counth', - - 'minute' => '{1}:count minutsi|{0}:count minutsit|]1,Inf[:count minutsit', - 'a_minute' => '{1}a minutsi|{0}:count minutsit|]1,Inf[:count minutsit', - 'min' => ':countm', - - 'second' => '{1}:count sikunti|{0}:count sikuntit|]1,Inf[:count sikuntit', - 'a_second' => '{1}sikunti|{0}:count sikuntit|]1,Inf[:count sikuntit', - 's' => ':counts', - - 'ago' => ':time matuma siorna', - -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kln.php b/vendor/nesbot/carbon/src/Carbon/Lang/kln.php deleted file mode 100644 index de3f44f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kln.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['krn', 'koosk'], - 'weekdays' => ['Kotisap', 'Kotaai', 'Koaeng’', 'Kosomok', 'Koang’wan', 'Komuut', 'Kolo'], - 'weekdays_short' => ['Kts', 'Kot', 'Koo', 'Kos', 'Koa', 'Kom', 'Kol'], - 'weekdays_min' => ['Kts', 'Kot', 'Koo', 'Kos', 'Koa', 'Kom', 'Kol'], - 'months' => ['Mulgul', 'Ng’atyaato', 'Kiptaamo', 'Iwootkuut', 'Mamuut', 'Paagi', 'Ng’eiyeet', 'Rooptui', 'Bureet', 'Epeeso', 'Kipsuunde ne taai', 'Kipsuunde nebo aeng’'], - 'months_short' => ['Mul', 'Ngat', 'Taa', 'Iwo', 'Mam', 'Paa', 'Nge', 'Roo', 'Bur', 'Epe', 'Kpt', 'Kpa'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => ':count maghatiat', // less reliable - 'y' => ':count maghatiat', // less reliable - 'a_year' => ':count maghatiat', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/km.php b/vendor/nesbot/carbon/src/Carbon/Lang/km.php deleted file mode 100644 index da790ac..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/km.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kruy Vanna - * - Sereysethy Touch - * - JD Isaacks - * - Sovichet Tep - */ -return [ - 'year' => '{1}មួយឆ្នាំ|]1,Inf[:count ឆ្នាំ', - 'y' => ':count ឆ្នាំ', - 'month' => '{1}មួយខែ|]1,Inf[:count ខែ', - 'm' => ':count ខែ', - 'week' => ':count សប្ដាហ៍', - 'w' => ':count សប្ដាហ៍', - 'day' => '{1}មួយថ្ងៃ|]1,Inf[:count ថ្ងៃ', - 'd' => ':count ថ្ងៃ', - 'hour' => '{1}មួយម៉ោង|]1,Inf[:count ម៉ោង', - 'h' => ':count ម៉ោង', - 'minute' => '{1}មួយនាទី|]1,Inf[:count នាទី', - 'min' => ':count នាទី', - 'second' => '{1}ប៉ុន្មានវិនាទី|]1,Inf[:count វិនាទី', - 's' => ':count វិនាទី', - 'ago' => ':timeមុន', - 'from_now' => ':timeទៀត', - 'after' => 'នៅ​ក្រោយ :time', - 'before' => 'នៅ​មុន :time', - 'diff_now' => 'ឥឡូវ', - 'diff_today' => 'ថ្ងៃនេះ', - 'diff_today_regexp' => 'ថ្ងៃនេះ(?:\\s+ម៉ោង)?', - 'diff_yesterday' => 'ម្សិលមិញ', - 'diff_yesterday_regexp' => 'ម្សិលមិញ(?:\\s+ម៉ោង)?', - 'diff_tomorrow' => 'ថ្ងៃ​ស្អែក', - 'diff_tomorrow_regexp' => 'ស្អែក(?:\\s+ម៉ោង)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[ថ្ងៃនេះ ម៉ោង] LT', - 'nextDay' => '[ស្អែក ម៉ោង] LT', - 'nextWeek' => 'dddd [ម៉ោង] LT', - 'lastDay' => '[ម្សិលមិញ ម៉ោង] LT', - 'lastWeek' => 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', - 'sameElse' => 'L', - ], - 'ordinal' => 'ទី:number', - 'meridiem' => ['ព្រឹក', 'ល្ងាច'], - 'months' => ['មករា', 'កុម្ភៈ', 'មីនា', 'មេសា', 'ឧសភា', 'មិថុនា', 'កក្កដា', 'សីហា', 'កញ្ញា', 'តុលា', 'វិច្ឆិកា', 'ធ្នូ'], - 'months_short' => ['មករា', 'កុម្ភៈ', 'មីនា', 'មេសា', 'ឧសភា', 'មិថុនា', 'កក្កដា', 'សីហា', 'កញ្ញា', 'តុលា', 'វិច្ឆិកា', 'ធ្នូ'], - 'weekdays' => ['អាទិត្យ', 'ច័ន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'], - 'weekdays_short' => ['អា', 'ច', 'អ', 'ព', 'ព្រ', 'សុ', 'ស'], - 'weekdays_min' => ['អា', 'ច', 'អ', 'ព', 'ព្រ', 'សុ', 'ស'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', 'និង '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php b/vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php deleted file mode 100644 index 92e5fdb..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/km.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kn.php b/vendor/nesbot/carbon/src/Carbon/Lang/kn.php deleted file mode 100644 index 350a487..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kn.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - MOHAN M U - * - François B - * - rajeevnaikte - */ -return [ - 'year' => '{1}ಒಂದು ವರ್ಷ|]1,Inf[:count ವರ್ಷ', - 'month' => '{1}ಒಂದು ತಿಂಗಳು|]1,Inf[:count ತಿಂಗಳು', - 'week' => '{1}ಒಂದು ವಾರ|]1,Inf[:count ವಾರಗಳು', - 'day' => '{1}ಒಂದು ದಿನ|]1,Inf[:count ದಿನ', - 'hour' => '{1}ಒಂದು ಗಂಟೆ|]1,Inf[:count ಗಂಟೆ', - 'minute' => '{1}ಒಂದು ನಿಮಿಷ|]1,Inf[:count ನಿಮಿಷ', - 'second' => '{1}ಕೆಲವು ಕ್ಷಣಗಳು|]1,Inf[:count ಸೆಕೆಂಡುಗಳು', - 'ago' => ':time ಹಿಂದೆ', - 'from_now' => ':time ನಂತರ', - 'diff_now' => 'ಈಗ', - 'diff_today' => 'ಇಂದು', - 'diff_yesterday' => 'ನಿನ್ನೆ', - 'diff_tomorrow' => 'ನಾಳೆ', - 'formats' => [ - 'LT' => 'A h:mm', - 'LTS' => 'A h:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm', - ], - 'calendar' => [ - 'sameDay' => '[ಇಂದು] LT', - 'nextDay' => '[ನಾಳೆ] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[ನಿನ್ನೆ] LT', - 'lastWeek' => '[ಕೊನೆಯ] dddd, LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberನೇ', - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'ರಾತ್ರಿ'; - } - if ($hour < 10) { - return 'ಬೆಳಿಗ್ಗೆ'; - } - if ($hour < 17) { - return 'ಮಧ್ಯಾಹ್ನ'; - } - if ($hour < 20) { - return 'ಸಂಜೆ'; - } - - return 'ರಾತ್ರಿ'; - }, - 'months' => ['ಜನವರಿ', 'ಫೆಬ್ರವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂಬರ್', 'ಅಕ್ಟೋಬರ್', 'ನವೆಂಬರ್', 'ಡಿಸೆಂಬರ್'], - 'months_short' => ['ಜನ', 'ಫೆಬ್ರ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂ', 'ಅಕ್ಟೋ', 'ನವೆಂ', 'ಡಿಸೆಂ'], - 'weekdays' => ['ಭಾನುವಾರ', 'ಸೋಮವಾರ', 'ಮಂಗಳವಾರ', 'ಬುಧವಾರ', 'ಗುರುವಾರ', 'ಶುಕ್ರವಾರ', 'ಶನಿವಾರ'], - 'weekdays_short' => ['ಭಾನು', 'ಸೋಮ', 'ಮಂಗಳ', 'ಬುಧ', 'ಗುರು', 'ಶುಕ್ರ', 'ಶನಿ'], - 'weekdays_min' => ['ಭಾ', 'ಸೋ', 'ಮಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'], - 'list' => ', ', - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekend' => [0, 0], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php deleted file mode 100644 index 30e3d88..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/kn.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ko.php b/vendor/nesbot/carbon/src/Carbon/Lang/ko.php deleted file mode 100644 index bb290a7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ko.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - FourwingsY - * - François B - * - Jason Katz-Brown - * - Seokjun Kim - * - Junho Kim - * - JD Isaacks - * - Juwon Kim - */ -return [ - 'year' => ':count년', - 'a_year' => '{1}일년|]1,Inf[:count년', - 'y' => ':count년', - 'month' => ':count개월', - 'a_month' => '{1}한달|]1,Inf[:count개월', - 'm' => ':count개월', - 'week' => ':count주', - 'a_week' => '{1}일주일|]1,Inf[:count 주', - 'w' => ':count주일', - 'day' => ':count일', - 'a_day' => '{1}하루|]1,Inf[:count일', - 'd' => ':count일', - 'hour' => ':count시간', - 'a_hour' => '{1}한시간|]1,Inf[:count시간', - 'h' => ':count시간', - 'minute' => ':count분', - 'a_minute' => '{1}일분|]1,Inf[:count분', - 'min' => ':count분', - 'second' => ':count초', - 'a_second' => '{1}몇초|]1,Inf[:count초', - 's' => ':count초', - 'ago' => ':time 전', - 'from_now' => ':time 후', - 'after' => ':time 후', - 'before' => ':time 전', - 'diff_now' => '지금', - 'diff_today' => '오늘', - 'diff_yesterday' => '어제', - 'diff_tomorrow' => '내일', - 'formats' => [ - 'LT' => 'A h:mm', - 'LTS' => 'A h:mm:ss', - 'L' => 'YYYY.MM.DD.', - 'LL' => 'YYYY년 MMMM D일', - 'LLL' => 'YYYY년 MMMM D일 A h:mm', - 'LLLL' => 'YYYY년 MMMM D일 dddd A h:mm', - ], - 'calendar' => [ - 'sameDay' => '오늘 LT', - 'nextDay' => '내일 LT', - 'nextWeek' => 'dddd LT', - 'lastDay' => '어제 LT', - 'lastWeek' => '지난주 dddd LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number, $period) { - return match ($period) { - 'd', 'D', 'DDD' => $number.'일', - 'M' => $number.'월', - 'w', 'W' => $number.'주', - default => $number, - }; - }, - 'meridiem' => ['오전', '오후'], - 'months' => ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], - 'months_short' => ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], - 'weekdays' => ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'], - 'weekdays_short' => ['일', '월', '화', '수', '목', '금', '토'], - 'weekdays_min' => ['일', '월', '화', '수', '목', '금', '토'], - 'list' => ' ', -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php b/vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php deleted file mode 100644 index 4ba802b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ko.php', [ - 'first_day_of_week' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php deleted file mode 100644 index 9d873a2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ko.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kok.php b/vendor/nesbot/carbon/src/Carbon/Lang/kok.php deleted file mode 100644 index 4adcddc..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kok.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/kok_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php deleted file mode 100644 index c6110d5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D-M-YY', - ], - 'months' => ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ओगस्ट', 'सेप्टेंबर', 'ओक्टोबर', 'नोव्हेंबर', 'डिसेंबर'], - 'months_short' => ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ओगस्ट', 'सेप्टेंबर', 'ओक्टोबर', 'नोव्हेंबर', 'डिसेंबर'], - 'weekdays' => ['आयतार', 'सोमार', 'मंगळवार', 'बुधवार', 'बेरेसतार', 'शुकरार', 'शेनवार'], - 'weekdays_short' => ['आयतार', 'सोमार', 'मंगळवार', 'बुधवार', 'बेरेसतार', 'शुकरार', 'शेनवार'], - 'weekdays_min' => ['आयतार', 'सोमार', 'मंगळवार', 'बुधवार', 'बेरेसतार', 'शुकरार', 'शेनवार'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['म.पू.', 'म.नं.'], - - 'year' => ':count वैशाकु', // less reliable - 'y' => ':count वैशाकु', // less reliable - 'a_year' => ':count वैशाकु', // less reliable - - 'week' => ':count आदित्यवार', // less reliable - 'w' => ':count आदित्यवार', // less reliable - 'a_week' => ':count आदित्यवार', // less reliable - - 'minute' => ':count नोंद', // less reliable - 'min' => ':count नोंद', // less reliable - 'a_minute' => ':count नोंद', // less reliable - - 'second' => ':count तेंको', // less reliable - 's' => ':count तेंको', // less reliable - 'a_second' => ':count तेंको', // less reliable - - 'month' => ':count मैनो', - 'm' => ':count मैनो', - 'a_month' => ':count मैनो', - - 'day' => ':count दिवसु', - 'd' => ':count दिवसु', - 'a_day' => ':count दिवसु', - - 'hour' => ':count घंते', - 'h' => ':count घंते', - 'a_hour' => ':count घंते', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ks.php b/vendor/nesbot/carbon/src/Carbon/Lang/ks.php deleted file mode 100644 index 9876079..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ks.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ks_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php deleted file mode 100644 index 4ec598f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'M/D/YY', - ], - 'months' => ['جنؤری', 'فرؤری', 'مارٕچ', 'اپریل', 'میٔ', 'جوٗن', 'جوٗلایی', 'اگست', 'ستمبر', 'اکتوٗبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنؤری', 'فرؤری', 'مارٕچ', 'اپریل', 'میٔ', 'جوٗن', 'جوٗلایی', 'اگست', 'ستمبر', 'اکتوٗبر', 'نومبر', 'دسمبر'], - 'weekdays' => ['آتهوار', 'ژءندروار', 'بوءںوار', 'بودهوار', 'برىسوار', 'جمع', 'بٹوار'], - 'weekdays_short' => ['آتهوار', 'ژءنتروار', 'بوءںوار', 'بودهوار', 'برىسوار', 'جمع', 'بٹوار'], - 'weekdays_min' => ['آتهوار', 'ژءنتروار', 'بوءںوار', 'بودهوار', 'برىسوار', 'جمع', 'بٹوار'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['دوپھربرونھ', 'دوپھرپتھ'], - - 'year' => ':count آب', // less reliable - 'y' => ':count آب', // less reliable - 'a_year' => ':count آب', // less reliable - - 'month' => ':count रान्', // less reliable - 'm' => ':count रान्', // less reliable - 'a_month' => ':count रान्', // less reliable - - 'week' => ':count آتھٕوار', // less reliable - 'w' => ':count آتھٕوار', // less reliable - 'a_week' => ':count آتھٕوار', // less reliable - - 'hour' => ':count سۄن', // less reliable - 'h' => ':count سۄن', // less reliable - 'a_hour' => ':count سۄن', // less reliable - - 'minute' => ':count فَن', // less reliable - 'min' => ':count فَن', // less reliable - 'a_minute' => ':count فَن', // less reliable - - 'second' => ':count दोʼयुम', // less reliable - 's' => ':count दोʼयुम', // less reliable - 'a_second' => ':count दोʼयुम', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php b/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php deleted file mode 100644 index 0708f3f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - ks-gnome-trans-commits@lists.code.indlinux.net - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'M/D/YY', - ], - 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'weekdays' => ['आथवार', 'चॅ़दुरवार', 'बोमवार', 'ब्वदवार', 'ब्रसवार', 'शोकुरवार', 'बटुवार'], - 'weekdays_short' => ['आथ ', 'चॅ़दुर', 'बोम', 'ब्वद', 'ब्रस', 'शोकुर', 'बटु'], - 'weekdays_min' => ['आथ ', 'चॅ़दुर', 'बोम', 'ब्वद', 'ब्रस', 'शोकुर', 'बटु'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ksb.php b/vendor/nesbot/carbon/src/Carbon/Lang/ksb.php deleted file mode 100644 index aaa0061..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ksb.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['makeo', 'nyiaghuo'], - 'weekdays' => ['Jumaapii', 'Jumaatatu', 'Jumaane', 'Jumaatano', 'Alhamisi', 'Ijumaa', 'Jumaamosi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jmn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jmn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Januali', 'Febluali', 'Machi', 'Aplili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ksf.php b/vendor/nesbot/carbon/src/Carbon/Lang/ksf.php deleted file mode 100644 index 84a5967..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ksf.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['sárúwá', 'cɛɛ́nko'], - 'weekdays' => ['sɔ́ndǝ', 'lǝndí', 'maadí', 'mɛkrɛdí', 'jǝǝdí', 'júmbá', 'samdí'], - 'weekdays_short' => ['sɔ́n', 'lǝn', 'maa', 'mɛk', 'jǝǝ', 'júm', 'sam'], - 'weekdays_min' => ['sɔ́n', 'lǝn', 'maa', 'mɛk', 'jǝǝ', 'júm', 'sam'], - 'months' => ['ŋwíí a ntɔ́ntɔ', 'ŋwíí akǝ bɛ́ɛ', 'ŋwíí akǝ ráá', 'ŋwíí akǝ nin', 'ŋwíí akǝ táan', 'ŋwíí akǝ táafɔk', 'ŋwíí akǝ táabɛɛ', 'ŋwíí akǝ táaraa', 'ŋwíí akǝ táanin', 'ŋwíí akǝ ntɛk', 'ŋwíí akǝ ntɛk di bɔ́k', 'ŋwíí akǝ ntɛk di bɛ́ɛ'], - 'months_short' => ['ŋ1', 'ŋ2', 'ŋ3', 'ŋ4', 'ŋ5', 'ŋ6', 'ŋ7', 'ŋ8', 'ŋ9', 'ŋ10', 'ŋ11', 'ŋ12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ksh.php b/vendor/nesbot/carbon/src/Carbon/Lang/ksh.php deleted file mode 100644 index 95457e2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ksh.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['v.M.', 'n.M.'], - 'weekdays' => ['Sunndaach', 'Mohndaach', 'Dinnsdaach', 'Metwoch', 'Dunnersdaach', 'Friidaach', 'Samsdaach'], - 'weekdays_short' => ['Su.', 'Mo.', 'Di.', 'Me.', 'Du.', 'Fr.', 'Sa.'], - 'weekdays_min' => ['Su', 'Mo', 'Di', 'Me', 'Du', 'Fr', 'Sa'], - 'months' => ['Jannewa', 'Fäbrowa', 'Määz', 'Aprell', 'Mai', 'Juuni', 'Juuli', 'Oujoß', 'Septämber', 'Oktohber', 'Novämber', 'Dezämber'], - 'months_short' => ['Jan', 'Fäb', 'Mäz', 'Apr', 'Mai', 'Jun', 'Jul', 'Ouj', 'Säp', 'Okt', 'Nov', 'Dez'], - 'months_short_standalone' => ['Jan.', 'Fäb.', 'Mäz.', 'Apr.', 'Mai', 'Jun.', 'Jul.', 'Ouj.', 'Säp.', 'Okt.', 'Nov.', 'Dez.'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D. M. YYYY', - 'LL' => 'D. MMM. YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd, [dä] D. MMMM YYYY HH:mm', - ], - - 'year' => ':count Johr', - 'y' => ':count Johr', - 'a_year' => ':count Johr', - - 'month' => ':count Moohnd', - 'm' => ':count Moohnd', - 'a_month' => ':count Moohnd', - - 'week' => ':count woch', - 'w' => ':count woch', - 'a_week' => ':count woch', - - 'day' => ':count Daach', - 'd' => ':count Daach', - 'a_day' => ':count Daach', - - 'hour' => ':count Uhr', - 'h' => ':count Uhr', - 'a_hour' => ':count Uhr', - - 'minute' => ':count Menutt', - 'min' => ':count Menutt', - 'a_minute' => ':count Menutt', - - 'second' => ':count Sekůndt', - 's' => ':count Sekůndt', - 'a_second' => ':count Sekůndt', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ku.php b/vendor/nesbot/carbon/src/Carbon/Lang/ku.php deleted file mode 100644 index 074b076..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ku.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Unicode, Inc. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'ago' => 'berî :time', - 'from_now' => 'di :time de', - 'after' => ':time piştî', - 'before' => ':time berê', - 'year' => ':count sal', - 'a_year' => ':count sal', - 'y' => ':count sal', - 'year_ago' => ':count salê|:count salan', - 'y_ago' => ':count salê|:count salan', - 'year_from_now' => 'salekê|:count salan', - 'y_from_now' => 'salekê|:count salan', - 'month' => ':count meh', - 'a_month' => ':count meh', - 'm' => ':count meh', - 'week' => ':count hefte', - 'a_week' => ':count hefte', - 'w' => ':count hefte', - 'day' => ':count roj', - 'a_day' => ':count roj', - 'd' => ':count roj', - 'hour' => ':count saet', - 'a_hour' => ':count saet', - 'h' => ':count saet', - 'minute' => ':count deqîqe', - 'a_minute' => ':count deqîqe', - 'min' => ':count deqîqe', - 'second' => ':count saniye', - 'a_second' => ':count saniye', - 's' => ':count saniye', - 'months' => ['rêbendanê', 'reşemiyê', 'adarê', 'avrêlê', 'gulanê', 'pûşperê', 'tîrmehê', 'gelawêjê', 'rezberê', 'kewçêrê', 'sermawezê', 'berfanbarê'], - 'months_standalone' => ['rêbendan', 'reşemî', 'adar', 'avrêl', 'gulan', 'pûşper', 'tîrmeh', 'gelawêj', 'rezber', 'kewçêr', 'sermawez', 'berfanbar'], - 'months_short' => ['rêb', 'reş', 'ada', 'avr', 'gul', 'pûş', 'tîr', 'gel', 'rez', 'kew', 'ser', 'ber'], - 'weekdays' => ['yekşem', 'duşem', 'sêşem', 'çarşem', 'pêncşem', 'în', 'şemî'], - 'weekdays_short' => ['yş', 'dş', 'sş', 'çş', 'pş', 'în', 'ş'], - 'weekdays_min' => ['Y', 'D', 'S', 'Ç', 'P', 'Î', 'Ş'], - 'list' => [', ', ' û '], - 'ordinal' => ':number', - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php deleted file mode 100644 index 4243a82..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ku.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kw.php b/vendor/nesbot/carbon/src/Carbon/Lang/kw.php deleted file mode 100644 index 26e242e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kw.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/kw_GB.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php b/vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php deleted file mode 100644 index 00bf52b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Alastair McKinstry bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['mis Genver', 'mis Hwevrer', 'mis Meurth', 'mis Ebrel', 'mis Me', 'mis Metheven', 'mis Gortheren', 'mis Est', 'mis Gwynngala', 'mis Hedra', 'mis Du', 'mis Kevardhu'], - 'months_short' => ['Gen', 'Hwe', 'Meu', 'Ebr', 'Me', 'Met', 'Gor', 'Est', 'Gwn', 'Hed', 'Du', 'Kev'], - 'weekdays' => ['De Sul', 'De Lun', 'De Merth', 'De Merher', 'De Yow', 'De Gwener', 'De Sadorn'], - 'weekdays_short' => ['Sul', 'Lun', 'Mth', 'Mhr', 'Yow', 'Gwe', 'Sad'], - 'weekdays_min' => ['Sul', 'Lun', 'Mth', 'Mhr', 'Yow', 'Gwe', 'Sad'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count bledhen', - 'y' => ':count bledhen', - 'a_year' => ':count bledhen', - - 'month' => ':count mis', - 'm' => ':count mis', - 'a_month' => ':count mis', - - 'week' => ':count seythen', - 'w' => ':count seythen', - 'a_week' => ':count seythen', - - 'day' => ':count dydh', - 'd' => ':count dydh', - 'a_day' => ':count dydh', - - 'hour' => ':count eur', - 'h' => ':count eur', - 'a_hour' => ':count eur', - - 'minute' => ':count mynysen', - 'min' => ':count mynysen', - 'a_minute' => ':count mynysen', - - 'second' => ':count pryjwyth', - 's' => ':count pryjwyth', - 'a_second' => ':count pryjwyth', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ky.php b/vendor/nesbot/carbon/src/Carbon/Lang/ky.php deleted file mode 100644 index 2cb8503..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ky.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - acutexyz - * - Josh Soref - * - François B - * - Chyngyz Arystan uulu - * - Chyngyz - * - acutexyz - * - Josh Soref - * - François B - * - Chyngyz Arystan uulu - */ -return [ - 'year' => ':count жыл', - 'a_year' => '{1}бир жыл|:count жыл', - 'y' => ':count жыл', - 'month' => ':count ай', - 'a_month' => '{1}бир ай|:count ай', - 'm' => ':count ай', - 'week' => ':count апта', - 'a_week' => '{1}бир апта|:count апта', - 'w' => ':count апт.', - 'day' => ':count күн', - 'a_day' => '{1}бир күн|:count күн', - 'd' => ':count күн', - 'hour' => ':count саат', - 'a_hour' => '{1}бир саат|:count саат', - 'h' => ':count саат.', - 'minute' => ':count мүнөт', - 'a_minute' => '{1}бир мүнөт|:count мүнөт', - 'min' => ':count мүн.', - 'second' => ':count секунд', - 'a_second' => '{1}бирнече секунд|:count секунд', - 's' => ':count сек.', - 'ago' => ':time мурун', - 'from_now' => ':time ичинде', - 'diff_now' => 'азыр', - 'diff_today' => 'Бүгүн', - 'diff_today_regexp' => 'Бүгүн(?:\\s+саат)?', - 'diff_yesterday' => 'кечээ', - 'diff_yesterday_regexp' => 'Кече(?:\\s+саат)?', - 'diff_tomorrow' => 'эртең', - 'diff_tomorrow_regexp' => 'Эртең(?:\\s+саат)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Бүгүн саат] LT', - 'nextDay' => '[Эртең саат] LT', - 'nextWeek' => 'dddd [саат] LT', - 'lastDay' => '[Кече саат] LT', - 'lastWeek' => '[Өткен аптанын] dddd [күнү] [саат] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - static $suffixes = [ - 0 => '-чү', - 1 => '-чи', - 2 => '-чи', - 3 => '-чү', - 4 => '-чү', - 5 => '-чи', - 6 => '-чы', - 7 => '-чи', - 8 => '-чи', - 9 => '-чу', - 10 => '-чу', - 20 => '-чы', - 30 => '-чу', - 40 => '-чы', - 50 => '-чү', - 60 => '-чы', - 70 => '-чи', - 80 => '-чи', - 90 => '-чу', - 100 => '-чү', - ]; - - return $number.($suffixes[$number] ?? $suffixes[$number % 10] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); - }, - 'months' => ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'], - 'months_short' => ['янв', 'фев', 'март', 'апр', 'май', 'июнь', 'июль', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'weekdays' => ['Жекшемби', 'Дүйшөмбү', 'Шейшемби', 'Шаршемби', 'Бейшемби', 'Жума', 'Ишемби'], - 'weekdays_short' => ['Жек', 'Дүй', 'Шей', 'Шар', 'Бей', 'Жум', 'Ише'], - 'weekdays_min' => ['Жк', 'Дй', 'Шй', 'Шр', 'Бй', 'Жм', 'Иш'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => ' ', - 'meridiem' => ['таңкы', 'түштөн кийинки'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php deleted file mode 100644 index 9923a31..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ky.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lag.php b/vendor/nesbot/carbon/src/Carbon/Lang/lag.php deleted file mode 100644 index f3f57f6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lag.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['TOO', 'MUU'], - 'weekdays' => ['Jumapíiri', 'Jumatátu', 'Jumaíne', 'Jumatáano', 'Alamíisi', 'Ijumáa', 'Jumamóosi'], - 'weekdays_short' => ['Píili', 'Táatu', 'Íne', 'Táano', 'Alh', 'Ijm', 'Móosi'], - 'weekdays_min' => ['Píili', 'Táatu', 'Íne', 'Táano', 'Alh', 'Ijm', 'Móosi'], - 'months' => ['Kʉfúngatɨ', 'Kʉnaanɨ', 'Kʉkeenda', 'Kwiikumi', 'Kwiinyambála', 'Kwiidwaata', 'Kʉmʉʉnchɨ', 'Kʉvɨɨrɨ', 'Kʉsaatʉ', 'Kwiinyi', 'Kʉsaano', 'Kʉsasatʉ'], - 'months_short' => ['Fúngatɨ', 'Naanɨ', 'Keenda', 'Ikúmi', 'Inyambala', 'Idwaata', 'Mʉʉnchɨ', 'Vɨɨrɨ', 'Saatʉ', 'Inyi', 'Saano', 'Sasatʉ'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lb.php b/vendor/nesbot/carbon/src/Carbon/Lang/lb.php deleted file mode 100644 index 72267b7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lb.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - dan-nl - * - Simon Lelorrain (slelorrain) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count Joer', - 'y' => ':countJ', - 'month' => ':count Mount|:count Méint', - 'm' => ':countMo', - 'week' => ':count Woch|:count Wochen', - 'w' => ':countWo|:countWo', - 'day' => ':count Dag|:count Deeg', - 'd' => ':countD', - 'hour' => ':count Stonn|:count Stonnen', - 'h' => ':countSto', - 'minute' => ':count Minutt|:count Minutten', - 'min' => ':countM', - 'second' => ':count Sekonn|:count Sekonnen', - 's' => ':countSek', - - 'ago' => 'virun :time', - 'from_now' => 'an :time', - 'before' => ':time virdrun', - 'after' => ':time duerno', - - 'diff_today' => 'Haut', - 'diff_yesterday' => 'Gëschter', - 'diff_yesterday_regexp' => 'Gëschter(?:\\s+um)?', - 'diff_tomorrow' => 'Muer', - 'diff_tomorrow_regexp' => 'Muer(?:\\s+um)?', - 'diff_today_regexp' => 'Haut(?:\\s+um)?', - 'formats' => [ - 'LT' => 'H:mm [Auer]', - 'LTS' => 'H:mm:ss [Auer]', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm [Auer]', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm [Auer]', - ], - - 'calendar' => [ - 'sameDay' => '[Haut um] LT', - 'nextDay' => '[Muer um] LT', - 'nextWeek' => 'dddd [um] LT', - 'lastDay' => '[Gëschter um] LT', - 'lastWeek' => static function (CarbonInterface $date) { - // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule - return match ($date->dayOfWeek) { - 2, 4 => '[Leschten] dddd [um] LT', - default => '[Leschte] dddd [um] LT', - }; - }, - 'sameElse' => 'L', - ], - - 'months' => ['Januar', 'Februar', 'Mäerz', 'Abrëll', 'Mee', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], - 'months_short' => ['Jan.', 'Febr.', 'Mrz.', 'Abr.', 'Mee', 'Jun.', 'Jul.', 'Aug.', 'Sept.', 'Okt.', 'Nov.', 'Dez.'], - 'weekdays' => ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'], - 'weekdays_short' => ['So.', 'Mé.', 'Dë.', 'Më.', 'Do.', 'Fr.', 'Sa.'], - 'weekdays_min' => ['So', 'Mé', 'Dë', 'Më', 'Do', 'Fr', 'Sa'], - 'ordinal' => ':number.', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' an '], - 'meridiem' => ['moies', 'mëttes'], - 'weekdays_short_standalone' => ['Son', 'Méi', 'Dën', 'Mët', 'Don', 'Fre', 'Sam'], - 'months_short_standalone' => ['Jan', 'Feb', 'Mäe', 'Abr', 'Mee', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php b/vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php deleted file mode 100644 index 414bd4d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/lb.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lg.php b/vendor/nesbot/carbon/src/Carbon/Lang/lg.php deleted file mode 100644 index 48bc68b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lg.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/lg_UG.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php b/vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php deleted file mode 100644 index aa02214..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Akademe ya Luganda Kizito Birabwa kompyuta@kizito.uklinux.net - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Janwaliyo', 'Febwaliyo', 'Marisi', 'Apuli', 'Maayi', 'Juuni', 'Julaayi', 'Agusito', 'Sebuttemba', 'Okitobba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apu', 'Maa', 'Juu', 'Jul', 'Agu', 'Seb', 'Oki', 'Nov', 'Des'], - 'weekdays' => ['Sabiiti', 'Balaza', 'Lwakubiri', 'Lwakusatu', 'Lwakuna', 'Lwakutaano', 'Lwamukaaga'], - 'weekdays_short' => ['Sab', 'Bal', 'Lw2', 'Lw3', 'Lw4', 'Lw5', 'Lw6'], - 'weekdays_min' => ['Sab', 'Bal', 'Lw2', 'Lw3', 'Lw4', 'Lw5', 'Lw6'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'month' => ':count njuba', // less reliable - 'm' => ':count njuba', // less reliable - 'a_month' => ':count njuba', // less reliable - - 'year' => ':count mwaaka', - 'y' => ':count mwaaka', - 'a_year' => ':count mwaaka', - - 'week' => ':count sabbiiti', - 'w' => ':count sabbiiti', - 'a_week' => ':count sabbiiti', - - 'day' => ':count lunaku', - 'd' => ':count lunaku', - 'a_day' => ':count lunaku', - - 'hour' => 'saawa :count', - 'h' => 'saawa :count', - 'a_hour' => 'saawa :count', - - 'minute' => 'ddakiika :count', - 'min' => 'ddakiika :count', - 'a_minute' => 'ddakiika :count', - - 'second' => ':count kyʼokubiri', - 's' => ':count kyʼokubiri', - 'a_second' => ':count kyʼokubiri', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/li.php b/vendor/nesbot/carbon/src/Carbon/Lang/li.php deleted file mode 100644 index 86c3009..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/li.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/li_NL.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php b/vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php deleted file mode 100644 index 6c5feb7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['jannewarie', 'fibberwarie', 'miert', 'eprèl', 'meij', 'junie', 'julie', 'augustus', 'september', 'oktober', 'november', 'desember'], - 'months_short' => ['jan', 'fib', 'mie', 'epr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['zóndig', 'maondig', 'daensdig', 'goonsdig', 'dónderdig', 'vriedig', 'zaoterdig'], - 'weekdays_short' => ['zón', 'mao', 'dae', 'goo', 'dón', 'vri', 'zao'], - 'weekdays_min' => ['zón', 'mao', 'dae', 'goo', 'dón', 'vri', 'zao'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'minute' => ':count momênt', // less reliable - 'min' => ':count momênt', // less reliable - 'a_minute' => ':count momênt', // less reliable - - 'year' => ':count jaor', - 'y' => ':count jaor', - 'a_year' => ':count jaor', - - 'month' => ':count maond', - 'm' => ':count maond', - 'a_month' => ':count maond', - - 'week' => ':count waek', - 'w' => ':count waek', - 'a_week' => ':count waek', - - 'day' => ':count daag', - 'd' => ':count daag', - 'a_day' => ':count daag', - - 'hour' => ':count oer', - 'h' => ':count oer', - 'a_hour' => ':count oer', - - 'second' => ':count Secónd', - 's' => ':count Secónd', - 'a_second' => ':count Secónd', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lij.php b/vendor/nesbot/carbon/src/Carbon/Lang/lij.php deleted file mode 100644 index 45732b5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lij.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/lij_IT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php deleted file mode 100644 index f8726fd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Gastaldi alessio.gastaldi@libero.it - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['zenâ', 'fevrâ', 'marzo', 'avrî', 'mazzo', 'zûgno', 'lûggio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dixembre'], - 'months_short' => ['zen', 'fev', 'mar', 'arv', 'maz', 'zûg', 'lûg', 'ago', 'set', 'ött', 'nov', 'dix'], - 'weekdays' => ['domenega', 'lûnedì', 'martedì', 'mercUrdì', 'zêggia', 'venardì', 'sabbo'], - 'weekdays_short' => ['dom', 'lûn', 'mar', 'mer', 'zêu', 'ven', 'sab'], - 'weekdays_min' => ['dom', 'lûn', 'mar', 'mer', 'zêu', 'ven', 'sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count etæ', // less reliable - 'y' => ':count etæ', // less reliable - 'a_year' => ':count etæ', // less reliable - - 'month' => ':count meize', - 'm' => ':count meize', - 'a_month' => ':count meize', - - 'week' => ':count settemannha', - 'w' => ':count settemannha', - 'a_week' => ':count settemannha', - - 'day' => ':count giorno', - 'd' => ':count giorno', - 'a_day' => ':count giorno', - - 'hour' => ':count reléuio', // less reliable - 'h' => ':count reléuio', // less reliable - 'a_hour' => ':count reléuio', // less reliable - - 'minute' => ':count menûo', - 'min' => ':count menûo', - 'a_minute' => ':count menûo', - - 'second' => ':count segondo', - 's' => ':count segondo', - 'a_second' => ':count segondo', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lkt.php b/vendor/nesbot/carbon/src/Carbon/Lang/lkt.php deleted file mode 100644 index a5485fb..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lkt.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - - 'month' => ':count haŋwí', // less reliable - 'm' => ':count haŋwí', // less reliable - 'a_month' => ':count haŋwí', // less reliable - - 'week' => ':count šakówiŋ', // less reliable - 'w' => ':count šakówiŋ', // less reliable - 'a_week' => ':count šakówiŋ', // less reliable - - 'hour' => ':count maza škaŋškaŋ', // less reliable - 'h' => ':count maza škaŋškaŋ', // less reliable - 'a_hour' => ':count maza škaŋškaŋ', // less reliable - - 'minute' => ':count číkʼala', // less reliable - 'min' => ':count číkʼala', // less reliable - 'a_minute' => ':count číkʼala', // less reliable - - 'year' => ':count waníyetu', - 'y' => ':count waníyetu', - 'a_year' => ':count waníyetu', - - 'day' => ':count aŋpétu', - 'd' => ':count aŋpétu', - 'a_day' => ':count aŋpétu', - - 'second' => ':count icinuŋpa', - 's' => ':count icinuŋpa', - 'a_second' => ':count icinuŋpa', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ln.php b/vendor/nesbot/carbon/src/Carbon/Lang/ln.php deleted file mode 100644 index 9d5c35d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ln.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ubuntu René Manassé GALEKWA renemanasse@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'months' => ['sánzá ya yambo', 'sánzá ya míbalé', 'sánzá ya mísáto', 'sánzá ya mínei', 'sánzá ya mítáno', 'sánzá ya motóbá', 'sánzá ya nsambo', 'sánzá ya mwambe', 'sánzá ya libwa', 'sánzá ya zómi', 'sánzá ya zómi na mɔ̌kɔ́', 'sánzá ya zómi na míbalé'], - 'months_short' => ['yan', 'fbl', 'msi', 'apl', 'mai', 'yun', 'yul', 'agt', 'stb', 'ɔtb', 'nvb', 'dsb'], - 'weekdays' => ['Lomíngo', 'Mosálá mɔ̌kɔ́', 'Misálá míbalé', 'Misálá mísáto', 'Misálá mínei', 'Misálá mítáno', 'Mpɔ́sɔ'], - 'weekdays_short' => ['m1.', 'm2.', 'm3.', 'm4.', 'm5.', 'm6.', 'm7.'], - 'weekdays_min' => ['m1.', 'm2.', 'm3.', 'm4.', 'm5.', 'm6.', 'm7.'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => 'mbula :count', - 'y' => 'mbula :count', - 'a_year' => 'mbula :count', - - 'month' => 'sánzá :count', - 'm' => 'sánzá :count', - 'a_month' => 'sánzá :count', - - 'week' => 'mpɔ́sɔ :count', - 'w' => 'mpɔ́sɔ :count', - 'a_week' => 'mpɔ́sɔ :count', - - 'day' => 'mokɔlɔ :count', - 'd' => 'mokɔlɔ :count', - 'a_day' => 'mokɔlɔ :count', - - 'hour' => 'ngonga :count', - 'h' => 'ngonga :count', - 'a_hour' => 'ngonga :count', - - 'minute' => 'miniti :count', - 'min' => 'miniti :count', - 'a_minute' => 'miniti :count', - - 'second' => 'segɔnde :count', - 's' => 'segɔnde :count', - 'a_second' => 'segɔnde :count', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php b/vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php deleted file mode 100644 index 7fdb7f1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ln.php', [ - 'weekdays' => ['eyenga', 'mokɔlɔ mwa yambo', 'mokɔlɔ mwa míbalé', 'mokɔlɔ mwa mísáto', 'mokɔlɔ ya mínéi', 'mokɔlɔ ya mítáno', 'mpɔ́sɔ'], - 'weekdays_short' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'weekdays_min' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'meridiem' => ['ntɔ́ngɔ́', 'mpókwa'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php deleted file mode 100644 index 13635fc..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ubuntu René Manassé GALEKWA renemanasse@gmail.com - */ -return require __DIR__.'/ln.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php b/vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php deleted file mode 100644 index 7fdb7f1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ln.php', [ - 'weekdays' => ['eyenga', 'mokɔlɔ mwa yambo', 'mokɔlɔ mwa míbalé', 'mokɔlɔ mwa mísáto', 'mokɔlɔ ya mínéi', 'mokɔlɔ ya mítáno', 'mpɔ́sɔ'], - 'weekdays_short' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'weekdays_min' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'meridiem' => ['ntɔ́ngɔ́', 'mpókwa'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php deleted file mode 100644 index 7fdb7f1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ln.php', [ - 'weekdays' => ['eyenga', 'mokɔlɔ mwa yambo', 'mokɔlɔ mwa míbalé', 'mokɔlɔ mwa mísáto', 'mokɔlɔ ya mínéi', 'mokɔlɔ ya mítáno', 'mpɔ́sɔ'], - 'weekdays_short' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'weekdays_min' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'meridiem' => ['ntɔ́ngɔ́', 'mpókwa'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lo.php b/vendor/nesbot/carbon/src/Carbon/Lang/lo.php deleted file mode 100644 index 48715f5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lo.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - ryanhart2 - */ -return [ - 'year' => ':count ປີ', - 'y' => ':count ປີ', - 'month' => ':count ເດືອນ', - 'm' => ':count ດ. ', - 'week' => ':count ອາທິດ', - 'w' => ':count ອທ. ', - 'day' => ':count ມື້', - 'd' => ':count ມື້', - 'hour' => ':count ຊົ່ວໂມງ', - 'h' => ':count ຊມ. ', - 'minute' => ':count ນາທີ', - 'min' => ':count ນທ. ', - 'second' => '{1}ບໍ່ເທົ່າໃດວິນາທີ|]1,Inf[:count ວິນາທີ', - 's' => ':count ວິ. ', - 'ago' => ':timeຜ່ານມາ', - 'from_now' => 'ອີກ :time', - 'diff_now' => 'ຕອນນີ້', - 'diff_today' => 'ມື້ນີ້ເວລາ', - 'diff_yesterday' => 'ມື້ວານນີ້ເວລາ', - 'diff_tomorrow' => 'ມື້ອື່ນເວລາ', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'ວັນdddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[ມື້ນີ້ເວລາ] LT', - 'nextDay' => '[ມື້ອື່ນເວລາ] LT', - 'nextWeek' => '[ວັນ]dddd[ໜ້າເວລາ] LT', - 'lastDay' => '[ມື້ວານນີ້ເວລາ] LT', - 'lastWeek' => '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', - 'sameElse' => 'L', - ], - 'ordinal' => 'ທີ່:number', - 'meridiem' => ['ຕອນເຊົ້າ', 'ຕອນແລງ'], - 'months' => ['ມັງກອນ', 'ກຸມພາ', 'ມີນາ', 'ເມສາ', 'ພຶດສະພາ', 'ມິຖຸນາ', 'ກໍລະກົດ', 'ສິງຫາ', 'ກັນຍາ', 'ຕຸລາ', 'ພະຈິກ', 'ທັນວາ'], - 'months_short' => ['ມັງກອນ', 'ກຸມພາ', 'ມີນາ', 'ເມສາ', 'ພຶດສະພາ', 'ມິຖຸນາ', 'ກໍລະກົດ', 'ສິງຫາ', 'ກັນຍາ', 'ຕຸລາ', 'ພະຈິກ', 'ທັນວາ'], - 'weekdays' => ['ອາທິດ', 'ຈັນ', 'ອັງຄານ', 'ພຸດ', 'ພະຫັດ', 'ສຸກ', 'ເສົາ'], - 'weekdays_short' => ['ທິດ', 'ຈັນ', 'ອັງຄານ', 'ພຸດ', 'ພະຫັດ', 'ສຸກ', 'ເສົາ'], - 'weekdays_min' => ['ທ', 'ຈ', 'ອຄ', 'ພ', 'ພຫ', 'ສກ', 'ສ'], - 'list' => [', ', 'ແລະ '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php b/vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php deleted file mode 100644 index 9b7fd9b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/lo.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lrc.php b/vendor/nesbot/carbon/src/Carbon/Lang/lrc.php deleted file mode 100644 index 31cfc84..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lrc.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - - 'minute' => ':count هنر', // less reliable - 'min' => ':count هنر', // less reliable - 'a_minute' => ':count هنر', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php deleted file mode 100644 index 1ae546b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/lrc.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lt.php b/vendor/nesbot/carbon/src/Carbon/Lang/lt.php deleted file mode 100644 index 207b817..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lt.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - tjku - * - valdas406 - * - Justas Palumickas - * - Max Melentiev - * - Andrius Janauskas - * - Juanito Fatas - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Nicolás Hock Isaza - * - Laurynas Butkus - * - Sven Fuchs - * - Dominykas Tijūnaitis - * - Justinas Bolys - * - Ričardas - * - Kirill Chalkin - * - Rolandas - * - Justinas (Gamesh) - */ -return [ - 'year' => ':count metai|:count metai|:count metų', - 'y' => ':count m.', - 'month' => ':count mėnuo|:count mėnesiai|:count mėnesį', - 'm' => ':count mėn.', - 'week' => ':count savaitė|:count savaitės|:count savaitę', - 'w' => ':count sav.', - 'day' => ':count diena|:count dienos|:count dienų', - 'd' => ':count d.', - 'hour' => ':count valanda|:count valandos|:count valandų', - 'h' => ':count val.', - 'minute' => ':count minutė|:count minutės|:count minutę', - 'min' => ':count min.', - 'second' => ':count sekundė|:count sekundės|:count sekundžių', - 's' => ':count sek.', - - 'year_ago' => ':count metus|:count metus|:count metų', - 'month_ago' => ':count mėnesį|:count mėnesius|:count mėnesių', - 'week_ago' => ':count savaitę|:count savaites|:count savaičių', - 'day_ago' => ':count dieną|:count dienas|:count dienų', - 'hour_ago' => ':count valandą|:count valandas|:count valandų', - 'minute_ago' => ':count minutę|:count minutes|:count minučių', - 'second_ago' => ':count sekundę|:count sekundes|:count sekundžių', - - 'year_from_now' => ':count metų', - 'month_from_now' => ':count mėnesio|:count mėnesių|:count mėnesių', - 'week_from_now' => ':count savaitės|:count savaičių|:count savaičių', - 'day_from_now' => ':count dienos|:count dienų|:count dienų', - 'hour_from_now' => ':count valandos|:count valandų|:count valandų', - 'minute_from_now' => ':count minutės|:count minučių|:count minučių', - 'second_from_now' => ':count sekundės|:count sekundžių|:count sekundžių', - - 'year_after' => ':count metų', - 'month_after' => ':count mėnesio|:count mėnesių|:count mėnesių', - 'week_after' => ':count savaitės|:count savaičių|:count savaičių', - 'day_after' => ':count dienos|:count dienų|:count dienų', - 'hour_after' => ':count valandos|:count valandų|:count valandų', - 'minute_after' => ':count minutės|:count minučių|:count minučių', - 'second_after' => ':count sekundės|:count sekundžių|:count sekundžių', - - 'ago' => 'prieš :time', - 'from_now' => ':time nuo dabar', - 'after' => 'po :time', - 'before' => 'už :time', - - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'diff_now' => 'ką tik', - 'diff_today' => 'Šiandien', - 'diff_yesterday' => 'vakar', - 'diff_yesterday_regexp' => 'Vakar', - 'diff_tomorrow' => 'rytoj', - 'diff_tomorrow_regexp' => 'Rytoj', - 'diff_before_yesterday' => 'užvakar', - 'diff_after_tomorrow' => 'poryt', - - 'period_recurrences' => 'kartą|:count kartų', - 'period_interval' => 'kiekvieną :interval', - 'period_start_date' => 'nuo :date', - 'period_end_date' => 'iki :date', - - 'months' => ['sausio', 'vasario', 'kovo', 'balandžio', 'gegužės', 'birželio', 'liepos', 'rugpjūčio', 'rugsėjo', 'spalio', 'lapkričio', 'gruodžio'], - 'months_standalone' => ['sausis', 'vasaris', 'kovas', 'balandis', 'gegužė', 'birželis', 'liepa', 'rugpjūtis', 'rugsėjis', 'spalis', 'lapkritis', 'gruodis'], - 'months_regexp' => '/(L{2,4}|D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?)/', - 'months_short' => ['sau', 'vas', 'kov', 'bal', 'geg', 'bir', 'lie', 'rgp', 'rgs', 'spa', 'lap', 'gru'], - 'weekdays' => ['sekmadienį', 'pirmadienį', 'antradienį', 'trečiadienį', 'ketvirtadienį', 'penktadienį', 'šeštadienį'], - 'weekdays_standalone' => ['sekmadienis', 'pirmadienis', 'antradienis', 'trečiadienis', 'ketvirtadienis', 'penktadienis', 'šeštadienis'], - 'weekdays_short' => ['sek', 'pir', 'ant', 'tre', 'ket', 'pen', 'šeš'], - 'weekdays_min' => ['se', 'pi', 'an', 'tr', 'ke', 'pe', 'še'], - 'list' => [', ', ' ir '], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'MMMM DD, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Šiandien] LT', - 'nextDay' => '[Rytoj] LT', - 'nextWeek' => 'dddd LT', - 'lastDay' => '[Vakar] LT', - 'lastWeek' => '[Paskutinį] dddd LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - return match ($number) { - 0 => '0-is', - 3 => '3-ias', - default => "$number-as", - }; - }, - 'meridiem' => ['priešpiet', 'popiet'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php b/vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php deleted file mode 100644 index f772d38..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/lt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lu.php b/vendor/nesbot/carbon/src/Carbon/Lang/lu.php deleted file mode 100644 index c8cd83a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lu.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Dinda', 'Dilolo'], - 'weekdays' => ['Lumingu', 'Nkodya', 'Ndàayà', 'Ndangù', 'Njòwa', 'Ngòvya', 'Lubingu'], - 'weekdays_short' => ['Lum', 'Nko', 'Ndy', 'Ndg', 'Njw', 'Ngv', 'Lub'], - 'weekdays_min' => ['Lum', 'Nko', 'Ndy', 'Ndg', 'Njw', 'Ngv', 'Lub'], - 'months' => ['Ciongo', 'Lùishi', 'Lusòlo', 'Mùuyà', 'Lumùngùlù', 'Lufuimi', 'Kabàlàshìpù', 'Lùshìkà', 'Lutongolo', 'Lungùdi', 'Kaswèkèsè', 'Ciswà'], - 'months_short' => ['Cio', 'Lui', 'Lus', 'Muu', 'Lum', 'Luf', 'Kab', 'Lush', 'Lut', 'Lun', 'Kas', 'Cis'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/luo.php b/vendor/nesbot/carbon/src/Carbon/Lang/luo.php deleted file mode 100644 index 5d6ec7c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/luo.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['OD', 'OT'], - 'weekdays' => ['Jumapil', 'Wuok Tich', 'Tich Ariyo', 'Tich Adek', 'Tich Ang’wen', 'Tich Abich', 'Ngeso'], - 'weekdays_short' => ['JMP', 'WUT', 'TAR', 'TAD', 'TAN', 'TAB', 'NGS'], - 'weekdays_min' => ['JMP', 'WUT', 'TAR', 'TAD', 'TAN', 'TAB', 'NGS'], - 'months' => ['Dwe mar Achiel', 'Dwe mar Ariyo', 'Dwe mar Adek', 'Dwe mar Ang’wen', 'Dwe mar Abich', 'Dwe mar Auchiel', 'Dwe mar Abiriyo', 'Dwe mar Aboro', 'Dwe mar Ochiko', 'Dwe mar Apar', 'Dwe mar gi achiel', 'Dwe mar Apar gi ariyo'], - 'months_short' => ['DAC', 'DAR', 'DAD', 'DAN', 'DAH', 'DAU', 'DAO', 'DAB', 'DOC', 'DAP', 'DGI', 'DAG'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => 'higni :count', - 'y' => 'higni :count', - 'a_year' => ':higni :count', - - 'month' => 'dweche :count', - 'm' => 'dweche :count', - 'a_month' => 'dweche :count', - - 'week' => 'jumbe :count', - 'w' => 'jumbe :count', - 'a_week' => 'jumbe :count', - - 'day' => 'ndalo :count', - 'd' => 'ndalo :count', - 'a_day' => 'ndalo :count', - - 'hour' => 'seche :count', - 'h' => 'seche :count', - 'a_hour' => 'seche :count', - - 'minute' => 'dakika :count', - 'min' => 'dakika :count', - 'a_minute' => 'dakika :count', - - 'second' => 'nus dakika :count', - 's' => 'nus dakika :count', - 'a_second' => 'nus dakika :count', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/luy.php b/vendor/nesbot/carbon/src/Carbon/Lang/luy.php deleted file mode 100644 index ab92e84..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/luy.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'weekdays' => ['Jumapiri', 'Jumatatu', 'Jumanne', 'Jumatano', 'Murwa wa Kanne', 'Murwa wa Katano', 'Jumamosi'], - 'weekdays_short' => ['J2', 'J3', 'J4', 'J5', 'Al', 'Ij', 'J1'], - 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Al', 'Ij', 'J1'], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - // Too unreliable - /* - 'year' => ':count liliino', // less reliable - 'y' => ':count liliino', // less reliable - 'a_year' => ':count liliino', // less reliable - - 'month' => ':count kumwesi', // less reliable - 'm' => ':count kumwesi', // less reliable - 'a_month' => ':count kumwesi', // less reliable - - 'week' => ':count olutambi', // less reliable - 'w' => ':count olutambi', // less reliable - 'a_week' => ':count olutambi', // less reliable - - 'day' => ':count luno', // less reliable - 'd' => ':count luno', // less reliable - 'a_day' => ':count luno', // less reliable - - 'hour' => ':count ekengele', // less reliable - 'h' => ':count ekengele', // less reliable - 'a_hour' => ':count ekengele', // less reliable - - 'minute' => ':count omundu', // less reliable - 'min' => ':count omundu', // less reliable - 'a_minute' => ':count omundu', // less reliable - - 'second' => ':count liliino', // less reliable - 's' => ':count liliino', // less reliable - 'a_second' => ':count liliino', // less reliable - */ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lv.php b/vendor/nesbot/carbon/src/Carbon/Lang/lv.php deleted file mode 100644 index 6ff3551..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lv.php +++ /dev/null @@ -1,177 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Carbon\CarbonInterface; - -/** - * This file is part of the Carbon package. - * - * (c) Brian Nesbitt - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - pirminis - * - Tsutomu Kuroda - * - tjku - * - Andris Zāģeris - * - Max Melentiev - * - Edgars Beigarts - * - Juanito Fatas - * - Vitauts Stočka - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Kaspars Bankovskis - * - Nicolás Hock Isaza - * - Viesturs Kavacs (Kavacky) - * - zakse - * - Janis Eglitis (janiseglitis) - * - Guntars - * - Juris Sudmalis - */ -$daysOfWeek = ['svētdiena', 'pirmdiena', 'otrdiena', 'trešdiena', 'ceturtdiena', 'piektdiena', 'sestdiena']; -$daysOfWeekLocativum = ['svētdien', 'pirmdien', 'otrdien', 'trešdien', 'ceturtdien', 'piektdien', 'sestdien']; - -$transformDiff = static fn (string $input) => strtr($input, [ - // Nominative => "pirms/pēc" Dative - 'gads' => 'gada', - 'gadi' => 'gadiem', - 'gadu' => 'gadiem', - 'mēnesis' => 'mēneša', - 'mēneši' => 'mēnešiem', - 'mēnešu' => 'mēnešiem', - 'nedēļa' => 'nedēļas', - 'nedēļas' => 'nedēļām', - 'nedēļu' => 'nedēļām', - 'diena' => 'dienas', - 'dienas' => 'dienām', - 'dienu' => 'dienām', - 'stunda' => 'stundas', - 'stundas' => 'stundām', - 'stundu' => 'stundām', - 'minūte' => 'minūtes', - 'minūtes' => 'minūtēm', - 'minūšu' => 'minūtēm', - 'sekunde' => 'sekundes', - 'sekundes' => 'sekundēm', - 'sekunžu' => 'sekundēm', -]); - -return [ - 'ago' => static fn (string $time) => 'pirms '.$transformDiff($time), - 'from_now' => static fn (string $time) => 'pēc '.$transformDiff($time), - - 'year' => '0 gadu|:count gads|:count gadi', - 'y' => ':count g.', - 'a_year' => '{1}gads|0 gadu|:count gads|:count gadi', - 'month' => '0 mēnešu|:count mēnesis|:count mēneši', - 'm' => ':count mēn.', - 'a_month' => '{1}mēnesis|0 mēnešu|:count mēnesis|:count mēneši', - 'week' => '0 nedēļu|:count nedēļa|:count nedēļas', - 'w' => ':count ned.', - 'a_week' => '{1}nedēļa|0 nedēļu|:count nedēļa|:count nedēļas', - 'day' => '0 dienu|:count diena|:count dienas', - 'd' => ':count d.', - 'a_day' => '{1}diena|0 dienu|:count diena|:count dienas', - 'hour' => '0 stundu|:count stunda|:count stundas', - 'h' => ':count st.', - 'a_hour' => '{1}stunda|0 stundu|:count stunda|:count stundas', - 'minute' => '0 minūšu|:count minūte|:count minūtes', - 'min' => ':count min.', - 'a_minute' => '{1}minūte|0 minūšu|:count minūte|:count minūtes', - 'second' => '0 sekunžu|:count sekunde|:count sekundes', - 's' => ':count sek.', - 'a_second' => '{1}sekunde|0 sekunžu|:count sekunde|:count sekundes', - - 'after' => ':time vēlāk', - 'year_after' => '0 gadus|:count gadu|:count gadus', - 'a_year_after' => '{1}gadu|0 gadus|:count gadu|:count gadus', - 'month_after' => '0 mēnešus|:count mēnesi|:count mēnešus', - 'a_month_after' => '{1}mēnesi|0 mēnešus|:count mēnesi|:count mēnešus', - 'week_after' => '0 nedēļas|:count nedēļu|:count nedēļas', - 'a_week_after' => '{1}nedēļu|0 nedēļas|:count nedēļu|:count nedēļas', - 'day_after' => '0 dienas|:count dienu|:count dienas', - 'a_day_after' => '{1}dienu|0 dienas|:count dienu|:count dienas', - 'hour_after' => '0 stundas|:count stundu|:count stundas', - 'a_hour_after' => '{1}stundu|0 stundas|:count stundu|:count stundas', - 'minute_after' => '0 minūtes|:count minūti|:count minūtes', - 'a_minute_after' => '{1}minūti|0 minūtes|:count minūti|:count minūtes', - 'second_after' => '0 sekundes|:count sekundi|:count sekundes', - 'a_second_after' => '{1}sekundi|0 sekundes|:count sekundi|:count sekundes', - - 'before' => ':time agrāk', - 'year_before' => '0 gadus|:count gadu|:count gadus', - 'a_year_before' => '{1}gadu|0 gadus|:count gadu|:count gadus', - 'month_before' => '0 mēnešus|:count mēnesi|:count mēnešus', - 'a_month_before' => '{1}mēnesi|0 mēnešus|:count mēnesi|:count mēnešus', - 'week_before' => '0 nedēļas|:count nedēļu|:count nedēļas', - 'a_week_before' => '{1}nedēļu|0 nedēļas|:count nedēļu|:count nedēļas', - 'day_before' => '0 dienas|:count dienu|:count dienas', - 'a_day_before' => '{1}dienu|0 dienas|:count dienu|:count dienas', - 'hour_before' => '0 stundas|:count stundu|:count stundas', - 'a_hour_before' => '{1}stundu|0 stundas|:count stundu|:count stundas', - 'minute_before' => '0 minūtes|:count minūti|:count minūtes', - 'a_minute_before' => '{1}minūti|0 minūtes|:count minūti|:count minūtes', - 'second_before' => '0 sekundes|:count sekundi|:count sekundes', - 'a_second_before' => '{1}sekundi|0 sekundes|:count sekundi|:count sekundes', - - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' un '], - - 'diff_now' => 'tagad', - 'diff_today' => 'šodien', - 'diff_yesterday' => 'vakar', - 'diff_before_yesterday' => 'aizvakar', - 'diff_tomorrow' => 'rīt', - 'diff_after_tomorrow' => 'parīt', - - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY.', - 'LL' => 'YYYY. [gada] D. MMMM', - 'LLL' => 'DD.MM.YYYY., HH:mm', - 'LLLL' => 'YYYY. [gada] D. MMMM, HH:mm', - ], - - 'calendar' => [ - 'sameDay' => '[šodien] [plkst.] LT', - 'nextDay' => '[rīt] [plkst.] LT', - 'nextWeek' => static function (CarbonInterface $current, CarbonInterface $other) use ($daysOfWeekLocativum) { - if ($current->week !== $other->week) { - return '[nākošo] ['.$daysOfWeekLocativum[$current->dayOfWeek].'] [plkst.] LT'; - } - - return '['.$daysOfWeekLocativum[$current->dayOfWeek].'] [plkst.] LT'; - }, - 'lastDay' => '[vakar] [plkst.] LT', - 'lastWeek' => static function (CarbonInterface $current) use ($daysOfWeekLocativum) { - return '[pagājušo] ['.$daysOfWeekLocativum[$current->dayOfWeek].'] [plkst.] LT'; - }, - 'sameElse' => 'L', - ], - - 'weekdays' => $daysOfWeek, - 'weekdays_short' => ['Sv.', 'P.', 'O.', 'T.', 'C.', 'Pk.', 'S.'], - 'weekdays_min' => ['Sv.', 'P.', 'O.', 'T.', 'C.', 'Pk.', 'S.'], - 'months' => ['janvāris', 'februāris', 'marts', 'aprīlis', 'maijs', 'jūnijs', 'jūlijs', 'augusts', 'septembris', 'oktobris', 'novembris', 'decembris'], - 'months_standalone' => ['janvārī', 'februārī', 'martā', 'aprīlī', 'maijā', 'jūnijā', 'jūlijā', 'augustā', 'septembrī', 'oktobrī', 'novembrī', 'decembrī'], - 'months_short' => ['janv.', 'febr.', 'martā', 'apr.', 'maijā', 'jūn.', 'jūl.', 'aug.', 'sept.', 'okt.', 'nov.', 'dec.'], - 'meridiem' => ['priekšpusdiena', 'pēcpusdiena'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php b/vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php deleted file mode 100644 index ee91c36..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/lv.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lzh.php b/vendor/nesbot/carbon/src/Carbon/Lang/lzh.php deleted file mode 100644 index 1180c6b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lzh.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/lzh_TW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php deleted file mode 100644 index 771394e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'OY[年]MMMMOD[日]', - ], - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => [' 一 ', ' 二 ', ' 三 ', ' 四 ', ' 五 ', ' 六 ', ' 七 ', ' 八 ', ' 九 ', ' 十 ', '十一', '十二'], - 'weekdays' => ['週日', '週一', '週二', '週三', '週四', '週五', '週六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '廿', '廿一', '廿二', '廿三', '廿四', '廿五', '廿六', '廿七', '廿八', '廿九', '卅', '卅一'], - 'meridiem' => ['朝', '暮'], - - 'year' => ':count 夏', // less reliable - 'y' => ':count 夏', // less reliable - 'a_year' => ':count 夏', // less reliable - - 'month' => ':count 月', // less reliable - 'm' => ':count 月', // less reliable - 'a_month' => ':count 月', // less reliable - - 'hour' => ':count 氧', // less reliable - 'h' => ':count 氧', // less reliable - 'a_hour' => ':count 氧', // less reliable - - 'minute' => ':count 點', // less reliable - 'min' => ':count 點', // less reliable - 'a_minute' => ':count 點', // less reliable - - 'second' => ':count 楚', // less reliable - 's' => ':count 楚', // less reliable - 'a_second' => ':count 楚', // less reliable - - 'week' => ':count 星期', - 'w' => ':count 星期', - 'a_week' => ':count 星期', - - 'day' => ':count 日(曆法)', - 'd' => ':count 日(曆法)', - 'a_day' => ':count 日(曆法)', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mag.php b/vendor/nesbot/carbon/src/Carbon/Lang/mag.php deleted file mode 100644 index 7532436..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mag.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mag_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php deleted file mode 100644 index 8797765..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bhashaghar@googlegroups.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'weekdays' => ['एतवार', 'सोमार', 'मंगर', 'बुध', 'बिफे', 'सूक', 'सनिचर'], - 'weekdays_short' => ['एतवार', 'सोमार', 'मंगर', 'बुध', 'बिफे', 'सूक', 'सनिचर'], - 'weekdays_min' => ['एतवार', 'सोमार', 'मंगर', 'बुध', 'बिफे', 'सूक', 'सनिचर'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mai.php b/vendor/nesbot/carbon/src/Carbon/Lang/mai.php deleted file mode 100644 index 792b973..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mai.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mai_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php deleted file mode 100644 index 3f9bba7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Maithili Computing Research Center, Pune, India rajeshkajha@yahoo.com,akhilesh.k@samusng.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['बैसाख', 'जेठ', 'अषाढ़', 'सावोन', 'भादो', 'आसिन', 'कातिक', 'अगहन', 'पूस', 'माघ', 'फागुन', 'चैति'], - 'months_short' => ['बैसाख', 'जेठ', 'अषाढ़', 'सावोन', 'भादो', 'आसिन', 'कातिक', 'अगहन', 'पूस', 'माघ', 'फागुन', 'चैति'], - 'weekdays' => ['रविदिन', 'सोमदिन', 'मंगलदिन', 'बुधदिन', 'बृहस्पतीदिन', 'शुक्रदिन', 'शनीदिन'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पती', 'शुक्र', 'शनी'], - 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पती', 'शुक्र', 'शनी'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], - - 'year' => ':count ऋतु', // less reliable - 'y' => ':count ऋतु', // less reliable - 'a_year' => ':count ऋतु', // less reliable - - 'month' => ':count महिना', - 'm' => ':count महिना', - 'a_month' => ':count महिना', - - 'week' => ':count श्रेणी:क्यालेन्डर', // less reliable - 'w' => ':count श्रेणी:क्यालेन्डर', // less reliable - 'a_week' => ':count श्रेणी:क्यालेन्डर', // less reliable - - 'day' => ':count दिन', - 'd' => ':count दिन', - 'a_day' => ':count दिन', - - 'hour' => ':count घण्टा', - 'h' => ':count घण्टा', - 'a_hour' => ':count घण्टा', - - 'minute' => ':count समय', // less reliable - 'min' => ':count समय', // less reliable - 'a_minute' => ':count समय', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mas.php b/vendor/nesbot/carbon/src/Carbon/Lang/mas.php deleted file mode 100644 index ba99156..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mas.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['Ɛnkakɛnyá', 'Ɛndámâ'], - 'weekdays' => ['Jumapílí', 'Jumatátu', 'Jumane', 'Jumatánɔ', 'Alaámisi', 'Jumáa', 'Jumamósi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Oladalʉ́', 'Arát', 'Ɔɛnɨ́ɔɨŋɔk', 'Olodoyíóríê inkókúâ', 'Oloilépūnyīē inkókúâ', 'Kújúɔrɔk', 'Mórusásin', 'Ɔlɔ́ɨ́bɔ́rárɛ', 'Kúshîn', 'Olgísan', 'Pʉshʉ́ka', 'Ntʉ́ŋʉ́s'], - 'months_short' => ['Dal', 'Ará', 'Ɔɛn', 'Doy', 'Lép', 'Rok', 'Sás', 'Bɔ́r', 'Kús', 'Gís', 'Shʉ́', 'Ntʉ́'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => ':count olameyu', // less reliable - 'y' => ':count olameyu', // less reliable - 'a_year' => ':count olameyu', // less reliable - - 'week' => ':count engolongeare orwiki', // less reliable - 'w' => ':count engolongeare orwiki', // less reliable - 'a_week' => ':count engolongeare orwiki', // less reliable - - 'hour' => ':count esahabu', // less reliable - 'h' => ':count esahabu', // less reliable - 'a_hour' => ':count esahabu', // less reliable - - 'second' => ':count are', // less reliable - 's' => ':count are', // less reliable - 'a_second' => ':count are', // less reliable - - 'month' => ':count olapa', - 'm' => ':count olapa', - 'a_month' => ':count olapa', - - 'day' => ':count enkolongʼ', - 'd' => ':count enkolongʼ', - 'a_day' => ':count enkolongʼ', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php deleted file mode 100644 index 56e2905..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/mas.php', [ - 'first_day_of_week' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mer.php b/vendor/nesbot/carbon/src/Carbon/Lang/mer.php deleted file mode 100644 index 9b4ad3b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mer.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['RŨ', 'ŨG'], - 'weekdays' => ['Kiumia', 'Muramuko', 'Wairi', 'Wethatu', 'Wena', 'Wetano', 'Jumamosi'], - 'weekdays_short' => ['KIU', 'MRA', 'WAI', 'WET', 'WEN', 'WTN', 'JUM'], - 'weekdays_min' => ['KIU', 'MRA', 'WAI', 'WET', 'WEN', 'WTN', 'JUM'], - 'months' => ['Januarĩ', 'Feburuarĩ', 'Machi', 'Ĩpurũ', 'Mĩĩ', 'Njuni', 'Njuraĩ', 'Agasti', 'Septemba', 'Oktũba', 'Novemba', 'Dicemba'], - 'months_short' => ['JAN', 'FEB', 'MAC', 'ĨPU', 'MĨĨ', 'NJU', 'NJR', 'AGA', 'SPT', 'OKT', 'NOV', 'DEC'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => ':count murume', // less reliable - 'y' => ':count murume', // less reliable - 'a_year' => ':count murume', // less reliable - - 'month' => ':count muchaara', // less reliable - 'm' => ':count muchaara', // less reliable - 'a_month' => ':count muchaara', // less reliable - - 'minute' => ':count monto', // less reliable - 'min' => ':count monto', // less reliable - 'a_minute' => ':count monto', // less reliable - - 'second' => ':count gikeno', // less reliable - 's' => ':count gikeno', // less reliable - 'a_second' => ':count gikeno', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mfe.php b/vendor/nesbot/carbon/src/Carbon/Lang/mfe.php deleted file mode 100644 index 4d6e6b6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mfe.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mfe_MU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php b/vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php deleted file mode 100644 index ef51ce7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['zanvie', 'fevriye', 'mars', 'avril', 'me', 'zin', 'zilye', 'out', 'septam', 'oktob', 'novam', 'desam'], - 'months_short' => ['zan', 'fev', 'mar', 'avr', 'me', 'zin', 'zil', 'out', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['dimans', 'lindi', 'mardi', 'merkredi', 'zedi', 'vandredi', 'samdi'], - 'weekdays_short' => ['dim', 'lin', 'mar', 'mer', 'ze', 'van', 'sam'], - 'weekdays_min' => ['dim', 'lin', 'mar', 'mer', 'ze', 'van', 'sam'], - - 'year' => ':count banané', - 'y' => ':count banané', - 'a_year' => ':count banané', - - 'month' => ':count mwa', - 'm' => ':count mwa', - 'a_month' => ':count mwa', - - 'week' => ':count sémenn', - 'w' => ':count sémenn', - 'a_week' => ':count sémenn', - - 'day' => ':count zour', - 'd' => ':count zour', - 'a_day' => ':count zour', - - 'hour' => ':count -er-tan', - 'h' => ':count -er-tan', - 'a_hour' => ':count -er-tan', - - 'minute' => ':count minitt', - 'min' => ':count minitt', - 'a_minute' => ':count minitt', - - 'second' => ':count déziém', - 's' => ':count déziém', - 'a_second' => ':count déziém', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mg.php b/vendor/nesbot/carbon/src/Carbon/Lang/mg.php deleted file mode 100644 index 40bc2a8..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mg.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mg_MG.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php b/vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php deleted file mode 100644 index 6a14535..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - The Debian Project modified by GNU//Linux Malagasy Rado Ramarotafika,Do-Risika RAFIEFERANTSIARONJY rado@linuxmg.org,dourix@free.fr - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Janoary', 'Febroary', 'Martsa', 'Aprily', 'Mey', 'Jona', 'Jolay', 'Aogositra', 'Septambra', 'Oktobra', 'Novambra', 'Desambra'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mey', 'Jon', 'Jol', 'Aog', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['alahady', 'alatsinainy', 'talata', 'alarobia', 'alakamisy', 'zoma', 'sabotsy'], - 'weekdays_short' => ['lhd', 'lts', 'tlt', 'lrb', 'lkm', 'zom', 'sab'], - 'weekdays_min' => ['lhd', 'lts', 'tlt', 'lrb', 'lkm', 'zom', 'sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'minute' => ':count minitra', // less reliable - 'min' => ':count minitra', // less reliable - 'a_minute' => ':count minitra', // less reliable - - 'year' => ':count taona', - 'y' => ':count taona', - 'a_year' => ':count taona', - - 'month' => ':count volana', - 'm' => ':count volana', - 'a_month' => ':count volana', - - 'week' => ':count herinandro', - 'w' => ':count herinandro', - 'a_week' => ':count herinandro', - - 'day' => ':count andro', - 'd' => ':count andro', - 'a_day' => ':count andro', - - 'hour' => ':count ora', - 'h' => ':count ora', - 'a_hour' => ':count ora', - - 'second' => ':count segondra', - 's' => ':count segondra', - 'a_second' => ':count segondra', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mgh.php b/vendor/nesbot/carbon/src/Carbon/Lang/mgh.php deleted file mode 100644 index a4b624c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mgh.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['wichishu', 'mchochil’l'], - 'weekdays' => ['Sabato', 'Jumatatu', 'Jumanne', 'Jumatano', 'Arahamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Sab', 'Jtt', 'Jnn', 'Jtn', 'Ara', 'Iju', 'Jmo'], - 'weekdays_min' => ['Sab', 'Jtt', 'Jnn', 'Jtn', 'Ara', 'Iju', 'Jmo'], - 'months' => ['Mweri wo kwanza', 'Mweri wo unayeli', 'Mweri wo uneraru', 'Mweri wo unecheshe', 'Mweri wo unethanu', 'Mweri wo thanu na mocha', 'Mweri wo saba', 'Mweri wo nane', 'Mweri wo tisa', 'Mweri wo kumi', 'Mweri wo kumi na moja', 'Mweri wo kumi na yel’li'], - 'months_short' => ['Kwa', 'Una', 'Rar', 'Che', 'Tha', 'Moc', 'Sab', 'Nan', 'Tis', 'Kum', 'Moj', 'Yel'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mgo.php b/vendor/nesbot/carbon/src/Carbon/Lang/mgo.php deleted file mode 100644 index a126c9f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mgo.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['Aneg 1', 'Aneg 2', 'Aneg 3', 'Aneg 4', 'Aneg 5', 'Aneg 6', 'Aneg 7'], - 'weekdays_short' => ['Aneg 1', 'Aneg 2', 'Aneg 3', 'Aneg 4', 'Aneg 5', 'Aneg 6', 'Aneg 7'], - 'weekdays_min' => ['1', '2', '3', '4', '5', '6', '7'], - 'months' => ['iməg mbegtug', 'imeg àbùbì', 'imeg mbəŋchubi', 'iməg ngwə̀t', 'iməg fog', 'iməg ichiibɔd', 'iməg àdùmbə̀ŋ', 'iməg ichika', 'iməg kud', 'iməg tèsiʼe', 'iməg zò', 'iməg krizmed'], - 'months_short' => ['mbegtug', 'imeg àbùbì', 'imeg mbəŋchubi', 'iməg ngwə̀t', 'iməg fog', 'iməg ichiibɔd', 'iməg àdùmbə̀ŋ', 'iməg ichika', 'iməg kud', 'iməg tèsiʼe', 'iməg zò', 'iməg krizmed'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'dddd, YYYY MMMM DD HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mhr.php b/vendor/nesbot/carbon/src/Carbon/Lang/mhr.php deleted file mode 100644 index 6bbc9f6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mhr.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mhr_RU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php deleted file mode 100644 index 309ead9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - PeshSajSoft Ltd. Vyacheslav Kileev slavakileev@yandex.ru - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY.MM.DD', - ], - 'months' => ['Шорыкйол', 'Пургыж', 'Ӱярня', 'Вӱдшор', 'Ага', 'Пеледыш', 'Сӱрем', 'Сорла', 'Идым', 'Шыжа', 'Кылме', 'Теле'], - 'months_short' => ['Шрк', 'Пгж', 'Ӱрн', 'Вшр', 'Ага', 'Пдш', 'Срм', 'Срл', 'Идм', 'Шыж', 'Клм', 'Тел'], - 'weekdays' => ['Рушарня', 'Шочмо', 'Кушкыжмо', 'Вӱргече', 'Изарня', 'Кугарня', 'Шуматкече'], - 'weekdays_short' => ['Ршр', 'Шчм', 'Кжм', 'Вгч', 'Изр', 'Кгр', 'Шмт'], - 'weekdays_min' => ['Ршр', 'Шчм', 'Кжм', 'Вгч', 'Изр', 'Кгр', 'Шмт'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count идалык', - 'y' => ':count идалык', - 'a_year' => ':count идалык', - - 'month' => ':count Тылзе', - 'm' => ':count Тылзе', - 'a_month' => ':count Тылзе', - - 'week' => ':count арня', - 'w' => ':count арня', - 'a_week' => ':count арня', - - 'day' => ':count кече', - 'd' => ':count кече', - 'a_day' => ':count кече', - - 'hour' => ':count час', - 'h' => ':count час', - 'a_hour' => ':count час', - - 'minute' => ':count минут', - 'min' => ':count минут', - 'a_minute' => ':count минут', - - 'second' => ':count кокымшан', - 's' => ':count кокымшан', - 'a_second' => ':count кокымшан', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mi.php b/vendor/nesbot/carbon/src/Carbon/Lang/mi.php deleted file mode 100644 index b7f51ec..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mi.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - John Corrigan - * - François B - */ -return [ - 'year' => ':count tau', - 'a_year' => '{1}he tau|:count tau', - 'month' => ':count marama', - 'a_month' => '{1}he marama|:count marama', - 'week' => ':count wiki', - 'a_week' => '{1}he wiki|:count wiki', - 'day' => ':count ra', - 'a_day' => '{1}he ra|:count ra', - 'hour' => ':count haora', - 'a_hour' => '{1}te haora|:count haora', - 'minute' => ':count meneti', - 'a_minute' => '{1}he meneti|:count meneti', - 'second' => ':count hēkona', - 'a_second' => '{1}te hēkona ruarua|:count hēkona', - 'ago' => ':time i mua', - 'from_now' => 'i roto i :time', - 'diff_yesterday' => 'inanahi', - 'diff_yesterday_regexp' => 'inanahi(?:\\s+i)?', - 'diff_today' => 'i teie', - 'diff_today_regexp' => 'i teie(?:\\s+mahana,)?(?:\\s+i)?', - 'diff_tomorrow' => 'apopo', - 'diff_tomorrow_regexp' => 'apopo(?:\\s+i)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY [i] HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY [i] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[i teie mahana, i] LT', - 'nextDay' => '[apopo i] LT', - 'nextWeek' => 'dddd [i] LT', - 'lastDay' => '[inanahi i] LT', - 'lastWeek' => 'dddd [whakamutunga i] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['Kohi-tāte', 'Hui-tanguru', 'Poutū-te-rangi', 'Paenga-whāwhā', 'Haratua', 'Pipiri', 'Hōngoingoi', 'Here-turi-kōkā', 'Mahuru', 'Whiringa-ā-nuku', 'Whiringa-ā-rangi', 'Hakihea'], - 'months_short' => ['Kohi', 'Hui', 'Pou', 'Pae', 'Hara', 'Pipi', 'Hōngoi', 'Here', 'Mahu', 'Whi-nu', 'Whi-ra', 'Haki'], - 'weekdays' => ['Rātapu', 'Mane', 'Tūrei', 'Wenerei', 'Tāite', 'Paraire', 'Hātarei'], - 'weekdays_short' => ['Ta', 'Ma', 'Tū', 'We', 'Tāi', 'Pa', 'Hā'], - 'weekdays_min' => ['Ta', 'Ma', 'Tū', 'We', 'Tāi', 'Pa', 'Hā'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' me te '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php deleted file mode 100644 index 6b964e3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/mi.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/miq.php b/vendor/nesbot/carbon/src/Carbon/Lang/miq.php deleted file mode 100644 index 51e5a98..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/miq.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/miq_NI.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php b/vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php deleted file mode 100644 index 57faa31..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['siakwa kati', 'kuswa kati', 'kakamuk kati', 'lî wainhka kati', 'lih mairin kati', 'lî kati', 'pastara kati', 'sikla kati', 'wîs kati', 'waupasa kati', 'yahbra kati', 'trisu kati'], - 'months_short' => ['siakwa kati', 'kuswa kati', 'kakamuk kati', 'lî wainhka kati', 'lih mairin kati', 'lî kati', 'pastara kati', 'sikla kati', 'wîs kati', 'waupasa kati', 'yahbra kati', 'trisu kati'], - 'weekdays' => ['sandi', 'mundi', 'tiusdi', 'wensde', 'tausde', 'praidi', 'satadi'], - 'weekdays_short' => ['san', 'mun', 'tius', 'wens', 'taus', 'prai', 'sat'], - 'weekdays_min' => ['san', 'mun', 'tius', 'wens', 'taus', 'prai', 'sat'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 7, - 'meridiem' => ['VM', 'NM'], - - 'month' => ':count kati', // less reliable - 'm' => ':count kati', // less reliable - 'a_month' => ':count kati', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mjw.php b/vendor/nesbot/carbon/src/Carbon/Lang/mjw.php deleted file mode 100644 index 617154c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mjw.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mjw_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php deleted file mode 100644 index 58ed0d1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Jor Teron bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['Arkoi', 'Thangthang', 'There', 'Jangmi', 'Aru', 'Vosik', 'Jakhong', 'Paipai', 'Chiti', 'Phere', 'Phaikuni', 'Matijong'], - 'months_short' => ['Ark', 'Thang', 'The', 'Jang', 'Aru', 'Vos', 'Jak', 'Pai', 'Chi', 'Phe', 'Phai', 'Mati'], - 'weekdays' => ['Bhomkuru', 'Urmi', 'Durmi', 'Thelang', 'Theman', 'Bhomta', 'Bhomti'], - 'weekdays_short' => ['Bhom', 'Ur', 'Dur', 'Tkel', 'Tkem', 'Bhta', 'Bhti'], - 'weekdays_min' => ['Bhom', 'Ur', 'Dur', 'Tkel', 'Tkem', 'Bhta', 'Bhti'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mk.php b/vendor/nesbot/carbon/src/Carbon/Lang/mk.php deleted file mode 100644 index 38fe6d0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mk.php +++ /dev/null @@ -1,110 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sashko Todorov - * - Josh Soref - * - François B - * - Serhan Apaydın - * - Borislav Mickov - * - JD Isaacks - * - Tomi Atanasoski - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count година|:count години', - 'a_year' => 'година|:count години', - 'y' => ':count год.', - 'month' => ':count месец|:count месеци', - 'a_month' => 'месец|:count месеци', - 'm' => ':count месец|:count месеци', - 'week' => ':count седмица|:count седмици', - 'a_week' => 'седмица|:count седмици', - 'w' => ':count седмица|:count седмици', - 'day' => ':count ден|:count дена', - 'a_day' => 'ден|:count дена', - 'd' => ':count ден|:count дена', - 'hour' => ':count час|:count часа', - 'a_hour' => 'час|:count часа', - 'h' => ':count час|:count часа', - 'minute' => ':count минута|:count минути', - 'a_minute' => 'минута|:count минути', - 'min' => ':count мин.', - 'second' => ':count секунда|:count секунди', - 'a_second' => 'неколку секунди|:count секунди', - 's' => ':count сек.', - 'ago' => 'пред :time', - 'from_now' => 'после :time', - 'after' => 'по :time', - 'before' => 'пред :time', - 'diff_now' => 'сега', - 'diff_today' => 'Денес', - 'diff_today_regexp' => 'Денес(?:\\s+во)?', - 'diff_yesterday' => 'вчера', - 'diff_yesterday_regexp' => 'Вчера(?:\\s+во)?', - 'diff_tomorrow' => 'утре', - 'diff_tomorrow_regexp' => 'Утре(?:\\s+во)?', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'D.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY H:mm', - 'LLLL' => 'dddd, D MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[Денес во] LT', - 'nextDay' => '[Утре во] LT', - 'nextWeek' => '[Во] dddd [во] LT', - 'lastDay' => '[Вчера во] LT', - 'lastWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0, 3, 6 => '[Изминатата] dddd [во] LT', - default => '[Изминатиот] dddd [во] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - $lastDigit = $number % 10; - $last2Digits = $number % 100; - if ($number === 0) { - return $number.'-ев'; - } - if ($last2Digits === 0) { - return $number.'-ен'; - } - if ($last2Digits > 10 && $last2Digits < 20) { - return $number.'-ти'; - } - if ($lastDigit === 1) { - return $number.'-ви'; - } - if ($lastDigit === 2) { - return $number.'-ри'; - } - if ($lastDigit === 7 || $lastDigit === 8) { - return $number.'-ми'; - } - - return $number.'-ти'; - }, - 'months' => ['јануари', 'февруари', 'март', 'април', 'мај', 'јуни', 'јули', 'август', 'септември', 'октомври', 'ноември', 'декември'], - 'months_short' => ['јан', 'фев', 'мар', 'апр', 'мај', 'јун', 'јул', 'авг', 'сеп', 'окт', 'ное', 'дек'], - 'weekdays' => ['недела', 'понеделник', 'вторник', 'среда', 'четврток', 'петок', 'сабота'], - 'weekdays_short' => ['нед', 'пон', 'вто', 'сре', 'чет', 'пет', 'саб'], - 'weekdays_min' => ['нe', 'пo', 'вт', 'ср', 'че', 'пе', 'сa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' и '], - 'meridiem' => ['АМ', 'ПМ'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php b/vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php deleted file mode 100644 index 95e2ff9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/mk.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ml.php b/vendor/nesbot/carbon/src/Carbon/Lang/ml.php deleted file mode 100644 index a35f96f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ml.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - JD Isaacks - */ -return [ - 'year' => ':count വർഷം', - 'a_year' => 'ഒരു വർഷം|:count വർഷം', - 'month' => ':count മാസം', - 'a_month' => 'ഒരു മാസം|:count മാസം', - 'week' => ':count ആഴ്ച', - 'a_week' => 'ഒരാഴ്ച|:count ആഴ്ച', - 'day' => ':count ദിവസം', - 'a_day' => 'ഒരു ദിവസം|:count ദിവസം', - 'hour' => ':count മണിക്കൂർ', - 'a_hour' => 'ഒരു മണിക്കൂർ|:count മണിക്കൂർ', - 'minute' => ':count മിനിറ്റ്', - 'a_minute' => 'ഒരു മിനിറ്റ്|:count മിനിറ്റ്', - 'second' => ':count സെക്കൻഡ്', - 'a_second' => 'അൽപ നിമിഷങ്ങൾ|:count സെക്കൻഡ്', - 'ago' => ':time മുൻപ്', - 'from_now' => ':time കഴിഞ്ഞ്', - 'diff_now' => 'ഇപ്പോൾ', - 'diff_today' => 'ഇന്ന്', - 'diff_yesterday' => 'ഇന്നലെ', - 'diff_tomorrow' => 'നാളെ', - 'formats' => [ - 'LT' => 'A h:mm -നു', - 'LTS' => 'A h:mm:ss -നു', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm -നു', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm -നു', - ], - 'calendar' => [ - 'sameDay' => '[ഇന്ന്] LT', - 'nextDay' => '[നാളെ] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[ഇന്നലെ] LT', - 'lastWeek' => '[കഴിഞ്ഞ] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'രാത്രി'; - } - if ($hour < 12) { - return 'രാവിലെ'; - } - if ($hour < 17) { - return 'ഉച്ച കഴിഞ്ഞ്'; - } - if ($hour < 20) { - return 'വൈകുന്നേരം'; - } - - return 'രാത്രി'; - }, - 'months' => ['ജനുവരി', 'ഫെബ്രുവരി', 'മാർച്ച്', 'ഏപ്രിൽ', 'മേയ്', 'ജൂൺ', 'ജൂലൈ', 'ഓഗസ്റ്റ്', 'സെപ്റ്റംബർ', 'ഒക്ടോബർ', 'നവംബർ', 'ഡിസംബർ'], - 'months_short' => ['ജനു.', 'ഫെബ്രു.', 'മാർ.', 'ഏപ്രി.', 'മേയ്', 'ജൂൺ', 'ജൂലൈ.', 'ഓഗ.', 'സെപ്റ്റ.', 'ഒക്ടോ.', 'നവം.', 'ഡിസം.'], - 'weekdays' => ['ഞായറാഴ്ച', 'തിങ്കളാഴ്ച', 'ചൊവ്വാഴ്ച', 'ബുധനാഴ്ച', 'വ്യാഴാഴ്ച', 'വെള്ളിയാഴ്ച', 'ശനിയാഴ്ച'], - 'weekdays_short' => ['ഞായർ', 'തിങ്കൾ', 'ചൊവ്വ', 'ബുധൻ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'], - 'weekdays_min' => ['ഞാ', 'തി', 'ചൊ', 'ബു', 'വ്യാ', 'വെ', 'ശ'], - 'list' => ', ', - 'weekend' => [0, 0], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php deleted file mode 100644 index 000e795..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ml.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mn.php b/vendor/nesbot/carbon/src/Carbon/Lang/mn.php deleted file mode 100644 index 38c6434..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mn.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Zolzaya Erdenebaatar - * - Tom Hughes - * - Akira Matsuda - * - Christopher Dell - * - Michael Kessler - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Nicolás Hock Isaza - * - Ochirkhuyag - * - Batmandakh - * - lucifer-crybaby - */ -return [ - 'year' => ':count жил', - 'y' => ':count жил', - 'month' => ':count сар', - 'm' => ':count сар', - 'week' => ':count долоо хоног', - 'w' => ':count долоо хоног', - 'day' => ':count өдөр', - 'd' => ':count өдөр', - 'hour' => ':count цаг', - 'h' => ':countц', - 'minute' => ':count минут', - 'min' => ':countм', - 'second' => ':count секунд', - 's' => ':countс', - - 'ago_mode' => 'last', - 'ago' => ':time өмнө', - 'year_ago' => ':count жилийн', - 'y_ago' => ':count жилийн', - 'month_ago' => ':count сарын', - 'm_ago' => ':count сарын', - 'day_ago' => ':count хоногийн', - 'd_ago' => ':count хоногийн', - 'week_ago' => ':count долоо хоногийн', - 'w_ago' => ':count долоо хоногийн', - 'hour_ago' => ':count цагийн', - 'minute_ago' => ':count минутын', - 'second_ago' => ':count секундын', - - 'from_now_mode' => 'last', - 'from_now' => 'одоогоос :time', - 'year_from_now' => ':count жилийн дараа', - 'y_from_now' => ':count жилийн дараа', - 'month_from_now' => ':count сарын дараа', - 'm_from_now' => ':count сарын дараа', - 'day_from_now' => ':count хоногийн дараа', - 'd_from_now' => ':count хоногийн дараа', - 'hour_from_now' => ':count цагийн дараа', - 'minute_from_now' => ':count минутын дараа', - 'second_from_now' => ':count секундын дараа', - - 'after_mode' => 'last', - 'after' => ':time дараа', - 'year_after' => ':count жилийн', - 'y_after' => ':count жилийн', - 'month_after' => ':count сарын', - 'm_after' => ':count сарын', - 'day_after' => ':count хоногийн', - 'd_after' => ':count хоногийн', - 'hour_after' => ':count цагийн', - 'minute_after' => ':count минутын', - 'second_after' => ':count секундын', - - 'before_mode' => 'last', - 'before' => ':time өмнө', - 'year_before' => ':count жилийн', - 'y_before' => ':count жилийн', - 'month_before' => ':count сарын', - 'm_before' => ':count сарын', - 'day_before' => ':count хоногийн', - 'd_before' => ':count хоногийн', - 'hour_before' => ':count цагийн', - 'minute_before' => ':count минутын', - 'second_before' => ':count секундын', - - 'list' => ', ', - 'diff_now' => 'одоо', - 'diff_yesterday' => 'өчигдөр', - 'diff_tomorrow' => 'маргааш', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'YYYY MMMM DD', - 'LLL' => 'YY-MM-DD, HH:mm', - 'LLLL' => 'YYYY MMMM DD, HH:mm', - ], - 'weekdays' => ['Ням', 'Даваа', 'Мягмар', 'Лхагва', 'Пүрэв', 'Баасан', 'Бямба'], - 'weekdays_short' => ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'], - 'weekdays_min' => ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'], - 'months' => ['1 сар', '2 сар', '3 сар', '4 сар', '5 сар', '6 сар', '7 сар', '8 сар', '9 сар', '10 сар', '11 сар', '12 сар'], - 'months_short' => ['1 сар', '2 сар', '3 сар', '4 сар', '5 сар', '6 сар', '7 сар', '8 сар', '9 сар', '10 сар', '11 сар', '12 сар'], - 'meridiem' => ['өглөө', 'орой'], - 'first_day_of_week' => 1, -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php deleted file mode 100644 index e5ce426..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/mn.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mni.php b/vendor/nesbot/carbon/src/Carbon/Lang/mni.php deleted file mode 100644 index cafa2f8..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mni.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mni_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php deleted file mode 100644 index 4dc577c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat Pune libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['জানুৱারি', 'ফেব্রুৱারি', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগষ্ট', 'সেপ্তেম্বর', 'ওক্তোবর', 'নবেম্বর', 'ডিসেম্বর'], - 'months_short' => ['জান', 'ফেব', 'মার', 'এপ্রি', 'মে', 'জুন', 'জুল', 'আগ', 'সেপ', 'ওক্ত', 'নবে', 'ডিস'], - 'weekdays' => ['নোংমাইজিং', 'নিংথৌকাবা', 'লৈবাকপোকপা', 'য়ুমশকৈশা', 'শগোলশেন', 'ইরাই', 'থাংজ'], - 'weekdays_short' => ['নোং', 'নিং', 'লৈবাক', 'য়ুম', 'শগোল', 'ইরা', 'থাং'], - 'weekdays_min' => ['নোং', 'নিং', 'লৈবাক', 'য়ুম', 'শগোল', 'ইরা', 'থাং'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['এ.ম.', 'প.ম.'], - - 'year' => ':count ইসিং', // less reliable - 'y' => ':count ইসিং', // less reliable - 'a_year' => ':count ইসিং', // less reliable - - 'second' => ':count ꯅꯤꯡꯊꯧꯀꯥꯕ', // less reliable - 's' => ':count ꯅꯤꯡꯊꯧꯀꯥꯕ', // less reliable - 'a_second' => ':count ꯅꯤꯡꯊꯧꯀꯥꯕ', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mo.php b/vendor/nesbot/carbon/src/Carbon/Lang/mo.php deleted file mode 100644 index 102afcd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mo.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ro.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mr.php b/vendor/nesbot/carbon/src/Carbon/Lang/mr.php deleted file mode 100644 index e57e6f5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mr.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Vikram-enyota - */ -return [ - 'year' => ':count वर्ष', - 'y' => ':count वर्ष', - 'month' => ':count महिना|:count महिने', - 'm' => ':count महिना|:count महिने', - 'week' => ':count आठवडा|:count आठवडे', - 'w' => ':count आठवडा|:count आठवडे', - 'day' => ':count दिवस', - 'd' => ':count दिवस', - 'hour' => ':count तास', - 'h' => ':count तास', - 'minute' => ':count मिनिटे', - 'min' => ':count मिनिटे', - 'second' => ':count सेकंद', - 's' => ':count सेकंद', - - 'ago' => ':timeपूर्वी', - 'from_now' => ':timeमध्ये', - 'before' => ':timeपूर्वी', - 'after' => ':timeनंतर', - - 'diff_now' => 'आत्ता', - 'diff_today' => 'आज', - 'diff_yesterday' => 'काल', - 'diff_tomorrow' => 'उद्या', - - 'formats' => [ - 'LT' => 'A h:mm वाजता', - 'LTS' => 'A h:mm:ss वाजता', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm वाजता', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm वाजता', - ], - - 'calendar' => [ - 'sameDay' => '[आज] LT', - 'nextDay' => '[उद्या] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[काल] LT', - 'lastWeek' => '[मागील] dddd, LT', - 'sameElse' => 'L', - ], - - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'रात्री'; - } - if ($hour < 10) { - return 'सकाळी'; - } - if ($hour < 17) { - return 'दुपारी'; - } - if ($hour < 20) { - return 'सायंकाळी'; - } - - return 'रात्री'; - }, - - 'months' => ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ऑगस्ट', 'सप्टेंबर', 'ऑक्टोबर', 'नोव्हेंबर', 'डिसेंबर'], - 'months_short' => ['जाने.', 'फेब्रु.', 'मार्च.', 'एप्रि.', 'मे.', 'जून.', 'जुलै.', 'ऑग.', 'सप्टें.', 'ऑक्टो.', 'नोव्हें.', 'डिसें.'], - 'weekdays' => ['रविवार', 'सोमवार', 'मंगळवार', 'बुधवार', 'गुरूवार', 'शुक्रवार', 'शनिवार'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगळ', 'बुध', 'गुरू', 'शुक्र', 'शनि'], - 'weekdays_min' => ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'], - 'list' => [', ', ' आणि '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekend' => [0, 0], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php deleted file mode 100644 index 7bca919..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/mr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ms.php b/vendor/nesbot/carbon/src/Carbon/Lang/ms.php deleted file mode 100644 index 1e9ff78..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ms.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Azri Jamil - * - JD Isaacks - * - Josh Soref - * - Azri Jamil - * - Hariadi Hinta - * - Ashraf Kamarudin - */ -return [ - 'year' => ':count tahun', - 'a_year' => '{1}setahun|]1,Inf[:count tahun', - 'y' => ':count tahun', - 'month' => ':count bulan', - 'a_month' => '{1}sebulan|]1,Inf[:count bulan', - 'm' => ':count bulan', - 'week' => ':count minggu', - 'a_week' => '{1}seminggu|]1,Inf[:count minggu', - 'w' => ':count minggu', - 'day' => ':count hari', - 'a_day' => '{1}sehari|]1,Inf[:count hari', - 'd' => ':count hari', - 'hour' => ':count jam', - 'a_hour' => '{1}sejam|]1,Inf[:count jam', - 'h' => ':count jam', - 'minute' => ':count minit', - 'a_minute' => '{1}seminit|]1,Inf[:count minit', - 'min' => ':count minit', - 'second' => ':count saat', - 'a_second' => '{1}beberapa saat|]1,Inf[:count saat', - 'millisecond' => ':count milisaat', - 'a_millisecond' => '{1}semilisaat|]1,Inf[:count milliseconds', - 'microsecond' => ':count mikrodetik', - 'a_microsecond' => '{1}semikrodetik|]1,Inf[:count mikrodetik', - 's' => ':count saat', - 'ago' => ':time yang lepas', - 'from_now' => ':time dari sekarang', - 'after' => ':time kemudian', - 'before' => ':time sebelum', - 'diff_now' => 'sekarang', - 'diff_today' => 'Hari', - 'diff_today_regexp' => 'Hari(?:\\s+ini)?(?:\\s+pukul)?', - 'diff_yesterday' => 'semalam', - 'diff_yesterday_regexp' => 'Semalam(?:\\s+pukul)?', - 'diff_tomorrow' => 'esok', - 'diff_tomorrow_regexp' => 'Esok(?:\\s+pukul)?', - 'diff_before_yesterday' => 'kelmarin', - 'diff_after_tomorrow' => 'lusa', - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm.ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY [pukul] HH.mm', - 'LLLL' => 'dddd, D MMMM YYYY [pukul] HH.mm', - ], - 'calendar' => [ - 'sameDay' => '[Hari ini pukul] LT', - 'nextDay' => '[Esok pukul] LT', - 'nextWeek' => 'dddd [pukul] LT', - 'lastDay' => '[Kelmarin pukul] LT', - 'lastWeek' => 'dddd [lepas pukul] LT', - 'sameElse' => 'L', - ], - 'meridiem' => static function ($hour) { - if ($hour < 1) { - return 'tengah malam'; - } - - if ($hour < 12) { - return 'pagi'; - } - - if ($hour < 13) { - return 'tengah hari'; - } - - if ($hour < 19) { - return 'petang'; - } - - return 'malam'; - }, - 'months' => ['Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogs', 'Sep', 'Okt', 'Nov', 'Dis'], - 'weekdays' => ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'], - 'weekdays_short' => ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'], - 'weekdays_min' => ['Ah', 'Is', 'Sl', 'Rb', 'Km', 'Jm', 'Sb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' dan '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php deleted file mode 100644 index ef837a2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ms.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/MM/yy', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, h:mm a', - 'LLLL' => 'dd MMMM YYYY, h:mm a', - ], - 'meridiem' => ['a', 'p'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php b/vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php deleted file mode 100644 index 970d604..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Azri Jamil - * - JD Isaacks - */ -return require __DIR__.'/ms.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php deleted file mode 100644 index 77cb83d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ms.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/MM/yy', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY, h:mm a', - ], - 'meridiem' => ['a', 'p'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mt.php b/vendor/nesbot/carbon/src/Carbon/Lang/mt.php deleted file mode 100644 index e8aadcc..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mt.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Alessandro Maruccia - */ -return [ - 'year' => 'sena|:count sni|:count sni|:count sni', - 'y' => 'sa sena|:count snin|:count snin|:count snin', - 'month' => 'xahar|:count xhur|:count xhur|:count xhur', - 'm' => ':count xahar|:count xhur|:count xhur|:count xhur', - 'week' => 'gimgħa|:count ġimgħat|:count ġimgħat|:count ġimgħat', - 'w' => 'ġimgħa|:count ġimgħat|:count ġimgħat|:count ġimgħat', - 'day' => 'ġurnata|:count ġranet|:count ġranet|:count ġranet', - 'd' => 'ġurnata|:count ġranet|:count ġranet|:count ġranet', - 'hour' => 'siegħa|:count siegħat|:count siegħat|:count siegħat', - 'h' => 'siegħa|:count sigħat|:count sigħat|:count sigħat', - 'minute' => 'minuta|:count minuti|:count minuti|:count minuti', - 'min' => 'min.|:count min.|:count min.|:count min.', - 'second' => 'ftit sekondi|:count sekondi|:count sekondi|:count sekondi', - 's' => 'sek.|:count sek.|:count sek.|:count sek.', - 'ago' => ':time ilu', - 'from_now' => 'f’ :time', - 'diff_now' => 'issa', - 'diff_today' => 'Illum', - 'diff_today_regexp' => 'Illum(?:\\s+fil-)?', - 'diff_yesterday' => 'lbieraħ', - 'diff_yesterday_regexp' => 'Il-bieraħ(?:\\s+fil-)?', - 'diff_tomorrow' => 'għada', - 'diff_tomorrow_regexp' => 'Għada(?:\\s+fil-)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Illum fil-]LT', - 'nextDay' => '[Għada fil-]LT', - 'nextWeek' => 'dddd [fil-]LT', - 'lastDay' => '[Il-bieraħ fil-]LT', - 'lastWeek' => 'dddd [li għadda] [fil-]LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['Jannar', 'Frar', 'Marzu', 'April', 'Mejju', 'Ġunju', 'Lulju', 'Awwissu', 'Settembru', 'Ottubru', 'Novembru', 'Diċembru'], - 'months_short' => ['Jan', 'Fra', 'Mar', 'Apr', 'Mej', 'Ġun', 'Lul', 'Aww', 'Set', 'Ott', 'Nov', 'Diċ'], - 'weekdays' => ['Il-Ħadd', 'It-Tnejn', 'It-Tlieta', 'L-Erbgħa', 'Il-Ħamis', 'Il-Ġimgħa', 'Is-Sibt'], - 'weekdays_short' => ['Ħad', 'Tne', 'Tli', 'Erb', 'Ħam', 'Ġim', 'Sib'], - 'weekdays_min' => ['Ħa', 'Tn', 'Tl', 'Er', 'Ħa', 'Ġi', 'Si'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' u '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php b/vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php deleted file mode 100644 index 9534f68..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/mt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mua.php b/vendor/nesbot/carbon/src/Carbon/Lang/mua.php deleted file mode 100644 index a3a3c6f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mua.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['comme', 'lilli'], - 'weekdays' => ['Com’yakke', 'Comlaaɗii', 'Comzyiiɗii', 'Comkolle', 'Comkaldǝɓlii', 'Comgaisuu', 'Comzyeɓsuu'], - 'weekdays_short' => ['Cya', 'Cla', 'Czi', 'Cko', 'Cka', 'Cga', 'Cze'], - 'weekdays_min' => ['Cya', 'Cla', 'Czi', 'Cko', 'Cka', 'Cga', 'Cze'], - 'months' => ['Fĩi Loo', 'Cokcwaklaŋne', 'Cokcwaklii', 'Fĩi Marfoo', 'Madǝǝuutǝbijaŋ', 'Mamǝŋgwãafahbii', 'Mamǝŋgwãalii', 'Madǝmbii', 'Fĩi Dǝɓlii', 'Fĩi Mundaŋ', 'Fĩi Gwahlle', 'Fĩi Yuru'], - 'months_short' => ['FLO', 'CLA', 'CKI', 'FMF', 'MAD', 'MBI', 'MLI', 'MAM', 'FDE', 'FMU', 'FGW', 'FYU'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/my.php b/vendor/nesbot/carbon/src/Carbon/Lang/my.php deleted file mode 100644 index bbdfba4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/my.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - JD Isaacks - * - Nay Lin Aung - */ -return [ - 'year' => '{1}တစ်နှစ်|]1,Inf[:count နှစ်', - 'y' => ':count နှစ်', - 'month' => '{1}တစ်လ|]1,Inf[:count လ', - 'm' => ':count လ', - 'week' => ':count ပတ်', - 'w' => ':count ပတ်', - 'day' => '{1}တစ်ရက်|]1,Inf[:count ရက်', - 'd' => ':count ရက်', - 'hour' => '{1}တစ်နာရီ|]1,Inf[:count နာရီ', - 'h' => ':count နာရီ', - 'minute' => '{1}တစ်မိနစ်|]1,Inf[:count မိနစ်', - 'min' => ':count မိနစ်', - 'second' => '{1}စက္ကန်.အနည်းငယ်|]1,Inf[:count စက္ကန့်', - 's' => ':count စက္ကန့်', - 'ago' => 'လွန်ခဲ့သော :time က', - 'from_now' => 'လာမည့် :time မှာ', - 'after' => ':time ကြာပြီးနောက်', - 'before' => ':time မတိုင်ခင်', - 'diff_now' => 'အခုလေးတင်', - 'diff_today' => 'ယနေ.', - 'diff_yesterday' => 'မနေ့က', - 'diff_yesterday_regexp' => 'မနေ.က', - 'diff_tomorrow' => 'မနက်ဖြန်', - 'diff_before_yesterday' => 'တမြန်နေ့က', - 'diff_after_tomorrow' => 'တဘက်ခါ', - 'period_recurrences' => ':count ကြိမ်', - 'formats' => [ - 'LT' => 'Oh:Om A', - 'LTS' => 'Oh:Om:Os A', - 'L' => 'OD/OM/OY', - 'LL' => 'OD MMMM OY', - 'LLL' => 'OD MMMM OY Oh:Om A', - 'LLLL' => 'dddd OD MMMM OY Oh:Om A', - ], - 'calendar' => [ - 'sameDay' => '[ယနေ.] LT [မှာ]', - 'nextDay' => '[မနက်ဖြန်] LT [မှာ]', - 'nextWeek' => 'dddd LT [မှာ]', - 'lastDay' => '[မနေ.က] LT [မှာ]', - 'lastWeek' => '[ပြီးခဲ့သော] dddd LT [မှာ]', - 'sameElse' => 'L', - ], - 'months' => ['ဇန်နဝါရီ', 'ဖေဖော်ဝါရီ', 'မတ်', 'ဧပြီ', 'မေ', 'ဇွန်', 'ဇူလိုင်', 'သြဂုတ်', 'စက်တင်ဘာ', 'အောက်တိုဘာ', 'နိုဝင်ဘာ', 'ဒီဇင်ဘာ'], - 'months_short' => ['ဇန်', 'ဖေ', 'မတ်', 'ပြီ', 'မေ', 'ဇွန်', 'လိုင်', 'သြ', 'စက်', 'အောက်', 'နို', 'ဒီ'], - 'weekdays' => ['တနင်္ဂနွေ', 'တနင်္လာ', 'အင်္ဂါ', 'ဗုဒ္ဓဟူး', 'ကြာသပတေး', 'သောကြာ', 'စနေ'], - 'weekdays_short' => ['နွေ', 'လာ', 'ဂါ', 'ဟူး', 'ကြာ', 'သော', 'နေ'], - 'weekdays_min' => ['နွေ', 'လာ', 'ဂါ', 'ဟူး', 'ကြာ', 'သော', 'နေ'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'alt_numbers' => ['၀၀', '၀၁', '၀၂', '၀၃', '၀၄', '၀၅', '၀၆', '၀၇', '၀၈', '၀၉', '၁၀', '၁၁', '၁၂', '၁၃', '၁၄', '၁၅', '၁၆', '၁၇', '၁၈', '၁၉', '၂၀', '၂၁', '၂၂', '၂၃', '၂၄', '၂၅', '၂၆', '၂၇', '၂၈', '၂၉', '၃၀', '၃၁', '၃၂', '၃၃', '၃၄', '၃၅', '၃၆', '၃၇', '၃၈', '၃၉', '၄၀', '၄၁', '၄၂', '၄၃', '၄၄', '၄၅', '၄၆', '၄၇', '၄၈', '၄၉', '၅၀', '၅၁', '၅၂', '၅၃', '၅၄', '၅၅', '၅၆', '၅၇', '၅၈', '၅၉', '၆၀', '၆၁', '၆၂', '၆၃', '၆၄', '၆၅', '၆၆', '၆၇', '၆၈', '၆၉', '၇၀', '၇၁', '၇၂', '၇၃', '၇၄', '၇၅', '၇၆', '၇၇', '၇၈', '၇၉', '၈၀', '၈၁', '၈၂', '၈၃', '၈၄', '၈၅', '၈၆', '၈၇', '၈၈', '၈၉', '၉၀', '၉၁', '၉၂', '၉၃', '၉၄', '၉၅', '၉၆', '၉၇', '၉၈', '၉၉'], - 'meridiem' => ['နံနက်', 'ညနေ'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php b/vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php deleted file mode 100644 index a0108dd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/my.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mzn.php b/vendor/nesbot/carbon/src/Carbon/Lang/mzn.php deleted file mode 100644 index 70f5f23..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mzn.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fa.php', [ - 'months' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], - 'months_short' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], - 'first_day_of_week' => 6, - 'weekend' => [5, 5], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nan.php b/vendor/nesbot/carbon/src/Carbon/Lang/nan.php deleted file mode 100644 index 0affece..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nan.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/nan_TW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php deleted file mode 100644 index 4fc6548..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY年MM月DD日', - ], - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => [' 1月', ' 2月', ' 3月', ' 4月', ' 5月', ' 6月', ' 7月', ' 8月', ' 9月', '10月', '11月', '12月'], - 'weekdays' => ['禮拜日', '禮拜一', '禮拜二', '禮拜三', '禮拜四', '禮拜五', '禮拜六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['頂晡', '下晡'], - - 'year' => ':count 年', - 'y' => ':count 年', - 'a_year' => ':count 年', - - 'month' => ':count goe̍h', - 'm' => ':count goe̍h', - 'a_month' => ':count goe̍h', - - 'week' => ':count lé-pài', - 'w' => ':count lé-pài', - 'a_week' => ':count lé-pài', - - 'day' => ':count 日', - 'd' => ':count 日', - 'a_day' => ':count 日', - - 'hour' => ':count tiám-cheng', - 'h' => ':count tiám-cheng', - 'a_hour' => ':count tiám-cheng', - - 'minute' => ':count Hun-cheng', - 'min' => ':count Hun-cheng', - 'a_minute' => ':count Hun-cheng', - - 'second' => ':count Bió', - 's' => ':count Bió', - 'a_second' => ':count Bió', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php b/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php deleted file mode 100644 index 5eecc63..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Arne Goetje arne@canonical.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], - 'months' => ['1goe̍h', '2goe̍h', '3goe̍h', '4goe̍h', '5goe̍h', '6goe̍h', '7goe̍h', '8goe̍h', '9goe̍h', '10goe̍h', '11goe̍h', '12goe̍h'], - 'months_short' => ['1g', '2g', '3g', '4g', '5g', '6g', '7g', '8g', '9g', '10g', '11g', '12g'], - 'weekdays' => ['lé-pài-ji̍t', 'pài-it', 'pài-jī', 'pài-saⁿ', 'pài-sì', 'pài-gō͘', 'pài-la̍k'], - 'weekdays_short' => ['lp', 'p1', 'p2', 'p3', 'p4', 'p5', 'p6'], - 'weekdays_min' => ['lp', 'p1', 'p2', 'p3', 'p4', 'p5', 'p6'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['téng-po͘', 'ē-po͘'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/naq.php b/vendor/nesbot/carbon/src/Carbon/Lang/naq.php deleted file mode 100644 index fbd9be9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/naq.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['ǁgoagas', 'ǃuias'], - 'weekdays' => ['Sontaxtsees', 'Mantaxtsees', 'Denstaxtsees', 'Wunstaxtsees', 'Dondertaxtsees', 'Fraitaxtsees', 'Satertaxtsees'], - 'weekdays_short' => ['Son', 'Ma', 'De', 'Wu', 'Do', 'Fr', 'Sat'], - 'weekdays_min' => ['Son', 'Ma', 'De', 'Wu', 'Do', 'Fr', 'Sat'], - 'months' => ['ǃKhanni', 'ǃKhanǀgôab', 'ǀKhuuǁkhâb', 'ǃHôaǂkhaib', 'ǃKhaitsâb', 'Gamaǀaeb', 'ǂKhoesaob', 'Aoǁkhuumûǁkhâb', 'Taraǀkhuumûǁkhâb', 'ǂNûǁnâiseb', 'ǀHooǂgaeb', 'Hôasoreǁkhâb'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY h:mm a', - ], - - 'year' => ':count kurigu', - 'y' => ':count kurigu', - 'a_year' => ':count kurigu', - - 'month' => ':count ǁaub', // less reliable - 'm' => ':count ǁaub', // less reliable - 'a_month' => ':count ǁaub', // less reliable - - 'week' => ':count hû', // less reliable - 'w' => ':count hû', // less reliable - 'a_week' => ':count hû', // less reliable - - 'day' => ':count ǀhobas', // less reliable - 'd' => ':count ǀhobas', // less reliable - 'a_day' => ':count ǀhobas', // less reliable - - 'hour' => ':count ǂgaes', // less reliable - 'h' => ':count ǂgaes', // less reliable - 'a_hour' => ':count ǂgaes', // less reliable - - 'minute' => ':count minutga', // less reliable - 'min' => ':count minutga', // less reliable - 'a_minute' => ':count minutga', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nb.php b/vendor/nesbot/carbon/src/Carbon/Lang/nb.php deleted file mode 100644 index 371ee84..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nb.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Alexander Tømmerås - * - Sigurd Gartmann - * - JD Isaacks - */ -return [ - 'year' => ':count år|:count år', - 'a_year' => 'ett år|:count år', - 'y' => ':count år|:count år', - 'month' => ':count måned|:count måneder', - 'a_month' => 'en måned|:count måneder', - 'm' => ':count md.', - 'week' => ':count uke|:count uker', - 'a_week' => 'en uke|:count uker', - 'w' => ':count u.', - 'day' => ':count dag|:count dager', - 'a_day' => 'en dag|:count dager', - 'd' => ':count d.', - 'hour' => ':count time|:count timer', - 'a_hour' => 'en time|:count timer', - 'h' => ':count t', - 'minute' => ':count minutt|:count minutter', - 'a_minute' => 'ett minutt|:count minutter', - 'min' => ':count min', - 'second' => ':count sekund|:count sekunder', - 'a_second' => 'noen sekunder|:count sekunder', - 's' => ':count sek', - 'ago' => ':time siden', - 'from_now' => 'om :time', - 'after' => ':time etter', - 'before' => ':time før', - 'diff_now' => 'akkurat nå', - 'diff_today' => 'i dag', - 'diff_today_regexp' => 'i dag(?:\\s+kl.)?', - 'diff_yesterday' => 'i går', - 'diff_yesterday_regexp' => 'i går(?:\\s+kl.)?', - 'diff_tomorrow' => 'i morgen', - 'diff_tomorrow_regexp' => 'i morgen(?:\\s+kl.)?', - 'diff_before_yesterday' => 'i forgårs', - 'diff_after_tomorrow' => 'i overmorgen', - 'period_recurrences' => 'en gang|:count ganger', - 'period_interval' => 'hver :interval', - 'period_start_date' => 'fra :date', - 'period_end_date' => 'til :date', - 'months' => ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'], - 'weekdays_short' => ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'], - 'weekdays_min' => ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'], - 'ordinal' => ':number.', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY [kl.] HH:mm', - 'LLLL' => 'dddd D. MMMM YYYY [kl.] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[i dag kl.] LT', - 'nextDay' => '[i morgen kl.] LT', - 'nextWeek' => 'dddd [kl.] LT', - 'lastDay' => '[i går kl.] LT', - 'lastWeek' => '[forrige] dddd [kl.] LT', - 'sameElse' => 'L', - ], - 'list' => [', ', ' og '], - 'meridiem' => ['a.m.', 'p.m.'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php b/vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php deleted file mode 100644 index 31678c5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nb.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php deleted file mode 100644 index ce0210b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/nb.php', [ - 'formats' => [ - 'LL' => 'D. MMM YYYY', - 'LLL' => 'D. MMMM YYYY, HH:mm', - 'LLLL' => 'dddd D. MMMM YYYY, HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nd.php b/vendor/nesbot/carbon/src/Carbon/Lang/nd.php deleted file mode 100644 index d88633c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nd.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'weekdays' => ['Sonto', 'Mvulo', 'Sibili', 'Sithathu', 'Sine', 'Sihlanu', 'Mgqibelo'], - 'weekdays_short' => ['Son', 'Mvu', 'Sib', 'Sit', 'Sin', 'Sih', 'Mgq'], - 'weekdays_min' => ['Son', 'Mvu', 'Sib', 'Sit', 'Sin', 'Sih', 'Mgq'], - 'months' => ['Zibandlela', 'Nhlolanja', 'Mbimbitho', 'Mabasa', 'Nkwenkwezi', 'Nhlangula', 'Ntulikazi', 'Ncwabakazi', 'Mpandula', 'Mfumfu', 'Lwezi', 'Mpalakazi'], - 'months_short' => ['Zib', 'Nhlo', 'Mbi', 'Mab', 'Nkw', 'Nhla', 'Ntu', 'Ncw', 'Mpan', 'Mfu', 'Lwe', 'Mpal'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => 'okweminyaka engu-:count', // less reliable - 'y' => 'okweminyaka engu-:count', // less reliable - 'a_year' => 'okweminyaka engu-:count', // less reliable - - 'month' => 'inyanga ezingu-:count', - 'm' => 'inyanga ezingu-:count', - 'a_month' => 'inyanga ezingu-:count', - - 'week' => 'amaviki angu-:count', - 'w' => 'amaviki angu-:count', - 'a_week' => 'amaviki angu-:count', - - 'day' => 'kwamalanga angu-:count', - 'd' => 'kwamalanga angu-:count', - 'a_day' => 'kwamalanga angu-:count', - - 'hour' => 'amahola angu-:count', - 'h' => 'amahola angu-:count', - 'a_hour' => 'amahola angu-:count', - - 'minute' => 'imizuzu engu-:count', - 'min' => 'imizuzu engu-:count', - 'a_minute' => 'imizuzu engu-:count', - - 'second' => 'imizuzwana engu-:count', - 's' => 'imizuzwana engu-:count', - 'a_second' => 'imizuzwana engu-:count', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nds.php b/vendor/nesbot/carbon/src/Carbon/Lang/nds.php deleted file mode 100644 index c0b3775..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nds.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/nds_DE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php deleted file mode 100644 index a6c57a9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Jannuaar', 'Feberwaar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], - 'months_short' => ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], - 'weekdays' => ['Sünndag', 'Maandag', 'Dingsdag', 'Middeweek', 'Dunnersdag', 'Freedag', 'Sünnavend'], - 'weekdays_short' => ['Sdag', 'Maan', 'Ding', 'Midd', 'Dunn', 'Free', 'Svd.'], - 'weekdays_min' => ['Sd', 'Ma', 'Di', 'Mi', 'Du', 'Fr', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count Johr', - 'y' => ':countJ', - 'a_year' => '{1}een Johr|:count Johr', - - 'month' => ':count Maand', - 'm' => ':countM', - 'a_month' => '{1}een Maand|:count Maand', - - 'week' => ':count Week|:count Weken', - 'w' => ':countW', - 'a_week' => '{1}een Week|:count Week|:count Weken', - - 'day' => ':count Dag|:count Daag', - 'd' => ':countD', - 'a_day' => '{1}een Dag|:count Dag|:count Daag', - - 'hour' => ':count Stünn|:count Stünnen', - 'h' => ':countSt', - 'a_hour' => '{1}een Stünn|:count Stünn|:count Stünnen', - - 'minute' => ':count Minuut|:count Minuten', - 'min' => ':countm', - 'a_minute' => '{1}een Minuut|:count Minuut|:count Minuten', - - 'second' => ':count Sekunn|:count Sekunnen', - 's' => ':counts', - 'a_second' => 'en poor Sekunnen|:count Sekunn|:count Sekunnen', - - 'ago' => 'vör :time', - 'from_now' => 'in :time', - 'before' => ':time vörher', - 'after' => ':time later', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php b/vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php deleted file mode 100644 index de2c57b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Jaunuwoa', 'Februwoa', 'Moaz', 'Aprell', 'Mai', 'Juni', 'Juli', 'August', 'Septamba', 'Oktoba', 'Nowamba', 'Dezamba'], - 'months_short' => ['Jan', 'Feb', 'Moz', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Now', 'Dez'], - 'weekdays' => ['Sinndag', 'Mondag', 'Dingsdag', 'Meddwäakj', 'Donnadag', 'Friedag', 'Sinnowend'], - 'weekdays_short' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], - 'weekdays_min' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ne.php b/vendor/nesbot/carbon/src/Carbon/Lang/ne.php deleted file mode 100644 index 998d13f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ne.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - nootanghimire - * - Josh Soref - * - Nj Subedi - * - JD Isaacks - */ -return [ - 'year' => 'एक बर्ष|:count बर्ष', - 'y' => ':count वर्ष', - 'month' => 'एक महिना|:count महिना', - 'm' => ':count महिना', - 'week' => ':count हप्ता', - 'w' => ':count हप्ता', - 'day' => 'एक दिन|:count दिन', - 'd' => ':count दिन', - 'hour' => 'एक घण्टा|:count घण्टा', - 'h' => ':count घण्टा', - 'minute' => 'एक मिनेट|:count मिनेट', - 'min' => ':count मिनेट', - 'second' => 'केही क्षण|:count सेकेण्ड', - 's' => ':count सेकेण्ड', - 'ago' => ':time अगाडि', - 'from_now' => ':timeमा', - 'after' => ':time पछि', - 'before' => ':time अघि', - 'diff_now' => 'अहिले', - 'diff_today' => 'आज', - 'diff_yesterday' => 'हिजो', - 'diff_tomorrow' => 'भोलि', - 'formats' => [ - 'LT' => 'Aको h:mm बजे', - 'LTS' => 'Aको h:mm:ss बजे', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, Aको h:mm बजे', - 'LLLL' => 'dddd, D MMMM YYYY, Aको h:mm बजे', - ], - 'calendar' => [ - 'sameDay' => '[आज] LT', - 'nextDay' => '[भोलि] LT', - 'nextWeek' => '[आउँदो] dddd[,] LT', - 'lastDay' => '[हिजो] LT', - 'lastWeek' => '[गएको] dddd[,] LT', - 'sameElse' => 'L', - ], - 'meridiem' => static function ($hour) { - if ($hour < 3) { - return 'राति'; - } - if ($hour < 12) { - return 'बिहान'; - } - if ($hour < 16) { - return 'दिउँसो'; - } - if ($hour < 20) { - return 'साँझ'; - } - - return 'राति'; - }, - 'months' => ['जनवरी', 'फेब्रुवरी', 'मार्च', 'अप्रिल', 'मई', 'जुन', 'जुलाई', 'अगष्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'], - 'months_short' => ['जन.', 'फेब्रु.', 'मार्च', 'अप्रि.', 'मई', 'जुन', 'जुलाई.', 'अग.', 'सेप्ट.', 'अक्टो.', 'नोभे.', 'डिसे.'], - 'weekdays' => ['आइतबार', 'सोमबार', 'मङ्गलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'], - 'weekdays_short' => ['आइत.', 'सोम.', 'मङ्गल.', 'बुध.', 'बिहि.', 'शुक्र.', 'शनि.'], - 'weekdays_min' => ['आ.', 'सो.', 'मं.', 'बु.', 'बि.', 'शु.', 'श.'], - 'list' => [', ', ' र '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php deleted file mode 100644 index f68d00e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ne.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'yy/M/d', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D, h:mm a', - 'LLLL' => 'YYYY MMMM D, dddd, h:mm a', - ], - 'months' => ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'], - 'months_short' => ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'], - 'weekend' => [0, 0], - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php b/vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php deleted file mode 100644 index 27840c0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ne.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nhn.php b/vendor/nesbot/carbon/src/Carbon/Lang/nhn.php deleted file mode 100644 index 5a85831..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nhn.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/nhn_MX.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php b/vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php deleted file mode 100644 index 8d06d50..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'], - 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'], - 'weekdays' => ['teoilhuitl', 'ceilhuitl', 'omeilhuitl', 'yeilhuitl', 'nahuilhuitl', 'macuililhuitl', 'chicuaceilhuitl'], - 'weekdays_short' => ['teo', 'cei', 'ome', 'yei', 'nau', 'mac', 'chi'], - 'weekdays_min' => ['teo', 'cei', 'ome', 'yei', 'nau', 'mac', 'chi'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'month' => ':count metztli', // less reliable - 'm' => ':count metztli', // less reliable - 'a_month' => ':count metztli', // less reliable - - 'week' => ':count tonalli', // less reliable - 'w' => ':count tonalli', // less reliable - 'a_week' => ':count tonalli', // less reliable - - 'day' => ':count tonatih', // less reliable - 'd' => ':count tonatih', // less reliable - 'a_day' => ':count tonatih', // less reliable - - 'minute' => ':count toltecayotl', // less reliable - 'min' => ':count toltecayotl', // less reliable - 'a_minute' => ':count toltecayotl', // less reliable - - 'second' => ':count ome', // less reliable - 's' => ':count ome', // less reliable - 'a_second' => ':count ome', // less reliable - - 'year' => ':count xihuitl', - 'y' => ':count xihuitl', - 'a_year' => ':count xihuitl', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/niu.php b/vendor/nesbot/carbon/src/Carbon/Lang/niu.php deleted file mode 100644 index bd9be8a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/niu.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/niu_NU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php b/vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php deleted file mode 100644 index 6e7a697..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RockET Systems Emani Fakaotimanava-Lui emani@niue.nu - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Ianuali', 'Fepuali', 'Masi', 'Apelila', 'Me', 'Iuni', 'Iulai', 'Aokuso', 'Sepetema', 'Oketopa', 'Novema', 'Tesemo'], - 'months_short' => ['Ian', 'Fep', 'Mas', 'Ape', 'Me', 'Iun', 'Iul', 'Aok', 'Sep', 'Oke', 'Nov', 'Tes'], - 'weekdays' => ['Aho Tapu', 'Aho Gofua', 'Aho Ua', 'Aho Lotu', 'Aho Tuloto', 'Aho Falaile', 'Aho Faiumu'], - 'weekdays_short' => ['Tapu', 'Gofua', 'Ua', 'Lotu', 'Tuloto', 'Falaile', 'Faiumu'], - 'weekdays_min' => ['Tapu', 'Gofua', 'Ua', 'Lotu', 'Tuloto', 'Falaile', 'Faiumu'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count tau', - 'y' => ':count tau', - 'a_year' => ':count tau', - - 'month' => ':count mahina', - 'm' => ':count mahina', - 'a_month' => ':count mahina', - - 'week' => ':count faahi tapu', - 'w' => ':count faahi tapu', - 'a_week' => ':count faahi tapu', - - 'day' => ':count aho', - 'd' => ':count aho', - 'a_day' => ':count aho', - - 'hour' => ':count e tulā', - 'h' => ':count e tulā', - 'a_hour' => ':count e tulā', - - 'minute' => ':count minuti', - 'min' => ':count minuti', - 'a_minute' => ':count minuti', - - 'second' => ':count sekone', - 's' => ':count sekone', - 'a_second' => ':count sekone', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl.php deleted file mode 100644 index ccf1925..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nl.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Roy - * - Stephan - * - François B - * - Tim Fish - * - Kevin Huang - * - Jacob Middag - * - JD Isaacks - * - Roy - * - Stephan - * - François B - * - Tim Fish - * - Jacob Middag - * - JD Isaacks - * - Propaganistas - * - MegaXLR - * - adriaanzon - * - MonkeyPhysics - * - JeroenG - * - RikSomers - * - proclame - * - Rik de Groot (hwdegroot) - */ -return [ - 'year' => ':count jaar|:count jaar', - 'a_year' => 'een jaar|:count jaar', - 'y' => ':countj', - 'month' => ':count maand|:count maanden', - 'a_month' => 'een maand|:count maanden', - 'm' => ':countmnd', - 'week' => ':count week|:count weken', - 'a_week' => 'een week|:count weken', - 'w' => ':countw', - 'day' => ':count dag|:count dagen', - 'a_day' => 'een dag|:count dagen', - 'd' => ':countd', - 'hour' => ':count uur|:count uur', - 'a_hour' => 'een uur|:count uur', - 'h' => ':countu', - 'minute' => ':count minuut|:count minuten', - 'a_minute' => 'een minuut|:count minuten', - 'min' => ':countmin', - 'second' => ':count seconde|:count seconden', - 'a_second' => 'een paar seconden|:count seconden', - 's' => ':counts', - 'ago' => ':time geleden', - 'from_now' => 'over :time', - 'after' => ':time later', - 'before' => ':time eerder', - 'diff_now' => 'nu', - 'diff_today' => 'vandaag', - 'diff_today_regexp' => 'vandaag(?:\\s+om)?', - 'diff_yesterday' => 'gisteren', - 'diff_yesterday_regexp' => 'gisteren(?:\\s+om)?', - 'diff_tomorrow' => 'morgen', - 'diff_tomorrow_regexp' => 'morgen(?:\\s+om)?', - 'diff_after_tomorrow' => 'overmorgen', - 'diff_before_yesterday' => 'eergisteren', - 'period_recurrences' => ':count keer', - 'period_interval' => static function (string $interval = '') { - /** @var string $output */ - $output = preg_replace('/^(een|één|1)\s+/u', '', $interval); - - if (preg_match('/^(een|één|1)( jaar|j| uur|u)/u', $interval)) { - return "elk $output"; - } - - return "elke $output"; - }, - 'period_start_date' => 'van :date', - 'period_end_date' => 'tot :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD-MM-YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[vandaag om] LT', - 'nextDay' => '[morgen om] LT', - 'nextWeek' => 'dddd [om] LT', - 'lastDay' => '[gisteren om] LT', - 'lastWeek' => '[afgelopen] dddd [om] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - return $number.(($number === 1 || $number === 8 || $number >= 20) ? 'ste' : 'de'); - }, - 'months' => ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'mmm_suffix' => '.', - 'weekdays' => ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], - 'weekdays_short' => ['zo.', 'ma.', 'di.', 'wo.', 'do.', 'vr.', 'za.'], - 'weekdays_min' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' en '], - 'meridiem' => ['\'s ochtends', '\'s middags'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php deleted file mode 100644 index 5ec136d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/nl.php', [ - 'formats' => [ - 'L' => 'DD-MM-YY', - ], - 'months' => ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], - 'weekdays_short' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], - 'weekdays_min' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php deleted file mode 100644 index 037f5b4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Roy - * - Stephan - * - François B - * - Tim Fish - * - Kevin Huang - * - Jacob Middag - * - JD Isaacks - * - Propaganistas - */ -return array_replace_recursive(require __DIR__.'/nl.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php deleted file mode 100644 index c269197..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php deleted file mode 100644 index c269197..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php deleted file mode 100644 index 14e4853..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/nl.php', [ - 'months' => ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], - 'weekdays_short' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], - 'weekdays_min' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php deleted file mode 100644 index c269197..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php deleted file mode 100644 index c269197..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nmg.php b/vendor/nesbot/carbon/src/Carbon/Lang/nmg.php deleted file mode 100644 index 4d1df6e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nmg.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['maná', 'kugú'], - 'weekdays' => ['sɔ́ndɔ', 'mɔ́ndɔ', 'sɔ́ndɔ mafú mába', 'sɔ́ndɔ mafú málal', 'sɔ́ndɔ mafú mána', 'mabágá má sukul', 'sásadi'], - 'weekdays_short' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'mbs', 'sas'], - 'weekdays_min' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'mbs', 'sas'], - 'months' => ['ngwɛn matáhra', 'ngwɛn ńmba', 'ngwɛn ńlal', 'ngwɛn ńna', 'ngwɛn ńtan', 'ngwɛn ńtuó', 'ngwɛn hɛmbuɛrí', 'ngwɛn lɔmbi', 'ngwɛn rɛbvuâ', 'ngwɛn wum', 'ngwɛn wum navǔr', 'krísimin'], - 'months_short' => ['ng1', 'ng2', 'ng3', 'ng4', 'ng5', 'ng6', 'ng7', 'ng8', 'ng9', 'ng10', 'ng11', 'kris'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nn.php b/vendor/nesbot/carbon/src/Carbon/Lang/nn.php deleted file mode 100644 index 041f7b2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nn.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Alexander Tømmerås - * - Øystein - * - JD Isaacks - * - Gaute Hvoslef Kvalnes (gaute) - */ -return [ - 'year' => ':count år', - 'a_year' => 'eit år|:count år', - 'y' => ':count år', - 'month' => ':count månad|:count månader', - 'a_month' => 'ein månad|:count månader', - 'm' => ':count md', - 'week' => ':count veke|:count veker', - 'a_week' => 'ei veke|:count veker', - 'w' => ':countv', - 'day' => ':count dag|:count dagar', - 'a_day' => 'ein dag|:count dagar', - 'd' => ':countd', - 'hour' => ':count time|:count timar', - 'a_hour' => 'ein time|:count timar', - 'h' => ':countt', - 'minute' => ':count minutt', - 'a_minute' => 'eit minutt|:count minutt', - 'min' => ':countm', - 'second' => ':count sekund', - 'a_second' => 'nokre sekund|:count sekund', - 's' => ':counts', - 'ago' => ':time sidan', - 'from_now' => 'om :time', - 'after' => ':time etter', - 'before' => ':time før', - 'diff_today' => 'I dag', - 'diff_yesterday' => 'I går', - 'diff_yesterday_regexp' => 'I går(?:\\s+klokka)?', - 'diff_tomorrow' => 'I morgon', - 'diff_tomorrow_regexp' => 'I morgon(?:\\s+klokka)?', - 'diff_today_regexp' => 'I dag(?:\\s+klokka)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY [kl.] H:mm', - 'LLLL' => 'dddd D. MMMM YYYY [kl.] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[I dag klokka] LT', - 'nextDay' => '[I morgon klokka] LT', - 'nextWeek' => 'dddd [klokka] LT', - 'lastDay' => '[I går klokka] LT', - 'lastWeek' => '[Føregåande] dddd [klokka] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['sundag', 'måndag', 'tysdag', 'onsdag', 'torsdag', 'fredag', 'laurdag'], - 'weekdays_short' => ['sun', 'mån', 'tys', 'ons', 'tor', 'fre', 'lau'], - 'weekdays_min' => ['su', 'må', 'ty', 'on', 'to', 'fr', 'la'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' og '], - 'meridiem' => ['f.m.', 'e.m.'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php b/vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php deleted file mode 100644 index 8e16871..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nn.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nnh.php b/vendor/nesbot/carbon/src/Carbon/Lang/nnh.php deleted file mode 100644 index 007d239..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nnh.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['mbaʼámbaʼ', 'ncwònzém'], - 'weekdays' => null, - 'weekdays_short' => ['lyɛʼɛ́ sẅíŋtè', 'mvfò lyɛ̌ʼ', 'mbɔ́ɔntè mvfò lyɛ̌ʼ', 'tsètsɛ̀ɛ lyɛ̌ʼ', 'mbɔ́ɔntè tsetsɛ̀ɛ lyɛ̌ʼ', 'mvfò màga lyɛ̌ʼ', 'màga lyɛ̌ʼ'], - 'weekdays_min' => null, - 'months' => null, - 'months_short' => ['saŋ tsetsɛ̀ɛ lùm', 'saŋ kàg ngwóŋ', 'saŋ lepyè shúm', 'saŋ cÿó', 'saŋ tsɛ̀ɛ cÿó', 'saŋ njÿoláʼ', 'saŋ tyɛ̀b tyɛ̀b mbʉ̀ŋ', 'saŋ mbʉ̀ŋ', 'saŋ ngwɔ̀ʼ mbÿɛ', 'saŋ tàŋa tsetsáʼ', 'saŋ mejwoŋó', 'saŋ lùm'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/yy', - 'LL' => 'D MMM, YYYY', - 'LLL' => '[lyɛ]̌ʼ d [na] MMMM, YYYY HH:mm', - 'LLLL' => 'dddd , [lyɛ]̌ʼ d [na] MMMM, YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/no.php b/vendor/nesbot/carbon/src/Carbon/Lang/no.php deleted file mode 100644 index f4497c7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/no.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Daniel S. Billing - * - Paul - * - Jimmie Johansson - * - Jens Herlevsen - */ -return array_replace_recursive(require __DIR__.'/nb.php', [ - 'formats' => [ - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D. MMMM YYYY [kl.] HH:mm', - ], - 'calendar' => [ - 'nextWeek' => 'på dddd [kl.] LT', - 'lastWeek' => '[i] dddd[s kl.] LT', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nr.php b/vendor/nesbot/carbon/src/Carbon/Lang/nr.php deleted file mode 100644 index 1bc999f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nr.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/nr_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php deleted file mode 100644 index 5093759..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Janabari', 'uFeberbari', 'uMatjhi', 'u-Apreli', 'Meyi', 'Juni', 'Julayi', 'Arhostosi', 'Septemba', 'Oktoba', 'Usinyikhaba', 'Disemba'], - 'months_short' => ['Jan', 'Feb', 'Mat', 'Apr', 'Mey', 'Jun', 'Jul', 'Arh', 'Sep', 'Okt', 'Usi', 'Dis'], - 'weekdays' => ['uSonto', 'uMvulo', 'uLesibili', 'lesithathu', 'uLesine', 'ngoLesihlanu', 'umGqibelo'], - 'weekdays_short' => ['Son', 'Mvu', 'Bil', 'Tha', 'Ne', 'Hla', 'Gqi'], - 'weekdays_min' => ['Son', 'Mvu', 'Bil', 'Tha', 'Ne', 'Hla', 'Gqi'], - 'day_of_first_week_of_year' => 1, - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nso.php b/vendor/nesbot/carbon/src/Carbon/Lang/nso.php deleted file mode 100644 index 2a6cabb..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nso.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/nso_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php deleted file mode 100644 index 93da1e7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Janaware', 'Febereware', 'Matšhe', 'Aprele', 'Mei', 'June', 'Julae', 'Agostose', 'Setemere', 'Oktobere', 'Nofemere', 'Disemere'], - 'months_short' => ['Jan', 'Feb', 'Mat', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Set', 'Okt', 'Nof', 'Dis'], - 'weekdays' => ['LaMorena', 'Mošupologo', 'Labobedi', 'Laboraro', 'Labone', 'Labohlano', 'Mokibelo'], - 'weekdays_short' => ['Son', 'Moš', 'Bed', 'Rar', 'Ne', 'Hla', 'Mok'], - 'weekdays_min' => ['Son', 'Moš', 'Bed', 'Rar', 'Ne', 'Hla', 'Mok'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count ngwaga', - 'y' => ':count ngwaga', - 'a_year' => ':count ngwaga', - - 'month' => ':count Kgwedi', - 'm' => ':count Kgwedi', - 'a_month' => ':count Kgwedi', - - 'week' => ':count Beke', - 'w' => ':count Beke', - 'a_week' => ':count Beke', - - 'day' => ':count Letšatši', - 'd' => ':count Letšatši', - 'a_day' => ':count Letšatši', - - 'hour' => ':count Iri', - 'h' => ':count Iri', - 'a_hour' => ':count Iri', - - 'minute' => ':count Motsotso', - 'min' => ':count Motsotso', - 'a_minute' => ':count Motsotso', - - 'second' => ':count motsotswana', - 's' => ':count motsotswana', - 'a_second' => ':count motsotswana', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nus.php b/vendor/nesbot/carbon/src/Carbon/Lang/nus.php deleted file mode 100644 index 789bc39..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nus.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['RW', 'TŊ'], - 'weekdays' => ['Cäŋ kuɔth', 'Jiec la̱t', 'Rɛw lätni', 'Diɔ̱k lätni', 'Ŋuaan lätni', 'Dhieec lätni', 'Bäkɛl lätni'], - 'weekdays_short' => ['Cäŋ', 'Jiec', 'Rɛw', 'Diɔ̱k', 'Ŋuaan', 'Dhieec', 'Bäkɛl'], - 'weekdays_min' => ['Cäŋ', 'Jiec', 'Rɛw', 'Diɔ̱k', 'Ŋuaan', 'Dhieec', 'Bäkɛl'], - 'months' => ['Tiop thar pɛt', 'Pɛt', 'Duɔ̱ɔ̱ŋ', 'Guak', 'Duät', 'Kornyoot', 'Pay yie̱tni', 'Tho̱o̱r', 'Tɛɛr', 'Laath', 'Kur', 'Tio̱p in di̱i̱t'], - 'months_short' => ['Tiop', 'Pɛt', 'Duɔ̱ɔ̱', 'Guak', 'Duä', 'Kor', 'Pay', 'Thoo', 'Tɛɛ', 'Laa', 'Kur', 'Tid'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], - - 'year' => ':count jiök', // less reliable - 'y' => ':count jiök', // less reliable - 'a_year' => ':count jiök', // less reliable - - 'month' => ':count pay', // less reliable - 'm' => ':count pay', // less reliable - 'a_month' => ':count pay', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nyn.php b/vendor/nesbot/carbon/src/Carbon/Lang/nyn.php deleted file mode 100644 index 8660ea4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/nyn.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['Sande', 'Orwokubanza', 'Orwakabiri', 'Orwakashatu', 'Orwakana', 'Orwakataano', 'Orwamukaaga'], - 'weekdays_short' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], - 'weekdays_min' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], - 'months' => ['Okwokubanza', 'Okwakabiri', 'Okwakashatu', 'Okwakana', 'Okwakataana', 'Okwamukaaga', 'Okwamushanju', 'Okwamunaana', 'Okwamwenda', 'Okwaikumi', 'Okwaikumi na kumwe', 'Okwaikumi na ibiri'], - 'months_short' => ['KBZ', 'KBR', 'KST', 'KKN', 'KTN', 'KMK', 'KMS', 'KMN', 'KMW', 'KKM', 'KNK', 'KNB'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/oc.php b/vendor/nesbot/carbon/src/Carbon/Lang/oc.php deleted file mode 100644 index 858cf77..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/oc.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Quentí - * - Quentin PAGÈS - */ -// @codeCoverageIgnoreStart -use Symfony\Component\Translation\PluralizationRules; - -if (class_exists('Symfony\\Component\\Translation\\PluralizationRules')) { - PluralizationRules::set(static function ($number) { - return $number == 1 ? 0 : 1; - }, 'oc'); -} -// @codeCoverageIgnoreEnd - -return [ - 'year' => ':count an|:count ans', - 'a_year' => 'un an|:count ans', - 'y' => ':count an|:count ans', - 'month' => ':count mes|:count meses', - 'a_month' => 'un mes|:count meses', - 'm' => ':count mes|:count meses', - 'week' => ':count setmana|:count setmanas', - 'a_week' => 'una setmana|:count setmanas', - 'w' => ':count setmana|:count setmanas', - 'day' => ':count jorn|:count jorns', - 'a_day' => 'un jorn|:count jorns', - 'd' => ':count jorn|:count jorns', - 'hour' => ':count ora|:count oras', - 'a_hour' => 'una ora|:count oras', - 'h' => ':count ora|:count oras', - 'minute' => ':count minuta|:count minutas', - 'a_minute' => 'una minuta|:count minutas', - 'min' => ':count minuta|:count minutas', - 'second' => ':count segonda|:count segondas', - 'a_second' => 'una segonda|:count segondas', - 's' => ':count segonda|:count segondas', - 'ago' => 'fa :time', - 'from_now' => 'd\'aquí :time', - 'after' => ':time aprèp', - 'before' => ':time abans', - 'diff_now' => 'ara meteis', - 'diff_today' => 'Uèi', - 'diff_today_regexp' => 'Uèi(?:\\s+a)?', - 'diff_yesterday' => 'ièr', - 'diff_yesterday_regexp' => 'Ièr(?:\\s+a)?', - 'diff_tomorrow' => 'deman', - 'diff_tomorrow_regexp' => 'Deman(?:\\s+a)?', - 'diff_before_yesterday' => 'ièr delà', - 'diff_after_tomorrow' => 'deman passat', - 'period_recurrences' => ':count còp|:count còps', - 'period_interval' => 'cada :interval', - 'period_start_date' => 'de :date', - 'period_end_date' => 'fins a :date', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM [de] YYYY', - 'LLL' => 'D MMMM [de] YYYY [a] H:mm', - 'LLLL' => 'dddd D MMMM [de] YYYY [a] H:mm', - ], - 'calendar' => [ - 'sameDay' => '[Uèi a] LT', - 'nextDay' => '[Deman a] LT', - 'nextWeek' => 'dddd [a] LT', - 'lastDay' => '[Ièr a] LT', - 'lastWeek' => 'dddd [passat a] LT', - 'sameElse' => 'L', - ], - 'months' => ['de genièr', 'de febrièr', 'de març', 'd\'abrial', 'de mai', 'de junh', 'de julhet', 'd\'agost', 'de setembre', 'd’octòbre', 'de novembre', 'de decembre'], - 'months_standalone' => ['genièr', 'febrièr', 'març', 'abrial', 'mai', 'junh', 'julh', 'agost', 'setembre', 'octòbre', 'novembre', 'decembre'], - 'months_short' => ['gen.', 'feb.', 'març', 'abr.', 'mai', 'junh', 'julh', 'ago.', 'sep.', 'oct.', 'nov.', 'dec.'], - 'weekdays' => ['dimenge', 'diluns', 'dimars', 'dimècres', 'dijòus', 'divendres', 'dissabte'], - 'weekdays_short' => ['dg', 'dl', 'dm', 'dc', 'dj', 'dv', 'ds'], - 'weekdays_min' => ['dg', 'dl', 'dm', 'dc', 'dj', 'dv', 'ds'], - 'ordinal' => static function ($number, string $period = '') { - $ordinal = [1 => 'èr', 2 => 'nd'][(int) $number] ?? 'en'; - - // feminine for week, hour, minute, second - if (preg_match('/^[wWhHgGis]$/', $period)) { - $ordinal .= 'a'; - } - - return $number.$ordinal; - }, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' e '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php deleted file mode 100644 index 01eb5c1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/oc.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/om.php b/vendor/nesbot/carbon/src/Carbon/Lang/om.php deleted file mode 100644 index 3c72dc9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/om.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation & Sagalee Oromoo Publishing Co. Inc. locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'dd-MMM-YYYY', - 'LLL' => 'dd MMMM YYYY HH:mm', - 'LLLL' => 'dddd, MMMM D, YYYY HH:mm', - ], - 'months' => ['Amajjii', 'Guraandhala', 'Bitooteessa', 'Elba', 'Caamsa', 'Waxabajjii', 'Adooleessa', 'Hagayya', 'Fuulbana', 'Onkololeessa', 'Sadaasa', 'Muddee'], - 'months_short' => ['Ama', 'Gur', 'Bit', 'Elb', 'Cam', 'Wax', 'Ado', 'Hag', 'Ful', 'Onk', 'Sad', 'Mud'], - 'weekdays' => ['Dilbata', 'Wiixata', 'Qibxata', 'Roobii', 'Kamiisa', 'Jimaata', 'Sanbata'], - 'weekdays_short' => ['Dil', 'Wix', 'Qib', 'Rob', 'Kam', 'Jim', 'San'], - 'weekdays_min' => ['Dil', 'Wix', 'Qib', 'Rob', 'Kam', 'Jim', 'San'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['WD', 'WB'], - - 'year' => 'wggoota :count', - 'y' => 'wggoota :count', - 'a_year' => 'wggoota :count', - - 'month' => 'ji’a :count', - 'm' => 'ji’a :count', - 'a_month' => 'ji’a :count', - - 'week' => 'torban :count', - 'w' => 'torban :count', - 'a_week' => 'torban :count', - - 'day' => 'guyyaa :count', - 'd' => 'guyyaa :count', - 'a_day' => 'guyyaa :count', - - 'hour' => 'saʼaatii :count', - 'h' => 'saʼaatii :count', - 'a_hour' => 'saʼaatii :count', - - 'minute' => 'daqiiqaa :count', - 'min' => 'daqiiqaa :count', - 'a_minute' => 'daqiiqaa :count', - - 'second' => 'sekoondii :count', - 's' => 'sekoondii :count', - 'a_second' => 'sekoondii :count', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php deleted file mode 100644 index 044760e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/om.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php b/vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php deleted file mode 100644 index f5a4d1c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/om.php', [ - 'day_of_first_week_of_year' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/or.php b/vendor/nesbot/carbon/src/Carbon/Lang/or.php deleted file mode 100644 index 3aa7173..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/or.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/or_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php deleted file mode 100644 index 57a89f5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM AP Linux Technology Center, Yamato Software Laboratory bug-glibc@gnu.org - */ -return [ - 'diff_now' => 'ବର୍ତ୍ତମାନ', - 'diff_yesterday' => 'ଗତକାଲି', - 'diff_tomorrow' => 'ଆସନ୍ତାକାଲି', - 'formats' => [ - 'LT' => 'Oh:Om A', - 'LTS' => 'Oh:Om:Os A', - 'L' => 'OD-OM-OY', - 'LL' => 'OD MMMM OY', - 'LLL' => 'OD MMMM OY Oh:Om A', - 'LLLL' => 'dddd OD MMMM OY Oh:Om A', - ], - 'months' => ['ଜାନୁଆରୀ', 'ଫେବୃଆରୀ', 'ମାର୍ଚ୍ଚ', 'ଅପ୍ରେଲ', 'ମଇ', 'ଜୁନ', 'ଜୁଲାଇ', 'ଅଗଷ୍ଟ', 'ସେପ୍ଟେମ୍ବର', 'ଅକ୍ଟୋବର', 'ନଭେମ୍ବର', 'ଡିସେମ୍ବର'], - 'months_short' => ['ଜାନୁଆରୀ', 'ଫେବୃଆରୀ', 'ମାର୍ଚ୍ଚ', 'ଅପ୍ରେଲ', 'ମଇ', 'ଜୁନ', 'ଜୁଲାଇ', 'ଅଗଷ୍ଟ', 'ସେପ୍ଟେମ୍ବର', 'ଅକ୍ଟୋବର', 'ନଭେମ୍ବର', 'ଡିସେମ୍ବର'], - 'weekdays' => ['ରବିବାର', 'ସୋମବାର', 'ମଙ୍ଗଳବାର', 'ବୁଧବାର', 'ଗୁରୁବାର', 'ଶୁକ୍ରବାର', 'ଶନିବାର'], - 'weekdays_short' => ['ରବି', 'ସୋମ', 'ମଙ୍ଗଳ', 'ବୁଧ', 'ଗୁରୁ', 'ଶୁକ୍ର', 'ଶନି'], - 'weekdays_min' => ['ରବି', 'ସୋମ', 'ମଙ୍ଗଳ', 'ବୁଧ', 'ଗୁରୁ', 'ଶୁକ୍ର', 'ଶନି'], - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['୦', '୧', '୨', '୩', '୪', '୫', '୬', '୭', '୮', '୯', '୧୦', '୧୧', '୧୨', '୧୩', '୧୪', '୧୫', '୧୬', '୧୭', '୧୮', '୧୯', '୨୦', '୨୧', '୨୨', '୨୩', '୨୪', '୨୫', '୨୬', '୨୭', '୨୮', '୨୯', '୩୦', '୩୧', '୩୨', '୩୩', '୩୪', '୩୫', '୩୬', '୩୭', '୩୮', '୩୯', '୪୦', '୪୧', '୪୨', '୪୩', '୪୪', '୪୫', '୪୬', '୪୭', '୪୮', '୪୯', '୫୦', '୫୧', '୫୨', '୫୩', '୫୪', '୫୫', '୫୬', '୫୭', '୫୮', '୫୯', '୬୦', '୬୧', '୬୨', '୬୩', '୬୪', '୬୫', '୬୬', '୬୭', '୬୮', '୬୯', '୭୦', '୭୧', '୭୨', '୭୩', '୭୪', '୭୫', '୭୬', '୭୭', '୭୮', '୭୯', '୮୦', '୮୧', '୮୨', '୮୩', '୮୪', '୮୫', '୮୬', '୮୭', '୮୮', '୮୯', '୯୦', '୯୧', '୯୨', '୯୩', '୯୪', '୯୫', '୯୬', '୯୭', '୯୮', '୯୯'], - 'year' => ':count ବର୍ଷ', - 'y' => ':count ବ.', - 'month' => ':count ମାସ', - 'm' => ':count ମା.', - 'week' => ':count ସପ୍ତାହ', - 'w' => ':count ସପ୍ତା.', - 'day' => ':count ଦିନ', - 'd' => ':count ଦିନ', - 'hour' => ':count ଘଣ୍ତ', - 'h' => ':count ଘ.', - 'minute' => ':count ମିନଟ', - 'min' => ':count ମି.', - 'second' => ':count ସେକଣ୍ଢ', - 's' => ':count ସେ.', - 'ago' => ':time ପୂର୍ବେ', - 'from_now' => ':timeରେ', -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/os.php b/vendor/nesbot/carbon/src/Carbon/Lang/os.php deleted file mode 100644 index 5f55e8a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/os.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/os_RU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php deleted file mode 100644 index 9592d15..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['январы', 'февралы', 'мартъийы', 'апрелы', 'майы', 'июны', 'июлы', 'августы', 'сентябры', 'октябры', 'ноябры', 'декабры'], - 'months_short' => ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'], - 'weekdays' => ['Хуыцаубон', 'Къуырисæр', 'Дыццæг', 'Æртыццæг', 'Цыппæрæм', 'Майрæмбон', 'Сабат'], - 'weekdays_short' => ['Хцб', 'Крс', 'Дцг', 'Æрт', 'Цпр', 'Мрб', 'Сбт'], - 'weekdays_min' => ['Хцб', 'Крс', 'Дцг', 'Æрт', 'Цпр', 'Мрб', 'Сбт'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'minute' => ':count гыццыл', // less reliable - 'min' => ':count гыццыл', // less reliable - 'a_minute' => ':count гыццыл', // less reliable - - 'second' => ':count æндæр', // less reliable - 's' => ':count æндæр', // less reliable - 'a_second' => ':count æндæр', // less reliable - - 'year' => ':count аз', - 'y' => ':count аз', - 'a_year' => ':count аз', - - 'month' => ':count мӕй', - 'm' => ':count мӕй', - 'a_month' => ':count мӕй', - - 'week' => ':count къуыри', - 'w' => ':count къуыри', - 'a_week' => ':count къуыри', - - 'day' => ':count бон', - 'd' => ':count бон', - 'a_day' => ':count бон', - - 'hour' => ':count сахат', - 'h' => ':count сахат', - 'a_hour' => ':count сахат', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pa.php b/vendor/nesbot/carbon/src/Carbon/Lang/pa.php deleted file mode 100644 index 23c2f9e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pa.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - Punjab - */ -return [ - 'year' => 'ਇੱਕ ਸਾਲ|:count ਸਾਲ', - 'month' => 'ਇੱਕ ਮਹੀਨਾ|:count ਮਹੀਨੇ', - 'week' => 'ਹਫਤਾ|:count ਹਫ਼ਤੇ', - 'day' => 'ਇੱਕ ਦਿਨ|:count ਦਿਨ', - 'hour' => 'ਇੱਕ ਘੰਟਾ|:count ਘੰਟੇ', - 'minute' => 'ਇਕ ਮਿੰਟ|:count ਮਿੰਟ', - 'second' => 'ਕੁਝ ਸਕਿੰਟ|:count ਸਕਿੰਟ', - 'ago' => ':time ਪਹਿਲਾਂ', - 'from_now' => ':time ਵਿੱਚ', - 'before' => ':time ਤੋਂ ਪਹਿਲਾਂ', - 'after' => ':time ਤੋਂ ਬਾਅਦ', - 'diff_now' => 'ਹੁਣ', - 'diff_today' => 'ਅਜ', - 'diff_yesterday' => 'ਕਲ', - 'diff_tomorrow' => 'ਕਲ', - 'formats' => [ - 'LT' => 'A h:mm ਵਜੇ', - 'LTS' => 'A h:mm:ss ਵਜੇ', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm ਵਜੇ', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm ਵਜੇ', - ], - 'calendar' => [ - 'sameDay' => '[ਅਜ] LT', - 'nextDay' => '[ਕਲ] LT', - 'nextWeek' => '[ਅਗਲਾ] dddd, LT', - 'lastDay' => '[ਕਲ] LT', - 'lastWeek' => '[ਪਿਛਲੇ] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'ਰਾਤ'; - } - if ($hour < 10) { - return 'ਸਵੇਰ'; - } - if ($hour < 17) { - return 'ਦੁਪਹਿਰ'; - } - if ($hour < 20) { - return 'ਸ਼ਾਮ'; - } - - return 'ਰਾਤ'; - }, - 'months' => ['ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'], - 'months_short' => ['ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'], - 'weekdays' => ['ਐਤਵਾਰ', 'ਸੋਮਵਾਰ', 'ਮੰਗਲਵਾਰ', 'ਬੁਧਵਾਰ', 'ਵੀਰਵਾਰ', 'ਸ਼ੁੱਕਰਵਾਰ', 'ਸ਼ਨੀਚਰਵਾਰ'], - 'weekdays_short' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁਧ', 'ਵੀਰ', 'ਸ਼ੁਕਰ', 'ਸ਼ਨੀ'], - 'weekdays_min' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁਧ', 'ਵੀਰ', 'ਸ਼ੁਕਰ', 'ਸ਼ਨੀ'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' ਅਤੇ '], - 'weekend' => [0, 0], - 'alt_numbers' => ['੦', '੧', '੨', '੩', '੪', '੫', '੬', '੭', '੮', '੯'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php b/vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php deleted file mode 100644 index 39b0653..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ur.php', [ - 'weekdays' => ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'], - 'weekdays_short' => ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'], - 'weekdays_min' => ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'], - 'months' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd, DD MMMM YYYY h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php b/vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php deleted file mode 100644 index 7adff5c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/pa.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/M/yy', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY, h:mm a', - ], - 'months' => ['ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'], - 'months_short' => ['ਜਨ', 'ਫ਼ਰ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾ', 'ਅਗ', 'ਸਤੰ', 'ਅਕਤੂ', 'ਨਵੰ', 'ਦਸੰ'], - 'weekdays' => ['ਐਤਵਾਰ', 'ਸੋਮਵਾਰ', 'ਮੰਗਲਵਾਰ', 'ਬੁੱਧਵਾਰ', 'ਵੀਰਵਾਰ', 'ਸ਼ੁੱਕਰਵਾਰ', 'ਸ਼ਨਿੱਚਰਵਾਰ'], - 'weekdays_short' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁੱਧ', 'ਵੀਰ', 'ਸ਼ੁੱਕਰ', 'ਸ਼ਨਿੱਚਰ'], - 'weekdays_min' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗ', 'ਬੁੱਧ', 'ਵੀਰ', 'ਸ਼ੁੱਕ', 'ਸ਼ਨਿੱ'], - 'weekend' => [0, 0], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php deleted file mode 100644 index ca67642..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Guo Xiang Tan - * - Josh Soref - * - Ash - * - harpreetkhalsagtbit - */ -return require __DIR__.'/pa.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php b/vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php deleted file mode 100644 index 494a877..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['جنوري', 'فروري', 'مارچ', 'اپريل', 'مٓی', 'جون', 'جولاي', 'اگست', 'ستمبر', 'اكتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنوري', 'فروري', 'مارچ', 'اپريل', 'مٓی', 'جون', 'جولاي', 'اگست', 'ستمبر', 'اكتوبر', 'نومبر', 'دسمبر'], - 'weekdays' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'weekdays_short' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'weekdays_min' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ص', 'ش'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pap.php b/vendor/nesbot/carbon/src/Carbon/Lang/pap.php deleted file mode 100644 index b4c1706..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pap.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return [ - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm:ss', - 'L' => 'DD-MM-YY', - 'LL' => 'MMMM [di] DD, YYYY', - 'LLL' => 'DD MMM HH.mm', - 'LLLL' => 'MMMM DD, YYYY HH.mm', - ], - 'months' => ['yanüari', 'febrüari', 'mart', 'aprel', 'mei', 'yüni', 'yüli', 'ougùstùs', 'sèptèmber', 'oktober', 'novèmber', 'desèmber'], - 'months_short' => ['yan', 'feb', 'mar', 'apr', 'mei', 'yün', 'yül', 'oug', 'sèp', 'okt', 'nov', 'des'], - 'weekdays' => ['djadomingo', 'djaluna', 'djamars', 'djawebs', 'djarason', 'djabierne', 'djasabra'], - 'weekdays_short' => ['do', 'lu', 'ma', 'we', 'ra', 'bi', 'sa'], - 'weekdays_min' => ['do', 'lu', 'ma', 'we', 'ra', 'bi', 'sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'year' => ':count aña', - 'month' => ':count luna', - 'week' => ':count siman', - 'day' => ':count dia', - 'hour' => ':count ora', - 'minute' => ':count minüt', - 'second' => ':count sekònde', - 'list' => [', ', ' i '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php b/vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php deleted file mode 100644 index e9a48ff..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from native speaker Pablo Saratxaga pablo@mandrakesoft.com - */ -return require __DIR__.'/pap.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php b/vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php deleted file mode 100644 index e9a48ff..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from native speaker Pablo Saratxaga pablo@mandrakesoft.com - */ -return require __DIR__.'/pap.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pl.php b/vendor/nesbot/carbon/src/Carbon/Lang/pl.php deleted file mode 100644 index 35381f3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pl.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Wacław Jacek - * - François B - * - Tim Fish - * - Serhan Apaydın - * - Massimiliano Caniparoli - * - JD Isaacks - * - Jakub Szwacz - * - Jan - * - Paul - * - damlys - * - Marek (marast78) - * - Peter (UnrulyNatives) - * - Qrzysio - * - Jan (aso824) - * - diverpl - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count rok|:count lata|:count lat', - 'a_year' => 'rok|:count lata|:count lat', - 'y' => ':count r|:count l|:count l', - 'month' => ':count miesiąc|:count miesiące|:count miesięcy', - 'a_month' => 'miesiąc|:count miesiące|:count miesięcy', - 'm' => ':count mies.', - 'week' => ':count tydzień|:count tygodnie|:count tygodni', - 'a_week' => 'tydzień|:count tygodnie|:count tygodni', - 'w' => ':count tyg.', - 'day' => ':count dzień|:count dni|:count dni', - 'a_day' => 'dzień|:count dni|:count dni', - 'd' => ':count d', - 'hour' => ':count godzina|:count godziny|:count godzin', - 'a_hour' => 'godzina|:count godziny|:count godzin', - 'h' => ':count godz.', - 'minute' => ':count minuta|:count minuty|:count minut', - 'a_minute' => 'minuta|:count minuty|:count minut', - 'min' => ':count min', - 'second' => ':count sekunda|:count sekundy|:count sekund', - 'a_second' => '{1}kilka sekund|:count sekunda|:count sekundy|:count sekund', - 's' => ':count sek.', - 'ago' => ':time temu', - 'from_now' => static function ($time) { - return 'za '.strtr($time, [ - 'godzina' => 'godzinę', - 'minuta' => 'minutę', - 'sekunda' => 'sekundę', - ]); - }, - 'after' => ':time po', - 'before' => ':time przed', - 'diff_now' => 'teraz', - 'diff_today' => 'Dziś', - 'diff_today_regexp' => 'Dziś(?:\\s+o)?', - 'diff_yesterday' => 'wczoraj', - 'diff_yesterday_regexp' => 'Wczoraj(?:\\s+o)?', - 'diff_tomorrow' => 'jutro', - 'diff_tomorrow_regexp' => 'Jutro(?:\\s+o)?', - 'diff_before_yesterday' => 'przedwczoraj', - 'diff_after_tomorrow' => 'pojutrze', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Dziś o] LT', - 'nextDay' => '[Jutro o] LT', - 'nextWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[W niedzielę o] LT', - 2 => '[We wtorek o] LT', - 3 => '[W środę o] LT', - 6 => '[W sobotę o] LT', - default => '[W] dddd [o] LT', - }, - 'lastDay' => '[Wczoraj o] LT', - 'lastWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[W zeszłą niedzielę o] LT', - 3 => '[W zeszłą środę o] LT', - 6 => '[W zeszłą sobotę o] LT', - default => '[W zeszły] dddd [o] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', 'lipca', 'sierpnia', 'września', 'października', 'listopada', 'grudnia'], - 'months_standalone' => ['styczeń', 'luty', 'marzec', 'kwiecień', 'maj', 'czerwiec', 'lipiec', 'sierpień', 'wrzesień', 'październik', 'listopad', 'grudzień'], - 'months_short' => ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'], - 'months_regexp' => '/(DD?o?\.?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['niedziela', 'poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota'], - 'weekdays_short' => ['ndz', 'pon', 'wt', 'śr', 'czw', 'pt', 'sob'], - 'weekdays_min' => ['Nd', 'Pn', 'Wt', 'Śr', 'Cz', 'Pt', 'So'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' i '], - 'meridiem' => ['przed południem', 'po południu'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php b/vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php deleted file mode 100644 index 222bcdb..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/prg.php b/vendor/nesbot/carbon/src/Carbon/Lang/prg.php deleted file mode 100644 index 6e63f4a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/prg.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'months' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'months_short' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], - - 'year' => ':count meta', - 'y' => ':count meta', - 'a_year' => ':count meta', - - 'month' => ':count mēniks', // less reliable - 'm' => ':count mēniks', // less reliable - 'a_month' => ':count mēniks', // less reliable - - 'week' => ':count sawaītin', // less reliable - 'w' => ':count sawaītin', // less reliable - 'a_week' => ':count sawaītin', // less reliable - - 'day' => ':count di', - 'd' => ':count di', - 'a_day' => ':count di', - - 'hour' => ':count bruktēt', // less reliable - 'h' => ':count bruktēt', // less reliable - 'a_hour' => ':count bruktēt', // less reliable - - 'minute' => ':count līkuts', // less reliable - 'min' => ':count līkuts', // less reliable - 'a_minute' => ':count līkuts', // less reliable - - 'second' => ':count kitan', // less reliable - 's' => ':count kitan', // less reliable - 'a_second' => ':count kitan', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ps.php b/vendor/nesbot/carbon/src/Carbon/Lang/ps.php deleted file mode 100644 index a928b28..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ps.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Muhammad Nasir Rahimi - * - Nassim Nasibullah (spinzar) - */ -return [ - 'year' => ':count کال|:count کاله', - 'y' => ':countکال|:countکاله', - 'month' => ':count مياشت|:count مياشتي', - 'm' => ':countمياشت|:countمياشتي', - 'week' => ':count اونۍ|:count اونۍ', - 'w' => ':countاونۍ|:countاونۍ', - 'day' => ':count ورځ|:count ورځي', - 'd' => ':countورځ|:countورځي', - 'hour' => ':count ساعت|:count ساعته', - 'h' => ':countساعت|:countساعته', - 'minute' => ':count دقيقه|:count دقيقې', - 'min' => ':countدقيقه|:countدقيقې', - 'second' => ':count ثانيه|:count ثانيې', - 's' => ':countثانيه|:countثانيې', - 'ago' => ':time دمخه', - 'from_now' => ':time له اوس څخه', - 'after' => ':time وروسته', - 'before' => ':time دمخه', - 'list' => ['، ', ' او '], - 'meridiem' => ['غ.م.', 'غ.و.'], - 'weekdays' => ['اتوار', 'ګل', 'نهه', 'شورو', 'زيارت', 'جمعه', 'خالي'], - 'weekdays_short' => ['ا', 'ګ', 'ن', 'ش', 'ز', 'ج', 'خ'], - 'weekdays_min' => ['ا', 'ګ', 'ن', 'ش', 'ز', 'ج', 'خ'], - 'months' => ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سېپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سېپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_standalone' => ['جنوري', 'فېبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short_standalone' => ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'first_day_of_week' => 6, - 'weekend' => [4, 5], - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'YYYY/M/d', - 'LL' => 'YYYY MMM D', - 'LLL' => 'د YYYY د MMMM D H:mm', - 'LLLL' => 'dddd د YYYY د MMMM D H:mm', - ], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php b/vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php deleted file mode 100644 index 6ec5180..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ps.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt.php deleted file mode 100644 index 85dbddc..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Cassiano Montanari - * - Matt Pope - * - François B - * - Prodis - * - JD Isaacks - * - Raphael Amorim - * - João Magalhães - * - victortobias - * - Paulo Freitas - * - Sebastian Thierer - * - Claudson Martins (claudsonm) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count ano|:count anos', - 'a_year' => 'um ano|:count anos', - 'y' => ':counta', - 'month' => ':count mês|:count meses', - 'a_month' => 'um mês|:count meses', - 'm' => ':countm', - 'week' => ':count semana|:count semanas', - 'a_week' => 'uma semana|:count semanas', - 'w' => ':countsem', - 'day' => ':count dia|:count dias', - 'a_day' => 'um dia|:count dias', - 'd' => ':countd', - 'hour' => ':count hora|:count horas', - 'a_hour' => 'uma hora|:count horas', - 'h' => ':counth', - 'minute' => ':count minuto|:count minutos', - 'a_minute' => 'um minuto|:count minutos', - 'min' => ':countmin', - 'second' => ':count segundo|:count segundos', - 'a_second' => 'alguns segundos|:count segundos', - 's' => ':counts', - 'millisecond' => ':count milissegundo|:count milissegundos', - 'a_millisecond' => 'um milissegundo|:count milissegundos', - 'ms' => ':countms', - 'microsecond' => ':count microssegundo|:count microssegundos', - 'a_microsecond' => 'um microssegundo|:count microssegundos', - 'µs' => ':countµs', - 'ago' => 'há :time', - 'from_now' => 'em :time', - 'after' => ':time depois', - 'before' => ':time antes', - 'diff_now' => 'agora', - 'diff_today' => 'Hoje', - 'diff_today_regexp' => 'Hoje(?:\\s+às)?', - 'diff_yesterday' => 'ontem', - 'diff_yesterday_regexp' => 'Ontem(?:\\s+às)?', - 'diff_tomorrow' => 'amanhã', - 'diff_tomorrow_regexp' => 'Amanhã(?:\\s+às)?', - 'diff_before_yesterday' => 'anteontem', - 'diff_after_tomorrow' => 'depois de amanhã', - 'period_recurrences' => 'uma vez|:count vezes', - 'period_interval' => 'cada :interval', - 'period_start_date' => 'de :date', - 'period_end_date' => 'até :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D [de] MMMM [de] YYYY', - 'LLL' => 'D [de] MMMM [de] YYYY HH:mm', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Hoje às] LT', - 'nextDay' => '[Amanhã às] LT', - 'nextWeek' => 'dddd [às] LT', - 'lastDay' => '[Ontem às] LT', - 'lastWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0, 6 => '[Último] dddd [às] LT', - default => '[Última] dddd [às] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'], - 'months_short' => ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'], - 'weekdays' => ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'], - 'weekdays_short' => ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'], - 'weekdays_min' => ['Do', '2ª', '3ª', '4ª', '5ª', '6ª', 'Sá'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' e '], - 'ordinal_words' => [ - 'of' => 'de', - 'first' => 'primeira', - 'second' => 'segunda', - 'third' => 'terceira', - 'fourth' => 'quarta', - 'fifth' => 'quinta', - 'last' => 'última', - ], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php deleted file mode 100644 index 22c01ec..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php deleted file mode 100644 index e917c5c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Cassiano Montanari - * - Eduardo Dalla Vecchia - * - David Rodrigues - * - Matt Pope - * - François B - * - Prodis - * - Marlon Maxwel - * - JD Isaacks - * - Raphael Amorim - * - Rafael Raupp - * - felipeleite1 - * - swalker - * - Lucas Macedo - * - Paulo Freitas - * - Sebastian Thierer - */ -return array_replace_recursive(require __DIR__.'/pt.php', [ - 'period_recurrences' => 'uma|:count vez', - 'period_interval' => 'toda :interval', - 'formats' => [ - 'LLL' => 'D [de] MMMM [de] YYYY [às] HH:mm', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY [às] HH:mm', - ], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php deleted file mode 100644 index 22c01ec..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php deleted file mode 100644 index 22c01ec..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php deleted file mode 100644 index 22c01ec..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php deleted file mode 100644 index 22c01ec..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php deleted file mode 100644 index 22c01ec..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php deleted file mode 100644 index f2b5eab..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/pt.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'LLL' => 'D [de] MMMM [de] YYYY, h:mm a', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY, h:mm a', - ], - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php deleted file mode 100644 index fbc0c97..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/pt.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php deleted file mode 100644 index 2a76fc1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/pt.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'], - 'months_short' => ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'], - 'weekdays' => ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'], - 'weekdays_short' => ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'], - 'weekdays_min' => ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php deleted file mode 100644 index 22c01ec..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php deleted file mode 100644 index 22c01ec..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/qu.php b/vendor/nesbot/carbon/src/Carbon/Lang/qu.php deleted file mode 100644 index 65278cd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/qu.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es_UY.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM, YYYY HH:mm', - ], - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php b/vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php deleted file mode 100644 index d5db6bf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/qu.php', [ - 'first_day_of_week' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php b/vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php deleted file mode 100644 index d5db6bf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/qu.php', [ - 'first_day_of_week' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/quz.php b/vendor/nesbot/carbon/src/Carbon/Lang/quz.php deleted file mode 100644 index 1640c02..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/quz.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/quz_PE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php b/vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php deleted file mode 100644 index b047e59..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sugar Labs // OLPC sugarlabs.org libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['iniru', 'phiwriru', 'marsu', 'awril', 'mayu', 'huniyu', 'huliyu', 'agustu', 'siptiyimri', 'uktuwri', 'nuwiyimri', 'tisiyimri'], - 'months_short' => ['ini', 'phi', 'mar', 'awr', 'may', 'hun', 'hul', 'agu', 'sip', 'ukt', 'nuw', 'tis'], - 'weekdays' => ['tuminku', 'lunis', 'martis', 'miyirkulis', 'juywis', 'wiyirnis', 'sawatu'], - 'weekdays_short' => ['tum', 'lun', 'mar', 'miy', 'juy', 'wiy', 'saw'], - 'weekdays_min' => ['tum', 'lun', 'mar', 'miy', 'juy', 'wiy', 'saw'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'minute' => ':count uchuy', // less reliable - 'min' => ':count uchuy', // less reliable - 'a_minute' => ':count uchuy', // less reliable - - 'year' => ':count wata', - 'y' => ':count wata', - 'a_year' => ':count wata', - - 'month' => ':count killa', - 'm' => ':count killa', - 'a_month' => ':count killa', - - 'week' => ':count simana', - 'w' => ':count simana', - 'a_week' => ':count simana', - - 'day' => ':count pʼunchaw', - 'd' => ':count pʼunchaw', - 'a_day' => ':count pʼunchaw', - - 'hour' => ':count ura', - 'h' => ':count ura', - 'a_hour' => ':count ura', - - 'second' => ':count iskay ñiqin', - 's' => ':count iskay ñiqin', - 'a_second' => ':count iskay ñiqin', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/raj.php b/vendor/nesbot/carbon/src/Carbon/Lang/raj.php deleted file mode 100644 index 26138c9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/raj.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/raj_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php deleted file mode 100644 index 4a9f0b9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - meghrajsuthar03@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्टूबर', 'नवंबर', 'दिसंबर'], - 'months_short' => ['जन', 'फर', 'मार्च', 'अप्रै', 'मई', 'जून', 'जुल', 'अग', 'सित', 'अक्टू', 'नव', 'दिस'], - 'weekdays' => ['रविवार', 'सोमवार', 'मंगल्लवार', 'बुधवार', 'बृहस्पतिवार', 'शुक्रवार', 'शनिवार'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], - 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], - - 'year' => ':count आंहू', // less reliable - 'y' => ':count आंहू', // less reliable - 'a_year' => ':count आंहू', // less reliable - - 'month' => ':count सूरज', // less reliable - 'm' => ':count सूरज', // less reliable - 'a_month' => ':count सूरज', // less reliable - - 'week' => ':count निवाज', // less reliable - 'w' => ':count निवाज', // less reliable - 'a_week' => ':count निवाज', // less reliable - - 'day' => ':count अेक', // less reliable - 'd' => ':count अेक', // less reliable - 'a_day' => ':count अेक', // less reliable - - 'hour' => ':count दुनियांण', // less reliable - 'h' => ':count दुनियांण', // less reliable - 'a_hour' => ':count दुनियांण', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rm.php b/vendor/nesbot/carbon/src/Carbon/Lang/rm.php deleted file mode 100644 index 1843f45..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/rm.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - tjku - * - Max Melentiev - * - Juanito Fatas - * - Tsutomu Kuroda - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Nicolás Hock Isaza - * - sebastian de castelberg - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'Do MMMM YYYY', - 'LLL' => 'Do MMMM, HH:mm [Uhr]', - 'LLLL' => 'dddd, Do MMMM YYYY, HH:mm [Uhr]', - ], - 'year' => ':count onn|:count onns', - 'month' => ':count mais', - 'week' => ':count emna|:count emnas', - 'day' => ':count di|:count dis', - 'hour' => ':count oura|:count ouras', - 'minute' => ':count minuta|:count minutas', - 'second' => ':count secunda|:count secundas', - 'weekdays' => ['dumengia', 'glindesdi', 'mardi', 'mesemna', 'gievgia', 'venderdi', 'sonda'], - 'weekdays_short' => ['du', 'gli', 'ma', 'me', 'gie', 've', 'so'], - 'weekdays_min' => ['du', 'gli', 'ma', 'me', 'gie', 've', 'so'], - 'months' => ['schaner', 'favrer', 'mars', 'avrigl', 'matg', 'zercladur', 'fanadur', 'avust', 'settember', 'october', 'november', 'december'], - 'months_short' => ['schan', 'favr', 'mars', 'avr', 'matg', 'zercl', 'fan', 'avust', 'sett', 'oct', 'nov', 'dec'], - 'meridiem' => ['avantmezdi', 'suentermezdi'], - 'list' => [', ', ' e '], - 'first_day_of_week' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rn.php b/vendor/nesbot/carbon/src/Carbon/Lang/rn.php deleted file mode 100644 index 8ab958e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/rn.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Z.MU.', 'Z.MW.'], - 'weekdays' => ['Ku w’indwi', 'Ku wa mbere', 'Ku wa kabiri', 'Ku wa gatatu', 'Ku wa kane', 'Ku wa gatanu', 'Ku wa gatandatu'], - 'weekdays_short' => ['cu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'], - 'weekdays_min' => ['cu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'], - 'months' => ['Nzero', 'Ruhuhuma', 'Ntwarante', 'Ndamukiza', 'Rusama', 'Ruheshi', 'Mukakaro', 'Nyandagaro', 'Nyakanga', 'Gitugutu', 'Munyonyo', 'Kigarama'], - 'months_short' => ['Mut.', 'Gas.', 'Wer.', 'Mat.', 'Gic.', 'Kam.', 'Nya.', 'Kan.', 'Nze.', 'Ukw.', 'Ugu.', 'Uku.'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'year' => 'imyaka :count', - 'y' => 'imyaka :count', - 'a_year' => 'imyaka :count', - - 'month' => 'amezi :count', - 'm' => 'amezi :count', - 'a_month' => 'amezi :count', - - 'week' => 'indwi :count', - 'w' => 'indwi :count', - 'a_week' => 'indwi :count', - - 'day' => 'imisi :count', - 'd' => 'imisi :count', - 'a_day' => 'imisi :count', - - 'hour' => 'amasaha :count', - 'h' => 'amasaha :count', - 'a_hour' => 'amasaha :count', - - 'minute' => 'iminuta :count', - 'min' => 'iminuta :count', - 'a_minute' => 'iminuta :count', - - 'second' => 'inguvu :count', // less reliable - 's' => 'inguvu :count', // less reliable - 'a_second' => 'inguvu :count', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ro.php b/vendor/nesbot/carbon/src/Carbon/Lang/ro.php deleted file mode 100644 index 868a327..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ro.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - JD Isaacks - * - Cătălin Georgescu - * - Valentin Ivaşcu (oriceon) - */ -return [ - 'year' => ':count an|:count ani|:count ani', - 'a_year' => 'un an|:count ani|:count ani', - 'y' => ':count a.', - 'month' => ':count lună|:count luni|:count luni', - 'a_month' => 'o lună|:count luni|:count luni', - 'm' => ':count l.', - 'week' => ':count săptămână|:count săptămâni|:count săptămâni', - 'a_week' => 'o săptămână|:count săptămâni|:count săptămâni', - 'w' => ':count săp.', - 'day' => ':count zi|:count zile|:count zile', - 'a_day' => 'o zi|:count zile|:count zile', - 'd' => ':count z.', - 'hour' => ':count oră|:count ore|:count ore', - 'a_hour' => 'o oră|:count ore|:count ore', - 'h' => ':count o.', - 'minute' => ':count minut|:count minute|:count minute', - 'a_minute' => 'un minut|:count minute|:count minute', - 'min' => ':count m.', - 'second' => ':count secundă|:count secunde|:count secunde', - 'a_second' => 'câteva secunde|:count secunde|:count secunde', - 's' => ':count sec.', - 'ago' => ':time în urmă', - 'from_now' => 'peste :time', - 'after' => 'peste :time', - 'before' => 'acum :time', - 'diff_now' => 'acum', - 'diff_today' => 'azi', - 'diff_today_regexp' => 'azi(?:\\s+la)?', - 'diff_yesterday' => 'ieri', - 'diff_yesterday_regexp' => 'ieri(?:\\s+la)?', - 'diff_tomorrow' => 'mâine', - 'diff_tomorrow_regexp' => 'mâine(?:\\s+la)?', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY H:mm', - 'LLLL' => 'dddd, D MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[azi la] LT', - 'nextDay' => '[mâine la] LT', - 'nextWeek' => 'dddd [la] LT', - 'lastDay' => '[ieri la] LT', - 'lastWeek' => '[fosta] dddd [la] LT', - 'sameElse' => 'L', - ], - 'months' => ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'], - 'months_short' => ['ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'], - 'weekdays' => ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'], - 'weekdays_short' => ['dum', 'lun', 'mar', 'mie', 'joi', 'vin', 'sâm'], - 'weekdays_min' => ['du', 'lu', 'ma', 'mi', 'jo', 'vi', 'sâ'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' și '], - 'meridiem' => ['a.m.', 'p.m.'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php deleted file mode 100644 index ad1d2fa..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ro.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php b/vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php deleted file mode 100644 index 102afcd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ro.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rof.php b/vendor/nesbot/carbon/src/Carbon/Lang/rof.php deleted file mode 100644 index 205fc26..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/rof.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['kang’ama', 'kingoto'], - 'weekdays' => ['Ijumapili', 'Ijumatatu', 'Ijumanne', 'Ijumatano', 'Alhamisi', 'Ijumaa', 'Ijumamosi'], - 'weekdays_short' => ['Ijp', 'Ijt', 'Ijn', 'Ijtn', 'Alh', 'Iju', 'Ijm'], - 'weekdays_min' => ['Ijp', 'Ijt', 'Ijn', 'Ijtn', 'Alh', 'Iju', 'Ijm'], - 'months' => ['Mweri wa kwanza', 'Mweri wa kaili', 'Mweri wa katatu', 'Mweri wa kaana', 'Mweri wa tanu', 'Mweri wa sita', 'Mweri wa saba', 'Mweri wa nane', 'Mweri wa tisa', 'Mweri wa ikumi', 'Mweri wa ikumi na moja', 'Mweri wa ikumi na mbili'], - 'months_short' => ['M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7', 'M8', 'M9', 'M10', 'M11', 'M12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru.php deleted file mode 100644 index 671e619..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ru.php +++ /dev/null @@ -1,174 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Bari Badamshin - * - Jørn Ølmheim - * - François B - * - Tim Fish - * - Коренберг Марк (imac) - * - Serhan Apaydın - * - RomeroMsk - * - vsn4ik - * - JD Isaacks - * - Bari Badamshin - * - Jørn Ølmheim - * - François B - * - Коренберг Марк (imac) - * - Serhan Apaydın - * - RomeroMsk - * - vsn4ik - * - JD Isaacks - * - Fellzo - * - andrey-helldar - * - Pavel Skripkin (psxx) - * - AlexWalkerson - * - Vladislav UnsealedOne - * - dima-bzz - */ - -use Carbon\CarbonInterface; - -$transformDiff = static fn (string $input) => strtr($input, [ - 'неделя' => 'неделю', - 'секунда' => 'секунду', - 'минута' => 'минуту', -]); - -return [ - 'year' => ':count год|:count года|:count лет', - 'y' => ':count г.|:count г.|:count л.', - 'a_year' => '{1}год|:count год|:count года|:count лет', - 'month' => ':count месяц|:count месяца|:count месяцев', - 'm' => ':count мес.', - 'a_month' => '{1}месяц|:count месяц|:count месяца|:count месяцев', - 'week' => ':count неделя|:count недели|:count недель', - 'w' => ':count нед.', - 'a_week' => '{1}неделя|:count неделю|:count недели|:count недель', - 'day' => ':count день|:count дня|:count дней', - 'd' => ':count д.', - 'a_day' => '{1}день|:count день|:count дня|:count дней', - 'hour' => ':count час|:count часа|:count часов', - 'h' => ':count ч.', - 'a_hour' => '{1}час|:count час|:count часа|:count часов', - 'minute' => ':count минута|:count минуты|:count минут', - 'min' => ':count мин.', - 'a_minute' => '{1}минута|:count минута|:count минуты|:count минут', - 'second' => ':count секунда|:count секунды|:count секунд', - 's' => ':count сек.', - 'a_second' => '{1}несколько секунд|:count секунду|:count секунды|:count секунд', - 'ago' => static fn (string $time) => $transformDiff($time).' назад', - 'from_now' => static fn (string $time) => 'через '.$transformDiff($time), - 'after' => static fn (string $time) => $transformDiff($time).' после', - 'before' => static fn (string $time) => $transformDiff($time).' до', - 'diff_now' => 'только что', - 'diff_today' => 'Сегодня,', - 'diff_today_regexp' => 'Сегодня,?(?:\\s+в)?', - 'diff_yesterday' => 'вчера', - 'diff_yesterday_regexp' => 'Вчера,?(?:\\s+в)?', - 'diff_tomorrow' => 'завтра', - 'diff_tomorrow_regexp' => 'Завтра,?(?:\\s+в)?', - 'diff_before_yesterday' => 'позавчера', - 'diff_after_tomorrow' => 'послезавтра', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY г.', - 'LLL' => 'D MMMM YYYY г., H:mm', - 'LLLL' => 'dddd, D MMMM YYYY г., H:mm', - ], - 'calendar' => [ - 'sameDay' => '[Сегодня, в] LT', - 'nextDay' => '[Завтра, в] LT', - 'nextWeek' => static function (CarbonInterface $current, \Carbon\CarbonInterface $other) { - if ($current->week !== $other->week) { - switch ($current->dayOfWeek) { - case 0: - return '[В следующее] dddd, [в] LT'; - case 1: - case 2: - case 4: - return '[В следующий] dddd, [в] LT'; - case 3: - case 5: - case 6: - return '[В следующую] dddd, [в] LT'; - } - } - - if ($current->dayOfWeek === 2) { - return '[Во] dddd, [в] LT'; - } - - return '[В] dddd, [в] LT'; - }, - 'lastDay' => '[Вчера, в] LT', - 'lastWeek' => static function (CarbonInterface $current, \Carbon\CarbonInterface $other) { - if ($current->week !== $other->week) { - switch ($current->dayOfWeek) { - case 0: - return '[В прошлое] dddd, [в] LT'; - case 1: - case 2: - case 4: - return '[В прошлый] dddd, [в] LT'; - case 3: - case 5: - case 6: - return '[В прошлую] dddd, [в] LT'; - } - } - - if ($current->dayOfWeek === 2) { - return '[Во] dddd, [в] LT'; - } - - return '[В] dddd, [в] LT'; - }, - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number, $period) { - return match ($period) { - 'M', 'd', 'DDD' => $number.'-й', - 'D' => $number.'-го', - 'w', 'W' => $number.'-я', - default => $number, - }; - }, - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'ночи'; - } - if ($hour < 12) { - return 'утра'; - } - if ($hour < 17) { - return 'дня'; - } - - return 'вечера'; - }, - 'months' => ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'], - 'months_standalone' => ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'], - 'months_short' => ['янв', 'фев', 'мар', 'апр', 'мая', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'months_short_standalone' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'months_regexp' => '/(DD?o?\.?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['воскресенье', 'понедельник', 'вторник', 'среду', 'четверг', 'пятницу', 'субботу'], - 'weekdays_standalone' => ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'], - 'weekdays_short' => ['вск', 'пнд', 'втр', 'срд', 'чтв', 'птн', 'сбт'], - 'weekdays_min' => ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], - 'weekdays_regexp' => '/\[\s*(В|в)\s*((?:прошлую|следующую|эту)\s*)?\]\s*dddd/', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' и '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php deleted file mode 100644 index 8ca7df3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ru.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php deleted file mode 100644 index 8ca7df3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ru.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php deleted file mode 100644 index 8ca7df3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ru.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php deleted file mode 100644 index 8ca7df3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ru.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php deleted file mode 100644 index 8ca7df3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ru.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php deleted file mode 100644 index db958d6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RFC 2319 bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ru.php', [ - 'weekdays' => ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'], - 'weekdays_short' => ['вск', 'пнд', 'вто', 'срд', 'чтв', 'птн', 'суб'], - 'weekdays_min' => ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'су'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rw.php b/vendor/nesbot/carbon/src/Carbon/Lang/rw.php deleted file mode 100644 index bc4a347..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/rw.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/rw_RW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php b/vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php deleted file mode 100644 index 9b3e068..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Rwanda Steve Murphy murf@e-tools.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Mutarama', 'Gashyantare', 'Werurwe', 'Mata', 'Gicuransi', 'Kamena', 'Nyakanga', 'Kanama', 'Nzeli', 'Ukwakira', 'Ugushyingo', 'Ukuboza'], - 'months_short' => ['Mut', 'Gas', 'Wer', 'Mat', 'Gic', 'Kam', 'Nya', 'Kan', 'Nze', 'Ukw', 'Ugu', 'Uku'], - 'weekdays' => ['Ku cyumweru', 'Kuwa mbere', 'Kuwa kabiri', 'Kuwa gatatu', 'Kuwa kane', 'Kuwa gatanu', 'Kuwa gatandatu'], - 'weekdays_short' => ['Mwe', 'Mbe', 'Kab', 'Gtu', 'Kan', 'Gnu', 'Gnd'], - 'weekdays_min' => ['Mwe', 'Mbe', 'Kab', 'Gtu', 'Kan', 'Gnu', 'Gnd'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'second' => ':count vuna', // less reliable - 's' => ':count vuna', // less reliable - 'a_second' => ':count vuna', // less reliable - - 'year' => 'aka :count', - 'y' => 'aka :count', - 'a_year' => 'aka :count', - - 'month' => 'ezi :count', - 'm' => 'ezi :count', - 'a_month' => 'ezi :count', - - 'week' => ':count icyumweru', - 'w' => ':count icyumweru', - 'a_week' => ':count icyumweru', - - 'day' => ':count nsi', - 'd' => ':count nsi', - 'a_day' => ':count nsi', - - 'hour' => 'saha :count', - 'h' => 'saha :count', - 'a_hour' => 'saha :count', - - 'minute' => ':count -nzinya', - 'min' => ':count -nzinya', - 'a_minute' => ':count -nzinya', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rwk.php b/vendor/nesbot/carbon/src/Carbon/Lang/rwk.php deleted file mode 100644 index ed92e8e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/rwk.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['utuko', 'kyiukonyi'], - 'weekdays' => ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sa.php b/vendor/nesbot/carbon/src/Carbon/Lang/sa.php deleted file mode 100644 index 1357c03..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sa.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sa_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php deleted file mode 100644 index f2489e8..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - The Debian project Christian Perrier bubulle@debian.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D-MM-YY', - ], - 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'weekdays' => ['रविवासर:', 'सोमवासर:', 'मंगलवासर:', 'बुधवासर:', 'बृहस्पतिवासरः', 'शुक्रवासर', 'शनिवासर:'], - 'weekdays_short' => ['रविः', 'सोम:', 'मंगल:', 'बुध:', 'बृहस्पतिः', 'शुक्र', 'शनि:'], - 'weekdays_min' => ['रविः', 'सोम:', 'मंगल:', 'बुध:', 'बृहस्पतिः', 'शुक्र', 'शनि:'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], - - 'minute' => ':count होरा', // less reliable - 'min' => ':count होरा', // less reliable - 'a_minute' => ':count होरा', // less reliable - - 'year' => ':count वर्ष', - 'y' => ':count वर्ष', - 'a_year' => ':count वर्ष', - - 'month' => ':count मास', - 'm' => ':count मास', - 'a_month' => ':count मास', - - 'week' => ':count सप्ताहः saptahaĥ', - 'w' => ':count सप्ताहः saptahaĥ', - 'a_week' => ':count सप्ताहः saptahaĥ', - - 'day' => ':count दिन', - 'd' => ':count दिन', - 'a_day' => ':count दिन', - - 'hour' => ':count घण्टा', - 'h' => ':count घण्टा', - 'a_hour' => ':count घण्टा', - - 'second' => ':count द्वितीयः', - 's' => ':count द्वितीयः', - 'a_second' => ':count द्वितीयः', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sah.php b/vendor/nesbot/carbon/src/Carbon/Lang/sah.php deleted file mode 100644 index b828824..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sah.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sah_RU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php deleted file mode 100644 index 94cc0cb..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Valery Timiriliyev Valery Timiriliyev timiriliyev@gmail.com - */ -return array_replace_recursive(require __DIR__.'/ru.php', [ - 'formats' => [ - 'L' => 'YYYY.MM.DD', - ], - 'months' => ['тохсунньу', 'олунньу', 'кулун тутар', 'муус устар', 'ыам ыйын', 'бэс ыйын', 'от ыйын', 'атырдьах ыйын', 'балаҕан ыйын', 'алтынньы', 'сэтинньи', 'ахсынньы'], - 'months_short' => ['тохс', 'олун', 'кул', 'муус', 'ыам', 'бэс', 'от', 'атыр', 'бал', 'алт', 'сэт', 'ахс'], - 'weekdays' => ['баскыһыанньа', 'бэнидиэнньик', 'оптуорунньук', 'сэрэдэ', 'чэппиэр', 'бээтинсэ', 'субуота'], - 'weekdays_short' => ['бс', 'бн', 'оп', 'ср', 'чп', 'бт', 'сб'], - 'weekdays_min' => ['бс', 'бн', 'оп', 'ср', 'чп', 'бт', 'сб'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/saq.php b/vendor/nesbot/carbon/src/Carbon/Lang/saq.php deleted file mode 100644 index ca3f994..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/saq.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['Tesiran', 'Teipa'], - 'weekdays' => ['Mderot ee are', 'Mderot ee kuni', 'Mderot ee ong’wan', 'Mderot ee inet', 'Mderot ee ile', 'Mderot ee sapa', 'Mderot ee kwe'], - 'weekdays_short' => ['Are', 'Kun', 'Ong', 'Ine', 'Ile', 'Sap', 'Kwe'], - 'weekdays_min' => ['Are', 'Kun', 'Ong', 'Ine', 'Ile', 'Sap', 'Kwe'], - 'months' => ['Lapa le obo', 'Lapa le waare', 'Lapa le okuni', 'Lapa le ong’wan', 'Lapa le imet', 'Lapa le ile', 'Lapa le sapa', 'Lapa le isiet', 'Lapa le saal', 'Lapa le tomon', 'Lapa le tomon obo', 'Lapa le tomon waare'], - 'months_short' => ['Obo', 'Waa', 'Oku', 'Ong', 'Ime', 'Ile', 'Sap', 'Isi', 'Saa', 'Tom', 'Tob', 'Tow'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sat.php b/vendor/nesbot/carbon/src/Carbon/Lang/sat.php deleted file mode 100644 index c9914c6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sat.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sat_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php deleted file mode 100644 index 6c3608b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat Pune libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रेल', 'मई', 'जुन', 'जुलाई', 'अगस्त', 'सितम्बर', 'अखथबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रेल', 'मई', 'जुन', 'जुलाई', 'अगस्त', 'सितम्बर', 'अखथबर', 'नवम्बर', 'दिसम्बर'], - 'weekdays' => ['सिंगेमाँहाँ', 'ओतेमाँहाँ', 'बालेमाँहाँ', 'सागुनमाँहाँ', 'सारदीमाँहाँ', 'जारुममाँहाँ', 'ञुहुममाँहाँ'], - 'weekdays_short' => ['सिंगे', 'ओते', 'बाले', 'सागुन', 'सारदी', 'जारुम', 'ञुहुम'], - 'weekdays_min' => ['सिंगे', 'ओते', 'बाले', 'सागुन', 'सारदी', 'जारुम', 'ञुहुम'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'month' => ':count ńindạ cando', // less reliable - 'm' => ':count ńindạ cando', // less reliable - 'a_month' => ':count ńindạ cando', // less reliable - - 'week' => ':count mãhã', // less reliable - 'w' => ':count mãhã', // less reliable - 'a_week' => ':count mãhã', // less reliable - - 'hour' => ':count ᱥᱳᱱᱚ', // less reliable - 'h' => ':count ᱥᱳᱱᱚ', // less reliable - 'a_hour' => ':count ᱥᱳᱱᱚ', // less reliable - - 'minute' => ':count ᱯᱤᱞᱪᱩ', // less reliable - 'min' => ':count ᱯᱤᱞᱪᱩ', // less reliable - 'a_minute' => ':count ᱯᱤᱞᱪᱩ', // less reliable - - 'second' => ':count ar', // less reliable - 's' => ':count ar', // less reliable - 'a_second' => ':count ar', // less reliable - - 'year' => ':count ne̲s', - 'y' => ':count ne̲s', - 'a_year' => ':count ne̲s', - - 'day' => ':count ᱫᱤᱱ', - 'd' => ':count ᱫᱤᱱ', - 'a_day' => ':count ᱫᱤᱱ', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sbp.php b/vendor/nesbot/carbon/src/Carbon/Lang/sbp.php deleted file mode 100644 index e29ca37..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sbp.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Lwamilawu', 'Pashamihe'], - 'weekdays' => ['Mulungu', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alahamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Mul', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Mul', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Mupalangulwa', 'Mwitope', 'Mushende', 'Munyi', 'Mushende Magali', 'Mujimbi', 'Mushipepo', 'Mupuguto', 'Munyense', 'Mokhu', 'Musongandembwe', 'Muhaano'], - 'months_short' => ['Mup', 'Mwi', 'Msh', 'Mun', 'Mag', 'Muj', 'Msp', 'Mpg', 'Mye', 'Mok', 'Mus', 'Muh'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sc.php b/vendor/nesbot/carbon/src/Carbon/Lang/sc.php deleted file mode 100644 index 7178cf4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sc.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sc_IT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php deleted file mode 100644 index 5d1e4ce..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sardinian Translators Team Massimeddu Cireddu massimeddu@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD. MM. YY', - ], - 'months' => ['Ghennàrgiu', 'Freàrgiu', 'Martzu', 'Abrile', 'Maju', 'Làmpadas', 'Argiolas//Trìulas', 'Austu', 'Cabudanni', 'Santugaine//Ladàmine', 'Onniasantu//Santandria', 'Nadale//Idas'], - 'months_short' => ['Ghe', 'Fre', 'Mar', 'Abr', 'Maj', 'Làm', 'Arg', 'Aus', 'Cab', 'Lad', 'Onn', 'Nad'], - 'weekdays' => ['Domìnigu', 'Lunis', 'Martis', 'Mèrcuris', 'Giòbia', 'Chenàbura', 'Sàbadu'], - 'weekdays_short' => ['Dom', 'Lun', 'Mar', 'Mèr', 'Giò', 'Che', 'Sàb'], - 'weekdays_min' => ['Dom', 'Lun', 'Mar', 'Mèr', 'Giò', 'Che', 'Sàb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'minute' => ':count mementu', // less reliable - 'min' => ':count mementu', // less reliable - 'a_minute' => ':count mementu', // less reliable - - 'year' => ':count annu', - 'y' => ':count annu', - 'a_year' => ':count annu', - - 'month' => ':count mese', - 'm' => ':count mese', - 'a_month' => ':count mese', - - 'week' => ':count chida', - 'w' => ':count chida', - 'a_week' => ':count chida', - - 'day' => ':count dí', - 'd' => ':count dí', - 'a_day' => ':count dí', - - 'hour' => ':count ora', - 'h' => ':count ora', - 'a_hour' => ':count ora', - - 'second' => ':count secundu', - 's' => ':count secundu', - 'a_second' => ':count secundu', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sd.php b/vendor/nesbot/carbon/src/Carbon/Lang/sd.php deleted file mode 100644 index 0022c5a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sd.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -$months = [ - 'جنوري', - 'فيبروري', - 'مارچ', - 'اپريل', - 'مئي', - 'جون', - 'جولاءِ', - 'آگسٽ', - 'سيپٽمبر', - 'آڪٽوبر', - 'نومبر', - 'ڊسمبر', -]; - -$weekdays = [ - 'آچر', - 'سومر', - 'اڱارو', - 'اربع', - 'خميس', - 'جمع', - 'ڇنڇر', -]; - -/* - * Authors: - * - Narain Sagar - * - Sawood Alam - * - Narain Sagar - */ -return [ - 'year' => '{1}'.'هڪ سال'.'|:count '.'سال', - 'month' => '{1}'.'هڪ مهينو'.'|:count '.'مهينا', - 'week' => '{1}'.'ھڪ ھفتو'.'|:count '.'هفتا', - 'day' => '{1}'.'هڪ ڏينهن'.'|:count '.'ڏينهن', - 'hour' => '{1}'.'هڪ ڪلاڪ'.'|:count '.'ڪلاڪ', - 'minute' => '{1}'.'هڪ منٽ'.'|:count '.'منٽ', - 'second' => '{1}'.'چند سيڪنڊ'.'|:count '.'سيڪنڊ', - 'ago' => ':time اڳ', - 'from_now' => ':time پوء', - 'diff_yesterday' => 'ڪالهه', - 'diff_today' => 'اڄ', - 'diff_tomorrow' => 'سڀاڻي', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd، D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اڄ] LT', - 'nextDay' => '[سڀاڻي] LT', - 'nextWeek' => 'dddd [اڳين هفتي تي] LT', - 'lastDay' => '[ڪالهه] LT', - 'lastWeek' => '[گزريل هفتي] dddd [تي] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['صبح', 'شام'], - 'months' => $months, - 'months_short' => $months, - 'weekdays' => $weekdays, - 'weekdays_short' => $weekdays, - 'weekdays_min' => $weekdays, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => ['، ', ' ۽ '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php deleted file mode 100644 index de1dad0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/sd.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['جنوري', 'فبروري', 'مارچ', 'اپريل', 'مي', 'جون', 'جولاءِ', 'آگسٽ', 'سيپٽيمبر', 'آڪٽوبر', 'نومبر', 'ڊسمبر'], - 'months_short' => ['جنوري', 'فبروري', 'مارچ', 'اپريل', 'مي', 'جون', 'جولاءِ', 'آگسٽ', 'سيپٽيمبر', 'آڪٽوبر', 'نومبر', 'ڊسمبر'], - 'weekdays' => ['آرتوارُ', 'سومرُ', 'منگلُ', 'ٻُڌرُ', 'وسپت', 'جُمو', 'ڇنڇر'], - 'weekdays_short' => ['آرتوارُ', 'سومرُ', 'منگلُ', 'ٻُڌرُ', 'وسپت', 'جُمو', 'ڇنڇر'], - 'weekdays_min' => ['آرتوارُ', 'سومرُ', 'منگلُ', 'ٻُڌرُ', 'وسپت', 'جُمو', 'ڇنڇر'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php b/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php deleted file mode 100644 index 061fcc1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/sd.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फबरवरी', 'मार्चि', 'अप्रेल', 'मे', 'जूनि', 'जूलाइ', 'आगस्टु', 'सेप्टेंबरू', 'आक्टूबरू', 'नवंबरू', 'ॾिसंबरू'], - 'months_short' => ['जनवरी', 'फबरवरी', 'मार्चि', 'अप्रेल', 'मे', 'जूनि', 'जूलाइ', 'आगस्टु', 'सेप्टेंबरू', 'आक्टूबरू', 'नवंबरू', 'ॾिसंबरू'], - 'weekdays' => ['आर्तवारू', 'सूमरू', 'मंगलू', 'ॿुधरू', 'विस्पति', 'जुमो', 'छंछस'], - 'weekdays_short' => ['आर्तवारू', 'सूमरू', 'मंगलू', 'ॿुधरू', 'विस्पति', 'जुमो', 'छंछस'], - 'weekdays_min' => ['आर्तवारू', 'सूमरू', 'मंगलू', 'ॿुधरू', 'विस्पति', 'जुमो', 'छंछस'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['म.पू.', 'म.नं.'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/se.php b/vendor/nesbot/carbon/src/Carbon/Lang/se.php deleted file mode 100644 index 7c4b92a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/se.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Karamell - */ -return [ - 'year' => '{1}:count jahki|:count jagit', - 'a_year' => '{1}okta jahki|:count jagit', - 'y' => ':count j.', - 'month' => '{1}:count mánnu|:count mánut', - 'a_month' => '{1}okta mánnu|:count mánut', - 'm' => ':count mán.', - 'week' => '{1}:count vahkku|:count vahkku', - 'a_week' => '{1}okta vahkku|:count vahkku', - 'w' => ':count v.', - 'day' => '{1}:count beaivi|:count beaivvit', - 'a_day' => '{1}okta beaivi|:count beaivvit', - 'd' => ':count b.', - 'hour' => '{1}:count diimmu|:count diimmut', - 'a_hour' => '{1}okta diimmu|:count diimmut', - 'h' => ':count d.', - 'minute' => '{1}:count minuhta|:count minuhtat', - 'a_minute' => '{1}okta minuhta|:count minuhtat', - 'min' => ':count min.', - 'second' => '{1}:count sekunddat|:count sekunddat', - 'a_second' => '{1}moadde sekunddat|:count sekunddat', - 's' => ':count s.', - 'ago' => 'maŋit :time', - 'from_now' => ':time geažes', - 'diff_yesterday' => 'ikte', - 'diff_yesterday_regexp' => 'ikte(?:\\s+ti)?', - 'diff_today' => 'otne', - 'diff_today_regexp' => 'otne(?:\\s+ti)?', - 'diff_tomorrow' => 'ihttin', - 'diff_tomorrow_regexp' => 'ihttin(?:\\s+ti)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'MMMM D. [b.] YYYY', - 'LLL' => 'MMMM D. [b.] YYYY [ti.] HH:mm', - 'LLLL' => 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[otne ti] LT', - 'nextDay' => '[ihttin ti] LT', - 'nextWeek' => 'dddd [ti] LT', - 'lastDay' => '[ikte ti] LT', - 'lastWeek' => '[ovddit] dddd [ti] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['ođđajagemánnu', 'guovvamánnu', 'njukčamánnu', 'cuoŋománnu', 'miessemánnu', 'geassemánnu', 'suoidnemánnu', 'borgemánnu', 'čakčamánnu', 'golggotmánnu', 'skábmamánnu', 'juovlamánnu'], - 'months_short' => ['ođđj', 'guov', 'njuk', 'cuo', 'mies', 'geas', 'suoi', 'borg', 'čakč', 'golg', 'skáb', 'juov'], - 'weekdays' => ['sotnabeaivi', 'vuossárga', 'maŋŋebárga', 'gaskavahkku', 'duorastat', 'bearjadat', 'lávvardat'], - 'weekdays_short' => ['sotn', 'vuos', 'maŋ', 'gask', 'duor', 'bear', 'láv'], - 'weekdays_min' => ['s', 'v', 'm', 'g', 'd', 'b', 'L'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' ja '], - 'meridiem' => ['i.b.', 'e.b.'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php b/vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php deleted file mode 100644 index cf01805..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/se.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'months' => ['ođđajagemánnu', 'guovvamánnu', 'njukčamánnu', 'cuoŋománnu', 'miessemánnu', 'geassemánnu', 'suoidnemánnu', 'borgemánnu', 'čakčamánnu', 'golggotmánnu', 'skábmamánnu', 'juovlamánnu'], - 'months_short' => ['ođđj', 'guov', 'njuk', 'cuoŋ', 'mies', 'geas', 'suoi', 'borg', 'čakč', 'golg', 'skáb', 'juov'], - 'weekdays' => ['sotnabeaivi', 'mánnodat', 'disdat', 'gaskavahkku', 'duorastat', 'bearjadat', 'lávvordat'], - 'weekdays_short' => ['so', 'má', 'di', 'ga', 'du', 'be', 'lá'], - 'weekdays_min' => ['so', 'má', 'di', 'ga', 'du', 'be', 'lá'], - 'meridiem' => ['i', 'e'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php b/vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php deleted file mode 100644 index 177c7e9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/se.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php b/vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php deleted file mode 100644 index 177c7e9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/se.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/seh.php b/vendor/nesbot/carbon/src/Carbon/Lang/seh.php deleted file mode 100644 index 31b5aad..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/seh.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'weekdays' => ['Dimingu', 'Chiposi', 'Chipiri', 'Chitatu', 'Chinai', 'Chishanu', 'Sabudu'], - 'weekdays_short' => ['Dim', 'Pos', 'Pir', 'Tat', 'Nai', 'Sha', 'Sab'], - 'weekdays_min' => ['Dim', 'Pos', 'Pir', 'Tat', 'Nai', 'Sha', 'Sab'], - 'months' => ['Janeiro', 'Fevreiro', 'Marco', 'Abril', 'Maio', 'Junho', 'Julho', 'Augusto', 'Setembro', 'Otubro', 'Novembro', 'Decembro'], - 'months_short' => ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Aug', 'Set', 'Otu', 'Nov', 'Dec'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'd [de] MMM [de] YYYY', - 'LLL' => 'd [de] MMMM [de] YYYY HH:mm', - 'LLLL' => 'dddd, d [de] MMMM [de] YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ses.php b/vendor/nesbot/carbon/src/Carbon/Lang/ses.php deleted file mode 100644 index e1099e6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ses.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Adduha', 'Aluula'], - 'weekdays' => ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamiisa', 'Alzuma', 'Asibti'], - 'weekdays_short' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], - 'weekdays_min' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], - 'months' => ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'], - 'months_short' => ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'month' => ':count alaada', // less reliable - 'm' => ':count alaada', // less reliable - 'a_month' => ':count alaada', // less reliable - - 'hour' => ':count ɲaajin', // less reliable - 'h' => ':count ɲaajin', // less reliable - 'a_hour' => ':count ɲaajin', // less reliable - - 'minute' => ':count zarbu', // less reliable - 'min' => ':count zarbu', // less reliable - 'a_minute' => ':count zarbu', // less reliable - - 'year' => ':count jiiri', - 'y' => ':count jiiri', - 'a_year' => ':count jiiri', - - 'week' => ':count jirbiiyye', - 'w' => ':count jirbiiyye', - 'a_week' => ':count jirbiiyye', - - 'day' => ':count zaari', - 'd' => ':count zaari', - 'a_day' => ':count zaari', - - 'second' => ':count ihinkante', - 's' => ':count ihinkante', - 'a_second' => ':count ihinkante', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sg.php b/vendor/nesbot/carbon/src/Carbon/Lang/sg.php deleted file mode 100644 index 9264e89..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sg.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['ND', 'LK'], - 'weekdays' => ['Bikua-ôko', 'Bïkua-ûse', 'Bïkua-ptâ', 'Bïkua-usïö', 'Bïkua-okü', 'Lâpôsö', 'Lâyenga'], - 'weekdays_short' => ['Bk1', 'Bk2', 'Bk3', 'Bk4', 'Bk5', 'Lâp', 'Lây'], - 'weekdays_min' => ['Bk1', 'Bk2', 'Bk3', 'Bk4', 'Bk5', 'Lâp', 'Lây'], - 'months' => ['Nyenye', 'Fulundïgi', 'Mbängü', 'Ngubùe', 'Bêläwü', 'Föndo', 'Lengua', 'Kükürü', 'Mvuka', 'Ngberere', 'Nabändüru', 'Kakauka'], - 'months_short' => ['Nye', 'Ful', 'Mbä', 'Ngu', 'Bêl', 'Fön', 'Len', 'Kük', 'Mvu', 'Ngb', 'Nab', 'Kak'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'year' => ':count dā', // less reliable - 'y' => ':count dā', // less reliable - 'a_year' => ':count dā', // less reliable - - 'week' => ':count bïkua-okü', // less reliable - 'w' => ':count bïkua-okü', // less reliable - 'a_week' => ':count bïkua-okü', // less reliable - - 'day' => ':count ziggawâ', // less reliable - 'd' => ':count ziggawâ', // less reliable - 'a_day' => ':count ziggawâ', // less reliable - - 'hour' => ':count yângâködörö', // less reliable - 'h' => ':count yângâködörö', // less reliable - 'a_hour' => ':count yângâködörö', // less reliable - - 'second' => ':count bïkua-ôko', // less reliable - 's' => ':count bïkua-ôko', // less reliable - 'a_second' => ':count bïkua-ôko', // less reliable - - 'month' => ':count Nze tî ngu', - 'm' => ':count Nze tî ngu', - 'a_month' => ':count Nze tî ngu', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sgs.php b/vendor/nesbot/carbon/src/Carbon/Lang/sgs.php deleted file mode 100644 index 864b989..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sgs.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sgs_LT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php b/vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php deleted file mode 100644 index aa9e942..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Arnas Udovičius bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY.MM.DD', - ], - 'months' => ['sausė', 'vasarė', 'kuova', 'balondė', 'gegožės', 'bėrželė', 'lëpas', 'rogpjūtė', 'siejės', 'spalė', 'lapkrėstė', 'grůdė'], - 'months_short' => ['Sau', 'Vas', 'Kuo', 'Bal', 'Geg', 'Bėr', 'Lëp', 'Rgp', 'Sie', 'Spa', 'Lap', 'Grd'], - 'weekdays' => ['nedielės dëna', 'panedielis', 'oterninks', 'sereda', 'četvergs', 'petnīčė', 'sobata'], - 'weekdays_short' => ['Nd', 'Pn', 'Ot', 'Sr', 'Čt', 'Pt', 'Sb'], - 'weekdays_min' => ['Nd', 'Pn', 'Ot', 'Sr', 'Čt', 'Pt', 'Sb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'minute' => ':count mažos', // less reliable - 'min' => ':count mažos', // less reliable - 'a_minute' => ':count mažos', // less reliable - - 'year' => ':count metā', - 'y' => ':count metā', - 'a_year' => ':count metā', - - 'month' => ':count mienou', - 'm' => ':count mienou', - 'a_month' => ':count mienou', - - 'week' => ':count nedielė', - 'w' => ':count nedielė', - 'a_week' => ':count nedielė', - - 'day' => ':count dīna', - 'd' => ':count dīna', - 'a_day' => ':count dīna', - - 'hour' => ':count adīna', - 'h' => ':count adīna', - 'a_hour' => ':count adīna', - - 'second' => ':count Sekondė', - 's' => ':count Sekondė', - 'a_second' => ':count Sekondė', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sh.php b/vendor/nesbot/carbon/src/Carbon/Lang/sh.php deleted file mode 100644 index d65f90e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sh.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Томица Кораћ - * - Enrique Vidal - * - Christopher Dell - * - dmilisic - * - danijel - * - Miroslav Matkovic (mikki021) - */ -return [ - 'diff_now' => 'sada', - 'diff_yesterday' => 'juče', - 'diff_tomorrow' => 'sutra', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'MMMM D, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], - 'year' => ':count godina|:count godine|:count godina', - 'y' => ':count g.', - 'month' => ':count mesec|:count meseca|:count meseci', - 'm' => ':count m.', - 'week' => ':count nedelja|:count nedelje|:count nedelja', - 'w' => ':count n.', - 'day' => ':count dan|:count dana|:count dana', - 'd' => ':count d.', - 'hour' => ':count sat|:count sata|:count sati', - 'h' => ':count č.', - 'minute' => ':count minut|:count minuta|:count minuta', - 'min' => ':count min.', - 'second' => ':count sekund|:count sekunde|:count sekundi', - 's' => ':count s.', - 'ago' => 'pre :time', - 'from_now' => 'za :time', - 'after' => 'nakon :time', - 'before' => ':time raniјe', - 'weekdays' => ['Nedelja', 'Ponedeljak', 'Utorak', 'Sreda', 'Četvrtak', 'Petak', 'Subota'], - 'weekdays_short' => ['Ned', 'Pon', 'Uto', 'Sre', 'Čet', 'Pet', 'Sub'], - 'weekdays_min' => ['Ned', 'Pon', 'Uto', 'Sre', 'Čet', 'Pet', 'Sub'], - 'months' => ['Januar', 'Februar', 'Mart', 'April', 'Maj', 'Jun', 'Jul', 'Avgust', 'Septembar', 'Oktobar', 'Novembar', 'Decembar'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Avg', 'Sep', 'Okt', 'Nov', 'Dec'], - 'list' => [', ', ' i '], - 'meridiem' => ['pre podne', 'po podne'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shi.php b/vendor/nesbot/carbon/src/Carbon/Lang/shi.php deleted file mode 100644 index 7815186..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/shi.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['ⵜⵉⴼⴰⵡⵜ', 'ⵜⴰⴷⴳⴳⵯⴰⵜ'], - 'weekdays' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵕⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], - 'weekdays_short' => ['ⴰⵙⴰ', 'ⴰⵢⵏ', 'ⴰⵙⵉ', 'ⴰⴽⵕ', 'ⴰⴽⵡ', 'ⴰⵙⵉⵎ', 'ⴰⵙⵉⴹ'], - 'weekdays_min' => ['ⴰⵙⴰ', 'ⴰⵢⵏ', 'ⴰⵙⵉ', 'ⴰⴽⵕ', 'ⴰⴽⵡ', 'ⴰⵙⵉⵎ', 'ⴰⵙⵉⴹ'], - 'months' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵜⵓⴱⵔ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⴰⵏⴱⵉⵔ'], - 'months_short' => ['ⵉⵏⵏ', 'ⴱⵕⴰ', 'ⵎⴰⵕ', 'ⵉⴱⵔ', 'ⵎⴰⵢ', 'ⵢⵓⵏ', 'ⵢⵓⵍ', 'ⵖⵓⵛ', 'ⵛⵓⵜ', 'ⴽⵜⵓ', 'ⵏⵓⵡ', 'ⴷⵓⵊ'], - 'first_day_of_week' => 6, - 'weekend' => [5, 6], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'year' => ':count aseggwas', - 'y' => ':count aseggwas', - 'a_year' => ':count aseggwas', - - 'month' => ':count ayyur', - 'm' => ':count ayyur', - 'a_month' => ':count ayyur', - - 'week' => ':count imalass', - 'w' => ':count imalass', - 'a_week' => ':count imalass', - - 'day' => ':count ass', - 'd' => ':count ass', - 'a_day' => ':count ass', - - 'hour' => ':count urɣ', // less reliable - 'h' => ':count urɣ', // less reliable - 'a_hour' => ':count urɣ', // less reliable - - 'minute' => ':count ⴰⵎⵥⵉ', // less reliable - 'min' => ':count ⴰⵎⵥⵉ', // less reliable - 'a_minute' => ':count ⴰⵎⵥⵉ', // less reliable - - 'second' => ':count sin', // less reliable - 's' => ':count sin', // less reliable - 'a_second' => ':count sin', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php deleted file mode 100644 index cddfb24..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/shi.php', [ - 'meridiem' => ['tifawt', 'tadggʷat'], - 'weekdays' => ['asamas', 'aynas', 'asinas', 'akṛas', 'akwas', 'asimwas', 'asiḍyas'], - 'weekdays_short' => ['asa', 'ayn', 'asi', 'akṛ', 'akw', 'asim', 'asiḍ'], - 'weekdays_min' => ['asa', 'ayn', 'asi', 'akṛ', 'akw', 'asim', 'asiḍ'], - 'months' => ['innayr', 'bṛayṛ', 'maṛṣ', 'ibrir', 'mayyu', 'yunyu', 'yulyuz', 'ɣuct', 'cutanbir', 'ktubr', 'nuwanbir', 'dujanbir'], - 'months_short' => ['inn', 'bṛa', 'maṛ', 'ibr', 'may', 'yun', 'yul', 'ɣuc', 'cut', 'ktu', 'nuw', 'duj'], - 'first_day_of_week' => 6, - 'weekend' => [5, 6], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'minute' => ':count agur', // less reliable - 'min' => ':count agur', // less reliable - 'a_minute' => ':count agur', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php b/vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php deleted file mode 100644 index f3df1f2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/shi.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shn.php b/vendor/nesbot/carbon/src/Carbon/Lang/shn.php deleted file mode 100644 index fe7b1ea..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/shn.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/shn_MM.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php b/vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php deleted file mode 100644 index 9eeba47..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - ubuntu Myanmar LoCo Team https://ubuntu-mm.net Bone Pyae Sone bone.burma@mail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'formats' => [ - 'L' => 'OY MMM OD dddd', - ], - 'months' => ['လိူၼ်ၵမ်', 'လိူၼ်သၢမ်', 'လိူၼ်သီ', 'လိူၼ်ႁႃႈ', 'လိူၼ်ႁူၵ်း', 'လိူၼ်ၸဵတ်း', 'လိူၼ်ပႅတ်ႇ', 'လိူၼ်ၵဝ်ႈ', 'လိူၼ်သိပ်း', 'လိူၼ်သိပ်းဢိတ်း', 'လိူၼ်သိပ်းဢိတ်းသွင်', 'လိူၼ်ၸဵင်'], - 'months_short' => ['လိူၼ်ၵမ်', 'လိူၼ်သၢမ်', 'လိူၼ်သီ', 'လိူၼ်ႁႃႈ', 'လိူၼ်ႁူၵ်း', 'လိူၼ်ၸဵတ်း', 'လိူၼ်ပႅတ်ႇ', 'လိူၼ်ၵဝ်ႈ', 'လိူၼ်သိပ်း', 'လိူၼ်သိပ်းဢိတ်း', 'လိူၼ်သိပ်းဢိတ်းသွင်', 'လိူၼ်ၸဵင်'], - 'weekdays' => ['ဝၼ်းဢႃးတိတ်ႉ', 'ဝၼ်းၸၼ်', 'ဝၼ်း​ဢၢင်း​ၵၢၼ်း', 'ဝၼ်းပူတ်ႉ', 'ဝၼ်းၽတ်း', 'ဝၼ်းသုၵ်း', 'ဝၼ်းသဝ်'], - 'weekdays_short' => ['တိတ့်', 'ၸၼ်', 'ၵၢၼ်း', 'ပုတ့်', 'ၽတ်း', 'သုၵ်း', 'သဝ်'], - 'weekdays_min' => ['တိတ့်', 'ၸၼ်', 'ၵၢၼ်း', 'ပုတ့်', 'ၽတ်း', 'သုၵ်း', 'သဝ်'], - 'alt_numbers' => ['႐႐', '႐႑', '႐႒', '႐႓', '႐႔', '႐႕', '႐႖', '႐႗', '႐႘', '႐႙', '႑႐', '႑႑', '႑႒', '႑႓', '႑႔', '႑႕', '႑႖', '႑႗', '႑႘', '႑႙', '႒႐', '႒႑', '႒႒', '႒႓', '႒႔', '႒႕', '႒႖', '႒႗', '႒႘', '႒႙', '႓႐', '႓႑', '႓႒', '႓႓', '႓႔', '႓႕', '႓႖', '႓႗', '႓႘', '႓႙', '႔႐', '႔႑', '႔႒', '႔႓', '႔႔', '႔႕', '႔႖', '႔႗', '႔႘', '႔႙', '႕႐', '႕႑', '႕႒', '႕႓', '႕႔', '႕႕', '႕႖', '႕႗', '႕႘', '႕႙', '႖႐', '႖႑', '႖႒', '႖႓', '႖႔', '႖႕', '႖႖', '႖႗', '႖႘', '႖႙', '႗႐', '႗႑', '႗႒', '႗႓', '႗႔', '႗႕', '႗႖', '႗႗', '႗႘', '႗႙', '႘႐', '႘႑', '႘႒', '႘႓', '႘႔', '႘႕', '႘႖', '႘႗', '႘႘', '႘႙', '႙႐', '႙႑', '႙႒', '႙႓', '႙႔', '႙႕', '႙႖', '႙႗', '႙႘', '႙႙'], - 'meridiem' => ['ၵၢင်ၼႂ်', 'တၢမ်းၶမ်ႈ'], - - 'month' => ':count လိူၼ်', // less reliable - 'm' => ':count လိူၼ်', // less reliable - 'a_month' => ':count လိူၼ်', // less reliable - - 'week' => ':count ဝၼ်း', // less reliable - 'w' => ':count ဝၼ်း', // less reliable - 'a_week' => ':count ဝၼ်း', // less reliable - - 'hour' => ':count ຕີ', // less reliable - 'h' => ':count ຕີ', // less reliable - 'a_hour' => ':count ຕີ', // less reliable - - 'minute' => ':count ເດັກ', // less reliable - 'min' => ':count ເດັກ', // less reliable - 'a_minute' => ':count ເດັກ', // less reliable - - 'second' => ':count ဢိုၼ်ႇ', // less reliable - 's' => ':count ဢိုၼ်ႇ', // less reliable - 'a_second' => ':count ဢိုၼ်ႇ', // less reliable - - 'year' => ':count ပီ', - 'y' => ':count ပီ', - 'a_year' => ':count ပီ', - - 'day' => ':count ກາງວັນ', - 'd' => ':count ກາງວັນ', - 'a_day' => ':count ກາງວັນ', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shs.php b/vendor/nesbot/carbon/src/Carbon/Lang/shs.php deleted file mode 100644 index 8d2e1d7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/shs.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/shs_CA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php b/vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php deleted file mode 100644 index f41c34d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Neskie Manuel bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Pellkwet̓min', 'Pelctsipwen̓ten', 'Pellsqépts', 'Peslléwten', 'Pell7ell7é7llqten', 'Pelltspéntsk', 'Pelltqwelq̓wél̓t', 'Pellct̓éxel̓cten', 'Pesqelqlélten', 'Pesllwélsten', 'Pellc7ell7é7llcwten̓', 'Pelltetétq̓em'], - 'months_short' => ['Kwe', 'Tsi', 'Sqe', 'Éwt', 'Ell', 'Tsp', 'Tqw', 'Ct̓é', 'Qel', 'Wél', 'U7l', 'Tet'], - 'weekdays' => ['Sxetspesq̓t', 'Spetkesq̓t', 'Selesq̓t', 'Skellesq̓t', 'Smesesq̓t', 'Stselkstesq̓t', 'Stqmekstesq̓t'], - 'weekdays_short' => ['Sxe', 'Spe', 'Sel', 'Ske', 'Sme', 'Sts', 'Stq'], - 'weekdays_min' => ['Sxe', 'Spe', 'Sel', 'Ske', 'Sme', 'Sts', 'Stq'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count sqlélten', // less reliable - 'y' => ':count sqlélten', // less reliable - 'a_year' => ':count sqlélten', // less reliable - - 'month' => ':count swewll', // less reliable - 'm' => ':count swewll', // less reliable - 'a_month' => ':count swewll', // less reliable - - 'hour' => ':count seqwlút', // less reliable - 'h' => ':count seqwlút', // less reliable - 'a_hour' => ':count seqwlút', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/si.php b/vendor/nesbot/carbon/src/Carbon/Lang/si.php deleted file mode 100644 index 7d14ca6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/si.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Serhan Apaydın - * - JD Isaacks - * - Malinda Weerasinghe (MalindaWMD) - */ -return [ - 'year' => '{1}වසර 1|වසර :count', - 'a_year' => '{1}වසරක්|වසර :count', - 'month' => '{1}මාස 1|මාස :count', - 'a_month' => '{1}මාසය|මාස :count', - 'week' => '{1}සති 1|සති :count', - 'a_week' => '{1}සතියක්|සති :count', - 'day' => '{1}දින 1|දින :count', - 'a_day' => '{1}දිනක්|දින :count', - 'hour' => '{1}පැය 1|පැය :count', - 'a_hour' => '{1}පැයක්|පැය :count', - 'minute' => '{1}මිනිත්තු 1|මිනිත්තු :count', - 'a_minute' => '{1}මිනිත්තුවක්|මිනිත්තු :count', - 'second' => '{1}තත්පර 1|තත්පර :count', - 'a_second' => '{1}තත්පර කිහිපයකට|තත්පර :count', - 'ago' => ':time කට පෙර', - 'from_now' => static function ($time) { - if (preg_match('/දින \d+/u', $time)) { - return $time.' න්'; - } - - return $time.' කින්'; - }, - 'before' => ':time කට පෙර', - 'after' => static function ($time) { - if (preg_match('/දින \d+/u', $time)) { - return $time.' න්'; - } - - return $time.' කින්'; - }, - 'diff_now' => 'දැන්', - 'diff_today' => 'අද', - 'diff_yesterday' => 'ඊයේ', - 'diff_tomorrow' => 'හෙට', - 'formats' => [ - 'LT' => 'a h:mm', - 'LTS' => 'a h:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY MMMM D', - 'LLL' => 'YYYY MMMM D, a h:mm', - 'LLLL' => 'YYYY MMMM D [වැනි] dddd, a h:mm:ss', - ], - 'calendar' => [ - 'sameDay' => '[අද] LT[ට]', - 'nextDay' => '[හෙට] LT[ට]', - 'nextWeek' => 'dddd LT[ට]', - 'lastDay' => '[ඊයේ] LT[ට]', - 'lastWeek' => '[පසුගිය] dddd LT[ට]', - 'sameElse' => 'L', - ], - 'ordinal' => ':number වැනි', - 'meridiem' => ['පෙර වරු', 'පස් වරු', 'පෙ.ව.', 'ප.ව.'], - 'months' => ['ජනවාරි', 'පෙබරවාරි', 'මාර්තු', 'අප්‍රේල්', 'මැයි', 'ජූනි', 'ජූලි', 'අගෝස්තු', 'සැප්තැම්බර්', 'ඔක්තෝබර්', 'නොවැම්බර්', 'දෙසැම්බර්'], - 'months_short' => ['ජන', 'පෙබ', 'මාර්', 'අප්', 'මැයි', 'ජූනි', 'ජූලි', 'අගෝ', 'සැප්', 'ඔක්', 'නොවැ', 'දෙසැ'], - 'weekdays' => ['ඉරිදා', 'සඳුදා', 'අඟහරුවාදා', 'බදාදා', 'බ්‍රහස්පතින්දා', 'සිකුරාදා', 'සෙනසුරාදා'], - 'weekdays_short' => ['ඉරි', 'සඳු', 'අඟ', 'බදා', 'බ්‍රහ', 'සිකු', 'සෙන'], - 'weekdays_min' => ['ඉ', 'ස', 'අ', 'බ', 'බ්‍ර', 'සි', 'සෙ'], - 'first_day_of_week' => 1, -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php b/vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php deleted file mode 100644 index 81c44e0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/si.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sid.php b/vendor/nesbot/carbon/src/Carbon/Lang/sid.php deleted file mode 100644 index b1c6521..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sid.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sid_ET.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php deleted file mode 100644 index 5e9632d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - 'weekdays' => ['Sambata', 'Sanyo', 'Maakisanyo', 'Roowe', 'Hamuse', 'Arbe', 'Qidaame'], - 'weekdays_short' => ['Sam', 'San', 'Mak', 'Row', 'Ham', 'Arb', 'Qid'], - 'weekdays_min' => ['Sam', 'San', 'Mak', 'Row', 'Ham', 'Arb', 'Qid'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['soodo', 'hawwaro'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sk.php b/vendor/nesbot/carbon/src/Carbon/Lang/sk.php deleted file mode 100644 index 051e935..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sk.php +++ /dev/null @@ -1,160 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Martin Suja - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Juanito Fatas - * - Ivan Stana - * - Akira Matsuda - * - Christopher Dell - * - James McKinney - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Jozef Fulop - * - Nicolás Hock Isaza - * - Tom Hughes - * - Simon Hürlimann (CyT) - * - jofi - * - Jakub ADAMEC - * - Marek Adamický - * - AlterwebStudio - * - Peter Kundis - */ - -use Carbon\CarbonInterface; - -$fromNow = function ($time) { - return 'o '.strtr($time, [ - 'hodina' => 'hodinu', - 'minúta' => 'minútu', - 'sekunda' => 'sekundu', - ]); -}; - -$ago = function ($time) { - $replacements = [ - '/\bhodina\b/' => 'hodinou', - '/\bminúta\b/' => 'minútou', - '/\bsekunda\b/' => 'sekundou', - '/\bdeň\b/u' => 'dňom', - '/\btýždeň\b/u' => 'týždňom', - '/\bmesiac\b/' => 'mesiacom', - '/\brok\b/' => 'rokom', - ]; - - $replacementsPlural = [ - '/\b(?:hodiny|hodín)\b/' => 'hodinami', - '/\b(?:minúty|minút)\b/' => 'minútami', - '/\b(?:sekundy|sekúnd)\b/' => 'sekundami', - '/\bdeň\b/' => 'dňom', - '/\bdni\b/' => 'dňami', - '/\bdní\b/u' => 'dňami', - '/\b(?:týždne|týždňov)\b/' => 'týždňami', - '/\b(?:mesiace|mesiacov)\b/' => 'mesiacmi', - '/\b(?:roky|rokov)\b/' => 'rokmi', - ]; - - foreach ($replacements + $replacementsPlural as $pattern => $replacement) { - $time = preg_replace($pattern, $replacement, $time); - } - - return "pred $time"; -}; - -return [ - 'year' => ':count rok|:count roky|:count rokov', - 'a_year' => 'rok|:count roky|:count rokov', - 'y' => ':count r', - 'month' => ':count mesiac|:count mesiace|:count mesiacov', - 'a_month' => 'mesiac|:count mesiace|:count mesiacov', - 'm' => ':count m', - 'week' => ':count týždeň|:count týždne|:count týždňov', - 'a_week' => 'týždeň|:count týždne|:count týždňov', - 'w' => ':count t', - 'day' => ':count deň|:count dni|:count dní', - 'a_day' => 'deň|:count dni|:count dní', - 'd' => ':count d', - 'hour' => ':count hodina|:count hodiny|:count hodín', - 'a_hour' => 'hodina|:count hodiny|:count hodín', - 'h' => ':count h', - 'minute' => ':count minúta|:count minúty|:count minút', - 'a_minute' => 'minúta|:count minúty|:count minút', - 'min' => ':count min', - 'second' => ':count sekunda|:count sekundy|:count sekúnd', - 'a_second' => 'sekunda|:count sekundy|:count sekúnd', - 's' => ':count s', - 'millisecond' => ':count milisekunda|:count milisekundy|:count milisekúnd', - 'a_millisecond' => 'milisekunda|:count milisekundy|:count milisekúnd', - 'ms' => ':count ms', - 'microsecond' => ':count mikrosekunda|:count mikrosekundy|:count mikrosekúnd', - 'a_microsecond' => 'mikrosekunda|:count mikrosekundy|:count mikrosekúnd', - 'µs' => ':count µs', - - 'ago' => $ago, - 'from_now' => $fromNow, - 'before' => ':time pred', - 'after' => ':time po', - - 'hour_after' => ':count hodinu|:count hodiny|:count hodín', - 'minute_after' => ':count minútu|:count minúty|:count minút', - 'second_after' => ':count sekundu|:count sekundy|:count sekúnd', - - 'hour_before' => ':count hodinu|:count hodiny|:count hodín', - 'minute_before' => ':count minútu|:count minúty|:count minút', - 'second_before' => ':count sekundu|:count sekundy|:count sekúnd', - - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' a '], - 'diff_now' => 'teraz', - 'diff_yesterday' => 'včera', - 'diff_tomorrow' => 'zajtra', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'DD. MMMM YYYY', - 'LLL' => 'D. M. HH:mm', - 'LLLL' => 'dddd D. MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[dnes o] LT', - 'nextDay' => '[zajtra o] LT', - 'lastDay' => '[včera o] LT', - 'nextWeek' => 'dddd [o] LT', - 'lastWeek' => static function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 1: - case 2: - case 4: - case 5: - return '[minulý] dddd [o] LT'; //pondelok/utorok/štvrtok/piatok - default: - return '[minulá] dddd [o] LT'; - } - }, - 'sameElse' => 'L', - ], - 'weekdays' => ['nedeľa', 'pondelok', 'utorok', 'streda', 'štvrtok', 'piatok', 'sobota'], - 'weekdays_short' => ['ned', 'pon', 'uto', 'str', 'štv', 'pia', 'sob'], - 'weekdays_min' => ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'], - 'months' => ['januára', 'februára', 'marca', 'apríla', 'mája', 'júna', 'júla', 'augusta', 'septembra', 'októbra', 'novembra', 'decembra'], - 'months_standalone' => ['január', 'február', 'marec', 'apríl', 'máj', 'jún', 'júl', 'august', 'september', 'október', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'máj', 'jún', 'júl', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'months_regexp' => '/(DD?o?\.?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'meridiem' => ['dopoludnia', 'popoludní'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php b/vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php deleted file mode 100644 index 0515601..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sk.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sl.php b/vendor/nesbot/carbon/src/Carbon/Lang/sl.php deleted file mode 100644 index 012742e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sl.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Juanito Fatas - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Nicolás Hock Isaza - * - Miha Rebernik - * - Gal Jakič (morpheus7CS) - * - Glavić - * - Anže Časar - * - Lovro Tramšek (Lovro1107) - * - burut13 - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count leto|:count leti|:count leta|:count let', - 'y' => ':count leto|:count leti|:count leta|:count let', - 'month' => ':count mesec|:count meseca|:count mesece|:count mesecev', - 'm' => ':count mes.', - 'week' => ':count teden|:count tedna|:count tedne|:count tednov', - 'w' => ':count ted.', - 'day' => ':count dan|:count dni|:count dni|:count dni', - 'd' => ':count dan|:count dni|:count dni|:count dni', - 'hour' => ':count ura|:count uri|:count ure|:count ur', - 'h' => ':count h', - 'minute' => ':count minuta|:count minuti|:count minute|:count minut', - 'min' => ':count min.', - 'second' => ':count sekunda|:count sekundi|:count sekunde|:count sekund', - 'a_second' => '{1}nekaj sekund|:count sekunda|:count sekundi|:count sekunde|:count sekund', - 's' => ':count s', - - 'year_ago' => ':count letom|:count letoma|:count leti|:count leti', - 'y_ago' => ':count letom|:count letoma|:count leti|:count leti', - 'month_ago' => ':count mesecem|:count mesecema|:count meseci|:count meseci', - 'week_ago' => ':count tednom|:count tednoma|:count tedni|:count tedni', - 'day_ago' => ':count dnem|:count dnevoma|:count dnevi|:count dnevi', - 'd_ago' => ':count dnem|:count dnevoma|:count dnevi|:count dnevi', - 'hour_ago' => ':count uro|:count urama|:count urami|:count urami', - 'minute_ago' => ':count minuto|:count minutama|:count minutami|:count minutami', - 'second_ago' => ':count sekundo|:count sekundama|:count sekundami|:count sekundami', - - 'day_from_now' => ':count dan|:count dneva|:count dni|:count dni', - 'd_from_now' => ':count dan|:count dneva|:count dni|:count dni', - 'hour_from_now' => ':count uro|:count uri|:count ure|:count ur', - 'minute_from_now' => ':count minuto|:count minuti|:count minute|:count minut', - 'second_from_now' => ':count sekundo|:count sekundi|:count sekunde|:count sekund', - - 'ago' => 'pred :time', - 'from_now' => 'čez :time', - 'after' => ':time kasneje', - 'before' => ':time prej', - - 'diff_now' => 'ravnokar', - 'diff_today' => 'danes', - 'diff_today_regexp' => 'danes(?:\\s+ob)?', - 'diff_yesterday' => 'včeraj', - 'diff_yesterday_regexp' => 'včeraj(?:\\s+ob)?', - 'diff_tomorrow' => 'jutri', - 'diff_tomorrow_regexp' => 'jutri(?:\\s+ob)?', - 'diff_before_yesterday' => 'predvčerajšnjim', - 'diff_after_tomorrow' => 'pojutrišnjem', - - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'period_start_date' => 'od :date', - 'period_end_date' => 'do :date', - - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[danes ob] LT', - 'nextDay' => '[jutri ob] LT', - 'nextWeek' => 'dddd [ob] LT', - 'lastDay' => '[včeraj ob] LT', - 'lastWeek' => static function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[preteklo] [nedeljo] [ob] LT'; - case 1: - return '[pretekli] [ponedeljek] [ob] LT'; - case 2: - return '[pretekli] [torek] [ob] LT'; - case 3: - return '[preteklo] [sredo] [ob] LT'; - case 4: - return '[pretekli] [četrtek] [ob] LT'; - case 5: - return '[pretekli] [petek] [ob] LT'; - case 6: - return '[preteklo] [soboto] [ob] LT'; - } - }, - 'sameElse' => 'L', - ], - 'months' => ['januar', 'februar', 'marec', 'april', 'maj', 'junij', 'julij', 'avgust', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['nedelja', 'ponedeljek', 'torek', 'sreda', 'četrtek', 'petek', 'sobota'], - 'weekdays_short' => ['ned', 'pon', 'tor', 'sre', 'čet', 'pet', 'sob'], - 'weekdays_min' => ['ne', 'po', 'to', 'sr', 'če', 'pe', 'so'], - 'list' => [', ', ' in '], - 'meridiem' => ['dopoldan', 'popoldan'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php b/vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php deleted file mode 100644 index 5dad8c8..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sm.php b/vendor/nesbot/carbon/src/Carbon/Lang/sm.php deleted file mode 100644 index e8c118a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sm.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sm_WS.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php b/vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php deleted file mode 100644 index 1568af6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Ianuari', 'Fepuari', 'Mati', 'Aperila', 'Me', 'Iuni', 'Iulai', 'Auguso', 'Setema', 'Oketopa', 'Novema', 'Tesema'], - 'months_short' => ['Ian', 'Fep', 'Mat', 'Ape', 'Me', 'Iun', 'Iul', 'Aug', 'Set', 'Oke', 'Nov', 'Tes'], - 'weekdays' => ['Aso Sa', 'Aso Gafua', 'Aso Lua', 'Aso Lulu', 'Aso Tofi', 'Aso Farail', 'Aso To\'ana\'i'], - 'weekdays_short' => ['Aso Sa', 'Aso Gaf', 'Aso Lua', 'Aso Lul', 'Aso Tof', 'Aso Far', 'Aso To\''], - 'weekdays_min' => ['Aso Sa', 'Aso Gaf', 'Aso Lua', 'Aso Lul', 'Aso Tof', 'Aso Far', 'Aso To\''], - - 'hour' => ':count uati', // less reliable - 'h' => ':count uati', // less reliable - 'a_hour' => ':count uati', // less reliable - - 'minute' => ':count itiiti', // less reliable - 'min' => ':count itiiti', // less reliable - 'a_minute' => ':count itiiti', // less reliable - - 'second' => ':count lua', // less reliable - 's' => ':count lua', // less reliable - 'a_second' => ':count lua', // less reliable - - 'year' => ':count tausaga', - 'y' => ':count tausaga', - 'a_year' => ':count tausaga', - - 'month' => ':count māsina', - 'm' => ':count māsina', - 'a_month' => ':count māsina', - - 'week' => ':count vaiaso', - 'w' => ':count vaiaso', - 'a_week' => ':count vaiaso', - - 'day' => ':count aso', - 'd' => ':count aso', - 'a_day' => ':count aso', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/smn.php b/vendor/nesbot/carbon/src/Carbon/Lang/smn.php deleted file mode 100644 index 20add02..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/smn.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['ip.', 'ep.'], - 'weekdays' => ['pasepeeivi', 'vuossaargâ', 'majebaargâ', 'koskoho', 'tuorâstuv', 'vástuppeeivi', 'lávurduv'], - 'weekdays_short' => ['pas', 'vuo', 'maj', 'kos', 'tuo', 'vás', 'láv'], - 'weekdays_min' => ['pa', 'vu', 'ma', 'ko', 'tu', 'vá', 'lá'], - 'weekdays_standalone' => ['pasepeivi', 'vuossargâ', 'majebargâ', 'koskokko', 'tuorâstâh', 'vástuppeivi', 'lávurdâh'], - 'months' => ['uđđâivemáánu', 'kuovâmáánu', 'njuhčâmáánu', 'cuáŋuimáánu', 'vyesimáánu', 'kesimáánu', 'syeinimáánu', 'porgemáánu', 'čohčâmáánu', 'roovvâdmáánu', 'skammâmáánu', 'juovlâmáánu'], - 'months_short' => ['uđiv', 'kuovâ', 'njuhčâ', 'cuáŋui', 'vyesi', 'kesi', 'syeini', 'porge', 'čohčâ', 'roovvâd', 'skammâ', 'juovlâ'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'H.mm', - 'LTS' => 'H.mm.ss', - 'L' => 'D.M.YYYY', - 'LL' => 'MMM D. YYYY', - 'LLL' => 'MMMM D. YYYY H.mm', - 'LLLL' => 'dddd, MMMM D. YYYY H.mm', - ], - - 'hour' => ':count äigi', // less reliable - 'h' => ':count äigi', // less reliable - 'a_hour' => ':count äigi', // less reliable - - 'year' => ':count ihe', - 'y' => ':count ihe', - 'a_year' => ':count ihe', - - 'month' => ':count mánuppaje', - 'm' => ':count mánuppaje', - 'a_month' => ':count mánuppaje', - - 'week' => ':count okko', - 'w' => ':count okko', - 'a_week' => ':count okko', - - 'day' => ':count peivi', - 'd' => ':count peivi', - 'a_day' => ':count peivi', - - 'minute' => ':count miinut', - 'min' => ':count miinut', - 'a_minute' => ':count miinut', - - 'second' => ':count nubbe', - 's' => ':count nubbe', - 'a_second' => ':count nubbe', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sn.php b/vendor/nesbot/carbon/src/Carbon/Lang/sn.php deleted file mode 100644 index 095936f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sn.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'meridiem' => ['a', 'p'], - 'weekdays' => ['Svondo', 'Muvhuro', 'Chipiri', 'Chitatu', 'China', 'Chishanu', 'Mugovera'], - 'weekdays_short' => ['Svo', 'Muv', 'Chp', 'Cht', 'Chn', 'Chs', 'Mug'], - 'weekdays_min' => ['Sv', 'Mu', 'Cp', 'Ct', 'Cn', 'Cs', 'Mg'], - 'months' => ['Ndira', 'Kukadzi', 'Kurume', 'Kubvumbi', 'Chivabvu', 'Chikumi', 'Chikunguru', 'Nyamavhuvhu', 'Gunyana', 'Gumiguru', 'Mbudzi', 'Zvita'], - 'months_short' => ['Ndi', 'Kuk', 'Kur', 'Kub', 'Chv', 'Chk', 'Chg', 'Nya', 'Gun', 'Gum', 'Mbu', 'Zvi'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], - - 'year' => 'makore :count', - 'y' => 'makore :count', - 'a_year' => 'makore :count', - - 'month' => 'mwedzi :count', - 'm' => 'mwedzi :count', - 'a_month' => 'mwedzi :count', - - 'week' => 'vhiki :count', - 'w' => 'vhiki :count', - 'a_week' => 'vhiki :count', - - 'day' => 'mazuva :count', - 'd' => 'mazuva :count', - 'a_day' => 'mazuva :count', - - 'hour' => 'maawa :count', - 'h' => 'maawa :count', - 'a_hour' => 'maawa :count', - - 'minute' => 'minitsi :count', - 'min' => 'minitsi :count', - 'a_minute' => 'minitsi :count', - - 'second' => 'sekonzi :count', - 's' => 'sekonzi :count', - 'a_second' => 'sekonzi :count', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/so.php b/vendor/nesbot/carbon/src/Carbon/Lang/so.php deleted file mode 100644 index 2e4549f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/so.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Author: - * - Abdifatah Abdilahi(@abdifatahz) - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'year' => ':count sanad|:count sanadood', - 'a_year' => 'sanad|:count sanadood', - 'y' => '{1}:countsn|{0}:countsns|]1,Inf[:countsn', - 'month' => ':count bil|:count bilood', - 'a_month' => 'bil|:count bilood', - 'm' => ':countbil', - 'week' => ':count isbuuc', - 'a_week' => 'isbuuc|:count isbuuc', - 'w' => ':countis', - 'day' => ':count maalin|:count maalmood', - 'a_day' => 'maalin|:count maalmood', - 'd' => ':countml', - 'hour' => ':count saac', - 'a_hour' => 'saacad|:count saac', - 'h' => ':countsc', - 'minute' => ':count daqiiqo', - 'a_minute' => 'daqiiqo|:count daqiiqo', - 'min' => ':countdq', - 'second' => ':count ilbidhiqsi', - 'a_second' => 'xooga ilbidhiqsiyo|:count ilbidhiqsi', - 's' => ':countil', - 'ago' => ':time kahor', - 'from_now' => ':time gudahood', - 'after' => ':time kedib', - 'before' => ':time kahor', - 'diff_now' => 'hada', - 'diff_today' => 'maanta', - 'diff_today_regexp' => 'maanta(?:\s+markay\s+(?:tahay|ahayd))?', - 'diff_yesterday' => 'shalayto', - 'diff_yesterday_regexp' => 'shalayto(?:\s+markay\s+ahayd)?', - 'diff_tomorrow' => 'beri', - 'diff_tomorrow_regexp' => 'beri(?:\s+markay\s+tahay)?', - 'diff_before_yesterday' => 'doraato', - 'diff_after_tomorrow' => 'saadanbe', - 'period_recurrences' => 'mar|:count jeer', - 'period_interval' => ':interval kasta', - 'period_start_date' => 'laga bilaabo :date', - 'period_end_date' => 'ilaa :date', - 'months' => ['Janaayo', 'Febraayo', 'Abriil', 'Maajo', 'Juun', 'Luuliyo', 'Agoosto', 'Sebteembar', 'Oktoobar', 'Nofeembar', 'Diseembar'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Abr', 'Mjo', 'Jun', 'Lyo', 'Agt', 'Seb', 'Okt', 'Nof', 'Dis'], - 'weekdays' => ['Axad', 'Isniin', 'Talaada', 'Arbaca', 'Khamiis', 'Jimce', 'Sabti'], - 'weekdays_short' => ['Axd', 'Isn', 'Tal', 'Arb', 'Kha', 'Jim', 'Sbt'], - 'weekdays_min' => ['Ax', 'Is', 'Ta', 'Ar', 'Kh', 'Ji', 'Sa'], - 'list' => [', ', ' and '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'calendar' => [ - 'sameDay' => '[Maanta markay tahay] LT', - 'nextDay' => '[Beri markay tahay] LT', - 'nextWeek' => 'dddd [markay tahay] LT', - 'lastDay' => '[Shalay markay ahayd] LT', - 'lastWeek' => '[Hore] dddd [Markay ahayd] LT', - 'sameElse' => 'L', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php deleted file mode 100644 index 273dda8..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/so.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php deleted file mode 100644 index 7b69971..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return require __DIR__.'/so.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php b/vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php deleted file mode 100644 index 7b69971..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return require __DIR__.'/so.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php b/vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php deleted file mode 100644 index 7b69971..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return require __DIR__.'/so.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sq.php b/vendor/nesbot/carbon/src/Carbon/Lang/sq.php deleted file mode 100644 index ffa592e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sq.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - JD Isaacks - * - Fadion Dashi - */ -return [ - 'year' => ':count vit|:count vjet', - 'a_year' => 'një vit|:count vite', - 'y' => ':count v.', - 'month' => ':count muaj', - 'a_month' => 'një muaj|:count muaj', - 'm' => ':count muaj', - 'week' => ':count javë', - 'a_week' => ':count javë|:count javë', - 'w' => ':count j.', - 'day' => ':count ditë', - 'a_day' => 'një ditë|:count ditë', - 'd' => ':count d.', - 'hour' => ':count orë', - 'a_hour' => 'një orë|:count orë', - 'h' => ':count o.', - 'minute' => ':count minutë|:count minuta', - 'a_minute' => 'një minutë|:count minuta', - 'min' => ':count min.', - 'second' => ':count sekondë|:count sekonda', - 'a_second' => 'disa sekonda|:count sekonda', - 's' => ':count s.', - 'ago' => ':time më parë', - 'from_now' => 'në :time', - 'after' => ':time pas', - 'before' => ':time para', - 'diff_now' => 'tani', - 'diff_today' => 'Sot', - 'diff_today_regexp' => 'Sot(?:\\s+në)?', - 'diff_yesterday' => 'dje', - 'diff_yesterday_regexp' => 'Dje(?:\\s+në)?', - 'diff_tomorrow' => 'nesër', - 'diff_tomorrow_regexp' => 'Nesër(?:\\s+në)?', - 'diff_before_yesterday' => 'pardje', - 'diff_after_tomorrow' => 'pasnesër', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Sot në] LT', - 'nextDay' => '[Nesër në] LT', - 'nextWeek' => 'dddd [në] LT', - 'lastDay' => '[Dje në] LT', - 'lastWeek' => 'dddd [e kaluar në] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'meridiem' => ['PD', 'MD'], - 'months' => ['janar', 'shkurt', 'mars', 'prill', 'maj', 'qershor', 'korrik', 'gusht', 'shtator', 'tetor', 'nëntor', 'dhjetor'], - 'months_short' => ['jan', 'shk', 'mar', 'pri', 'maj', 'qer', 'kor', 'gus', 'sht', 'tet', 'nën', 'dhj'], - 'weekdays' => ['e diel', 'e hënë', 'e martë', 'e mërkurë', 'e enjte', 'e premte', 'e shtunë'], - 'weekdays_short' => ['die', 'hën', 'mar', 'mër', 'enj', 'pre', 'sht'], - 'weekdays_min' => ['d', 'h', 'ma', 'më', 'e', 'p', 'sh'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' dhe '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php b/vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php deleted file mode 100644 index ea5df3f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sq.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php b/vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php deleted file mode 100644 index 62f752c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/sq.php', [ - 'formats' => [ - 'L' => 'D.M.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php b/vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php deleted file mode 100644 index 62f752c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/sq.php', [ - 'formats' => [ - 'L' => 'D.M.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr.php deleted file mode 100644 index faa9fbd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - shaishavgandhi05 - * - Serhan Apaydın - * - JD Isaacks - * - Glavić - * - Milos Sakovic - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count godina|:count godine|:count godina', - 'y' => ':count g.', - 'month' => ':count mesec|:count meseca|:count meseci', - 'm' => ':count mj.', - 'week' => ':count nedelja|:count nedelje|:count nedelja', - 'w' => ':count ned.', - 'day' => ':count dan|:count dana|:count dana', - 'd' => ':count d.', - 'hour' => ':count sat|:count sata|:count sati', - 'h' => ':count č.', - 'minute' => ':count minut|:count minuta|:count minuta', - 'min' => ':count min.', - 'second' => ':count sekundu|:count sekunde|:count sekundi', - 's' => ':count sek.', - - 'ago' => 'pre :time', - 'from_now' => 'za :time', - 'after' => 'nakon :time', - 'before' => 'pre :time', - - 'year_ago' => ':count godinu|:count godine|:count godina', - 'year_from_now' => ':count godinu|:count godine|:count godina', - 'week_ago' => ':count nedelju|:count nedelje|:count nedelja', - 'week_from_now' => ':count nedelju|:count nedelje|:count nedelja', - - 'diff_now' => 'upravo sada', - 'diff_today' => 'danas', - 'diff_today_regexp' => 'danas(?:\\s+u)?', - 'diff_yesterday' => 'juče', - 'diff_yesterday_regexp' => 'juče(?:\\s+u)?', - 'diff_tomorrow' => 'sutra', - 'diff_tomorrow_regexp' => 'sutra(?:\\s+u)?', - 'diff_before_yesterday' => 'prekjuče', - 'diff_after_tomorrow' => 'preksutra', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[danas u] LT', - 'nextDay' => '[sutra u] LT', - 'nextWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[u nedelju u] LT', - 3 => '[u sredu u] LT', - 6 => '[u subotu u] LT', - default => '[u] dddd [u] LT', - }, - 'lastDay' => '[juče u] LT', - 'lastWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[prošle nedelje u] LT', - 1 => '[prošlog ponedeljka u] LT', - 2 => '[prošlog utorka u] LT', - 3 => '[prošle srede u] LT', - 4 => '[prošlog četvrtka u] LT', - 5 => '[prošlog petka u] LT', - default => '[prošle subote u] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], - 'months_short' => ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], - 'weekdays' => ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sre.', 'čet.', 'pet.', 'sub.'], - 'weekdays_min' => ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' i '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php deleted file mode 100644 index fe42d5a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - shaishavgandhi05 - * - Serhan Apaydın - * - JD Isaacks - * - Glavić - * - Nikola Zeravcic - * - Milos Sakovic - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count година|:count године|:count година', - 'y' => ':count г.', - 'month' => ':count месец|:count месеца|:count месеци', - 'm' => ':count м.', - 'week' => ':count недеља|:count недеље|:count недеља', - 'w' => ':count нед.', - 'day' => ':count дан|:count дана|:count дана', - 'd' => ':count д.', - 'hour' => ':count сат|:count сата|:count сати', - 'h' => ':count ч.', - 'minute' => ':count минут|:count минута|:count минута', - 'min' => ':count мин.', - 'second' => ':count секунд|:count секунде|:count секунди', - 's' => ':count сек.', - 'ago' => 'пре :time', - 'from_now' => 'за :time', - 'after' => ':time након', - 'before' => ':time пре', - 'year_from_now' => ':count годину|:count године|:count година', - 'year_ago' => ':count годину|:count године|:count година', - 'week_from_now' => ':count недељу|:count недеље|:count недеља', - 'week_ago' => ':count недељу|:count недеље|:count недеља', - 'diff_now' => 'управо сада', - 'diff_today' => 'данас', - 'diff_today_regexp' => 'данас(?:\\s+у)?', - 'diff_yesterday' => 'јуче', - 'diff_yesterday_regexp' => 'јуче(?:\\s+у)?', - 'diff_tomorrow' => 'сутра', - 'diff_tomorrow_regexp' => 'сутра(?:\\s+у)?', - 'diff_before_yesterday' => 'прекјуче', - 'diff_after_tomorrow' => 'прекосутра', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[данас у] LT', - 'nextDay' => '[сутра у] LT', - 'nextWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[у недељу у] LT', - 3 => '[у среду у] LT', - 6 => '[у суботу у] LT', - default => '[у] dddd [у] LT', - }, - 'lastDay' => '[јуче у] LT', - 'lastWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[прошле недеље у] LT', - 1 => '[прошлог понедељка у] LT', - 2 => '[прошлог уторка у] LT', - 3 => '[прошле среде у] LT', - 4 => '[прошлог четвртка у] LT', - 5 => '[прошлог петка у] LT', - default => '[прошле суботе у] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'], - 'months_short' => ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'], - 'weekdays' => ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'], - 'weekdays_short' => ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'], - 'weekdays_min' => ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' и '], - 'meridiem' => ['АМ', 'ПМ'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php deleted file mode 100644 index 4b29a45..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Cyrl_BA'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/sr_Cyrl.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D.M.yy.', - 'LL' => 'DD.MM.YYYY.', - 'LLL' => 'DD. MMMM YYYY. HH:mm', - 'LLLL' => 'dddd, DD. MMMM YYYY. HH:mm', - ], - 'weekdays' => ['недјеља', 'понедељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'], - 'weekdays_short' => ['нед.', 'пон.', 'ут.', 'ср.', 'чет.', 'пет.', 'суб.'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php deleted file mode 100644 index e34f732..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Glavić - * - Milos Sakovic - */ - -use Carbon\CarbonInterface; -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Cyrl_ME'); -} -// @codeCoverageIgnoreEnd - -return [ - 'year' => ':count година|:count године|:count година', - 'y' => ':count г.', - 'month' => ':count мјесец|:count мјесеца|:count мјесеци', - 'm' => ':count мј.', - 'week' => ':count недјеља|:count недјеље|:count недјеља', - 'w' => ':count нед.', - 'day' => ':count дан|:count дана|:count дана', - 'd' => ':count д.', - 'hour' => ':count сат|:count сата|:count сати', - 'h' => ':count ч.', - 'minute' => ':count минут|:count минута|:count минута', - 'min' => ':count мин.', - 'second' => ':count секунд|:count секунде|:count секунди', - 's' => ':count сек.', - 'ago' => 'прије :time', - 'from_now' => 'за :time', - 'after' => ':time након', - 'before' => ':time прије', - - 'year_from_now' => ':count годину|:count године|:count година', - 'year_ago' => ':count годину|:count године|:count година', - - 'week_from_now' => ':count недјељу|:count недјеље|:count недјеља', - 'week_ago' => ':count недјељу|:count недјеље|:count недјеља', - - 'diff_now' => 'управо сада', - 'diff_today' => 'данас', - 'diff_today_regexp' => 'данас(?:\\s+у)?', - 'diff_yesterday' => 'јуче', - 'diff_yesterday_regexp' => 'јуче(?:\\s+у)?', - 'diff_tomorrow' => 'сутра', - 'diff_tomorrow_regexp' => 'сутра(?:\\s+у)?', - 'diff_before_yesterday' => 'прекјуче', - 'diff_after_tomorrow' => 'прекосјутра', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[данас у] LT', - 'nextDay' => '[сутра у] LT', - 'nextWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[у недељу у] LT', - 3 => '[у среду у] LT', - 6 => '[у суботу у] LT', - default => '[у] dddd [у] LT', - }, - 'lastDay' => '[јуче у] LT', - 'lastWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[прошле недеље у] LT', - 1 => '[прошлог понедељка у] LT', - 2 => '[прошлог уторка у] LT', - 3 => '[прошле среде у] LT', - 4 => '[прошлог четвртка у] LT', - 5 => '[прошлог петка у] LT', - default => '[прошле суботе у] LT', - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'], - 'months_short' => ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'], - 'weekdays' => ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'], - 'weekdays_short' => ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'], - 'weekdays_min' => ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' и '], - 'meridiem' => ['АМ', 'ПМ'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php deleted file mode 100644 index d6e29b8..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Cyrl_XK'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/sr_Cyrl_BA.php', [ - 'weekdays' => ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php deleted file mode 100644 index 9971674..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php deleted file mode 100644 index 95b2770..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Latn_BA'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/sr_Latn.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D.M.yy.', - 'LL' => 'DD.MM.YYYY.', - 'LLL' => 'DD. MMMM YYYY. HH:mm', - 'LLLL' => 'dddd, DD. MMMM YYYY. HH:mm', - ], - 'weekdays' => ['nedjelja', 'ponedeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned.', 'pon.', 'ut.', 'sr.', 'čet.', 'pet.', 'sub.'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php deleted file mode 100644 index 8115080..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Glavić - * - Milos Sakovic - */ - -use Carbon\CarbonInterface; -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Latn_ME'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/sr.php', [ - 'month' => ':count mjesec|:count mjeseca|:count mjeseci', - 'week' => ':count nedjelja|:count nedjelje|:count nedjelja', - 'second' => ':count sekund|:count sekunde|:count sekundi', - 'ago' => 'prije :time', - 'from_now' => 'za :time', - 'after' => ':time nakon', - 'before' => ':time prije', - 'week_from_now' => ':count nedjelju|:count nedjelje|:count nedjelja', - 'week_ago' => ':count nedjelju|:count nedjelje|:count nedjelja', - 'second_ago' => ':count sekund|:count sekunde|:count sekundi', - 'diff_tomorrow' => 'sjutra', - 'calendar' => [ - 'nextDay' => '[sjutra u] LT', - 'nextWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[u nedjelju u] LT', - 3 => '[u srijedu u] LT', - 6 => '[u subotu u] LT', - default => '[u] dddd [u] LT', - }, - 'lastWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0 => '[prošle nedjelje u] LT', - 1 => '[prošle nedjelje u] LT', - 2 => '[prošlog utorka u] LT', - 3 => '[prošle srijede u] LT', - 4 => '[prošlog četvrtka u] LT', - 5 => '[prošlog petka u] LT', - default => '[prošle subote u] LT', - }, - ], - 'weekdays' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sri.', 'čet.', 'pet.', 'sub.'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php deleted file mode 100644 index 5278e2e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Latn_XK'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/sr_Latn_BA.php', [ - 'weekdays' => ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php deleted file mode 100644 index d7c65b9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sr_Latn_ME.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php deleted file mode 100644 index bc5e04b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - sr_YU, sr_CS locale Danilo Segan bug-glibc-locales@gnu.org - */ -return require __DIR__.'/sr_Cyrl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php deleted file mode 100644 index 9971674..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ss.php b/vendor/nesbot/carbon/src/Carbon/Lang/ss.php deleted file mode 100644 index 0ec3e8f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ss.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Nicolai Davies - */ -return [ - 'year' => '{1}umnyaka|:count iminyaka', - 'month' => '{1}inyanga|:count tinyanga', - 'week' => '{1}:count liviki|:count emaviki', - 'day' => '{1}lilanga|:count emalanga', - 'hour' => '{1}lihora|:count emahora', - 'minute' => '{1}umzuzu|:count emizuzu', - 'second' => '{1}emizuzwana lomcane|:count mzuzwana', - 'ago' => 'wenteka nga :time', - 'from_now' => 'nga :time', - 'diff_yesterday' => 'Itolo', - 'diff_yesterday_regexp' => 'Itolo(?:\\s+nga)?', - 'diff_today' => 'Namuhla', - 'diff_today_regexp' => 'Namuhla(?:\\s+nga)?', - 'diff_tomorrow' => 'Kusasa', - 'diff_tomorrow_regexp' => 'Kusasa(?:\\s+nga)?', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm A', - 'LLLL' => 'dddd, D MMMM YYYY h:mm A', - ], - 'calendar' => [ - 'sameDay' => '[Namuhla nga] LT', - 'nextDay' => '[Kusasa nga] LT', - 'nextWeek' => 'dddd [nga] LT', - 'lastDay' => '[Itolo nga] LT', - 'lastWeek' => 'dddd [leliphelile] [nga] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - $lastDigit = $number % 10; - - return $number.( - ((int) ($number % 100 / 10) === 1) ? 'e' : ( - ($lastDigit === 1 || $lastDigit === 2) ? 'a' : 'e' - ) - ); - }, - 'meridiem' => static function ($hour) { - if ($hour < 11) { - return 'ekuseni'; - } - if ($hour < 15) { - return 'emini'; - } - if ($hour < 19) { - return 'entsambama'; - } - - return 'ebusuku'; - }, - 'months' => ['Bhimbidvwane', 'Indlovana', 'Indlov\'lenkhulu', 'Mabasa', 'Inkhwekhweti', 'Inhlaba', 'Kholwane', 'Ingci', 'Inyoni', 'Imphala', 'Lweti', 'Ingongoni'], - 'months_short' => ['Bhi', 'Ina', 'Inu', 'Mab', 'Ink', 'Inh', 'Kho', 'Igc', 'Iny', 'Imp', 'Lwe', 'Igo'], - 'weekdays' => ['Lisontfo', 'Umsombuluko', 'Lesibili', 'Lesitsatfu', 'Lesine', 'Lesihlanu', 'Umgcibelo'], - 'weekdays_short' => ['Lis', 'Umb', 'Lsb', 'Les', 'Lsi', 'Lsh', 'Umg'], - 'weekdays_min' => ['Li', 'Us', 'Lb', 'Lt', 'Ls', 'Lh', 'Ug'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php deleted file mode 100644 index ba89527..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ss.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/st.php b/vendor/nesbot/carbon/src/Carbon/Lang/st.php deleted file mode 100644 index b065445..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/st.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/st_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php deleted file mode 100644 index 5eee222..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Pherekgong', 'Hlakola', 'Tlhakubele', 'Mmese', 'Motsheanong', 'Phupjane', 'Phupu', 'Phato', 'Leotse', 'Mphalane', 'Pudungwana', 'Tshitwe'], - 'months_short' => ['Phe', 'Hla', 'TlH', 'Mme', 'Mot', 'Jan', 'Upu', 'Pha', 'Leo', 'Mph', 'Pud', 'Tsh'], - 'weekdays' => ['Sontaha', 'Mantaha', 'Labobedi', 'Laboraro', 'Labone', 'Labohlano', 'Moqebelo'], - 'weekdays_short' => ['Son', 'Mma', 'Bed', 'Rar', 'Ne', 'Hla', 'Moq'], - 'weekdays_min' => ['Son', 'Mma', 'Bed', 'Rar', 'Ne', 'Hla', 'Moq'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'week' => ':count Sontaha', // less reliable - 'w' => ':count Sontaha', // less reliable - 'a_week' => ':count Sontaha', // less reliable - - 'day' => ':count letsatsi', // less reliable - 'd' => ':count letsatsi', // less reliable - 'a_day' => ':count letsatsi', // less reliable - - 'hour' => ':count sešupanako', // less reliable - 'h' => ':count sešupanako', // less reliable - 'a_hour' => ':count sešupanako', // less reliable - - 'minute' => ':count menyane', // less reliable - 'min' => ':count menyane', // less reliable - 'a_minute' => ':count menyane', // less reliable - - 'second' => ':count thusa', // less reliable - 's' => ':count thusa', // less reliable - 'a_second' => ':count thusa', // less reliable - - 'year' => ':count selemo', - 'y' => ':count selemo', - 'a_year' => ':count selemo', - - 'month' => ':count kgwedi', - 'm' => ':count kgwedi', - 'a_month' => ':count kgwedi', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sv.php b/vendor/nesbot/carbon/src/Carbon/Lang/sv.php deleted file mode 100644 index d7e0ddf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sv.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Kristoffer Snabb - * - JD Isaacks - * - Jens Herlevsen - * - Nightpine - * - Anders Nygren (litemerafrukt) - */ -return [ - 'year' => ':count år', - 'a_year' => 'ett år|:count år', - 'y' => ':count år', - 'month' => ':count månad|:count månader', - 'a_month' => 'en månad|:count månader', - 'm' => ':count mån', - 'week' => ':count vecka|:count veckor', - 'a_week' => 'en vecka|:count veckor', - 'w' => ':count v', - 'day' => ':count dag|:count dagar', - 'a_day' => 'en dag|:count dagar', - 'd' => ':count dgr', - 'hour' => ':count timme|:count timmar', - 'a_hour' => 'en timme|:count timmar', - 'h' => ':count tim', - 'minute' => ':count minut|:count minuter', - 'a_minute' => 'en minut|:count minuter', - 'min' => ':count min', - 'second' => ':count sekund|:count sekunder', - 'a_second' => 'några sekunder|:count sekunder', - 's' => ':count s', - 'ago' => 'för :time sedan', - 'from_now' => 'om :time', - 'after' => ':time efter', - 'before' => ':time före', - 'diff_now' => 'nu', - 'diff_today' => 'I dag', - 'diff_yesterday' => 'i går', - 'diff_yesterday_regexp' => 'I går', - 'diff_tomorrow' => 'i morgon', - 'diff_tomorrow_regexp' => 'I morgon', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY [kl.] HH:mm', - 'LLLL' => 'dddd D MMMM YYYY [kl.] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[I dag] LT', - 'nextDay' => '[I morgon] LT', - 'nextWeek' => '[På] dddd LT', - 'lastDay' => '[I går] LT', - 'lastWeek' => '[I] dddd[s] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - $lastDigit = $number % 10; - - return $number.( - ((int) ($number % 100 / 10) === 1) ? 'e' : ( - ($lastDigit === 1 || $lastDigit === 2) ? 'a' : 'e' - ) - ); - }, - 'months' => ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'], - 'weekdays_short' => ['sön', 'mån', 'tis', 'ons', 'tors', 'fre', 'lör'], - 'weekdays_min' => ['sö', 'må', 'ti', 'on', 'to', 'fr', 'lö'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' och '], - 'meridiem' => ['fm', 'em'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php b/vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php deleted file mode 100644 index 70cc558..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/sv.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-dd', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php b/vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php deleted file mode 100644 index d7182c8..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sv.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php b/vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php deleted file mode 100644 index d7182c8..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sv.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sw.php b/vendor/nesbot/carbon/src/Carbon/Lang/sw.php deleted file mode 100644 index f8630d5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sw.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - leyluj - * - Josh Soref - * - ryanhart2 - */ -return [ - 'year' => 'mwaka :count|miaka :count', - 'a_year' => 'mwaka mmoja|miaka :count', - 'y' => 'mwaka :count|miaka :count', - 'month' => 'mwezi :count|miezi :count', - 'a_month' => 'mwezi mmoja|miezi :count', - 'm' => 'mwezi :count|miezi :count', - 'week' => 'wiki :count', - 'a_week' => 'wiki mmoja|wiki :count', - 'w' => 'w. :count', - 'day' => 'siku :count', - 'a_day' => 'siku moja|masiku :count', - 'd' => 'si. :count', - 'hour' => 'saa :count|masaa :count', - 'a_hour' => 'saa limoja|masaa :count', - 'h' => 'saa :count|masaa :count', - 'minute' => 'dakika :count', - 'a_minute' => 'dakika moja|dakika :count', - 'min' => 'd. :count', - 'second' => 'sekunde :count', - 'a_second' => 'hivi punde|sekunde :count', - 's' => 'se. :count', - 'ago' => 'tokea :time', - 'from_now' => ':time baadaye', - 'after' => ':time baada', - 'before' => ':time kabla', - 'diff_now' => 'sasa hivi', - 'diff_today' => 'leo', - 'diff_today_regexp' => 'leo(?:\\s+saa)?', - 'diff_yesterday' => 'jana', - 'diff_tomorrow' => 'kesho', - 'diff_tomorrow_regexp' => 'kesho(?:\\s+saa)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[leo saa] LT', - 'nextDay' => '[kesho saa] LT', - 'nextWeek' => '[wiki ijayo] dddd [saat] LT', - 'lastDay' => '[jana] LT', - 'lastWeek' => '[wiki iliyopita] dddd [saat] LT', - 'sameElse' => 'L', - ], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Jpl', 'Jtat', 'Jnne', 'Jtan', 'Alh', 'Ijm', 'Jmos'], - 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Al', 'Ij', 'J1'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' na '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php b/vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php deleted file mode 100644 index ec9117b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/sw.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php b/vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php deleted file mode 100644 index 2ace0db..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kamusi Project Martin Benjamin locales@kamusi.org - */ -return array_replace_recursive(require __DIR__.'/sw.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], - 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['asubuhi', 'alasiri'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php deleted file mode 100644 index fab3cd6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kamusi Project Martin Benjamin locales@kamusi.org - */ -return array_replace_recursive(require __DIR__.'/sw.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], - 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['asubuhi', 'alasiri'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php b/vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php deleted file mode 100644 index ec9117b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/sw.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/szl.php b/vendor/nesbot/carbon/src/Carbon/Lang/szl.php deleted file mode 100644 index 4429c4f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/szl.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/szl_PL.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php b/vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php deleted file mode 100644 index 9adddcf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - szl_PL locale Przemyslaw Buczkowski libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['styczyń', 'luty', 'merc', 'kwjeciyń', 'moj', 'czyrwjyń', 'lipjyń', 'siyrpjyń', 'wrzesiyń', 'październik', 'listopad', 'grudziyń'], - 'months_short' => ['sty', 'lut', 'mer', 'kwj', 'moj', 'czy', 'lip', 'siy', 'wrz', 'paź', 'lis', 'gru'], - 'weekdays' => ['niydziela', 'pyńdziŏek', 'wtŏrek', 'strzŏda', 'sztwortek', 'pjōntek', 'sobŏta'], - 'weekdays_short' => ['niy', 'pyń', 'wtŏ', 'str', 'szt', 'pjō', 'sob'], - 'weekdays_min' => ['niy', 'pyń', 'wtŏ', 'str', 'szt', 'pjō', 'sob'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count rok', - 'y' => ':count rok', - 'a_year' => ':count rok', - - 'month' => ':count mjeśůnc', - 'm' => ':count mjeśůnc', - 'a_month' => ':count mjeśůnc', - - 'week' => ':count tydźyń', - 'w' => ':count tydźyń', - 'a_week' => ':count tydźyń', - - 'day' => ':count dźyń', - 'd' => ':count dźyń', - 'a_day' => ':count dźyń', - - 'hour' => ':count godzina', - 'h' => ':count godzina', - 'a_hour' => ':count godzina', - - 'minute' => ':count minuta', - 'min' => ':count minuta', - 'a_minute' => ':count minuta', - - 'second' => ':count sekůnda', - 's' => ':count sekůnda', - 'a_second' => ':count sekůnda', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ta.php b/vendor/nesbot/carbon/src/Carbon/Lang/ta.php deleted file mode 100644 index c5dd68e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ta.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - JD Isaacks - * - Satheez - */ -return [ - 'year' => ':count வருடம்|:count ஆண்டுகள்', - 'a_year' => 'ஒரு வருடம்|:count ஆண்டுகள்', - 'y' => ':count வருட.|:count ஆண்.', - 'month' => ':count மாதம்|:count மாதங்கள்', - 'a_month' => 'ஒரு மாதம்|:count மாதங்கள்', - 'm' => ':count மாத.', - 'week' => ':count வாரம்|:count வாரங்கள்', - 'a_week' => 'ஒரு வாரம்|:count வாரங்கள்', - 'w' => ':count வார.', - 'day' => ':count நாள்|:count நாட்கள்', - 'a_day' => 'ஒரு நாள்|:count நாட்கள்', - 'd' => ':count நாள்|:count நாட்.', - 'hour' => ':count மணி நேரம்|:count மணி நேரம்', - 'a_hour' => 'ஒரு மணி நேரம்|:count மணி நேரம்', - 'h' => ':count மணி.', - 'minute' => ':count நிமிடம்|:count நிமிடங்கள்', - 'a_minute' => 'ஒரு நிமிடம்|:count நிமிடங்கள்', - 'min' => ':count நிமி.', - 'second' => ':count சில விநாடிகள்|:count விநாடிகள்', - 'a_second' => 'ஒரு சில விநாடிகள்|:count விநாடிகள்', - 's' => ':count விநா.', - 'ago' => ':time முன்', - 'from_now' => ':time இல்', - 'before' => ':time முன்', - 'after' => ':time பின்', - 'diff_now' => 'இப்போது', - 'diff_today' => 'இன்று', - 'diff_yesterday' => 'நேற்று', - 'diff_tomorrow' => 'நாளை', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[இன்று] LT', - 'nextDay' => '[நாளை] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[நேற்று] LT', - 'lastWeek' => '[கடந்த வாரம்] dddd, LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberவது', - 'meridiem' => static function ($hour) { - if ($hour < 2) { - return ' யாமம்'; - } - if ($hour < 6) { - return ' வைகறை'; - } - if ($hour < 10) { - return ' காலை'; - } - if ($hour < 14) { - return ' நண்பகல்'; - } - if ($hour < 18) { - return ' எற்பாடு'; - } - if ($hour < 22) { - return ' மாலை'; - } - - return ' யாமம்'; - }, - 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டெம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'months_short' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டெம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'weekdays' => ['ஞாயிற்றுக்கிழமை', 'திங்கட்கிழமை', 'செவ்வாய்கிழமை', 'புதன்கிழமை', 'வியாழக்கிழமை', 'வெள்ளிக்கிழமை', 'சனிக்கிழமை'], - 'weekdays_short' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], - 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' மற்றும் '], - 'weekend' => [0, 0], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php deleted file mode 100644 index 492d4c5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ta.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'months_short' => ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'], - 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], - 'weekdays_short' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['காலை', 'மாலை'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php b/vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php deleted file mode 100644 index 8e2afbf..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - J.Yogaraj 94-777-315206 yogaraj.ubuntu@gmail.com - */ -return array_replace_recursive(require __DIR__.'/ta.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'months_short' => ['ஜன', 'பிப்', 'மார்', 'ஏப்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக', 'செப்', 'அக்', 'நவ', 'டிச'], - 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], - 'weekdays_short' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['காலை', 'மாலை'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php b/vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php deleted file mode 100644 index a6cd8b5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ta.php', [ - 'formats' => [ - 'LT' => 'a h:mm', - 'LTS' => 'a h:mm:ss', - 'L' => 'D/M/yy', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM, YYYY, a h:mm', - 'LLLL' => 'dddd, D MMMM, YYYY, a h:mm', - ], - 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'months_short' => ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'], - 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], - 'weekdays_short' => ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'], - 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'first_day_of_week' => 1, - 'meridiem' => ['மு.ப', 'பி.ப'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php deleted file mode 100644 index 7dbedee..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ta.php', [ - 'formats' => [ - 'LT' => 'a h:mm', - 'LTS' => 'a h:mm:ss', - 'L' => 'D/M/yy', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM, YYYY, a h:mm', - 'LLLL' => 'dddd, D MMMM, YYYY, a h:mm', - ], - 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'months_short' => ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'], - 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], - 'weekdays_short' => ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'], - 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'meridiem' => ['மு.ப', 'பி.ப'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tcy.php b/vendor/nesbot/carbon/src/Carbon/Lang/tcy.php deleted file mode 100644 index 2eb9905..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tcy.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tcy_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php deleted file mode 100644 index f2bbf10..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IndLinux.org, Samsung Electronics Co., Ltd. alexey.merzlyakov@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['ಜನವರಿ', 'ಫೆಬ್ರುವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್‌‌', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂಬರ್‌', 'ಅಕ್ಟೋಬರ್', 'ನವೆಂಬರ್', 'ಡಿಸೆಂಬರ್'], - 'months_short' => ['ಜ', 'ಫೆ', 'ಮಾ', 'ಏ', 'ಮೇ', 'ಜೂ', 'ಜು', 'ಆ', 'ಸೆ', 'ಅ', 'ನ', 'ಡಿ'], - 'weekdays' => ['ಐಥಾರ', 'ಸೋಮಾರ', 'ಅಂಗರೆ', 'ಬುಧಾರ', 'ಗುರುವಾರ', 'ಶುಕ್ರರ', 'ಶನಿವಾರ'], - 'weekdays_short' => ['ಐ', 'ಸೋ', 'ಅಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'], - 'weekdays_min' => ['ಐ', 'ಸೋ', 'ಅಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ಕಾಂಡೆ', 'ಬಯ್ಯ'], - - 'year' => ':count ನೀರ್', // less reliable - 'y' => ':count ನೀರ್', // less reliable - 'a_year' => ':count ನೀರ್', // less reliable - - 'month' => ':count ಮೀನ್', // less reliable - 'm' => ':count ಮೀನ್', // less reliable - 'a_month' => ':count ಮೀನ್', // less reliable - - 'day' => ':count ಸುಗ್ಗಿ', // less reliable - 'd' => ':count ಸುಗ್ಗಿ', // less reliable - 'a_day' => ':count ಸುಗ್ಗಿ', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/te.php b/vendor/nesbot/carbon/src/Carbon/Lang/te.php deleted file mode 100644 index 52d4809..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/te.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - Josh Soref - * - François B - * - kc - */ -return [ - 'year' => ':count సంవత్సరం|:count సంవత్సరాలు', - 'a_year' => 'ఒక సంవత్సరం|:count సంవత్సరాలు', - 'y' => ':count సం.', - 'month' => ':count నెల|:count నెలలు', - 'a_month' => 'ఒక నెల|:count నెలలు', - 'm' => ':count నెల|:count నెల.', - 'week' => ':count వారం|:count వారాలు', - 'a_week' => 'ఒక వారం|:count వారాలు', - 'w' => ':count వార.|:count వారా.', - 'day' => ':count రోజు|:count రోజులు', - 'a_day' => 'ఒక రోజు|:count రోజులు', - 'd' => ':count రోజు|:count రోజు.', - 'hour' => ':count గంట|:count గంటలు', - 'a_hour' => 'ఒక గంట|:count గంటలు', - 'h' => ':count గం.', - 'minute' => ':count నిమిషం|:count నిమిషాలు', - 'a_minute' => 'ఒక నిమిషం|:count నిమిషాలు', - 'min' => ':count నిమి.', - 'second' => ':count సెకను|:count సెకన్లు', - 'a_second' => 'కొన్ని క్షణాలు|:count సెకన్లు', - 's' => ':count సెక.', - 'ago' => ':time క్రితం', - 'from_now' => ':time లో', - 'diff_now' => 'ప్రస్తుతం', - 'diff_today' => 'నేడు', - 'diff_yesterday' => 'నిన్న', - 'diff_tomorrow' => 'రేపు', - 'formats' => [ - 'LT' => 'A h:mm', - 'LTS' => 'A h:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm', - ], - 'calendar' => [ - 'sameDay' => '[నేడు] LT', - 'nextDay' => '[రేపు] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[నిన్న] LT', - 'lastWeek' => '[గత] dddd, LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberవ', - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'రాత్రి'; - } - if ($hour < 10) { - return 'ఉదయం'; - } - if ($hour < 17) { - return 'మధ్యాహ్నం'; - } - if ($hour < 20) { - return 'సాయంత్రం'; - } - - return ' రాత్రి'; - }, - 'months' => ['జనవరి', 'ఫిబ్రవరి', 'మార్చి', 'ఏప్రిల్', 'మే', 'జూన్', 'జూలై', 'ఆగస్టు', 'సెప్టెంబర్', 'అక్టోబర్', 'నవంబర్', 'డిసెంబర్'], - 'months_short' => ['జన.', 'ఫిబ్ర.', 'మార్చి', 'ఏప్రి.', 'మే', 'జూన్', 'జూలై', 'ఆగ.', 'సెప్.', 'అక్టో.', 'నవ.', 'డిసె.'], - 'weekdays' => ['ఆదివారం', 'సోమవారం', 'మంగళవారం', 'బుధవారం', 'గురువారం', 'శుక్రవారం', 'శనివారం'], - 'weekdays_short' => ['ఆది', 'సోమ', 'మంగళ', 'బుధ', 'గురు', 'శుక్ర', 'శని'], - 'weekdays_min' => ['ఆ', 'సో', 'మం', 'బు', 'గు', 'శు', 'శ'], - 'list' => ', ', - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekend' => [0, 0], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php deleted file mode 100644 index 3963f8d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/te.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/teo.php b/vendor/nesbot/carbon/src/Carbon/Lang/teo.php deleted file mode 100644 index ca30c37..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/teo.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ta.php', [ - 'meridiem' => ['Taparachu', 'Ebongi'], - 'weekdays' => ['Nakaejuma', 'Nakaebarasa', 'Nakaare', 'Nakauni', 'Nakaung’on', 'Nakakany', 'Nakasabiti'], - 'weekdays_short' => ['Jum', 'Bar', 'Aar', 'Uni', 'Ung', 'Kan', 'Sab'], - 'weekdays_min' => ['Jum', 'Bar', 'Aar', 'Uni', 'Ung', 'Kan', 'Sab'], - 'months' => ['Orara', 'Omuk', 'Okwamg’', 'Odung’el', 'Omaruk', 'Omodok’king’ol', 'Ojola', 'Opedel', 'Osokosokoma', 'Otibar', 'Olabor', 'Opoo'], - 'months_short' => ['Rar', 'Muk', 'Kwa', 'Dun', 'Mar', 'Mod', 'Jol', 'Ped', 'Sok', 'Tib', 'Lab', 'Poo'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php b/vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php deleted file mode 100644 index 010a04f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/teo.php', [ - 'first_day_of_week' => 0, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tet.php b/vendor/nesbot/carbon/src/Carbon/Lang/tet.php deleted file mode 100644 index d0544d4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tet.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Joshua Brooks - * - François B - */ -return [ - 'year' => 'tinan :count', - 'a_year' => '{1}tinan ida|tinan :count', - 'month' => 'fulan :count', - 'a_month' => '{1}fulan ida|fulan :count', - 'week' => 'semana :count', - 'a_week' => '{1}semana ida|semana :count', - 'day' => 'loron :count', - 'a_day' => '{1}loron ida|loron :count', - 'hour' => 'oras :count', - 'a_hour' => '{1}oras ida|oras :count', - 'minute' => 'minutu :count', - 'a_minute' => '{1}minutu ida|minutu :count', - 'second' => 'segundu :count', - 'a_second' => '{1}segundu balun|segundu :count', - 'ago' => ':time liuba', - 'from_now' => 'iha :time', - 'diff_yesterday' => 'Horiseik', - 'diff_yesterday_regexp' => 'Horiseik(?:\\s+iha)?', - 'diff_today' => 'Ohin', - 'diff_today_regexp' => 'Ohin(?:\\s+iha)?', - 'diff_tomorrow' => 'Aban', - 'diff_tomorrow_regexp' => 'Aban(?:\\s+iha)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Ohin iha] LT', - 'nextDay' => '[Aban iha] LT', - 'nextWeek' => 'dddd [iha] LT', - 'lastDay' => '[Horiseik iha] LT', - 'lastWeek' => 'dddd [semana kotuk] [iha] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['Janeiru', 'Fevereiru', 'Marsu', 'Abril', 'Maiu', 'Juñu', 'Jullu', 'Agustu', 'Setembru', 'Outubru', 'Novembru', 'Dezembru'], - 'months_short' => ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'], - 'weekdays' => ['Domingu', 'Segunda', 'Tersa', 'Kuarta', 'Kinta', 'Sesta', 'Sabadu'], - 'weekdays_short' => ['Dom', 'Seg', 'Ters', 'Kua', 'Kint', 'Sest', 'Sab'], - 'weekdays_min' => ['Do', 'Seg', 'Te', 'Ku', 'Ki', 'Ses', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tg.php b/vendor/nesbot/carbon/src/Carbon/Lang/tg.php deleted file mode 100644 index 57b4513..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tg.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Orif N. Jr - */ -return [ - 'year' => '{1}як сол|:count сол', - 'month' => '{1}як моҳ|:count моҳ', - 'week' => '{1}як ҳафта|:count ҳафта', - 'day' => '{1}як рӯз|:count рӯз', - 'hour' => '{1}як соат|:count соат', - 'minute' => '{1}як дақиқа|:count дақиқа', - 'second' => '{1}якчанд сония|:count сония', - 'ago' => ':time пеш', - 'from_now' => 'баъди :time', - 'diff_today' => 'Имрӯз', - 'diff_yesterday' => 'Дирӯз', - 'diff_yesterday_regexp' => 'Дирӯз(?:\\s+соати)?', - 'diff_tomorrow' => 'Пагоҳ', - 'diff_tomorrow_regexp' => 'Пагоҳ(?:\\s+соати)?', - 'diff_today_regexp' => 'Имрӯз(?:\\s+соати)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Имрӯз соати] LT', - 'nextDay' => '[Пагоҳ соати] LT', - 'nextWeek' => 'dddd[и] [ҳафтаи оянда соати] LT', - 'lastDay' => '[Дирӯз соати] LT', - 'lastWeek' => 'dddd[и] [ҳафтаи гузашта соати] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number) { - if ($number === 0) { // special case for zero - return "$number-ıncı"; - } - - static $suffixes = [ - 0 => '-ум', - 1 => '-ум', - 2 => '-юм', - 3 => '-юм', - 4 => '-ум', - 5 => '-ум', - 6 => '-ум', - 7 => '-ум', - 8 => '-ум', - 9 => '-ум', - 10 => '-ум', - 12 => '-ум', - 13 => '-ум', - 20 => '-ум', - 30 => '-юм', - 40 => '-ум', - 50 => '-ум', - 60 => '-ум', - 70 => '-ум', - 80 => '-ум', - 90 => '-ум', - 100 => '-ум', - ]; - - return $number.($suffixes[$number] ?? $suffixes[$number % 10] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); - }, - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'шаб'; - } - if ($hour < 11) { - return 'субҳ'; - } - if ($hour < 16) { - return 'рӯз'; - } - if ($hour < 19) { - return 'бегоҳ'; - } - - return 'шаб'; - }, - 'months' => ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'], - 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'weekdays' => ['якшанбе', 'душанбе', 'сешанбе', 'чоршанбе', 'панҷшанбе', 'ҷумъа', 'шанбе'], - 'weekdays_short' => ['яшб', 'дшб', 'сшб', 'чшб', 'пшб', 'ҷум', 'шнб'], - 'weekdays_min' => ['яш', 'дш', 'сш', 'чш', 'пш', 'ҷм', 'шб'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' ва '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php deleted file mode 100644 index badc7d1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/tg.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/th.php b/vendor/nesbot/carbon/src/Carbon/Lang/th.php deleted file mode 100644 index 6397f6e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/th.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Nate Whittaker - * - John MacAslan - * - Chanintorn Asavavichairoj - * - JD Isaacks - * - ROKAISAKKON - * - RO'KAISAKKON - * - Andreas Möller - * - nithisa - */ -return [ - 'year' => ':count ปี', - 'y' => ':count ปี', - 'month' => ':count เดือน', - 'm' => ':count เดือน', - 'week' => ':count สัปดาห์', - 'w' => ':count สัปดาห์', - 'day' => ':count วัน', - 'd' => ':count วัน', - 'hour' => ':count ชั่วโมง', - 'h' => ':count ชั่วโมง', - 'minute' => ':count นาที', - 'min' => ':count นาที', - 'second' => ':count วินาที', - 'a_second' => '{1}ไม่กี่วินาที|]1,Inf[:count วินาที', - 's' => ':count วินาที', - 'ago' => ':timeที่แล้ว', - 'from_now' => 'อีก :time', - 'after' => ':timeหลังจากนี้', - 'before' => ':timeก่อน', - 'diff_now' => 'ขณะนี้', - 'diff_today' => 'วันนี้', - 'diff_today_regexp' => 'วันนี้(?:\\s+เวลา)?', - 'diff_yesterday' => 'เมื่อวาน', - 'diff_yesterday_regexp' => 'เมื่อวานนี้(?:\\s+เวลา)?', - 'diff_tomorrow' => 'พรุ่งนี้', - 'diff_tomorrow_regexp' => 'พรุ่งนี้(?:\\s+เวลา)?', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY เวลา H:mm', - 'LLLL' => 'วันddddที่ D MMMM YYYY เวลา H:mm', - ], - 'calendar' => [ - 'sameDay' => '[วันนี้ เวลา] LT', - 'nextDay' => '[พรุ่งนี้ เวลา] LT', - 'nextWeek' => 'dddd[หน้า เวลา] LT', - 'lastDay' => '[เมื่อวานนี้ เวลา] LT', - 'lastWeek' => '[วัน]dddd[ที่แล้ว เวลา] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ก่อนเที่ยง', 'หลังเที่ยง'], - 'months' => ['มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'], - 'months_short' => ['ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'], - 'weekdays' => ['อาทิตย์', 'จันทร์', 'อังคาร', 'พุธ', 'พฤหัสบดี', 'ศุกร์', 'เสาร์'], - 'weekdays_short' => ['อาทิตย์', 'จันทร์', 'อังคาร', 'พุธ', 'พฤหัส', 'ศุกร์', 'เสาร์'], - 'weekdays_min' => ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'], - 'list' => [', ', ' และ '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php b/vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php deleted file mode 100644 index b9f94b2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/th.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/the.php b/vendor/nesbot/carbon/src/Carbon/Lang/the.php deleted file mode 100644 index 85f8333..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/the.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/the_NP.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php b/vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php deleted file mode 100644 index cdb02b2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Chitwanix OS Development info@chitwanix.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'dddd DD MMM YYYY', - ], - 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'weekdays' => ['आइतबार', 'सोमबार', 'मंगलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'], - 'weekdays_short' => ['आइत', 'सोम', 'मंगल', 'बुध', 'बिहि', 'शुक्र', 'शनि'], - 'weekdays_min' => ['आइत', 'सोम', 'मंगल', 'बुध', 'बिहि', 'शुक्र', 'शनि'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ti.php b/vendor/nesbot/carbon/src/Carbon/Lang/ti.php deleted file mode 100644 index ffd3236..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ti.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ti_ER.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php deleted file mode 100644 index 310c51c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጥሪ', 'ለካቲት', 'መጋቢት', 'ሚያዝያ', 'ግንቦት', 'ሰነ', 'ሓምለ', 'ነሓሰ', 'መስከረም', 'ጥቅምቲ', 'ሕዳር', 'ታሕሳስ'], - 'months_short' => ['ጥሪ ', 'ለካቲ', 'መጋቢ', 'ሚያዝ', 'ግንቦ', 'ሰነ ', 'ሓምለ', 'ነሓሰ', 'መስከ', 'ጥቅም', 'ሕዳር', 'ታሕሳ'], - 'weekdays' => ['ሰንበት', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'weekdays_short' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'weekdays_min' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ንጉሆ ሰዓተ', 'ድሕር ሰዓት'], - - 'year' => ':count ዓመት', - 'y' => ':count ዓመት', - 'a_year' => ':count ዓመት', - - 'month' => 'ወርሒ :count', - 'm' => 'ወርሒ :count', - 'a_month' => 'ወርሒ :count', - - 'week' => ':count ሰሙን', - 'w' => ':count ሰሙን', - 'a_week' => ':count ሰሙን', - - 'day' => ':count መዓልቲ', - 'd' => ':count መዓልቲ', - 'a_day' => ':count መዓልቲ', - - 'hour' => ':count ሰዓት', - 'h' => ':count ሰዓት', - 'a_hour' => ':count ሰዓት', - - 'minute' => ':count ደቒቕ', - 'min' => ':count ደቒቕ', - 'a_minute' => ':count ደቒቕ', - - 'second' => ':count ሰከንድ', - 's' => ':count ሰከንድ', - 'a_second' => ':count ሰከንድ', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php deleted file mode 100644 index a816069..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕረል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክተውበር', 'ኖቬምበር', 'ዲሴምበር'], - 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], - 'weekdays' => ['ሰንበት', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'weekdays_short' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'weekdays_min' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ንጉሆ ሰዓተ', 'ድሕር ሰዓት'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tig.php b/vendor/nesbot/carbon/src/Carbon/Lang/tig.php deleted file mode 100644 index 186fe71..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tig.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tig_ER.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php deleted file mode 100644 index 46887b0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጥሪ', 'ለካቲት', 'መጋቢት', 'ሚያዝያ', 'ግንቦት', 'ሰነ', 'ሓምለ', 'ነሓሰ', 'መስከረም', 'ጥቅምቲ', 'ሕዳር', 'ታሕሳስ'], - 'months_short' => ['ጥሪ ', 'ለካቲ', 'መጋቢ', 'ሚያዝ', 'ግንቦ', 'ሰነ ', 'ሓምለ', 'ነሓሰ', 'መስከ', 'ጥቅም', 'ሕዳር', 'ታሕሳ'], - 'weekdays' => ['ሰንበት ዓባይ', 'ሰኖ', 'ታላሸኖ', 'ኣረርባዓ', 'ከሚሽ', 'ጅምዓት', 'ሰንበት ንኢሽ'], - 'weekdays_short' => ['ሰ//ዓ', 'ሰኖ ', 'ታላሸ', 'ኣረር', 'ከሚሽ', 'ጅምዓ', 'ሰ//ን'], - 'weekdays_min' => ['ሰ//ዓ', 'ሰኖ ', 'ታላሸ', 'ኣረር', 'ከሚሽ', 'ጅምዓ', 'ሰ//ን'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ቀደም ሰር ምዕል', 'ሓቆ ሰር ምዕል'], - - 'year' => ':count ማይ', // less reliable - 'y' => ':count ማይ', // less reliable - 'a_year' => ':count ማይ', // less reliable - - 'month' => ':count ሸምሽ', // less reliable - 'm' => ':count ሸምሽ', // less reliable - 'a_month' => ':count ሸምሽ', // less reliable - - 'week' => ':count ሰቡዕ', // less reliable - 'w' => ':count ሰቡዕ', // less reliable - 'a_week' => ':count ሰቡዕ', // less reliable - - 'day' => ':count ዎሮ', // less reliable - 'd' => ':count ዎሮ', // less reliable - 'a_day' => ':count ዎሮ', // less reliable - - 'hour' => ':count ሰዓት', // less reliable - 'h' => ':count ሰዓት', // less reliable - 'a_hour' => ':count ሰዓት', // less reliable - - 'minute' => ':count ካልኣይት', // less reliable - 'min' => ':count ካልኣይት', // less reliable - 'a_minute' => ':count ካልኣይት', // less reliable - - 'second' => ':count ካልኣይ', - 's' => ':count ካልኣይ', - 'a_second' => ':count ካልኣይ', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tk.php b/vendor/nesbot/carbon/src/Carbon/Lang/tk.php deleted file mode 100644 index d8f7d19..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tk.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tk_TM.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php b/vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php deleted file mode 100644 index b1c487a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - Ghorban M. Tavakoly Pablo Saratxaga & Ghorban M. Tavakoly pablo@walon.org & gmt314@yahoo.com - * - SuperManPHP - * - Maksat Meredow (isadma) - */ -$transformDiff = static fn (string $input) => strtr($input, [ - 'sekunt' => 'sekunt', - 'hepde' => 'hepde', -]); - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Ýanwar', 'Fewral', 'Mart', 'Aprel', 'Maý', 'Iýun', 'Iýul', 'Awgust', 'Sentýabr', 'Oktýabr', 'Noýabr', 'Dekabr'], - 'months_short' => ['Ýan', 'Few', 'Mar', 'Apr', 'Maý', 'Iýn', 'Iýl', 'Awg', 'Sen', 'Okt', 'Noý', 'Dek'], - 'weekdays' => ['Ýekşenbe', 'Duşenbe', 'Sişenbe', 'Çarşenbe', 'Penşenbe', 'Anna', 'Şenbe'], - 'weekdays_short' => ['Ýek', 'Duş', 'Siş', 'Çar', 'Pen', 'Ann', 'Şen'], - 'weekdays_min' => ['Ýe', 'Du', 'Si', 'Ça', 'Pe', 'An', 'Şe'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count ýyl', - 'y' => ':count ýyl', - 'a_year' => ':count ýyl', - - 'month' => ':count aý', - 'm' => ':count aý', - 'a_month' => ':count aý', - - 'week' => ':count hepde', - 'w' => ':count hepde', - 'a_week' => ':count hepde', - - 'day' => ':count gün', - 'd' => ':count gün', - 'a_day' => ':count gün', - - 'hour' => ':count sagat', - 'h' => ':count sagat', - 'a_hour' => ':count sagat', - - 'minute' => ':count minut', - 'min' => ':count minut', - 'a_minute' => ':count minut', - - 'second' => ':count sekunt', - 's' => ':count sekunt', - 'a_second' => ':count sekunt', - - 'ago' => static fn (string $time) => $transformDiff($time).' ozal', - 'from_now' => static fn (string $time) => $transformDiff($time).' soňra', - 'after' => static fn (string $time) => $transformDiff($time).' soň', - 'before' => static fn (string $time) => $transformDiff($time).' öň', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tl.php b/vendor/nesbot/carbon/src/Carbon/Lang/tl.php deleted file mode 100644 index 410a266..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tl.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return [ - 'year' => ':count taon', - 'a_year' => '{1}isang taon|:count taon', - 'month' => ':count buwan', - 'a_month' => '{1}isang buwan|:count buwan', - 'week' => ':count linggo', - 'a_week' => '{1}isang linggo|:count linggo', - 'day' => ':count araw', - 'a_day' => '{1}isang araw|:count araw', - 'hour' => ':count oras', - 'a_hour' => '{1}isang oras|:count oras', - 'minute' => ':count minuto', - 'a_minute' => '{1}isang minuto|:count minuto', - 'min' => ':count min.', - 'second' => ':count segundo', - 'a_second' => '{1}ilang segundo|:count segundo', - 's' => ':count seg.', - 'ago' => ':time ang nakalipas', - 'from_now' => 'sa loob ng :time', - 'diff_now' => 'ngayon', - 'diff_today' => 'ngayong', - 'diff_today_regexp' => 'ngayong(?:\\s+araw)?', - 'diff_yesterday' => 'kahapon', - 'diff_tomorrow' => 'bukas', - 'diff_tomorrow_regexp' => 'Bukas(?:\\s+ng)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'MM/D/YYYY', - 'LL' => 'MMMM D, YYYY', - 'LLL' => 'MMMM D, YYYY HH:mm', - 'LLLL' => 'dddd, MMMM DD, YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => 'LT [ngayong araw]', - 'nextDay' => '[Bukas ng] LT', - 'nextWeek' => 'LT [sa susunod na] dddd', - 'lastDay' => 'LT [kahapon]', - 'lastWeek' => 'LT [noong nakaraang] dddd', - 'sameElse' => 'L', - ], - 'months' => ['Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'], - 'months_short' => ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'], - 'weekdays' => ['Linggo', 'Lunes', 'Martes', 'Miyerkules', 'Huwebes', 'Biyernes', 'Sabado'], - 'weekdays_short' => ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'], - 'weekdays_min' => ['Li', 'Lu', 'Ma', 'Mi', 'Hu', 'Bi', 'Sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' at '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php b/vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php deleted file mode 100644 index 95f508c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Ian De La Cruz - * - JD Isaacks - */ -return require __DIR__.'/tl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tlh.php b/vendor/nesbot/carbon/src/Carbon/Lang/tlh.php deleted file mode 100644 index 4ecf244..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tlh.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Serhan Apaydın - * - Dominika - */ -return [ - 'year' => '{1}wa’ DIS|:count DIS', - 'month' => '{1}wa’ jar|:count jar', - 'week' => '{1}wa’ hogh|:count hogh', - 'day' => '{1}wa’ jaj|:count jaj', - 'hour' => '{1}wa’ rep|:count rep', - 'minute' => '{1}wa’ tup|:count tup', - 'second' => '{1}puS lup|:count lup', - 'ago' => static function ($time) { - $output = strtr($time, [ - 'jaj' => 'Hu’', - 'jar' => 'wen', - 'DIS' => 'ben', - ]); - - return $output === $time ? "$time ret" : $output; - }, - 'from_now' => static function ($time) { - $output = strtr($time, [ - 'jaj' => 'leS', - 'jar' => 'waQ', - 'DIS' => 'nem', - ]); - - return $output === $time ? "$time pIq" : $output; - }, - 'diff_yesterday' => 'wa’Hu’', - 'diff_today' => 'DaHjaj', - 'diff_tomorrow' => 'wa’leS', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[DaHjaj] LT', - 'nextDay' => '[wa’leS] LT', - 'nextWeek' => 'LLL', - 'lastDay' => '[wa’Hu’] LT', - 'lastWeek' => 'LLL', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['tera’ jar wa’', 'tera’ jar cha’', 'tera’ jar wej', 'tera’ jar loS', 'tera’ jar vagh', 'tera’ jar jav', 'tera’ jar Soch', 'tera’ jar chorgh', 'tera’ jar Hut', 'tera’ jar wa’maH', 'tera’ jar wa’maH wa’', 'tera’ jar wa’maH cha’'], - 'months_short' => ['jar wa’', 'jar cha’', 'jar wej', 'jar loS', 'jar vagh', 'jar jav', 'jar Soch', 'jar chorgh', 'jar Hut', 'jar wa’maH', 'jar wa’maH wa’', 'jar wa’maH cha’'], - 'weekdays' => ['lojmItjaj', 'DaSjaj', 'povjaj', 'ghItlhjaj', 'loghjaj', 'buqjaj', 'ghInjaj'], - 'weekdays_short' => ['lojmItjaj', 'DaSjaj', 'povjaj', 'ghItlhjaj', 'loghjaj', 'buqjaj', 'ghInjaj'], - 'weekdays_min' => ['lojmItjaj', 'DaSjaj', 'povjaj', 'ghItlhjaj', 'loghjaj', 'buqjaj', 'ghInjaj'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' ’ej '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tn.php b/vendor/nesbot/carbon/src/Carbon/Lang/tn.php deleted file mode 100644 index f29bdf6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tn.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tn_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php deleted file mode 100644 index e3df8f6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Ferikgong', 'Tlhakole', 'Mopitlwe', 'Moranang', 'Motsheganong', 'Seetebosigo', 'Phukwi', 'Phatwe', 'Lwetse', 'Diphalane', 'Ngwanatsele', 'Sedimonthole'], - 'months_short' => ['Fer', 'Tlh', 'Mop', 'Mor', 'Mot', 'See', 'Phu', 'Pha', 'Lwe', 'Dip', 'Ngw', 'Sed'], - 'weekdays' => ['laTshipi', 'Mosupologo', 'Labobedi', 'Laboraro', 'Labone', 'Labotlhano', 'Lamatlhatso'], - 'weekdays_short' => ['Tsh', 'Mos', 'Bed', 'Rar', 'Ne', 'Tlh', 'Mat'], - 'weekdays_min' => ['Tsh', 'Mos', 'Bed', 'Rar', 'Ne', 'Tlh', 'Mat'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'year' => 'dingwaga di le :count', - 'y' => 'dingwaga di le :count', - 'a_year' => 'dingwaga di le :count', - - 'month' => 'dikgwedi di le :count', - 'm' => 'dikgwedi di le :count', - 'a_month' => 'dikgwedi di le :count', - - 'week' => 'dibeke di le :count', - 'w' => 'dibeke di le :count', - 'a_week' => 'dibeke di le :count', - - 'day' => 'malatsi :count', - 'd' => 'malatsi :count', - 'a_day' => 'malatsi :count', - - 'hour' => 'diura di le :count', - 'h' => 'diura di le :count', - 'a_hour' => 'diura di le :count', - - 'minute' => 'metsotso e le :count', - 'min' => 'metsotso e le :count', - 'a_minute' => 'metsotso e le :count', - - 'second' => 'metsotswana e le :count', - 's' => 'metsotswana e le :count', - 'a_second' => 'metsotswana e le :count', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/to.php b/vendor/nesbot/carbon/src/Carbon/Lang/to.php deleted file mode 100644 index 20581bb..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/to.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/to_TO.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php b/vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php deleted file mode 100644 index ce713ed..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - International Components for Unicode akhilesh.k@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 0, - 'formats' => [ - 'L' => 'dddd DD MMM YYYY', - ], - 'months' => ['Sānuali', 'Fēpueli', 'Maʻasi', 'ʻEpeleli', 'Mē', 'Sune', 'Siulai', 'ʻAokosi', 'Sepitema', 'ʻOkatopa', 'Nōvema', 'Tīsema'], - 'months_short' => ['Sān', 'Fēp', 'Maʻa', 'ʻEpe', 'Mē', 'Sun', 'Siu', 'ʻAok', 'Sep', 'ʻOka', 'Nōv', 'Tīs'], - 'weekdays' => ['Sāpate', 'Mōnite', 'Tūsite', 'Pulelulu', 'Tuʻapulelulu', 'Falaite', 'Tokonaki'], - 'weekdays_short' => ['Sāp', 'Mōn', 'Tūs', 'Pul', 'Tuʻa', 'Fal', 'Tok'], - 'weekdays_min' => ['Sāp', 'Mōn', 'Tūs', 'Pul', 'Tuʻa', 'Fal', 'Tok'], - 'meridiem' => ['hengihengi', 'efiafi'], - - 'year' => ':count fitu', // less reliable - 'y' => ':count fitu', // less reliable - 'a_year' => ':count fitu', // less reliable - - 'month' => ':count mahina', // less reliable - 'm' => ':count mahina', // less reliable - 'a_month' => ':count mahina', // less reliable - - 'week' => ':count Sapate', // less reliable - 'w' => ':count Sapate', // less reliable - 'a_week' => ':count Sapate', // less reliable - - 'day' => ':count ʻaho', // less reliable - 'd' => ':count ʻaho', // less reliable - 'a_day' => ':count ʻaho', // less reliable - - 'hour' => ':count houa', - 'h' => ':count houa', - 'a_hour' => ':count houa', - - 'minute' => ':count miniti', - 'min' => ':count miniti', - 'a_minute' => ':count miniti', - - 'second' => ':count sekoni', - 's' => ':count sekoni', - 'a_second' => ':count sekoni', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tpi.php b/vendor/nesbot/carbon/src/Carbon/Lang/tpi.php deleted file mode 100644 index 7d38dae..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tpi.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tpi_PG.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php b/vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php deleted file mode 100644 index 721b625..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Janueri', 'Februeri', 'Mas', 'Epril', 'Me', 'Jun', 'Julai', 'Ogas', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mas', 'Epr', 'Me', 'Jun', 'Jul', 'Oga', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Sande', 'Mande', 'Tunde', 'Trinde', 'Fonde', 'Fraide', 'Sarere'], - 'weekdays_short' => ['San', 'Man', 'Tun', 'Tri', 'Fon', 'Fra', 'Sar'], - 'weekdays_min' => ['San', 'Man', 'Tun', 'Tri', 'Fon', 'Fra', 'Sar'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['biknait', 'apinun'], - - 'year' => 'yia :count', - 'y' => 'yia :count', - 'a_year' => 'yia :count', - - 'month' => ':count mun', - 'm' => ':count mun', - 'a_month' => ':count mun', - - 'week' => ':count wik', - 'w' => ':count wik', - 'a_week' => ':count wik', - - 'day' => ':count de', - 'd' => ':count de', - 'a_day' => ':count de', - - 'hour' => ':count aua', - 'h' => ':count aua', - 'a_hour' => ':count aua', - - 'minute' => ':count minit', - 'min' => ':count minit', - 'a_minute' => ':count minit', - - 'second' => ':count namba tu', - 's' => ':count namba tu', - 'a_second' => ':count namba tu', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tr.php b/vendor/nesbot/carbon/src/Carbon/Lang/tr.php deleted file mode 100644 index 1e9446f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tr.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Alan Agius - * - Erhan Gundogan - * - François B - * - JD Isaacks - * - Murat Yüksel - * - Baran Şengül - * - Selami (selamialtin) - * - TeomanBey - */ -return [ - 'year' => ':count yıl', - 'a_year' => '{1}bir yıl|]1,Inf[:count yıl', - 'y' => ':county', - 'month' => ':count ay', - 'a_month' => '{1}bir ay|]1,Inf[:count ay', - 'm' => ':countay', - 'week' => ':count hafta', - 'a_week' => '{1}bir hafta|]1,Inf[:count hafta', - 'w' => ':counth', - 'day' => ':count gün', - 'a_day' => '{1}bir gün|]1,Inf[:count gün', - 'd' => ':countg', - 'hour' => ':count saat', - 'a_hour' => '{1}bir saat|]1,Inf[:count saat', - 'h' => ':countsa', - 'minute' => ':count dakika', - 'a_minute' => '{1}bir dakika|]1,Inf[:count dakika', - 'min' => ':countdk', - 'second' => ':count saniye', - 'a_second' => '{1}birkaç saniye|]1,Inf[:count saniye', - 's' => ':countsn', - 'ago' => ':time önce', - 'from_now' => ':time sonra', - 'after' => ':time sonra', - 'before' => ':time önce', - 'diff_now' => 'şimdi', - 'diff_today' => 'bugün', - 'diff_today_regexp' => 'bugün(?:\\s+saat)?', - 'diff_yesterday' => 'dün', - 'diff_tomorrow' => 'yarın', - 'diff_tomorrow_regexp' => 'yarın(?:\\s+saat)?', - 'diff_before_yesterday' => 'evvelsi gün', - 'diff_after_tomorrow' => 'öbür gün', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[bugün saat] LT', - 'nextDay' => '[yarın saat] LT', - 'nextWeek' => '[gelecek] dddd [saat] LT', - 'lastDay' => '[dün] LT', - 'lastWeek' => '[geçen] dddd [saat] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number, $period) { - switch ($period) { - case 'd': - case 'D': - case 'Do': - case 'DD': - return $number; - default: - if ($number === 0) { // special case for zero - return "$number'ıncı"; - } - - static $suffixes = [ - 1 => '\'inci', - 5 => '\'inci', - 8 => '\'inci', - 70 => '\'inci', - 80 => '\'inci', - 2 => '\'nci', - 7 => '\'nci', - 20 => '\'nci', - 50 => '\'nci', - 3 => '\'üncü', - 4 => '\'üncü', - 100 => '\'üncü', - 6 => '\'ncı', - 9 => '\'uncu', - 10 => '\'uncu', - 30 => '\'uncu', - 60 => '\'ıncı', - 90 => '\'ıncı', - ]; - - $lastDigit = $number % 10; - - return $number.($suffixes[$lastDigit] ?? $suffixes[$number % 100 - $lastDigit] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); - } - }, - 'meridiem' => ['ÖÖ', 'ÖS', 'öö', 'ös'], - 'months' => ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'], - 'months_short' => ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'], - 'weekdays' => ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'], - 'weekdays_short' => ['Paz', 'Pts', 'Sal', 'Çar', 'Per', 'Cum', 'Cts'], - 'weekdays_min' => ['Pz', 'Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' ve '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php b/vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php deleted file mode 100644 index 23f1144..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/tr.php', [ - 'weekdays_short' => ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'], - 'weekdays_min' => ['Pa', 'Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct'], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D.MM.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'D MMMM YYYY dddd h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php b/vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php deleted file mode 100644 index 9e99482..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/tr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ts.php b/vendor/nesbot/carbon/src/Carbon/Lang/ts.php deleted file mode 100644 index 525736b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ts.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ts_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php deleted file mode 100644 index 3271345..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Sunguti', 'Nyenyenyani', 'Nyenyankulu', 'Dzivamisoko', 'Mudyaxihi', 'Khotavuxika', 'Mawuwani', 'Mhawuri', 'Ndzhati', 'Nhlangula', 'Hukuri', 'N\'wendzamhala'], - 'months_short' => ['Sun', 'Yan', 'Kul', 'Dzi', 'Mud', 'Kho', 'Maw', 'Mha', 'Ndz', 'Nhl', 'Huk', 'N\'w'], - 'weekdays' => ['Sonto', 'Musumbhunuku', 'Ravumbirhi', 'Ravunharhu', 'Ravumune', 'Ravuntlhanu', 'Mugqivela'], - 'weekdays_short' => ['Son', 'Mus', 'Bir', 'Har', 'Ne', 'Tlh', 'Mug'], - 'weekdays_min' => ['Son', 'Mus', 'Bir', 'Har', 'Ne', 'Tlh', 'Mug'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'year' => 'malembe ya :count', - 'y' => 'malembe ya :count', - 'a_year' => 'malembe ya :count', - - 'month' => 'tin’hweti ta :count', - 'm' => 'tin’hweti ta :count', - 'a_month' => 'tin’hweti ta :count', - - 'week' => 'mavhiki ya :count', - 'w' => 'mavhiki ya :count', - 'a_week' => 'mavhiki ya :count', - - 'day' => 'masiku :count', - 'd' => 'masiku :count', - 'a_day' => 'masiku :count', - - 'hour' => 'tiawara ta :count', - 'h' => 'tiawara ta :count', - 'a_hour' => 'tiawara ta :count', - - 'minute' => 'timinete ta :count', - 'min' => 'timinete ta :count', - 'a_minute' => 'timinete ta :count', - - 'second' => 'tisekoni ta :count', - 's' => 'tisekoni ta :count', - 'a_second' => 'tisekoni ta :count', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tt.php b/vendor/nesbot/carbon/src/Carbon/Lang/tt.php deleted file mode 100644 index d67d896..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tt.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tt_RU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php deleted file mode 100644 index 38e42d0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Rinat Norkin Pablo Saratxaga, Rinat Norkin pablo@mandrakesoft.com, rinat@taif.ru - */ -return [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'DD MMM, HH:mm', - 'LLLL' => 'DD MMMM YYYY, HH:mm', - ], - 'months' => ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'], - 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'weekdays' => ['якшәмбе', 'дышәмбе', 'сишәмбе', 'чәршәәмбе', 'пәнҗешмбе', 'җомга', 'шимбә'], - 'weekdays_short' => ['якш', 'дыш', 'сиш', 'чәрш', 'пәнҗ', 'җом', 'шим'], - 'weekdays_min' => ['якш', 'дыш', 'сиш', 'чәрш', 'пәнҗ', 'җом', 'шим'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'year' => ':count ел', - 'month' => ':count ай', - 'week' => ':count атна', - 'day' => ':count көн', - 'hour' => ':count сәгать', - 'minute' => ':count минут', - 'second' => ':count секунд', -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php b/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php deleted file mode 100644 index 16b8efb..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Reshat Sabiq tatar.iqtelif.i18n@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Ğınwar', 'Fiwral\'', 'Mart', 'April', 'May', 'Yün', 'Yül', 'Awgust', 'Sintebír', 'Üktebír', 'Noyebír', 'Dikebír'], - 'months_short' => ['Ğın', 'Fiw', 'Mar', 'Apr', 'May', 'Yün', 'Yül', 'Awg', 'Sin', 'Ükt', 'Noy', 'Dik'], - 'weekdays' => ['Yekşembí', 'Düşembí', 'Sişembí', 'Çerşembí', 'Pencíşembí', 'Comğa', 'Şimbe'], - 'weekdays_short' => ['Yek', 'Düş', 'Siş', 'Çer', 'Pen', 'Com', 'Şim'], - 'weekdays_min' => ['Yek', 'Düş', 'Siş', 'Çer', 'Pen', 'Com', 'Şim'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ÖA', 'ÖS'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/twq.php b/vendor/nesbot/carbon/src/Carbon/Lang/twq.php deleted file mode 100644 index 5cbb46e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/twq.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ses.php', [ - 'meridiem' => ['Subbaahi', 'Zaarikay b'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tzl.php b/vendor/nesbot/carbon/src/Carbon/Lang/tzl.php deleted file mode 100644 index 50bf26d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tzl.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return [ - 'year' => '[0,1]:count ar|:count ars', - 'y' => '[0,1]:count ar|:count ars', - 'month' => '[0,1]:count mes|:count mesen', - 'm' => '[0,1]:count mes|:count mesen', - 'week' => '[0,1]:count seifetziua|:count seifetziuas', - 'w' => '[0,1]:count seifetziua|:count seifetziuas', - 'day' => '[0,1]:count ziua|:count ziuas', - 'd' => '[0,1]:count ziua|:count ziuas', - 'hour' => '[0,1]:count þora|:count þoras', - 'h' => '[0,1]:count þora|:count þoras', - 'minute' => '[0,1]:count míut|:count míuts', - 'min' => '[0,1]:count míut|:count míuts', - 'second' => ':count secunds', - 's' => ':count secunds', - - 'ago' => 'ja :time', - 'from_now' => 'osprei :time', - - 'diff_yesterday' => 'ieiri', - 'diff_yesterday_regexp' => 'ieiri(?:\\s+à)?', - 'diff_today' => 'oxhi', - 'diff_today_regexp' => 'oxhi(?:\\s+à)?', - 'diff_tomorrow' => 'demà', - 'diff_tomorrow_regexp' => 'demà(?:\\s+à)?', - - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm.ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM [dallas] YYYY', - 'LLL' => 'D. MMMM [dallas] YYYY HH.mm', - 'LLLL' => 'dddd, [li] D. MMMM [dallas] YYYY HH.mm', - ], - - 'calendar' => [ - 'sameDay' => '[oxhi à] LT', - 'nextDay' => '[demà à] LT', - 'nextWeek' => 'dddd [à] LT', - 'lastDay' => '[ieiri à] LT', - 'lastWeek' => '[sür el] dddd [lasteu à] LT', - 'sameElse' => 'L', - ], - - 'meridiem' => ["D'A", "D'O"], - 'months' => ['Januar', 'Fevraglh', 'Març', 'Avrïu', 'Mai', 'Gün', 'Julia', 'Guscht', 'Setemvar', 'Listopäts', 'Noemvar', 'Zecemvar'], - 'months_short' => ['Jan', 'Fev', 'Mar', 'Avr', 'Mai', 'Gün', 'Jul', 'Gus', 'Set', 'Lis', 'Noe', 'Zec'], - 'weekdays' => ['Súladi', 'Lúneçi', 'Maitzi', 'Márcuri', 'Xhúadi', 'Viénerçi', 'Sáturi'], - 'weekdays_short' => ['Súl', 'Lún', 'Mai', 'Már', 'Xhú', 'Vié', 'Sát'], - 'weekdays_min' => ['Sú', 'Lú', 'Ma', 'Má', 'Xh', 'Vi', 'Sá'], - 'ordinal' => ':number.', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tzm.php b/vendor/nesbot/carbon/src/Carbon/Lang/tzm.php deleted file mode 100644 index 2a1a0f2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tzm.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - JD Isaacks - */ -return [ - 'year' => '{1}ⴰⵙⴳⴰⵙ|:count ⵉⵙⴳⴰⵙⵏ', - 'month' => '{1}ⴰⵢoⵓⵔ|:count ⵉⵢⵢⵉⵔⵏ', - 'week' => ':count ⵉⵎⴰⵍⴰⵙⵙ', - 'day' => '{1}ⴰⵙⵙ|:count oⵙⵙⴰⵏ', - 'hour' => '{1}ⵙⴰⵄⴰ|:count ⵜⴰⵙⵙⴰⵄⵉⵏ', - 'minute' => '{1}ⵎⵉⵏⵓⴺ|:count ⵎⵉⵏⵓⴺ', - 'second' => '{1}ⵉⵎⵉⴽ|:count ⵉⵎⵉⴽ', - 'ago' => 'ⵢⴰⵏ :time', - 'from_now' => 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ :time', - 'diff_today' => 'ⴰⵙⴷⵅ', - 'diff_yesterday' => 'ⴰⵚⴰⵏⵜ', - 'diff_yesterday_regexp' => 'ⴰⵚⴰⵏⵜ(?:\\s+ⴴ)?', - 'diff_tomorrow' => 'ⴰⵙⴽⴰ', - 'diff_tomorrow_regexp' => 'ⴰⵙⴽⴰ(?:\\s+ⴴ)?', - 'diff_today_regexp' => 'ⴰⵙⴷⵅ(?:\\s+ⴴ)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[ⴰⵙⴷⵅ ⴴ] LT', - 'nextDay' => '[ⴰⵙⴽⴰ ⴴ] LT', - 'nextWeek' => 'dddd [ⴴ] LT', - 'lastDay' => '[ⴰⵚⴰⵏⵜ ⴴ] LT', - 'lastWeek' => 'dddd [ⴴ] LT', - 'sameElse' => 'L', - ], - 'months' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵟⵓⴱⵕ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⵏⴱⵉⵔ'], - 'months_short' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵟⵓⴱⵕ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⵏⴱⵉⵔ'], - 'weekdays' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵔⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⴰⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], - 'weekdays_short' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵔⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⴰⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], - 'weekdays_min' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵔⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⴰⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'weekend' => [5, 6], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php deleted file mode 100644 index 5840d20..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - JD Isaacks - */ -return [ - 'year' => '{1}:count asgas|:count isgasn', - 'a_year' => 'asgas|:count isgasn', - 'month' => '{1}:count ayowr|:count iyyirn', - 'a_month' => 'ayowr|:count iyyirn', - 'week' => ':count imalass', - 'a_week' => ':imalass', - 'day' => '{1}:count ass|:count ossan', - 'a_day' => 'ass|:count ossan', - 'hour' => '{1}:count saɛa|:count tassaɛin', - 'a_hour' => '{1}saɛa|:count tassaɛin', - 'minute' => ':count minuḍ', - 'a_minute' => '{1}minuḍ|:count minuḍ', - 'second' => ':count imik', - 'a_second' => '{1}imik|:count imik', - 'ago' => 'yan :time', - 'from_now' => 'dadkh s yan :time', - 'diff_yesterday' => 'assant', - 'diff_yesterday_regexp' => 'assant(?:\\s+g)?', - 'diff_today' => 'asdkh', - 'diff_today_regexp' => 'asdkh(?:\\s+g)?', - 'diff_tomorrow' => 'aska', - 'diff_tomorrow_regexp' => 'aska(?:\\s+g)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[asdkh g] LT', - 'nextDay' => '[aska g] LT', - 'nextWeek' => 'dddd [g] LT', - 'lastDay' => '[assant g] LT', - 'lastWeek' => 'dddd [g] LT', - 'sameElse' => 'L', - ], - 'months' => ['innayr', 'brˤayrˤ', 'marˤsˤ', 'ibrir', 'mayyw', 'ywnyw', 'ywlywz', 'ɣwšt', 'šwtanbir', 'ktˤwbrˤ', 'nwwanbir', 'dwjnbir'], - 'months_short' => ['innayr', 'brˤayrˤ', 'marˤsˤ', 'ibrir', 'mayyw', 'ywnyw', 'ywlywz', 'ɣwšt', 'šwtanbir', 'ktˤwbrˤ', 'nwwanbir', 'dwjnbir'], - 'weekdays' => ['asamas', 'aynas', 'asinas', 'akras', 'akwas', 'asimwas', 'asiḍyas'], - 'weekdays_short' => ['asamas', 'aynas', 'asinas', 'akras', 'akwas', 'asimwas', 'asiḍyas'], - 'weekdays_min' => ['asamas', 'aynas', 'asinas', 'akras', 'akwas', 'asimwas', 'asiḍyas'], - 'meridiem' => ['Zdat azal', 'Ḍeffir aza'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ug.php b/vendor/nesbot/carbon/src/Carbon/Lang/ug.php deleted file mode 100644 index 12c9f8a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ug.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - yasinn - */ -return [ - 'year' => '{1}'.'بىر يىل'.'|:count '.'يىل', - 'month' => '{1}'.'بىر ئاي'.'|:count '.'ئاي', - 'week' => '{1}'.'بىر ھەپتە'.'|:count '.'ھەپتە', - 'day' => '{1}'.'بىر كۈن'.'|:count '.'كۈن', - 'hour' => '{1}'.'بىر سائەت'.'|:count '.'سائەت', - 'minute' => '{1}'.'بىر مىنۇت'.'|:count '.'مىنۇت', - 'second' => '{1}'.'نەچچە سېكونت'.'|:count '.'سېكونت', - 'ago' => ':time بۇرۇن', - 'from_now' => ':time كېيىن', - 'diff_today' => 'بۈگۈن', - 'diff_yesterday' => 'تۆنۈگۈن', - 'diff_tomorrow' => 'ئەتە', - 'diff_tomorrow_regexp' => 'ئەتە(?:\\s+سائەت)?', - 'diff_today_regexp' => 'بۈگۈن(?:\\s+سائەت)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'YYYY-يىلىM-ئاينىڭD-كۈنى', - 'LLL' => 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', - 'LLLL' => 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[بۈگۈن سائەت] LT', - 'nextDay' => '[ئەتە سائەت] LT', - 'nextWeek' => '[كېلەركى] dddd [سائەت] LT', - 'lastDay' => '[تۆنۈگۈن] LT', - 'lastWeek' => '[ئالدىنقى] dddd [سائەت] LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number, $period) { - return match ($period) { - 'd', 'D', 'DDD' => $number.'-كۈنى', - 'w', 'W' => $number.'-ھەپتە', - default => $number, - }; - }, - 'meridiem' => static function ($hour, $minute) { - $time = $hour * 100 + $minute; - if ($time < 600) { - return 'يېرىم كېچە'; - } - if ($time < 900) { - return 'سەھەر'; - } - if ($time < 1130) { - return 'چۈشتىن بۇرۇن'; - } - if ($time < 1230) { - return 'چۈش'; - } - if ($time < 1800) { - return 'چۈشتىن كېيىن'; - } - - return 'كەچ'; - }, - 'months' => ['يانۋار', 'فېۋرال', 'مارت', 'ئاپرېل', 'ماي', 'ئىيۇن', 'ئىيۇل', 'ئاۋغۇست', 'سېنتەبىر', 'ئۆكتەبىر', 'نويابىر', 'دېكابىر'], - 'months_short' => ['يانۋار', 'فېۋرال', 'مارت', 'ئاپرېل', 'ماي', 'ئىيۇن', 'ئىيۇل', 'ئاۋغۇست', 'سېنتەبىر', 'ئۆكتەبىر', 'نويابىر', 'دېكابىر'], - 'weekdays' => ['يەكشەنبە', 'دۈشەنبە', 'سەيشەنبە', 'چارشەنبە', 'پەيشەنبە', 'جۈمە', 'شەنبە'], - 'weekdays_short' => ['يە', 'دۈ', 'سە', 'چا', 'پە', 'جۈ', 'شە'], - 'weekdays_min' => ['يە', 'دۈ', 'سە', 'چا', 'پە', 'جۈ', 'شە'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' ۋە '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php deleted file mode 100644 index deb828c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - Alim Boyaq - */ -return require __DIR__.'/ug.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uk.php b/vendor/nesbot/carbon/src/Carbon/Lang/uk.php deleted file mode 100644 index 3bedd2e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/uk.php +++ /dev/null @@ -1,190 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Carbon\CarbonInterface; - -$processHoursFunction = static function (CarbonInterface $date, string $format) { - return $format.'о'.($date->hour === 11 ? 'б' : '').'] LT'; -}; - -/* - * Authors: - * - Kunal Marwaha - * - Josh Soref - * - François B - * - Tim Fish - * - Serhan Apaydın - * - Max Mykhailenko - * - JD Isaacks - * - Max Kovpak - * - AucT - * - Philippe Vaucher - * - Ilya Shaplyko - * - Vadym Ievsieiev - * - Denys Kurets - * - Igor Kasyanchuk - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Oleh - * - epaminond - * - Juanito Fatas - * - Vitalii Khustochka - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Andriy Tyurnikov - * - Nicolás Hock Isaza - * - Iwakura Taro - * - Andrii Ponomarov - * - alecrabbit - * - vystepanenko - * - AlexWalkerson - * - Andre Havryliuk (Andrend) - * - Max Datsenko (datsenko-md) - */ -return [ - 'year' => ':count рік|:count роки|:count років', - 'y' => ':countр|:countрр|:countрр', - 'a_year' => '{1}рік|:count рік|:count роки|:count років', - 'month' => ':count місяць|:count місяці|:count місяців', - 'm' => ':countм', - 'a_month' => '{1}місяць|:count місяць|:count місяці|:count місяців', - 'week' => ':count тиждень|:count тижні|:count тижнів', - 'w' => ':countт', - 'a_week' => '{1}тиждень|:count тиждень|:count тижні|:count тижнів', - 'day' => ':count день|:count дні|:count днів', - 'd' => ':countд', - 'a_day' => '{1}день|:count день|:count дні|:count днів', - 'hour' => ':count година|:count години|:count годин', - 'h' => ':countг', - 'a_hour' => '{1}година|:count година|:count години|:count годин', - 'minute' => ':count хвилина|:count хвилини|:count хвилин', - 'min' => ':countхв', - 'a_minute' => '{1}хвилина|:count хвилина|:count хвилини|:count хвилин', - 'second' => ':count секунда|:count секунди|:count секунд', - 's' => ':countсек', - 'a_second' => '{1}декілька секунд|:count секунда|:count секунди|:count секунд', - - 'hour_ago' => ':count годину|:count години|:count годин', - 'a_hour_ago' => '{1}годину|:count годину|:count години|:count годин', - 'minute_ago' => ':count хвилину|:count хвилини|:count хвилин', - 'a_minute_ago' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', - 'second_ago' => ':count секунду|:count секунди|:count секунд', - 'a_second_ago' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', - - 'hour_from_now' => ':count годину|:count години|:count годин', - 'a_hour_from_now' => '{1}годину|:count годину|:count години|:count годин', - 'minute_from_now' => ':count хвилину|:count хвилини|:count хвилин', - 'a_minute_from_now' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', - 'second_from_now' => ':count секунду|:count секунди|:count секунд', - 'a_second_from_now' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', - - 'hour_after' => ':count годину|:count години|:count годин', - 'a_hour_after' => '{1}годину|:count годину|:count години|:count годин', - 'minute_after' => ':count хвилину|:count хвилини|:count хвилин', - 'a_minute_after' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', - 'second_after' => ':count секунду|:count секунди|:count секунд', - 'a_second_after' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', - - 'hour_before' => ':count годину|:count години|:count годин', - 'a_hour_before' => '{1}годину|:count годину|:count години|:count годин', - 'minute_before' => ':count хвилину|:count хвилини|:count хвилин', - 'a_minute_before' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', - 'second_before' => ':count секунду|:count секунди|:count секунд', - 'a_second_before' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', - - 'ago' => ':time тому', - 'from_now' => 'за :time', - 'after' => ':time після', - 'before' => ':time до', - 'diff_now' => 'щойно', - 'diff_today' => 'Сьогодні', - 'diff_today_regexp' => 'Сьогодні(?:\\s+о)?', - 'diff_yesterday' => 'вчора', - 'diff_yesterday_regexp' => 'Вчора(?:\\s+о)?', - 'diff_tomorrow' => 'завтра', - 'diff_tomorrow_regexp' => 'Завтра(?:\\s+о)?', - 'diff_before_yesterday' => 'позавчора', - 'diff_after_tomorrow' => 'післязавтра', - 'period_recurrences' => 'один раз|:count рази|:count разів', - 'period_interval' => 'кожні :interval', - 'period_start_date' => 'з :date', - 'period_end_date' => 'до :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', - ], - 'calendar' => [ - 'sameDay' => static fn (CarbonInterface $date) => $processHoursFunction($date, '[Сьогодні '), - 'nextDay' => static fn (CarbonInterface $date) => $processHoursFunction($date, '[Завтра '), - 'nextWeek' => static fn (CarbonInterface $date) => $processHoursFunction($date, '[У] dddd ['), - 'lastDay' => static fn (CarbonInterface $date) => $processHoursFunction($date, '[Вчора '), - 'lastWeek' => static fn (CarbonInterface $date) => match ($date->dayOfWeek) { - 0, 3, 5, 6 => $processHoursFunction($date, '[Минулої] dddd ['), - default => $processHoursFunction($date, '[Минулого] dddd ['), - }, - 'sameElse' => 'L', - ], - 'ordinal' => static fn ($number, $period) => match ($period) { - 'M', 'd', 'DDD', 'w', 'W' => $number.'-й', - 'D' => $number.'-го', - default => $number, - }, - 'meridiem' => static function ($hour) { - if ($hour < 4) { - return 'ночі'; - } - - if ($hour < 12) { - return 'ранку'; - } - - if ($hour < 17) { - return 'дня'; - } - - return 'вечора'; - }, - 'months' => ['січня', 'лютого', 'березня', 'квітня', 'травня', 'червня', 'липня', 'серпня', 'вересня', 'жовтня', 'листопада', 'грудня'], - 'months_standalone' => ['січень', 'лютий', 'березень', 'квітень', 'травень', 'червень', 'липень', 'серпень', 'вересень', 'жовтень', 'листопад', 'грудень'], - 'months_short' => ['січ', 'лют', 'бер', 'кві', 'тра', 'чер', 'лип', 'сер', 'вер', 'жов', 'лис', 'гру'], - 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => static function (CarbonInterface $date, $format, $index) { - static $words = [ - 'nominative' => ['неділя', 'понеділок', 'вівторок', 'середа', 'четвер', 'п’ятниця', 'субота'], - 'accusative' => ['неділю', 'понеділок', 'вівторок', 'середу', 'четвер', 'п’ятницю', 'суботу'], - 'genitive' => ['неділі', 'понеділка', 'вівторка', 'середи', 'четверга', 'п’ятниці', 'суботи'], - ]; - - $format ??= ''; - $nounCase = preg_match('/(\[(В|в|У|у)\])\s+dddd/u', $format) - ? 'accusative' - : ( - preg_match('/\[?(?:минулої|наступної)?\s*\]\s+dddd/u', $format) - ? 'genitive' - : 'nominative' - ); - - return $words[$nounCase][$index] ?? null; - }, - 'weekdays_short' => ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], - 'weekdays_min' => ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' i '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php b/vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php deleted file mode 100644 index bd11d86..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/uk.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/unm.php b/vendor/nesbot/carbon/src/Carbon/Lang/unm.php deleted file mode 100644 index d3f19f0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/unm.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/unm_US.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php b/vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php deleted file mode 100644 index 161a1ec..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['enikwsi', 'chkwali', 'xamokhwite', 'kwetayoxe', 'tainipen', 'kichinipen', 'lainipen', 'winaminke', 'kichitahkok', 'puksit', 'wini', 'muxkotae'], - 'months_short' => ['eni', 'chk', 'xam', 'kwe', 'tai', 'nip', 'lai', 'win', 'tah', 'puk', 'kun', 'mux'], - 'weekdays' => ['kentuwei', 'manteke', 'tusteke', 'lelai', 'tasteke', 'pelaiteke', 'sateteke'], - 'weekdays_short' => ['ken', 'man', 'tus', 'lel', 'tas', 'pel', 'sat'], - 'weekdays_min' => ['ken', 'man', 'tus', 'lel', 'tas', 'pel', 'sat'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - // Too unreliable - /* - 'year' => ':count kaxtëne', - 'y' => ':count kaxtëne', - 'a_year' => ':count kaxtëne', - - 'month' => ':count piskewëni kishux', // less reliable - 'm' => ':count piskewëni kishux', // less reliable - 'a_month' => ':count piskewëni kishux', // less reliable - - 'week' => ':count kishku', // less reliable - 'w' => ':count kishku', // less reliable - 'a_week' => ':count kishku', // less reliable - - 'day' => ':count kishku', - 'd' => ':count kishku', - 'a_day' => ':count kishku', - - 'hour' => ':count xkuk', // less reliable - 'h' => ':count xkuk', // less reliable - 'a_hour' => ':count xkuk', // less reliable - - 'minute' => ':count txituwàk', // less reliable - 'min' => ':count txituwàk', // less reliable - 'a_minute' => ':count txituwàk', // less reliable - - 'second' => ':count nisha', // less reliable - 's' => ':count nisha', // less reliable - 'a_second' => ':count nisha', // less reliable - */ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ur.php b/vendor/nesbot/carbon/src/Carbon/Lang/ur.php deleted file mode 100644 index dc16c2c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ur.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -$months = [ - 'جنوری', - 'فروری', - 'مارچ', - 'اپریل', - 'مئی', - 'جون', - 'جولائی', - 'اگست', - 'ستمبر', - 'اکتوبر', - 'نومبر', - 'دسمبر', -]; - -$weekdays = [ - 'اتوار', - 'پیر', - 'منگل', - 'بدھ', - 'جمعرات', - 'جمعہ', - 'ہفتہ', -]; - -/* - * Authors: - * - Sawood Alam - * - Mehshan - * - Philippe Vaucher - * - Tsutomu Kuroda - * - tjku - * - Zaid Akram - * - Max Melentiev - * - hafezdivandari - * - Hossein Jabbari - * - nimamo - */ -return [ - 'year' => 'ایک سال|:count سال', - 'month' => 'ایک ماہ|:count ماہ', - 'week' => ':count ہفتے', - 'day' => 'ایک دن|:count دن', - 'hour' => 'ایک گھنٹہ|:count گھنٹے', - 'minute' => 'ایک منٹ|:count منٹ', - 'second' => 'چند سیکنڈ|:count سیکنڈ', - 'ago' => ':time قبل', - 'from_now' => ':time بعد', - 'after' => ':time بعد', - 'before' => ':time پہلے', - 'diff_now' => 'اب', - 'diff_today' => 'آج', - 'diff_today_regexp' => 'آج(?:\\s+بوقت)?', - 'diff_yesterday' => 'گزشتہ کل', - 'diff_yesterday_regexp' => 'گذشتہ(?:\\s+روز)?(?:\\s+بوقت)?', - 'diff_tomorrow' => 'آئندہ کل', - 'diff_tomorrow_regexp' => 'کل(?:\\s+بوقت)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd، D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[آج بوقت] LT', - 'nextDay' => '[کل بوقت] LT', - 'nextWeek' => 'dddd [بوقت] LT', - 'lastDay' => '[گذشتہ روز بوقت] LT', - 'lastWeek' => '[گذشتہ] dddd [بوقت] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['صبح', 'شام'], - 'months' => $months, - 'months_short' => $months, - 'weekdays' => $weekdays, - 'weekdays_short' => $weekdays, - 'weekdays_min' => $weekdays, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => ['، ', ' اور '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php deleted file mode 100644 index f81c84d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ur.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'weekdays' => ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'سنیچر'], - 'weekdays_short' => ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'سنیچر'], - 'weekdays_min' => ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'سنیچر'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php b/vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php deleted file mode 100644 index 8cd593d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ur.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'weekdays' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'weekdays_short' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'weekdays_min' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ص', 'ش'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz.php deleted file mode 100644 index 61f3b64..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/uz.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Dmitriy Shabanov - * - JD Isaacks - * - Inoyatulloh - * - Jamshid - * - aarkhipov - * - Philippe Vaucher - * - felixthemagnificent - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Juanito Fatas - * - Alisher Ulugbekov - * - Ergashev Adizbek - */ -return [ - 'year' => ':count йил', - 'a_year' => '{1}бир йил|:count йил', - 'y' => ':count й', - 'month' => ':count ой', - 'a_month' => '{1}бир ой|:count ой', - 'm' => ':count о', - 'week' => ':count ҳафта', - 'a_week' => '{1}бир ҳафта|:count ҳафта', - 'w' => ':count ҳ', - 'day' => ':count кун', - 'a_day' => '{1}бир кун|:count кун', - 'd' => ':count к', - 'hour' => ':count соат', - 'a_hour' => '{1}бир соат|:count соат', - 'h' => ':count с', - 'minute' => ':count дақиқа', - 'a_minute' => '{1}бир дақиқа|:count дақиқа', - 'min' => ':count д', - 'second' => ':count сония', - 'a_second' => '{1}сония|:count сония', - 's' => ':count с', - 'ago' => ':time аввал', - 'from_now' => 'Якин :time ичида', - 'after' => ':timeдан кейин', - 'before' => ':time олдин', - 'diff_now' => 'ҳозир', - 'diff_today' => 'Бугун', - 'diff_today_regexp' => 'Бугун(?:\\s+соат)?', - 'diff_yesterday' => 'Кеча', - 'diff_yesterday_regexp' => 'Кеча(?:\\s+соат)?', - 'diff_tomorrow' => 'Эртага', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'D MMMM YYYY, dddd HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Бугун соат] LT [да]', - 'nextDay' => '[Эртага] LT [да]', - 'nextWeek' => 'dddd [куни соат] LT [да]', - 'lastDay' => '[Кеча соат] LT [да]', - 'lastWeek' => '[Утган] dddd [куни соат] LT [да]', - 'sameElse' => 'L', - ], - 'months' => ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'], - 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'weekdays' => ['якшанба', 'душанба', 'сешанба', 'чоршанба', 'пайшанба', 'жума', 'шанба'], - 'weekdays_short' => ['якш', 'душ', 'сеш', 'чор', 'пай', 'жум', 'шан'], - 'weekdays_min' => ['як', 'ду', 'се', 'чо', 'па', 'жу', 'ша'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['эрталаб', 'кечаси'], - 'list' => [', ', ' ва '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php deleted file mode 100644 index ffb5131..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fa.php', [ - 'weekdays' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'], - 'weekdays_short' => ['ی.', 'د.', 'س.', 'چ.', 'پ.', 'ج.', 'ش.'], - 'weekdays_min' => ['ی.', 'د.', 'س.', 'چ.', 'پ.', 'ج.', 'ش.'], - 'months' => ['جنوری', 'فبروری', 'مارچ', 'اپریل', 'می', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنو', 'فبر', 'مار', 'اپر', 'می', 'جون', 'جول', 'اگس', 'سپت', 'اکت', 'نوم', 'دسم'], - 'first_day_of_week' => 6, - 'weekend' => [4, 5], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php deleted file mode 100644 index 89e9971..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/uz.php', [ - 'formats' => [ - 'L' => 'DD/MM/yy', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM, YYYY HH:mm', - 'LLLL' => 'dddd, DD MMMM, YYYY HH:mm', - ], - 'meridiem' => ['ТО', 'ТК'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php deleted file mode 100644 index ecceeaa..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Rasulbek - * - Ilyosjon Kamoldinov (ilyosjon09) - */ -return [ - 'year' => ':count yil', - 'a_year' => '{1}bir yil|:count yil', - 'y' => ':count y', - 'month' => ':count oy', - 'a_month' => '{1}bir oy|:count oy', - 'm' => ':count o', - 'week' => ':count hafta', - 'a_week' => '{1}bir hafta|:count hafta', - 'w' => ':count h', - 'day' => ':count kun', - 'a_day' => '{1}bir kun|:count kun', - 'd' => ':count k', - 'hour' => ':count soat', - 'a_hour' => '{1}bir soat|:count soat', - 'h' => ':count soat', - 'minute' => ':count daqiqa', - 'a_minute' => '{1}bir daqiqa|:count daqiqa', - 'min' => ':count d', - 'second' => ':count soniya', - 'a_second' => '{1}soniya|:count soniya', - 's' => ':count son.', - 'ago' => ':time avval', - 'from_now' => 'Yaqin :time ichida', - 'after' => ':timedan keyin', - 'before' => ':time oldin', - 'diff_yesterday' => 'Kecha', - 'diff_yesterday_regexp' => 'Kecha(?:\\s+soat)?', - 'diff_today' => 'Bugun', - 'diff_today_regexp' => 'Bugun(?:\\s+soat)?', - 'diff_tomorrow' => 'Ertaga', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'D MMMM YYYY, dddd HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Bugun soat] LT [da]', - 'nextDay' => '[Ertaga] LT [da]', - 'nextWeek' => 'dddd [kuni soat] LT [da]', - 'lastDay' => '[Kecha soat] LT [da]', - 'lastWeek' => '[O\'tgan] dddd [kuni soat] LT [da]', - 'sameElse' => 'L', - ], - 'months' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'Iyun', 'Iyul', 'Avgust', 'Sentabr', 'Oktabr', 'Noyabr', 'Dekabr'], - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'Iyun', 'Iyul', 'Avg', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['Yakshanba', 'Dushanba', 'Seshanba', 'Chorshanba', 'Payshanba', 'Juma', 'Shanba'], - 'weekdays_short' => ['Yak', 'Dush', 'Sesh', 'Chor', 'Pay', 'Jum', 'Shan'], - 'weekdays_min' => ['Ya', 'Du', 'Se', 'Cho', 'Pa', 'Ju', 'Sha'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' va '], - 'meridiem' => ['TO', 'TK'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php deleted file mode 100644 index d41bfee..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Bobir Ismailov Bobir Ismailov, Pablo Saratxaga, Mashrab Kuvatov bobir_is@yahoo.com, pablo@mandrakesoft.com, kmashrab@uni-bremen.de - */ -return array_replace_recursive(require __DIR__.'/uz_Latn.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'Iyun', 'Iyul', 'Avgust', 'Sentabr', 'Oktabr', 'Noyabr', 'Dekabr'], - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'Iyn', 'Iyl', 'Avg', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['Yakshanba', 'Dushanba', 'Seshanba', 'Chorshanba', 'Payshanba', 'Juma', 'Shanba'], - 'weekdays_short' => ['Yak', 'Du', 'Se', 'Cho', 'Pay', 'Ju', 'Sha'], - 'weekdays_min' => ['Yak', 'Du', 'Se', 'Cho', 'Pay', 'Ju', 'Sha'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php deleted file mode 100644 index 2fa967c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Mashrab Kuvatov Mashrab Kuvatov, Pablo Saratxaga kmashrab@uni-bremen.de, pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/uz.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Январ', 'Феврал', 'Март', 'Апрел', 'Май', 'Июн', 'Июл', 'Август', 'Сентябр', 'Октябр', 'Ноябр', 'Декабр'], - 'months_short' => ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'], - 'weekdays' => ['Якшанба', 'Душанба', 'Сешанба', 'Чоршанба', 'Пайшанба', 'Жума', 'Шанба'], - 'weekdays_short' => ['Якш', 'Душ', 'Сеш', 'Чор', 'Пай', 'Жум', 'Шан'], - 'weekdays_min' => ['Якш', 'Душ', 'Сеш', 'Чор', 'Пай', 'Жум', 'Шан'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vai.php b/vendor/nesbot/carbon/src/Carbon/Lang/vai.php deleted file mode 100644 index 3c378df..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/vai.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'], - 'weekdays_short' => ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'], - 'weekdays_min' => ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'], - 'months' => ['ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ', 'ꕒꕡꖝꖕ', 'ꕾꖺ', 'ꖢꖕ', 'ꖑꕱ', 'ꖱꘋ', 'ꖱꕞꔤ', 'ꗛꔕ', 'ꕢꕌ', 'ꕭꖃ', 'ꔞꘋꕔꕿ ꕸꖃꗏ', 'ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ'], - 'months_short' => ['ꖨꖕꔞ', 'ꕒꕡ', 'ꕾꖺ', 'ꖢꖕ', 'ꖑꕱ', 'ꖱꘋ', 'ꖱꕞ', 'ꗛꔕ', 'ꕢꕌ', 'ꕭꖃ', 'ꔞꘋ', 'ꖨꖕꗏ'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY h:mm a', - ], - - 'year' => ':count ꕀ', // less reliable - 'y' => ':count ꕀ', // less reliable - 'a_year' => ':count ꕀ', // less reliable - - 'second' => ':count ꗱꕞꕯꕊ', // less reliable - 's' => ':count ꗱꕞꕯꕊ', // less reliable - 'a_second' => ':count ꗱꕞꕯꕊ', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php deleted file mode 100644 index 51e83cc..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'], - 'weekdays_short' => ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'], - 'weekdays_min' => ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'], - 'months' => ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'], - 'months_short' => ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY h:mm a', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php b/vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php deleted file mode 100644 index b4bb533..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/vai.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ve.php b/vendor/nesbot/carbon/src/Carbon/Lang/ve.php deleted file mode 100644 index 7f10aeb..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ve.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ve_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php deleted file mode 100644 index d401d9f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Phando', 'Luhuhi', 'Ṱhafamuhwe', 'Lambamai', 'Shundunthule', 'Fulwi', 'Fulwana', 'Ṱhangule', 'Khubvumedzi', 'Tshimedzi', 'Ḽara', 'Nyendavhusiku'], - 'months_short' => ['Pha', 'Luh', 'Fam', 'Lam', 'Shu', 'Lwi', 'Lwa', 'Ngu', 'Khu', 'Tsh', 'Ḽar', 'Nye'], - 'weekdays' => ['Swondaha', 'Musumbuluwo', 'Ḽavhuvhili', 'Ḽavhuraru', 'Ḽavhuṋa', 'Ḽavhuṱanu', 'Mugivhela'], - 'weekdays_short' => ['Swo', 'Mus', 'Vhi', 'Rar', 'ṋa', 'Ṱan', 'Mug'], - 'weekdays_min' => ['Swo', 'Mus', 'Vhi', 'Rar', 'ṋa', 'Ṱan', 'Mug'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - // Too unreliable - /* - 'day' => ':count vhege', // less reliable - 'd' => ':count vhege', // less reliable - 'a_day' => ':count vhege', // less reliable - - 'hour' => ':count watshi', // less reliable - 'h' => ':count watshi', // less reliable - 'a_hour' => ':count watshi', // less reliable - - 'minute' => ':count watshi', // less reliable - 'min' => ':count watshi', // less reliable - 'a_minute' => ':count watshi', // less reliable - - 'second' => ':count Mu', // less reliable - 's' => ':count Mu', // less reliable - 'a_second' => ':count Mu', // less reliable - - 'week' => ':count vhege', - 'w' => ':count vhege', - 'a_week' => ':count vhege', - */ -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vi.php b/vendor/nesbot/carbon/src/Carbon/Lang/vi.php deleted file mode 100644 index 73e2852..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/vi.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Andre Polykanine A.K.A. Menelion Elensúlë - * - JD Isaacks - */ -return [ - 'year' => ':count năm', - 'a_year' => '{1}một năm|]1, Inf[:count năm', - 'y' => ':count năm', - 'month' => ':count tháng', - 'a_month' => '{1}một tháng|]1, Inf[:count tháng', - 'm' => ':count tháng', - 'week' => ':count tuần', - 'a_week' => '{1}một tuần|]1, Inf[:count tuần', - 'w' => ':count tuần', - 'day' => ':count ngày', - 'a_day' => '{1}một ngày|]1, Inf[:count ngày', - 'd' => ':count ngày', - 'hour' => ':count giờ', - 'a_hour' => '{1}một giờ|]1, Inf[:count giờ', - 'h' => ':count giờ', - 'minute' => ':count phút', - 'a_minute' => '{1}một phút|]1, Inf[:count phút', - 'min' => ':count phút', - 'second' => ':count giây', - 'a_second' => '{1}vài giây|]1, Inf[:count giây', - 's' => ':count giây', - 'ago' => ':time trước', - 'from_now' => ':time tới', - 'after' => ':time sau', - 'before' => ':time trước', - 'diff_now' => 'bây giờ', - 'diff_today' => 'Hôm', - 'diff_today_regexp' => 'Hôm(?:\\s+nay)?(?:\\s+lúc)?', - 'diff_yesterday' => 'Hôm qua', - 'diff_yesterday_regexp' => 'Hôm(?:\\s+qua)?(?:\\s+lúc)?', - 'diff_tomorrow' => 'Ngày mai', - 'diff_tomorrow_regexp' => 'Ngày(?:\\s+mai)?(?:\\s+lúc)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM [năm] YYYY', - 'LLL' => 'D MMMM [năm] YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM [năm] YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Hôm nay lúc] LT', - 'nextDay' => '[Ngày mai lúc] LT', - 'nextWeek' => 'dddd [tuần tới lúc] LT', - 'lastDay' => '[Hôm qua lúc] LT', - 'lastWeek' => 'dddd [tuần trước lúc] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['SA', 'CH'], - 'months' => ['tháng 1', 'tháng 2', 'tháng 3', 'tháng 4', 'tháng 5', 'tháng 6', 'tháng 7', 'tháng 8', 'tháng 9', 'tháng 10', 'tháng 11', 'tháng 12'], - 'months_short' => ['Th01', 'Th02', 'Th03', 'Th04', 'Th05', 'Th06', 'Th07', 'Th08', 'Th09', 'Th10', 'Th11', 'Th12'], - 'weekdays' => ['chủ nhật', 'thứ hai', 'thứ ba', 'thứ tư', 'thứ năm', 'thứ sáu', 'thứ bảy'], - 'weekdays_short' => ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], - 'weekdays_min' => ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' và '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php b/vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php deleted file mode 100644 index 18d8987..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/vi.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vo.php b/vendor/nesbot/carbon/src/Carbon/Lang/vo.php deleted file mode 100644 index e273033..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/vo.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'months' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'months_short' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], - - 'year' => ':count yel', - 'y' => ':count yel', - 'a_year' => ':count yel', - - 'month' => ':count mul', - 'm' => ':count mul', - 'a_month' => ':count mul', - - 'week' => ':count vig', - 'w' => ':count vig', - 'a_week' => ':count vig', - - 'day' => ':count del', - 'd' => ':count del', - 'a_day' => ':count del', - - 'hour' => ':count düp', - 'h' => ':count düp', - 'a_hour' => ':count düp', - - 'minute' => ':count minut', - 'min' => ':count minut', - 'a_minute' => ':count minut', - - 'second' => ':count sekun', - 's' => ':count sekun', - 'a_second' => ':count sekun', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vun.php b/vendor/nesbot/carbon/src/Carbon/Lang/vun.php deleted file mode 100644 index ed92e8e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/vun.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['utuko', 'kyiukonyi'], - 'weekdays' => ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wa.php b/vendor/nesbot/carbon/src/Carbon/Lang/wa.php deleted file mode 100644 index f6dc4cc..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/wa.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/wa_BE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php b/vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php deleted file mode 100644 index a76d80d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Djan SACRE Pablo Saratxaga pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['di djanvî', 'di fevrî', 'di måss', 'd’ avri', 'di may', 'di djun', 'di djulete', 'd’ awousse', 'di setimbe', 'd’ octôbe', 'di nôvimbe', 'di decimbe'], - 'months_short' => ['dja', 'fev', 'mås', 'avr', 'may', 'djn', 'djl', 'awo', 'set', 'oct', 'nôv', 'dec'], - 'weekdays' => ['dimegne', 'londi', 'mårdi', 'mierkidi', 'djudi', 'vénrdi', 'semdi'], - 'weekdays_short' => ['dim', 'lon', 'mår', 'mie', 'dju', 'vén', 'sem'], - 'weekdays_min' => ['dim', 'lon', 'mår', 'mie', 'dju', 'vén', 'sem'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count anêye', - 'y' => ':count anêye', - 'a_year' => ':count anêye', - - 'month' => ':count meûs', - 'm' => ':count meûs', - 'a_month' => ':count meûs', - - 'week' => ':count samwinne', - 'w' => ':count samwinne', - 'a_week' => ':count samwinne', - - 'day' => ':count djoû', - 'd' => ':count djoû', - 'a_day' => ':count djoû', - - 'hour' => ':count eure', - 'h' => ':count eure', - 'a_hour' => ':count eure', - - 'minute' => ':count munute', - 'min' => ':count munute', - 'a_minute' => ':count munute', - - 'second' => ':count Sigonde', - 's' => ':count Sigonde', - 'a_second' => ':count Sigonde', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wae.php b/vendor/nesbot/carbon/src/Carbon/Lang/wae.php deleted file mode 100644 index bf57f23..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/wae.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/wae_CH.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php deleted file mode 100644 index 2af50b4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Walser Translation Team ml@translate-wae.ch - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], - 'months' => ['Jenner', 'Hornig', 'Märze', 'Abrille', 'Meije', 'Bráčet', 'Heiwet', 'Öigšte', 'Herbštmánet', 'Wímánet', 'Wintermánet', 'Chrištmánet'], - 'months_short' => ['Jen', 'Hor', 'Mär', 'Abr', 'Mei', 'Brá', 'Hei', 'Öig', 'Her', 'Wím', 'Win', 'Chr'], - 'weekdays' => ['Suntag', 'Mäntag', 'Zischtag', 'Mittwuch', 'Frontag', 'Fritag', 'Samschtag'], - 'weekdays_short' => ['Sun', 'Män', 'Zis', 'Mit', 'Fro', 'Fri', 'Sam'], - 'weekdays_min' => ['Sun', 'Män', 'Zis', 'Mit', 'Fro', 'Fri', 'Sam'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'month' => ':count Maano', // less reliable - 'm' => ':count Maano', // less reliable - 'a_month' => ':count Maano', // less reliable -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wal.php b/vendor/nesbot/carbon/src/Carbon/Lang/wal.php deleted file mode 100644 index e8ec40f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/wal.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/wal_ET.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php deleted file mode 100644 index e862f2c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕረል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክተውበር', 'ኖቬምበር', 'ዲሴምበር'], - 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], - 'weekdays' => ['ወጋ', 'ሳይኖ', 'ማቆሳኛ', 'አሩዋ', 'ሃሙሳ', 'አርባ', 'ቄራ'], - 'weekdays_short' => ['ወጋ ', 'ሳይኖ', 'ማቆሳ', 'አሩዋ', 'ሃሙሳ', 'አርባ', 'ቄራ '], - 'weekdays_min' => ['ወጋ ', 'ሳይኖ', 'ማቆሳ', 'አሩዋ', 'ሃሙሳ', 'አርባ', 'ቄራ '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ማለዶ', 'ቃማ'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wo.php b/vendor/nesbot/carbon/src/Carbon/Lang/wo.php deleted file mode 100644 index 74b95df..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/wo.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/wo_SN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php b/vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php deleted file mode 100644 index f8a85b3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - The Debian Project Christian Perrier bubulle@debian.org - */ -return [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'MMMM DD, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], - 'months' => ['sanwiy\'e', 'feebriy\'e', 'mars', 'awril', 'me', 'suwen', 'sulet', 'uut', 'septaambar', 'oktoobar', 'nowaambar', 'desaambar'], - 'months_short' => ['san', 'fee', 'mar', 'awr', 'me ', 'suw', 'sul', 'uut', 'sep', 'okt', 'now', 'des'], - 'weekdays' => ['dib\'eer', 'altine', 'talaata', 'allarba', 'alxames', 'ajjuma', 'gaawu'], - 'weekdays_short' => ['dib', 'alt', 'tal', 'all', 'alx', 'ajj', 'gaa'], - 'weekdays_min' => ['dib', 'alt', 'tal', 'all', 'alx', 'ajj', 'gaa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'year' => ':count at', - 'month' => ':count wèr', - 'week' => ':count ayubés', - 'day' => ':count bés', - 'hour' => ':count waxtu', - 'minute' => ':count simili', - 'second' => ':count saa', -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/xh.php b/vendor/nesbot/carbon/src/Carbon/Lang/xh.php deleted file mode 100644 index e88c78d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/xh.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/xh_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php deleted file mode 100644 index 009153c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['eyoMqungu', 'eyoMdumba', 'eyoKwindla', 'uTshazimpuzi', 'uCanzibe', 'eyeSilimela', 'eyeKhala', 'eyeThupa', 'eyoMsintsi', 'eyeDwarha', 'eyeNkanga', 'eyoMnga'], - 'months_short' => ['Mqu', 'Mdu', 'Kwi', 'Tsh', 'Can', 'Sil', 'Kha', 'Thu', 'Msi', 'Dwa', 'Nka', 'Mng'], - 'weekdays' => ['iCawa', 'uMvulo', 'lwesiBini', 'lwesiThathu', 'ulweSine', 'lwesiHlanu', 'uMgqibelo'], - 'weekdays_short' => ['Caw', 'Mvu', 'Bin', 'Tha', 'Sin', 'Hla', 'Mgq'], - 'weekdays_min' => ['Caw', 'Mvu', 'Bin', 'Tha', 'Sin', 'Hla', 'Mgq'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count ihlobo', // less reliable - 'y' => ':count ihlobo', // less reliable - 'a_year' => ':count ihlobo', // less reliable - - 'hour' => ':count iwotshi', // less reliable - 'h' => ':count iwotshi', // less reliable - 'a_hour' => ':count iwotshi', // less reliable - - 'minute' => ':count ingqalelo', // less reliable - 'min' => ':count ingqalelo', // less reliable - 'a_minute' => ':count ingqalelo', // less reliable - - 'second' => ':count nceda', // less reliable - 's' => ':count nceda', // less reliable - 'a_second' => ':count nceda', // less reliable - - 'month' => ':count inyanga', - 'm' => ':count inyanga', - 'a_month' => ':count inyanga', - - 'week' => ':count veki', - 'w' => ':count veki', - 'a_week' => ':count veki', - - 'day' => ':count imini', - 'd' => ':count imini', - 'a_day' => ':count imini', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/xog.php b/vendor/nesbot/carbon/src/Carbon/Lang/xog.php deleted file mode 100644 index eb55b4a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/xog.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Munkyo', 'Eigulo'], - 'weekdays' => ['Sabiiti', 'Balaza', 'Owokubili', 'Owokusatu', 'Olokuna', 'Olokutaanu', 'Olomukaaga'], - 'weekdays_short' => ['Sabi', 'Bala', 'Kubi', 'Kusa', 'Kuna', 'Kuta', 'Muka'], - 'weekdays_min' => ['Sabi', 'Bala', 'Kubi', 'Kusa', 'Kuna', 'Kuta', 'Muka'], - 'months' => ['Janwaliyo', 'Febwaliyo', 'Marisi', 'Apuli', 'Maayi', 'Juuni', 'Julaayi', 'Agusito', 'Sebuttemba', 'Okitobba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apu', 'Maa', 'Juu', 'Jul', 'Agu', 'Seb', 'Oki', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yav.php b/vendor/nesbot/carbon/src/Carbon/Lang/yav.php deleted file mode 100644 index 225a20d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yav.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['kiɛmɛ́ɛm', 'kisɛ́ndɛ'], - 'weekdays' => ['sɔ́ndiɛ', 'móndie', 'muányáŋmóndie', 'metúkpíápɛ', 'kúpélimetúkpiapɛ', 'feléte', 'séselé'], - 'weekdays_short' => ['sd', 'md', 'mw', 'et', 'kl', 'fl', 'ss'], - 'weekdays_min' => ['sd', 'md', 'mw', 'et', 'kl', 'fl', 'ss'], - 'months' => ['pikítíkítie, oólí ú kutúan', 'siɛyɛ́, oóli ú kándíɛ', 'ɔnsúmbɔl, oóli ú kátátúɛ', 'mesiŋ, oóli ú kénie', 'ensil, oóli ú kátánuɛ', 'ɔsɔn', 'efute', 'pisuyú', 'imɛŋ i puɔs', 'imɛŋ i putúk,oóli ú kátíɛ', 'makandikɛ', 'pilɔndɔ́'], - 'months_short' => ['o.1', 'o.2', 'o.3', 'o.4', 'o.5', 'o.6', 'o.7', 'o.8', 'o.9', 'o.10', 'o.11', 'o.12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yi.php b/vendor/nesbot/carbon/src/Carbon/Lang/yi.php deleted file mode 100644 index 8f32022..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yi.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/yi_US.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php b/vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php deleted file mode 100644 index f2dec33..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - http://www.uyip.org/ Pablo Saratxaga pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['יאַנואַר', 'פֿעברואַר', 'מערץ', 'אַפּריל', 'מיי', 'יוני', 'יולי', 'אויגוסט', 'סעפּטעמבער', 'אקטאבער', 'נאוועמבער', 'דעצעמבער'], - 'months_short' => ['יאַנ', 'פֿעב', 'מאַר', 'אַפּר', 'מײַ ', 'יונ', 'יול', 'אױג', 'סעפּ', 'אָקט', 'נאָװ', 'דעצ'], - 'weekdays' => ['זונטיק', 'מאָנטיק', 'דינסטיק', 'מיטװאָך', 'דאָנערשטיק', 'פֿרײַטיק', 'שבת'], - 'weekdays_short' => ['זונ\'', 'מאָנ\'', 'דינ\'', 'מיט\'', 'דאָנ\'', 'פֿרײַ\'', 'שבת'], - 'weekdays_min' => ['זונ\'', 'מאָנ\'', 'דינ\'', 'מיט\'', 'דאָנ\'', 'פֿרײַ\'', 'שבת'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count יאר', - 'y' => ':count יאר', - 'a_year' => ':count יאר', - - 'month' => ':count חודש', - 'm' => ':count חודש', - 'a_month' => ':count חודש', - - 'week' => ':count וואָך', - 'w' => ':count וואָך', - 'a_week' => ':count וואָך', - - 'day' => ':count טאָג', - 'd' => ':count טאָג', - 'a_day' => ':count טאָג', - - 'hour' => ':count שעה', - 'h' => ':count שעה', - 'a_hour' => ':count שעה', - - 'minute' => ':count מינוט', - 'min' => ':count מינוט', - 'a_minute' => ':count מינוט', - - 'second' => ':count סעקונדע', - 's' => ':count סעקונדע', - 'a_second' => ':count סעקונדע', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yo.php b/vendor/nesbot/carbon/src/Carbon/Lang/yo.php deleted file mode 100644 index 0a82981..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yo.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Atolagbe Abisoye - */ -return [ - 'year' => 'ọdún :count', - 'a_year' => '{1}ọdún kan|ọdún :count', - 'month' => 'osù :count', - 'a_month' => '{1}osù kan|osù :count', - 'week' => 'ọsẹ :count', - 'a_week' => '{1}ọsẹ kan|ọsẹ :count', - 'day' => 'ọjọ́ :count', - 'a_day' => '{1}ọjọ́ kan|ọjọ́ :count', - 'hour' => 'wákati :count', - 'a_hour' => '{1}wákati kan|wákati :count', - 'minute' => 'ìsẹjú :count', - 'a_minute' => '{1}ìsẹjú kan|ìsẹjú :count', - 'second' => 'iaayá :count', - 'a_second' => '{1}ìsẹjú aayá die|aayá :count', - 'ago' => ':time kọjá', - 'from_now' => 'ní :time', - 'diff_yesterday' => 'Àna', - 'diff_yesterday_regexp' => 'Àna(?:\\s+ni)?', - 'diff_today' => 'Ònì', - 'diff_today_regexp' => 'Ònì(?:\\s+ni)?', - 'diff_tomorrow' => 'Ọ̀la', - 'diff_tomorrow_regexp' => 'Ọ̀la(?:\\s+ni)?', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm A', - 'LLLL' => 'dddd, D MMMM YYYY h:mm A', - ], - 'calendar' => [ - 'sameDay' => '[Ònì ni] LT', - 'nextDay' => '[Ọ̀la ni] LT', - 'nextWeek' => 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', - 'lastDay' => '[Àna ni] LT', - 'lastWeek' => 'dddd [Ọsẹ̀ tólọ́] [ni] LT', - 'sameElse' => 'L', - ], - 'ordinal' => 'ọjọ́ :number', - 'months' => ['Sẹ́rẹ́', 'Èrèlè', 'Ẹrẹ̀nà', 'Ìgbé', 'Èbibi', 'Òkùdu', 'Agẹmo', 'Ògún', 'Owewe', 'Ọ̀wàrà', 'Bélú', 'Ọ̀pẹ̀̀'], - 'months_short' => ['Sẹ́r', 'Èrl', 'Ẹrn', 'Ìgb', 'Èbi', 'Òkù', 'Agẹ', 'Ògú', 'Owe', 'Ọ̀wà', 'Bél', 'Ọ̀pẹ̀̀'], - 'weekdays' => ['Àìkú', 'Ajé', 'Ìsẹ́gun', 'Ọjọ́rú', 'Ọjọ́bọ', 'Ẹtì', 'Àbámẹ́ta'], - 'weekdays_short' => ['Àìk', 'Ajé', 'Ìsẹ́', 'Ọjr', 'Ọjb', 'Ẹtì', 'Àbá'], - 'weekdays_min' => ['Àì', 'Aj', 'Ìs', 'Ọr', 'Ọb', 'Ẹt', 'Àb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'meridiem' => ['Àárọ̀', 'Ọ̀sán'], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php deleted file mode 100644 index 12b9e81..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/yo.php', [ - 'meridiem' => ['Àárɔ̀', 'Ɔ̀sán'], - 'weekdays' => ['Ɔjɔ́ Àìkú', 'Ɔjɔ́ Ajé', 'Ɔjɔ́ Ìsɛ́gun', 'Ɔjɔ́rú', 'Ɔjɔ́bɔ', 'Ɔjɔ́ Ɛtì', 'Ɔjɔ́ Àbámɛ́ta'], - 'weekdays_short' => ['Àìkú', 'Ajé', 'Ìsɛ́gun', 'Ɔjɔ́rú', 'Ɔjɔ́bɔ', 'Ɛtì', 'Àbámɛ́ta'], - 'weekdays_min' => ['Àìkú', 'Ajé', 'Ìsɛ́gun', 'Ɔjɔ́rú', 'Ɔjɔ́bɔ', 'Ɛtì', 'Àbámɛ́ta'], - 'months' => ['Oshù Shɛ́rɛ́', 'Oshù Èrèlè', 'Oshù Ɛrɛ̀nà', 'Oshù Ìgbé', 'Oshù Ɛ̀bibi', 'Oshù Òkúdu', 'Oshù Agɛmɔ', 'Oshù Ògún', 'Oshù Owewe', 'Oshù Ɔ̀wàrà', 'Oshù Bélú', 'Oshù Ɔ̀pɛ̀'], - 'months_short' => ['Shɛ́rɛ́', 'Èrèlè', 'Ɛrɛ̀nà', 'Ìgbé', 'Ɛ̀bibi', 'Òkúdu', 'Agɛmɔ', 'Ògún', 'Owewe', 'Ɔ̀wàrà', 'Bélú', 'Ɔ̀pɛ̀'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php b/vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php deleted file mode 100644 index 6860bc1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/yo.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yue.php b/vendor/nesbot/carbon/src/Carbon/Lang/yue.php deleted file mode 100644 index ce233a4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yue.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/yue_HK.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php b/vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php deleted file mode 100644 index 4e7d5c3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/zh_HK.php', [ - 'formats' => [ - 'L' => 'YYYY年MM月DD日 dddd', - ], - 'months' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['上午', '下午'], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php b/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php deleted file mode 100644 index db913ca..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hans.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php b/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php deleted file mode 100644 index e2526f1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yuw.php b/vendor/nesbot/carbon/src/Carbon/Lang/yuw.php deleted file mode 100644 index 8efdc93..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yuw.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/yuw_PG.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php b/vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php deleted file mode 100644 index 8a1ccf9..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Information from native speakers Hannah Sarvasy nungon.localization@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['jenuari', 'febuari', 'mas', 'epril', 'mei', 'jun', 'julai', 'ögus', 'septemba', 'öktoba', 'nöwemba', 'diksemba'], - 'months_short' => ['jen', 'feb', 'mas', 'epr', 'mei', 'jun', 'jul', 'ögu', 'sep', 'ökt', 'nöw', 'dis'], - 'weekdays' => ['sönda', 'mönda', 'sinda', 'mitiwö', 'sogipbono', 'nenggo', 'söndanggie'], - 'weekdays_short' => ['sön', 'mön', 'sin', 'mit', 'soi', 'nen', 'sab'], - 'weekdays_min' => ['sön', 'mön', 'sin', 'mit', 'soi', 'nen', 'sab'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zgh.php b/vendor/nesbot/carbon/src/Carbon/Lang/zgh.php deleted file mode 100644 index 4d2c3b3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zgh.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - BAKTETE Miloud - */ -return [ - 'year' => ':count ⵓⵙⴳⴳⵯⴰⵙ|:count ⵉⵙⴳⴳⵓⵙⴰ', - 'a_year' => 'ⵓⵙⴳⴳⵯⴰⵙ|:count ⵉⵙⴳⴳⵓⵙⴰ', - 'y' => ':count ⵓⵙⴳⴳⵯⴰⵙ|:count ⵉⵙⴳⴳⵓⵙⴰ', - 'month' => ':count ⵡⴰⵢⵢⵓⵔ|:count ⴰⵢⵢⵓⵔⵏ', - 'a_month' => 'ⵉⴷⵊ ⵡⴰⵢⵢⵓⵔ|:count ⴰⵢⵢⵓⵔⵏ', - 'm' => ':count ⴰⵢⵢⵓⵔⵏ', - 'week' => ':count ⵉⵎⴰⵍⴰⵙⵙ|:count ⵉⵎⴰⵍⴰⵙⵙⵏ', - 'a_week' => 'ⵉⵛⵜ ⵉⵎⴰⵍⴰⵙⵙ|:count ⵉⵎⴰⵍⴰⵙⵙⵏ', - 'w' => ':count ⵉⵎⴰⵍⴰⵙⵙ.', - 'day' => ':count ⵡⴰⵙⵙ|:count ⵓⵙⵙⴰⵏ', - 'a_day' => 'ⵉⴷⵊ ⵡⴰⵙⵙ|:count ⵓⵙⵙⴰⵏ', - 'd' => ':count ⵓ', - 'hour' => ':count ⵜⵙⵔⴰⴳⵜ|:count ⵜⵉⵙⵔⴰⴳⵉⵏ', - 'a_hour' => 'ⵉⵛⵜ ⵜⵙⵔⴰⴳⵜ|:count ⵜⵉⵙⵔⴰⴳⵉⵏ', - 'h' => ':count ⵜ', - 'minute' => ':count ⵜⵓⵙⴷⵉⴷⵜ|:count ⵜⵓⵙⴷⵉⴷⵉⵏ', - 'a_minute' => 'ⵉⵛⵜ ⵜⵓⵙⴷⵉⴷⵜ|:count ⵜⵓⵙⴷⵉⴷⵉⵏ', - 'min' => ':count ⵜⵓⵙ', - 'second' => ':count ⵜⵙⵉⵏⵜ|:count ⵜⵉⵙⵉⵏⴰ', - 'a_second' => 'ⴽⵔⴰ ⵜⵉⵙⵉⵏⴰ|:count ⵜⵉⵙⵉⵏⴰ', - 's' => ':count ⵜ', - 'ago' => 'ⵣⴳ :time', - 'from_now' => 'ⴷⴳ :time', - 'after' => ':time ⴰⵡⴰⵔ', - 'before' => ':time ⴷⴰⵜ', - 'diff_now' => 'ⴰⴷⵡⴰⵍⵉ', - 'diff_today' => 'ⴰⵙⵙ', - 'diff_today_regexp' => 'ⴰⵙⵙ(?:\\s+ⴰ/ⴰⴷ)?(?:\\s+ⴳ)?', - 'diff_yesterday' => 'ⴰⵙⵙⵏⵏⴰⵟ', - 'diff_yesterday_regexp' => 'ⴰⵙⵙⵏⵏⴰⵟ(?:\\s+ⴳ)?', - 'diff_tomorrow' => 'ⴰⵙⴽⴽⴰ', - 'diff_tomorrow_regexp' => 'ⴰⵙⴽⴽⴰ(?:\\s+ⴳ)?', - 'diff_before_yesterday' => 'ⴼⵔ ⵉⴹⵏⵏⴰⵟ', - 'diff_after_tomorrow' => 'ⵏⴰⴼ ⵓⵙⴽⴽⴰ', - 'period_recurrences' => ':count ⵜⵉⴽⴽⴰⵍ', - 'period_interval' => 'ⴽⵓ :interval', - 'period_start_date' => 'ⴳ :date', - 'period_end_date' => 'ⵉ :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[ⴰⵙⵙ ⴰ/ⴰⴷ ⴳ] LT', - 'nextDay' => '[ⴰⵙⴽⴽⴰ ⴳ] LT', - 'nextWeek' => 'dddd [ⴳ] LT', - 'lastDay' => '[ⴰⵙⵙⵏⵏⴰⵟ ⴳ] LT', - 'lastWeek' => 'dddd [ⴰⵎⴳⴳⴰⵔⵓ ⴳ] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ⵜⵉⴼⴰⵡⵜ', 'ⵜⴰⴷⴳⴳⵯⴰⵜ'], - 'months' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵟⵓⴱⵕ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⴰⵏⴱⵉⵔ'], - 'months_short' => ['ⵉⵏⵏ', 'ⴱⵕⴰ', 'ⵎⴰⵕ', 'ⵉⴱⵔ', 'ⵎⴰⵢ', 'ⵢⵓⵏ', 'ⵢⵓⵍ', 'ⵖⵓⵛ', 'ⵛⵓⵜ', 'ⴽⵟⵓ', 'ⵏⵓⵡ', 'ⴷⵓⵊ'], - 'weekdays' => ['ⵓⵙⴰⵎⴰⵙ', 'ⵡⴰⵢⵏⴰⵙ', 'ⵓⵙⵉⵏⴰⵙ', 'ⵡⴰⴽⵕⴰⵙ', 'ⵓⴽⵡⴰⵙ', 'ⵓⵙⵉⵎⵡⴰⵙ', 'ⵓⵙⵉⴹⵢⴰⵙ'], - 'weekdays_short' => ['ⵓⵙⴰ', 'ⵡⴰⵢ', 'ⵓⵙⵉ', 'ⵡⴰⴽ', 'ⵓⴽⵡ', 'ⵓⵙⵉⵎ', 'ⵓⵙⵉⴹ'], - 'weekdays_min' => ['ⵓⵙⴰ', 'ⵡⴰⵢ', 'ⵓⵙⵉ', 'ⵡⴰⴽ', 'ⵓⴽⵡ', 'ⵓⵙⵉⵎ', 'ⵓⵙⵉⴹ'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' ⴷ '], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh.php deleted file mode 100644 index 1187c3d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - xuri - * - sycuato - * - bokideckonja - * - Luo Ning - * - William Yang (williamyang233) - */ -return array_merge(require __DIR__.'/zh_Hans.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY年M月D日', - 'LLL' => 'YYYY年M月D日 A h点mm分', - 'LLLL' => 'YYYY年M月D日dddd A h点mm分', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php deleted file mode 100644 index 9c05d5a..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - monkeycon - * - François B - * - Jason Katz-Brown - * - Serhan Apaydın - * - Matt Johnson - * - JD Isaacks - * - Zeno Zeng - * - Chris Hemp - * - shankesgk2 - */ -return array_merge(require __DIR__.'/zh.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY年M月D日', - 'LLL' => 'YYYY年M月D日Ah点mm分', - 'LLLL' => 'YYYY年M月D日ddddAh点mm分', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php deleted file mode 100644 index c3ee9fc..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant_HK.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php deleted file mode 100644 index 38742ac..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - monkeycon - * - François B - * - Jason Katz-Brown - * - Konstantin Konev - * - Chris Lam - * - Serhan Apaydın - * - Gary Lo - * - JD Isaacks - * - Chris Hemp - * - shankesgk2 - * - Daniel Cheung (danvim) - */ -return [ - 'year' => ':count:optional-space年', - 'y' => ':count:optional-space年', - 'month' => ':count:optional-space个月', - 'm' => ':count:optional-space个月', - 'week' => ':count:optional-space周', - 'w' => ':count:optional-space周', - 'day' => ':count:optional-space天', - 'd' => ':count:optional-space天', - 'hour' => ':count:optional-space小时', - 'h' => ':count:optional-space小时', - 'minute' => ':count:optional-space分钟', - 'min' => ':count:optional-space分钟', - 'second' => ':count:optional-space秒', - 'a_second' => '{1}几秒|]1,Inf[:count:optional-space秒', - 's' => ':count:optional-space秒', - 'ago' => ':time前', - 'from_now' => ':time后', - 'after' => ':time后', - 'before' => ':time前', - 'diff_now' => '现在', - 'diff_today' => '今天', - 'diff_yesterday' => '昨天', - 'diff_tomorrow' => '明天', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY年M月D日', - 'LLL' => 'YYYY年M月D日 HH:mm', - 'LLLL' => 'YYYY年M月D日dddd HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[今天]LT', - 'nextDay' => '[明天]LT', - 'nextWeek' => '[下]ddddLT', - 'lastDay' => '[昨天]LT', - 'lastWeek' => '[上]ddddLT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number, $period) { - return match ($period) { - 'd', 'D', 'DDD' => $number.'日', - 'M' => $number.'月', - 'w', 'W' => $number.'周', - default => $number, - }; - }, - 'meridiem' => static function ($hour, $minute) { - $time = $hour * 100 + $minute; - if ($time < 600) { - return '凌晨'; - } - if ($time < 900) { - return '早上'; - } - if ($time < 1130) { - return '上午'; - } - if ($time < 1230) { - return '中午'; - } - if ($time < 1800) { - return '下午'; - } - - return '晚上'; - }, - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], - 'weekdays_short' => ['周日', '周一', '周二', '周三', '周四', '周五', '周六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => '', -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php deleted file mode 100644 index db913ca..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hans.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php deleted file mode 100644 index db913ca..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hans.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php deleted file mode 100644 index db913ca..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hans.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php deleted file mode 100644 index 8b567c4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Adam - * - monkeycon - * - François B - * - Jason Katz-Brown - * - Chris Lam - * - Serhan Apaydın - * - Gary Lo - * - JD Isaacks - * - Chris Hemp - * - Eddie - * - KID - * - shankesgk2 - * - Daniel Cheung (danvim) - */ -return [ - 'year' => ':count:optional-space年', - 'y' => ':count:optional-space年', - 'month' => ':count:optional-space個月', - 'm' => ':count:optional-space月', - 'week' => ':count:optional-space週', - 'w' => ':count:optional-space週', - 'day' => ':count:optional-space天', - 'd' => ':count:optional-space天', - 'hour' => ':count:optional-space小時', - 'h' => ':count:optional-space小時', - 'minute' => ':count:optional-space分鐘', - 'min' => ':count:optional-space分鐘', - 'second' => ':count:optional-space秒', - 'a_second' => '{1}幾秒|]1,Inf[:count:optional-space秒', - 's' => ':count:optional-space秒', - 'ago' => ':time前', - 'from_now' => ':time後', - 'after' => ':time後', - 'before' => ':time前', - 'diff_now' => '現在', - 'diff_today' => '今天', - 'diff_yesterday' => '昨天', - 'diff_tomorrow' => '明天', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY年M月D日', - 'LLL' => 'YYYY年M月D日 HH:mm', - 'LLLL' => 'YYYY年M月D日dddd HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[今天] LT', - 'nextDay' => '[明天] LT', - 'nextWeek' => '[下]dddd LT', - 'lastDay' => '[昨天] LT', - 'lastWeek' => '[上]dddd LT', - 'sameElse' => 'L', - ], - 'ordinal' => static function ($number, $period) { - return match ($period) { - 'd', 'D', 'DDD' => $number.'日', - 'M' => $number.'月', - 'w', 'W' => $number.'周', - default => $number, - }; - }, - 'meridiem' => static function ($hour, $minute) { - $time = $hour * 100 + $minute; - if ($time < 600) { - return '凌晨'; - } - if ($time < 900) { - return '早上'; - } - if ($time < 1130) { - return '上午'; - } - if ($time < 1230) { - return '中午'; - } - if ($time < 1800) { - return '下午'; - } - - return '晚上'; - }, - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], - 'weekdays_short' => ['週日', '週一', '週二', '週三', '週四', '週五', '週六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => '', -]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php deleted file mode 100644 index e2526f1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php deleted file mode 100644 index e2526f1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php deleted file mode 100644 index e2526f1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php deleted file mode 100644 index 1c86d47..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - tarunvelli - * - Eddie - * - KID - * - shankesgk2 - */ -return array_replace_recursive(require __DIR__.'/zh_Hant.php', [ - 'after' => ':time后', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php deleted file mode 100644 index c451a56..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/zh.php', [ - 'formats' => [ - 'L' => 'YYYY年MM月DD日', - ], - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php deleted file mode 100644 index c6789ed..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant_TW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php deleted file mode 100644 index b0d9ba8..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/zh.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zu.php b/vendor/nesbot/carbon/src/Carbon/Lang/zu.php deleted file mode 100644 index 9a6cce0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zu.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/zu_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php deleted file mode 100644 index b1e8bc0..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Januwari', 'Februwari', 'Mashi', 'Ephreli', 'Meyi', 'Juni', 'Julayi', 'Agasti', 'Septhemba', 'Okthoba', 'Novemba', 'Disemba'], - 'months_short' => ['Jan', 'Feb', 'Mas', 'Eph', 'Mey', 'Jun', 'Jul', 'Aga', 'Sep', 'Okt', 'Nov', 'Dis'], - 'weekdays' => ['iSonto', 'uMsombuluko', 'uLwesibili', 'uLwesithathu', 'uLwesine', 'uLwesihlanu', 'uMgqibelo'], - 'weekdays_short' => ['Son', 'Mso', 'Bil', 'Tha', 'Sin', 'Hla', 'Mgq'], - 'weekdays_min' => ['Son', 'Mso', 'Bil', 'Tha', 'Sin', 'Hla', 'Mgq'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - - 'year' => 'kweminyaka engu-:count', - 'y' => 'kweminyaka engu-:count', - 'a_year' => 'kweminyaka engu-:count', - - 'month' => 'izinyanga ezingu-:count', - 'm' => 'izinyanga ezingu-:count', - 'a_month' => 'izinyanga ezingu-:count', - - 'week' => 'lwamasonto angu-:count', - 'w' => 'lwamasonto angu-:count', - 'a_week' => 'lwamasonto angu-:count', - - 'day' => 'ezingaba ngu-:count', - 'd' => 'ezingaba ngu-:count', - 'a_day' => 'ezingaba ngu-:count', - - 'hour' => 'amahora angu-:count', - 'h' => 'amahora angu-:count', - 'a_hour' => 'amahora angu-:count', - - 'minute' => 'ngemizuzu engu-:count', - 'min' => 'ngemizuzu engu-:count', - 'a_minute' => 'ngemizuzu engu-:count', - - 'second' => 'imizuzwana engu-:count', - 's' => 'imizuzwana engu-:count', - 'a_second' => 'imizuzwana engu-:count', -]); diff --git a/vendor/nesbot/carbon/src/Carbon/Language.php b/vendor/nesbot/carbon/src/Carbon/Language.php deleted file mode 100644 index 6197e8b..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Language.php +++ /dev/null @@ -1,271 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use JsonSerializable; - -class Language implements JsonSerializable -{ - protected static ?array $languagesNames = null; - - protected static ?array $regionsNames = null; - - protected string $id; - - protected string $code; - - protected ?string $variant = null; - - protected ?string $region = null; - - protected ?array $names = null; - - protected ?string $isoName = null; - - protected ?string $nativeName = null; - - public function __construct(string $id) - { - $this->id = str_replace('-', '_', $id); - $parts = explode('_', $this->id); - $this->code = $parts[0]; - - if (isset($parts[1])) { - if (!preg_match('/^[A-Z]+$/', $parts[1])) { - $this->variant = $parts[1]; - $parts[1] = $parts[2] ?? null; - } - if ($parts[1]) { - $this->region = $parts[1]; - } - } - } - - /** - * Get the list of the known languages. - * - * @return array - */ - public static function all(): array - { - static::$languagesNames ??= require __DIR__.'/List/languages.php'; - - return static::$languagesNames; - } - - /** - * Get the list of the known regions. - * - * ⚠ ISO 3166-2 short name provided with no warranty, should not - * be used for any purpose to show official state names. - */ - public static function regions(): array - { - static::$regionsNames ??= require __DIR__.'/List/regions.php'; - - return static::$regionsNames; - } - - /** - * Get both isoName and nativeName as an array. - */ - public function getNames(): array - { - $this->names ??= static::all()[$this->code] ?? [ - 'isoName' => $this->code, - 'nativeName' => $this->code, - ]; - - return $this->names; - } - - /** - * Returns the original locale ID. - */ - public function getId(): string - { - return $this->id; - } - - /** - * Returns the code of the locale "en"/"fr". - */ - public function getCode(): string - { - return $this->code; - } - - /** - * Returns the variant code such as cyrl/latn. - */ - public function getVariant(): ?string - { - return $this->variant; - } - - /** - * Returns the variant such as Cyrillic/Latin. - */ - public function getVariantName(): ?string - { - if ($this->variant === 'Latn') { - return 'Latin'; - } - - if ($this->variant === 'Cyrl') { - return 'Cyrillic'; - } - - return $this->variant; - } - - /** - * Returns the region part of the locale. - */ - public function getRegion(): ?string - { - return $this->region; - } - - /** - * Returns the region name for the current language. - * - * ⚠ ISO 3166-2 short name provided with no warranty, should not - * be used for any purpose to show official state names. - */ - public function getRegionName(): ?string - { - return $this->region ? (static::regions()[$this->region] ?? $this->region) : null; - } - - /** - * Returns the long ISO language name. - */ - public function getFullIsoName(): string - { - $this->isoName ??= $this->getNames()['isoName']; - - return $this->isoName; - } - - /** - * Set the ISO language name. - */ - public function setIsoName(string $isoName): static - { - $this->isoName = $isoName; - - return $this; - } - - /** - * Return the full name of the language in this language. - */ - public function getFullNativeName(): string - { - $this->nativeName ??= $this->getNames()['nativeName']; - - return $this->nativeName; - } - - /** - * Set the name of the language in this language. - */ - public function setNativeName(string $nativeName): static - { - $this->nativeName = $nativeName; - - return $this; - } - - /** - * Returns the short ISO language name. - */ - public function getIsoName(): string - { - $name = $this->getFullIsoName(); - - return trim(strstr($name, ',', true) ?: $name); - } - - /** - * Get the short name of the language in this language. - */ - public function getNativeName(): string - { - $name = $this->getFullNativeName(); - - return trim(strstr($name, ',', true) ?: $name); - } - - /** - * Get a string with short ISO name, region in parentheses if applicable, variant in parentheses if applicable. - */ - public function getIsoDescription(): string - { - $region = $this->getRegionName(); - $variant = $this->getVariantName(); - - return $this->getIsoName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : ''); - } - - /** - * Get a string with short native name, region in parentheses if applicable, variant in parentheses if applicable. - */ - public function getNativeDescription(): string - { - $region = $this->getRegionName(); - $variant = $this->getVariantName(); - - return $this->getNativeName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : ''); - } - - /** - * Get a string with long ISO name, region in parentheses if applicable, variant in parentheses if applicable. - */ - public function getFullIsoDescription(): string - { - $region = $this->getRegionName(); - $variant = $this->getVariantName(); - - return $this->getFullIsoName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : ''); - } - - /** - * Get a string with long native name, region in parentheses if applicable, variant in parentheses if applicable. - */ - public function getFullNativeDescription(): string - { - $region = $this->getRegionName(); - $variant = $this->getVariantName(); - - return $this->getFullNativeName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : ''); - } - - /** - * Returns the original locale ID. - */ - public function __toString(): string - { - return $this->getId(); - } - - /** - * Get a string with short ISO name, region in parentheses if applicable, variant in parentheses if applicable. - */ - public function jsonSerialize(): string - { - return $this->getIsoDescription(); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php b/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php deleted file mode 100644 index ebd26bc..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Laravel; - -use Carbon\Carbon; -use Carbon\CarbonImmutable; -use Carbon\CarbonInterval; -use Carbon\CarbonPeriod; -use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; -use Illuminate\Events\Dispatcher; -use Illuminate\Events\EventDispatcher; -use Illuminate\Support\Carbon as IlluminateCarbon; -use Illuminate\Support\Facades\Date; -use Throwable; - -class ServiceProvider extends \Illuminate\Support\ServiceProvider -{ - /** @var callable|null */ - protected $appGetter = null; - - /** @var callable|null */ - protected $localeGetter = null; - - public function setAppGetter(?callable $appGetter): void - { - $this->appGetter = $appGetter; - } - - public function setLocaleGetter(?callable $localeGetter): void - { - $this->localeGetter = $localeGetter; - } - - public function boot() - { - $this->updateLocale(); - - if (!$this->app->bound('events')) { - return; - } - - $service = $this; - $events = $this->app['events']; - - if ($this->isEventDispatcher($events)) { - $events->listen(class_exists('Illuminate\Foundation\Events\LocaleUpdated') ? 'Illuminate\Foundation\Events\LocaleUpdated' : 'locale.changed', function () use ($service) { - $service->updateLocale(); - }); - } - } - - public function updateLocale() - { - $locale = $this->getLocale(); - - if ($locale === null) { - return; - } - - Carbon::setLocale($locale); - CarbonImmutable::setLocale($locale); - CarbonPeriod::setLocale($locale); - CarbonInterval::setLocale($locale); - - if (class_exists(IlluminateCarbon::class)) { - IlluminateCarbon::setLocale($locale); - } - - if (class_exists(Date::class)) { - try { - $root = Date::getFacadeRoot(); - $root->setLocale($locale); - } catch (Throwable) { - // Non Carbon class in use in Date facade - } - } - } - - public function register() - { - // Needed for Laravel < 5.3 compatibility - } - - protected function getLocale() - { - if ($this->localeGetter) { - return ($this->localeGetter)(); - } - - $app = $this->getApp(); - $app = $app && method_exists($app, 'getLocale') - ? $app - : $this->getGlobalApp('translator'); - - return $app ? $app->getLocale() : null; - } - - protected function getApp() - { - if ($this->appGetter) { - return ($this->appGetter)(); - } - - return $this->app ?? $this->getGlobalApp(); - } - - protected function getGlobalApp(...$args) - { - return \function_exists('app') ? \app(...$args) : null; - } - - protected function isEventDispatcher($instance) - { - return $instance instanceof EventDispatcher - || $instance instanceof Dispatcher - || $instance instanceof DispatcherContract; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/List/languages.php b/vendor/nesbot/carbon/src/Carbon/List/languages.php deleted file mode 100644 index 5577877..0000000 --- a/vendor/nesbot/carbon/src/Carbon/List/languages.php +++ /dev/null @@ -1,1241 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return [ - /* - * ISO 639-2 - */ - 'ab' => [ - 'isoName' => 'Abkhazian', - 'nativeName' => 'аҧсуа бызшәа, аҧсшәа', - ], - 'aa' => [ - 'isoName' => 'Afar', - 'nativeName' => 'Afaraf', - ], - 'af' => [ - 'isoName' => 'Afrikaans', - 'nativeName' => 'Afrikaans', - ], - 'ak' => [ - 'isoName' => 'Akan', - 'nativeName' => 'Akan', - ], - 'sq' => [ - 'isoName' => 'Albanian', - 'nativeName' => 'Shqip', - ], - 'am' => [ - 'isoName' => 'Amharic', - 'nativeName' => 'አማርኛ', - ], - 'ar' => [ - 'isoName' => 'Arabic', - 'nativeName' => 'العربية', - ], - 'an' => [ - 'isoName' => 'Aragonese', - 'nativeName' => 'aragonés', - ], - 'hy' => [ - 'isoName' => 'Armenian', - 'nativeName' => 'Հայերեն', - ], - 'as' => [ - 'isoName' => 'Assamese', - 'nativeName' => 'অসমীয়া', - ], - 'av' => [ - 'isoName' => 'Avaric', - 'nativeName' => 'авар мацӀ, магӀарул мацӀ', - ], - 'ae' => [ - 'isoName' => 'Avestan', - 'nativeName' => 'avesta', - ], - 'ay' => [ - 'isoName' => 'Aymara', - 'nativeName' => 'aymar aru', - ], - 'az' => [ - 'isoName' => 'Azerbaijani', - 'nativeName' => 'azərbaycan dili', - ], - 'bm' => [ - 'isoName' => 'Bambara', - 'nativeName' => 'bamanankan', - ], - 'ba' => [ - 'isoName' => 'Bashkir', - 'nativeName' => 'башҡорт теле', - ], - 'eu' => [ - 'isoName' => 'Basque', - 'nativeName' => 'euskara, euskera', - ], - 'be' => [ - 'isoName' => 'Belarusian', - 'nativeName' => 'беларуская мова', - ], - 'bn' => [ - 'isoName' => 'Bengali', - 'nativeName' => 'বাংলা', - ], - 'bh' => [ - 'isoName' => 'Bihari languages', - 'nativeName' => 'भोजपुरी', - ], - 'bi' => [ - 'isoName' => 'Bislama', - 'nativeName' => 'Bislama', - ], - 'bs' => [ - 'isoName' => 'Bosnian', - 'nativeName' => 'bosanski jezik', - ], - 'br' => [ - 'isoName' => 'Breton', - 'nativeName' => 'brezhoneg', - ], - 'bg' => [ - 'isoName' => 'Bulgarian', - 'nativeName' => 'български език', - ], - 'my' => [ - 'isoName' => 'Burmese', - 'nativeName' => 'ဗမာစာ', - ], - 'ca' => [ - 'isoName' => 'Catalan, Valencian', - 'nativeName' => 'català, valencià', - ], - 'ch' => [ - 'isoName' => 'Chamorro', - 'nativeName' => 'Chamoru', - ], - 'ce' => [ - 'isoName' => 'Chechen', - 'nativeName' => 'нохчийн мотт', - ], - 'ny' => [ - 'isoName' => 'Chichewa, Chewa, Nyanja', - 'nativeName' => 'chiCheŵa, chinyanja', - ], - 'zh' => [ - 'isoName' => 'Chinese', - 'nativeName' => '中文 (Zhōngwén), 汉语, 漢語', - ], - 'cv' => [ - 'isoName' => 'Chuvash', - 'nativeName' => 'чӑваш чӗлхи', - ], - 'kw' => [ - 'isoName' => 'Cornish', - 'nativeName' => 'Kernewek', - ], - 'co' => [ - 'isoName' => 'Corsican', - 'nativeName' => 'corsu, lingua corsa', - ], - 'cr' => [ - 'isoName' => 'Cree', - 'nativeName' => 'ᓀᐦᐃᔭᐍᐏᐣ', - ], - 'hr' => [ - 'isoName' => 'Croatian', - 'nativeName' => 'hrvatski jezik', - ], - 'cs' => [ - 'isoName' => 'Czech', - 'nativeName' => 'čeština, český jazyk', - ], - 'da' => [ - 'isoName' => 'Danish', - 'nativeName' => 'dansk', - ], - 'dv' => [ - 'isoName' => 'Divehi, Dhivehi, Maldivian', - 'nativeName' => 'ދިވެހި', - ], - 'nl' => [ - 'isoName' => 'Dutch, Flemish', - 'nativeName' => 'Nederlands, Vlaams', - ], - 'dz' => [ - 'isoName' => 'Dzongkha', - 'nativeName' => 'རྫོང་ཁ', - ], - 'en' => [ - 'isoName' => 'English', - 'nativeName' => 'English', - ], - 'eo' => [ - 'isoName' => 'Esperanto', - 'nativeName' => 'Esperanto', - ], - 'et' => [ - 'isoName' => 'Estonian', - 'nativeName' => 'eesti, eesti keel', - ], - 'ee' => [ - 'isoName' => 'Ewe', - 'nativeName' => 'Eʋegbe', - ], - 'fo' => [ - 'isoName' => 'Faroese', - 'nativeName' => 'føroyskt', - ], - 'fj' => [ - 'isoName' => 'Fijian', - 'nativeName' => 'vosa Vakaviti', - ], - 'fi' => [ - 'isoName' => 'Finnish', - 'nativeName' => 'suomi, suomen kieli', - ], - 'fr' => [ - 'isoName' => 'French', - 'nativeName' => 'français', - ], - 'ff' => [ - 'isoName' => 'Fulah', - 'nativeName' => 'Fulfulde, Pulaar, Pular', - ], - 'gl' => [ - 'isoName' => 'Galician', - 'nativeName' => 'Galego', - ], - 'ka' => [ - 'isoName' => 'Georgian', - 'nativeName' => 'ქართული', - ], - 'de' => [ - 'isoName' => 'German', - 'nativeName' => 'Deutsch', - ], - 'el' => [ - 'isoName' => 'Greek (modern)', - 'nativeName' => 'ελληνικά', - ], - 'gn' => [ - 'isoName' => 'Guaraní', - 'nativeName' => 'Avañe\'ẽ', - ], - 'gu' => [ - 'isoName' => 'Gujarati', - 'nativeName' => 'ગુજરાતી', - ], - 'ht' => [ - 'isoName' => 'Haitian, Haitian Creole', - 'nativeName' => 'Kreyòl ayisyen', - ], - 'ha' => [ - 'isoName' => 'Hausa', - 'nativeName' => '(Hausa) هَوُسَ', - ], - 'he' => [ - 'isoName' => 'Hebrew (modern)', - 'nativeName' => 'עברית', - ], - 'hz' => [ - 'isoName' => 'Herero', - 'nativeName' => 'Otjiherero', - ], - 'hi' => [ - 'isoName' => 'Hindi', - 'nativeName' => 'हिन्दी, हिंदी', - ], - 'ho' => [ - 'isoName' => 'Hiri Motu', - 'nativeName' => 'Hiri Motu', - ], - 'hu' => [ - 'isoName' => 'Hungarian', - 'nativeName' => 'magyar', - ], - 'ia' => [ - 'isoName' => 'Interlingua', - 'nativeName' => 'Interlingua', - ], - 'id' => [ - 'isoName' => 'Indonesian', - 'nativeName' => 'Bahasa Indonesia', - ], - 'ie' => [ - 'isoName' => 'Interlingue', - 'nativeName' => 'Originally called Occidental; then Interlingue after WWII', - ], - 'ga' => [ - 'isoName' => 'Irish', - 'nativeName' => 'Gaeilge', - ], - 'ig' => [ - 'isoName' => 'Igbo', - 'nativeName' => 'Asụsụ Igbo', - ], - 'ik' => [ - 'isoName' => 'Inupiaq', - 'nativeName' => 'Iñupiaq, Iñupiatun', - ], - 'io' => [ - 'isoName' => 'Ido', - 'nativeName' => 'Ido', - ], - 'is' => [ - 'isoName' => 'Icelandic', - 'nativeName' => 'Íslenska', - ], - 'it' => [ - 'isoName' => 'Italian', - 'nativeName' => 'Italiano', - ], - 'iu' => [ - 'isoName' => 'Inuktitut', - 'nativeName' => 'ᐃᓄᒃᑎᑐᑦ', - ], - 'ja' => [ - 'isoName' => 'Japanese', - 'nativeName' => '日本語 (にほんご)', - ], - 'jv' => [ - 'isoName' => 'Javanese', - 'nativeName' => 'ꦧꦱꦗꦮ, Basa Jawa', - ], - 'kl' => [ - 'isoName' => 'Kalaallisut, Greenlandic', - 'nativeName' => 'kalaallisut, kalaallit oqaasii', - ], - 'kn' => [ - 'isoName' => 'Kannada', - 'nativeName' => 'ಕನ್ನಡ', - ], - 'kr' => [ - 'isoName' => 'Kanuri', - 'nativeName' => 'Kanuri', - ], - 'ks' => [ - 'isoName' => 'Kashmiri', - 'nativeName' => 'कश्मीरी, كشميري‎', - ], - 'kk' => [ - 'isoName' => 'Kazakh', - 'nativeName' => 'қазақ тілі', - ], - 'km' => [ - 'isoName' => 'Central Khmer', - 'nativeName' => 'ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ', - ], - 'ki' => [ - 'isoName' => 'Kikuyu, Gikuyu', - 'nativeName' => 'Gĩkũyũ', - ], - 'rw' => [ - 'isoName' => 'Kinyarwanda', - 'nativeName' => 'Ikinyarwanda', - ], - 'ky' => [ - 'isoName' => 'Kirghiz, Kyrgyz', - 'nativeName' => 'Кыргызча, Кыргыз тили', - ], - 'kv' => [ - 'isoName' => 'Komi', - 'nativeName' => 'коми кыв', - ], - 'kg' => [ - 'isoName' => 'Kongo', - 'nativeName' => 'Kikongo', - ], - 'ko' => [ - 'isoName' => 'Korean', - 'nativeName' => '한국어', - ], - 'ku' => [ - 'isoName' => 'Kurdish', - 'nativeName' => 'Kurdî, کوردی‎', - ], - 'kj' => [ - 'isoName' => 'Kuanyama, Kwanyama', - 'nativeName' => 'Kuanyama', - ], - 'la' => [ - 'isoName' => 'Latin', - 'nativeName' => 'latine, lingua latina', - ], - 'lb' => [ - 'isoName' => 'Luxembourgish, Letzeburgesch', - 'nativeName' => 'Lëtzebuergesch', - ], - 'lg' => [ - 'isoName' => 'Ganda', - 'nativeName' => 'Luganda', - ], - 'li' => [ - 'isoName' => 'Limburgan, Limburger, Limburgish', - 'nativeName' => 'Limburgs', - ], - 'ln' => [ - 'isoName' => 'Lingala', - 'nativeName' => 'Lingála', - ], - 'lo' => [ - 'isoName' => 'Lao', - 'nativeName' => 'ພາສາລາວ', - ], - 'lt' => [ - 'isoName' => 'Lithuanian', - 'nativeName' => 'lietuvių kalba', - ], - 'lu' => [ - 'isoName' => 'Luba-Katanga', - 'nativeName' => 'Kiluba', - ], - 'lv' => [ - 'isoName' => 'Latvian', - 'nativeName' => 'latviešu valoda', - ], - 'gv' => [ - 'isoName' => 'Manx', - 'nativeName' => 'Gaelg, Gailck', - ], - 'mk' => [ - 'isoName' => 'Macedonian', - 'nativeName' => 'македонски јазик', - ], - 'mg' => [ - 'isoName' => 'Malagasy', - 'nativeName' => 'fiteny malagasy', - ], - 'ms' => [ - 'isoName' => 'Malay', - 'nativeName' => 'Bahasa Melayu, بهاس ملايو‎', - ], - 'ml' => [ - 'isoName' => 'Malayalam', - 'nativeName' => 'മലയാളം', - ], - 'mt' => [ - 'isoName' => 'Maltese', - 'nativeName' => 'Malti', - ], - 'mi' => [ - 'isoName' => 'Maori', - 'nativeName' => 'te reo Māori', - ], - 'mr' => [ - 'isoName' => 'Marathi', - 'nativeName' => 'मराठी', - ], - 'mh' => [ - 'isoName' => 'Marshallese', - 'nativeName' => 'Kajin M̧ajeļ', - ], - 'mn' => [ - 'isoName' => 'Mongolian', - 'nativeName' => 'Монгол хэл', - ], - 'na' => [ - 'isoName' => 'Nauru', - 'nativeName' => 'Dorerin Naoero', - ], - 'nv' => [ - 'isoName' => 'Navajo, Navaho', - 'nativeName' => 'Diné bizaad', - ], - 'nd' => [ - 'isoName' => 'North Ndebele', - 'nativeName' => 'isiNdebele', - ], - 'ne' => [ - 'isoName' => 'Nepali', - 'nativeName' => 'नेपाली', - ], - 'ng' => [ - 'isoName' => 'Ndonga', - 'nativeName' => 'Owambo', - ], - 'nb' => [ - 'isoName' => 'Norwegian Bokmål', - 'nativeName' => 'Norsk Bokmål', - ], - 'nn' => [ - 'isoName' => 'Norwegian Nynorsk', - 'nativeName' => 'Norsk Nynorsk', - ], - 'no' => [ - 'isoName' => 'Norwegian', - 'nativeName' => 'Norsk', - ], - 'ii' => [ - 'isoName' => 'Sichuan Yi, Nuosu', - 'nativeName' => 'ꆈꌠ꒿ Nuosuhxop', - ], - 'nr' => [ - 'isoName' => 'South Ndebele', - 'nativeName' => 'isiNdebele', - ], - 'oc' => [ - 'isoName' => 'Occitan', - 'nativeName' => 'occitan, lenga d\'òc', - ], - 'oj' => [ - 'isoName' => 'Ojibwa', - 'nativeName' => 'ᐊᓂᔑᓈᐯᒧᐎᓐ', - ], - 'cu' => [ - 'isoName' => 'Church Slavic, Church Slavonic, Old Church Slavonic, Old Slavonic, Old Bulgarian', - 'nativeName' => 'ѩзыкъ словѣньскъ', - ], - 'om' => [ - 'isoName' => 'Oromo', - 'nativeName' => 'Afaan Oromoo', - ], - 'or' => [ - 'isoName' => 'Oriya', - 'nativeName' => 'ଓଡ଼ିଆ', - ], - 'os' => [ - 'isoName' => 'Ossetian, Ossetic', - 'nativeName' => 'ирон æвзаг', - ], - 'pa' => [ - 'isoName' => 'Panjabi, Punjabi', - 'nativeName' => 'ਪੰਜਾਬੀ', - ], - 'pi' => [ - 'isoName' => 'Pali', - 'nativeName' => 'पाऴि', - ], - 'fa' => [ - 'isoName' => 'Persian', - 'nativeName' => 'فارسی', - ], - 'pl' => [ - 'isoName' => 'Polish', - 'nativeName' => 'język polski, polszczyzna', - ], - 'ps' => [ - 'isoName' => 'Pashto, Pushto', - 'nativeName' => 'پښتو', - ], - 'pt' => [ - 'isoName' => 'Portuguese', - 'nativeName' => 'Português', - ], - 'qu' => [ - 'isoName' => 'Quechua', - 'nativeName' => 'Runa Simi, Kichwa', - ], - 'rm' => [ - 'isoName' => 'Romansh', - 'nativeName' => 'Rumantsch Grischun', - ], - 'rn' => [ - 'isoName' => 'Rundi', - 'nativeName' => 'Ikirundi', - ], - 'ro' => [ - 'isoName' => 'Romanian, Moldavian, Moldovan', - 'nativeName' => 'Română', - ], - 'ru' => [ - 'isoName' => 'Russian', - 'nativeName' => 'русский', - ], - 'sa' => [ - 'isoName' => 'Sanskrit', - 'nativeName' => 'संस्कृतम्', - ], - 'sc' => [ - 'isoName' => 'Sardinian', - 'nativeName' => 'sardu', - ], - 'sd' => [ - 'isoName' => 'Sindhi', - 'nativeName' => 'सिन्धी, سنڌي، سندھی‎', - ], - 'se' => [ - 'isoName' => 'Northern Sami', - 'nativeName' => 'Davvisámegiella', - ], - 'sm' => [ - 'isoName' => 'Samoan', - 'nativeName' => 'gagana fa\'a Samoa', - ], - 'sg' => [ - 'isoName' => 'Sango', - 'nativeName' => 'yângâ tî sängö', - ], - 'sr' => [ - 'isoName' => 'Serbian', - 'nativeName' => 'српски језик', - ], - 'gd' => [ - 'isoName' => 'Gaelic, Scottish Gaelic', - 'nativeName' => 'Gàidhlig', - ], - 'sn' => [ - 'isoName' => 'Shona', - 'nativeName' => 'chiShona', - ], - 'si' => [ - 'isoName' => 'Sinhala, Sinhalese', - 'nativeName' => 'සිංහල', - ], - 'sk' => [ - 'isoName' => 'Slovak', - 'nativeName' => 'Slovenčina, Slovenský Jazyk', - ], - 'sl' => [ - 'isoName' => 'Slovene', - 'nativeName' => 'Slovenski Jezik, Slovenščina', - ], - 'so' => [ - 'isoName' => 'Somali', - 'nativeName' => 'Soomaaliga, af Soomaali', - ], - 'st' => [ - 'isoName' => 'Southern Sotho', - 'nativeName' => 'Sesotho', - ], - 'es' => [ - 'isoName' => 'Spanish, Castilian', - 'nativeName' => 'Español', - ], - 'su' => [ - 'isoName' => 'Sundanese', - 'nativeName' => 'Basa Sunda', - ], - 'sw' => [ - 'isoName' => 'Swahili', - 'nativeName' => 'Kiswahili', - ], - 'ss' => [ - 'isoName' => 'Swati', - 'nativeName' => 'SiSwati', - ], - 'sv' => [ - 'isoName' => 'Swedish', - 'nativeName' => 'Svenska', - ], - 'ta' => [ - 'isoName' => 'Tamil', - 'nativeName' => 'தமிழ்', - ], - 'te' => [ - 'isoName' => 'Telugu', - 'nativeName' => 'తెలుగు', - ], - 'tg' => [ - 'isoName' => 'Tajik', - 'nativeName' => 'тоҷикӣ, toçikī, تاجیکی‎', - ], - 'th' => [ - 'isoName' => 'Thai', - 'nativeName' => 'ไทย', - ], - 'ti' => [ - 'isoName' => 'Tigrinya', - 'nativeName' => 'ትግርኛ', - ], - 'bo' => [ - 'isoName' => 'Tibetan', - 'nativeName' => 'བོད་ཡིག', - ], - 'tk' => [ - 'isoName' => 'Turkmen', - 'nativeName' => 'Türkmen, Түркмен', - ], - 'tl' => [ - 'isoName' => 'Tagalog', - 'nativeName' => 'Wikang Tagalog', - ], - 'tn' => [ - 'isoName' => 'Tswana', - 'nativeName' => 'Setswana', - ], - 'to' => [ - 'isoName' => 'Tongan (Tonga Islands)', - 'nativeName' => 'Faka Tonga', - ], - 'tr' => [ - 'isoName' => 'Turkish', - 'nativeName' => 'Türkçe', - ], - 'ts' => [ - 'isoName' => 'Tsonga', - 'nativeName' => 'Xitsonga', - ], - 'tt' => [ - 'isoName' => 'Tatar', - 'nativeName' => 'татар теле, tatar tele', - ], - 'tw' => [ - 'isoName' => 'Twi', - 'nativeName' => 'Twi', - ], - 'ty' => [ - 'isoName' => 'Tahitian', - 'nativeName' => 'Reo Tahiti', - ], - 'ug' => [ - 'isoName' => 'Uighur, Uyghur', - 'nativeName' => 'Uyƣurqə, ‫ئۇيغۇرچ', - ], - 'uk' => [ - 'isoName' => 'Ukrainian', - 'nativeName' => 'Українська', - ], - 'ur' => [ - 'isoName' => 'Urdu', - 'nativeName' => 'اردو', - ], - 'uz' => [ - 'isoName' => 'Uzbek', - 'nativeName' => 'Oʻzbek, Ўзбек, أۇزبېك‎', - ], - 've' => [ - 'isoName' => 'Venda', - 'nativeName' => 'Tshivenḓa', - ], - 'vi' => [ - 'isoName' => 'Vietnamese', - 'nativeName' => 'Tiếng Việt', - ], - 'vo' => [ - 'isoName' => 'Volapük', - 'nativeName' => 'Volapük', - ], - 'wa' => [ - 'isoName' => 'Walloon', - 'nativeName' => 'Walon', - ], - 'cy' => [ - 'isoName' => 'Welsh', - 'nativeName' => 'Cymraeg', - ], - 'wo' => [ - 'isoName' => 'Wolof', - 'nativeName' => 'Wollof', - ], - 'fy' => [ - 'isoName' => 'Western Frisian', - 'nativeName' => 'Frysk', - ], - 'xh' => [ - 'isoName' => 'Xhosa', - 'nativeName' => 'isiXhosa', - ], - 'yi' => [ - 'isoName' => 'Yiddish', - 'nativeName' => 'ייִדיש', - ], - 'yo' => [ - 'isoName' => 'Yoruba', - 'nativeName' => 'Yorùbá', - ], - 'za' => [ - 'isoName' => 'Zhuang, Chuang', - 'nativeName' => 'Saɯ cueŋƅ, Saw cuengh', - ], - 'zu' => [ - 'isoName' => 'Zulu', - 'nativeName' => 'isiZulu', - ], - /* - * Add ISO 639-3 languages available in Carbon - */ - 'agq' => [ - 'isoName' => 'Aghem', - 'nativeName' => 'Aghem', - ], - 'agr' => [ - 'isoName' => 'Aguaruna', - 'nativeName' => 'Aguaruna', - ], - 'anp' => [ - 'isoName' => 'Angika', - 'nativeName' => 'Angika', - ], - 'asa' => [ - 'isoName' => 'Asu', - 'nativeName' => 'Asu', - ], - 'ast' => [ - 'isoName' => 'Asturian', - 'nativeName' => 'Asturian', - ], - 'ayc' => [ - 'isoName' => 'Southern Aymara', - 'nativeName' => 'Southern Aymara', - ], - 'bas' => [ - 'isoName' => 'Basaa', - 'nativeName' => 'Basaa', - ], - 'bem' => [ - 'isoName' => 'Bemba', - 'nativeName' => 'Bemba', - ], - 'bez' => [ - 'isoName' => 'Bena', - 'nativeName' => 'Bena', - ], - 'bhb' => [ - 'isoName' => 'Bhili', - 'nativeName' => 'Bhili', - ], - 'bho' => [ - 'isoName' => 'Bhojpuri', - 'nativeName' => 'Bhojpuri', - ], - 'brx' => [ - 'isoName' => 'Bodo', - 'nativeName' => 'Bodo', - ], - 'byn' => [ - 'isoName' => 'Bilin', - 'nativeName' => 'Bilin', - ], - 'ccp' => [ - 'isoName' => 'Chakma', - 'nativeName' => 'Chakma', - ], - 'cgg' => [ - 'isoName' => 'Chiga', - 'nativeName' => 'Chiga', - ], - 'chr' => [ - 'isoName' => 'Cherokee', - 'nativeName' => 'Cherokee', - ], - 'cmn' => [ - 'isoName' => 'Chinese', - 'nativeName' => 'Chinese', - ], - 'crh' => [ - 'isoName' => 'Crimean Turkish', - 'nativeName' => 'Crimean Turkish', - ], - 'csb' => [ - 'isoName' => 'Kashubian', - 'nativeName' => 'Kashubian', - ], - 'dav' => [ - 'isoName' => 'Taita', - 'nativeName' => 'Taita', - ], - 'dje' => [ - 'isoName' => 'Zarma', - 'nativeName' => 'Zarma', - ], - 'doi' => [ - 'isoName' => 'Dogri (macrolanguage)', - 'nativeName' => 'Dogri (macrolanguage)', - ], - 'dsb' => [ - 'isoName' => 'Lower Sorbian', - 'nativeName' => 'Lower Sorbian', - ], - 'dua' => [ - 'isoName' => 'Duala', - 'nativeName' => 'Duala', - ], - 'dyo' => [ - 'isoName' => 'Jola-Fonyi', - 'nativeName' => 'Jola-Fonyi', - ], - 'ebu' => [ - 'isoName' => 'Embu', - 'nativeName' => 'Embu', - ], - 'ewo' => [ - 'isoName' => 'Ewondo', - 'nativeName' => 'Ewondo', - ], - 'fil' => [ - 'isoName' => 'Filipino', - 'nativeName' => 'Filipino', - ], - 'fur' => [ - 'isoName' => 'Friulian', - 'nativeName' => 'Friulian', - ], - 'gez' => [ - 'isoName' => 'Geez', - 'nativeName' => 'Geez', - ], - 'gom' => [ - 'isoName' => 'Konkani, Goan', - 'nativeName' => 'ಕೊಂಕಣಿ', - ], - 'gsw' => [ - 'isoName' => 'Swiss German', - 'nativeName' => 'Swiss German', - ], - 'guz' => [ - 'isoName' => 'Gusii', - 'nativeName' => 'Gusii', - ], - 'hak' => [ - 'isoName' => 'Hakka Chinese', - 'nativeName' => 'Hakka Chinese', - ], - 'haw' => [ - 'isoName' => 'Hawaiian', - 'nativeName' => 'Hawaiian', - ], - 'hif' => [ - 'isoName' => 'Fiji Hindi', - 'nativeName' => 'Fiji Hindi', - ], - 'hne' => [ - 'isoName' => 'Chhattisgarhi', - 'nativeName' => 'Chhattisgarhi', - ], - 'hsb' => [ - 'isoName' => 'Upper Sorbian', - 'nativeName' => 'Upper Sorbian', - ], - 'jgo' => [ - 'isoName' => 'Ngomba', - 'nativeName' => 'Ngomba', - ], - 'jmc' => [ - 'isoName' => 'Machame', - 'nativeName' => 'Machame', - ], - 'kab' => [ - 'isoName' => 'Kabyle', - 'nativeName' => 'Kabyle', - ], - 'kam' => [ - 'isoName' => 'Kamba', - 'nativeName' => 'Kamba', - ], - 'kde' => [ - 'isoName' => 'Makonde', - 'nativeName' => 'Makonde', - ], - 'kea' => [ - 'isoName' => 'Kabuverdianu', - 'nativeName' => 'Kabuverdianu', - ], - 'khq' => [ - 'isoName' => 'Koyra Chiini', - 'nativeName' => 'Koyra Chiini', - ], - 'kkj' => [ - 'isoName' => 'Kako', - 'nativeName' => 'Kako', - ], - 'kln' => [ - 'isoName' => 'Kalenjin', - 'nativeName' => 'Kalenjin', - ], - 'kok' => [ - 'isoName' => 'Konkani', - 'nativeName' => 'Konkani', - ], - 'ksb' => [ - 'isoName' => 'Shambala', - 'nativeName' => 'Shambala', - ], - 'ksf' => [ - 'isoName' => 'Bafia', - 'nativeName' => 'Bafia', - ], - 'ksh' => [ - 'isoName' => 'Colognian', - 'nativeName' => 'Colognian', - ], - 'lag' => [ - 'isoName' => 'Langi', - 'nativeName' => 'Langi', - ], - 'lij' => [ - 'isoName' => 'Ligurian', - 'nativeName' => 'Ligurian', - ], - 'lkt' => [ - 'isoName' => 'Lakota', - 'nativeName' => 'Lakota', - ], - 'lrc' => [ - 'isoName' => 'Northern Luri', - 'nativeName' => 'Northern Luri', - ], - 'luo' => [ - 'isoName' => 'Luo', - 'nativeName' => 'Luo', - ], - 'luy' => [ - 'isoName' => 'Luyia', - 'nativeName' => 'Luyia', - ], - 'lzh' => [ - 'isoName' => 'Literary Chinese', - 'nativeName' => 'Literary Chinese', - ], - 'mag' => [ - 'isoName' => 'Magahi', - 'nativeName' => 'Magahi', - ], - 'mai' => [ - 'isoName' => 'Maithili', - 'nativeName' => 'Maithili', - ], - 'mas' => [ - 'isoName' => 'Masai', - 'nativeName' => 'Masai', - ], - 'mer' => [ - 'isoName' => 'Meru', - 'nativeName' => 'Meru', - ], - 'mfe' => [ - 'isoName' => 'Morisyen', - 'nativeName' => 'Morisyen', - ], - 'mgh' => [ - 'isoName' => 'Makhuwa-Meetto', - 'nativeName' => 'Makhuwa-Meetto', - ], - 'mgo' => [ - 'isoName' => 'Metaʼ', - 'nativeName' => 'Metaʼ', - ], - 'mhr' => [ - 'isoName' => 'Eastern Mari', - 'nativeName' => 'Eastern Mari', - ], - 'miq' => [ - 'isoName' => 'Mískito', - 'nativeName' => 'Mískito', - ], - 'mjw' => [ - 'isoName' => 'Karbi', - 'nativeName' => 'Karbi', - ], - 'mni' => [ - 'isoName' => 'Manipuri', - 'nativeName' => 'Manipuri', - ], - 'mua' => [ - 'isoName' => 'Mundang', - 'nativeName' => 'Mundang', - ], - 'mzn' => [ - 'isoName' => 'Mazanderani', - 'nativeName' => 'Mazanderani', - ], - 'nan' => [ - 'isoName' => 'Min Nan Chinese', - 'nativeName' => 'Min Nan Chinese', - ], - 'naq' => [ - 'isoName' => 'Nama', - 'nativeName' => 'Nama', - ], - 'nds' => [ - 'isoName' => 'Low German', - 'nativeName' => 'Low German', - ], - 'nhn' => [ - 'isoName' => 'Central Nahuatl', - 'nativeName' => 'Central Nahuatl', - ], - 'niu' => [ - 'isoName' => 'Niuean', - 'nativeName' => 'Niuean', - ], - 'nmg' => [ - 'isoName' => 'Kwasio', - 'nativeName' => 'Kwasio', - ], - 'nnh' => [ - 'isoName' => 'Ngiemboon', - 'nativeName' => 'Ngiemboon', - ], - 'nso' => [ - 'isoName' => 'Northern Sotho', - 'nativeName' => 'Northern Sotho', - ], - 'nus' => [ - 'isoName' => 'Nuer', - 'nativeName' => 'Nuer', - ], - 'nyn' => [ - 'isoName' => 'Nyankole', - 'nativeName' => 'Nyankole', - ], - 'pap' => [ - 'isoName' => 'Papiamento', - 'nativeName' => 'Papiamento', - ], - 'prg' => [ - 'isoName' => 'Prussian', - 'nativeName' => 'Prussian', - ], - 'quz' => [ - 'isoName' => 'Cusco Quechua', - 'nativeName' => 'Cusco Quechua', - ], - 'raj' => [ - 'isoName' => 'Rajasthani', - 'nativeName' => 'Rajasthani', - ], - 'rof' => [ - 'isoName' => 'Rombo', - 'nativeName' => 'Rombo', - ], - 'rwk' => [ - 'isoName' => 'Rwa', - 'nativeName' => 'Rwa', - ], - 'sah' => [ - 'isoName' => 'Sakha', - 'nativeName' => 'Sakha', - ], - 'saq' => [ - 'isoName' => 'Samburu', - 'nativeName' => 'Samburu', - ], - 'sat' => [ - 'isoName' => 'Santali', - 'nativeName' => 'Santali', - ], - 'sbp' => [ - 'isoName' => 'Sangu', - 'nativeName' => 'Sangu', - ], - 'scr' => [ - 'isoName' => 'Serbo Croatian', - 'nativeName' => 'Serbo Croatian', - ], - 'seh' => [ - 'isoName' => 'Sena', - 'nativeName' => 'Sena', - ], - 'ses' => [ - 'isoName' => 'Koyraboro Senni', - 'nativeName' => 'Koyraboro Senni', - ], - 'sgs' => [ - 'isoName' => 'Samogitian', - 'nativeName' => 'Samogitian', - ], - 'shi' => [ - 'isoName' => 'Tachelhit', - 'nativeName' => 'Tachelhit', - ], - 'shn' => [ - 'isoName' => 'Shan', - 'nativeName' => 'Shan', - ], - 'shs' => [ - 'isoName' => 'Shuswap', - 'nativeName' => 'Shuswap', - ], - 'sid' => [ - 'isoName' => 'Sidamo', - 'nativeName' => 'Sidamo', - ], - 'smn' => [ - 'isoName' => 'Inari Sami', - 'nativeName' => 'Inari Sami', - ], - 'szl' => [ - 'isoName' => 'Silesian', - 'nativeName' => 'Silesian', - ], - 'tcy' => [ - 'isoName' => 'Tulu', - 'nativeName' => 'Tulu', - ], - 'teo' => [ - 'isoName' => 'Teso', - 'nativeName' => 'Teso', - ], - 'tet' => [ - 'isoName' => 'Tetum', - 'nativeName' => 'Tetum', - ], - 'the' => [ - 'isoName' => 'Chitwania Tharu', - 'nativeName' => 'Chitwania Tharu', - ], - 'tig' => [ - 'isoName' => 'Tigre', - 'nativeName' => 'Tigre', - ], - 'tlh' => [ - 'isoName' => 'Klingon', - 'nativeName' => 'tlhIngan Hol', - ], - 'tpi' => [ - 'isoName' => 'Tok Pisin', - 'nativeName' => 'Tok Pisin', - ], - 'twq' => [ - 'isoName' => 'Tasawaq', - 'nativeName' => 'Tasawaq', - ], - 'tzl' => [ - 'isoName' => 'Talossan', - 'nativeName' => 'Talossan', - ], - 'tzm' => [ - 'isoName' => 'Tamazight, Central Atlas', - 'nativeName' => 'ⵜⵎⴰⵣⵉⵖⵜ', - ], - 'unm' => [ - 'isoName' => 'Unami', - 'nativeName' => 'Unami', - ], - 'vai' => [ - 'isoName' => 'Vai', - 'nativeName' => 'Vai', - ], - 'vun' => [ - 'isoName' => 'Vunjo', - 'nativeName' => 'Vunjo', - ], - 'wae' => [ - 'isoName' => 'Walser', - 'nativeName' => 'Walser', - ], - 'wal' => [ - 'isoName' => 'Wolaytta', - 'nativeName' => 'Wolaytta', - ], - 'xog' => [ - 'isoName' => 'Soga', - 'nativeName' => 'Soga', - ], - 'yav' => [ - 'isoName' => 'Yangben', - 'nativeName' => 'Yangben', - ], - 'yue' => [ - 'isoName' => 'Cantonese', - 'nativeName' => 'Cantonese', - ], - 'yuw' => [ - 'isoName' => 'Yau (Morobe Province)', - 'nativeName' => 'Yau (Morobe Province)', - ], - 'zgh' => [ - 'isoName' => 'Standard Moroccan Tamazight', - 'nativeName' => 'Standard Moroccan Tamazight', - ], -]; diff --git a/vendor/nesbot/carbon/src/Carbon/List/regions.php b/vendor/nesbot/carbon/src/Carbon/List/regions.php deleted file mode 100644 index f241015..0000000 --- a/vendor/nesbot/carbon/src/Carbon/List/regions.php +++ /dev/null @@ -1,292 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * ISO 3166-2 short names. - * - * ⚠ Provided with No Warranty - * - * This list has no official value, and it's using short name, i.e. the first column of - * https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes - * - * Without the extra parenthesis unless a particular ambiguity in the list. - * - * For instance: - * - Falkland Islands and Malvinas both to FK, but we keep only the first for brevity and - * because there is no ambiguity in the list to justify longer name. - * - For Sint Maarten/Saint Martin not to have any confusion between FM and SX codes that - * are on the same island and so to be clear it's not referring to the whole island, - * south (dutch-speaking) and north (french-speaking) parentheses are kept for disambiguation. - * - For Virgin Islands, that can refer to either VG or VI, parentheses are also kept for - * disambiguation. - * - * We won't take into consideration any change request in this list unless there is an update - * in ISO 3166-2 itself that we need to align to. - * - * It's a purely geographical helper, state sovereignty is out of scope, for political - * complains you should address them directly to https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes - * - * Anyone needing official state names (such as the second column of the wikipedia page above) - * should seek for another tool, this list is not meant to provide long names. - */ -return [ - 'AD' => 'Andorra', - 'AE' => 'United Arab Emirates', - 'AF' => 'Afghanistan', - 'AG' => 'Antigua and Barbuda', - 'AI' => 'Anguilla', - 'AL' => 'Albania', - 'AM' => 'Armenia', - 'AO' => 'Angola', - 'AQ' => 'Antarctica', - 'AR' => 'Argentina', - 'AS' => 'American Samoa', - 'AT' => 'Austria', - 'AU' => 'Australia', - 'AW' => 'Aruba', - 'AX' => 'Åland Islands', - 'AZ' => 'Azerbaijan', - 'BA' => 'Bosnia and Herzegovina', - 'BB' => 'Barbados', - 'BD' => 'Bangladesh', - 'BE' => 'Belgium', - 'BF' => 'Burkina Faso', - 'BG' => 'Bulgaria', - 'BH' => 'Bahrain', - 'BI' => 'Burundi', - 'BJ' => 'Benin', - 'BL' => 'Saint Barthélemy', - 'BM' => 'Bermuda', - 'BN' => 'Brunei Darussalam', - 'BO' => 'Bolivia', - 'BQ' => 'Bonaire, Sint Eustatius and Saba', - 'BR' => 'Brazil', - 'BS' => 'Bahamas', - 'BT' => 'Bhutan', - 'BV' => 'Bouvet Island', - 'BW' => 'Botswana', - 'BY' => 'Belarus', - 'BZ' => 'Belize', - 'CA' => 'Canada', - 'CC' => 'Cocos (Keeling) Islands', - 'CD' => 'Congo, Democratic Republic of the', - 'CF' => 'Central African Republic', - 'CG' => 'Congo', - 'CH' => 'Switzerland', - 'CI' => 'Côte d\'Ivoire', - 'CK' => 'Cook Islands', - 'CL' => 'Chile', - 'CM' => 'Cameroon', - 'CN' => 'China', - 'CO' => 'Colombia', - 'CR' => 'Costa Rica', - 'CU' => 'Cuba', - 'CV' => 'Cabo Verde', - 'CW' => 'Curaçao', - 'CX' => 'Christmas Island', - 'CY' => 'Cyprus', - 'CZ' => 'Czechia', - 'DE' => 'Germany', - 'DJ' => 'Djibouti', - 'DK' => 'Denmark', - 'DM' => 'Dominica', - 'DO' => 'Dominican Republic', - 'DZ' => 'Algeria', - 'EC' => 'Ecuador', - 'EE' => 'Estonia', - 'EG' => 'Egypt', - 'EH' => 'Western Sahara', - 'ER' => 'Eritrea', - 'ES' => 'Spain', - 'ET' => 'Ethiopia', - 'FI' => 'Finland', - 'FJ' => 'Fiji', - 'FK' => 'Falkland Islands', - 'FM' => 'Micronesia', - 'FO' => 'Faroe Islands', - 'FR' => 'France', - 'GA' => 'Gabon', - 'GB' => 'United Kingdom of Great Britain and Northern Ireland', - 'GD' => 'Grenada', - 'GE' => 'Georgia', - 'GF' => 'French Guiana', - 'GG' => 'Guernsey', - 'GH' => 'Ghana', - 'GI' => 'Gibraltar', - 'GL' => 'Greenland', - 'GM' => 'Gambia', - 'GN' => 'Guinea', - 'GP' => 'Guadeloupe', - 'GQ' => 'Equatorial Guinea', - 'GR' => 'Greece', - 'GS' => 'South Georgia and the South Sandwich Islands', - 'GT' => 'Guatemala', - 'GU' => 'Guam', - 'GW' => 'Guinea-Bissau', - 'GY' => 'Guyana', - 'HK' => 'Hong Kong', - 'HM' => 'Heard Island and McDonald Islands', - 'HN' => 'Honduras', - 'HR' => 'Croatia', - 'HT' => 'Haiti', - 'HU' => 'Hungary', - 'ID' => 'Indonesia', - 'IE' => 'Ireland', - 'IL' => 'Israel', - 'IM' => 'Isle of Man', - 'IN' => 'India', - 'IO' => 'British Indian Ocean Territory', - 'IQ' => 'Iraq', - 'IR' => 'Iran', - 'IS' => 'Iceland', - 'IT' => 'Italy', - 'JE' => 'Jersey', - 'JM' => 'Jamaica', - 'JO' => 'Jordan', - 'JP' => 'Japan', - 'KE' => 'Kenya', - 'KG' => 'Kyrgyzstan', - 'KH' => 'Cambodia', - 'KI' => 'Kiribati', - 'KM' => 'Comoros', - 'KN' => 'Saint Kitts and Nevis', - 'KP' => 'Korea (Democratic People\'s Republic of)', - 'KR' => 'Korea, Republic of', - 'KW' => 'Kuwait', - 'KY' => 'Cayman Islands', - 'KZ' => 'Kazakhstan', - 'LA' => 'Lao People\'s Democratic Republic', - 'LB' => 'Lebanon', - 'LC' => 'Saint Lucia', - 'LI' => 'Liechtenstein', - 'LK' => 'Sri Lanka', - 'LR' => 'Liberia', - 'LS' => 'Lesotho', - 'LT' => 'Lithuania', - 'LU' => 'Luxembourg', - 'LV' => 'Latvia', - 'LY' => 'Libya', - 'MA' => 'Morocco', - 'MC' => 'Monaco', - 'MD' => 'Moldova', - 'ME' => 'Montenegro', - 'MF' => 'Saint Martin (French part)', - 'MG' => 'Madagascar', - 'MH' => 'Marshall Islands', - 'MK' => 'North Macedonia', - 'ML' => 'Mali', - 'MM' => 'Myanmar', - 'MN' => 'Mongolia', - 'MO' => 'Macao', - 'MP' => 'Northern Mariana Islands', - 'MQ' => 'Martinique', - 'MR' => 'Mauritania', - 'MS' => 'Montserrat', - 'MT' => 'Malta', - 'MU' => 'Mauritius', - 'MV' => 'Maldives', - 'MW' => 'Malawi', - 'MX' => 'Mexico', - 'MY' => 'Malaysia', - 'MZ' => 'Mozambique', - 'NA' => 'Namibia', - 'NC' => 'New Caledonia', - 'NE' => 'Niger', - 'NF' => 'Norfolk Island', - 'NG' => 'Nigeria', - 'NI' => 'Nicaragua', - 'NL' => 'Netherlands', - 'NO' => 'Norway', - 'NP' => 'Nepal', - 'NR' => 'Nauru', - 'NU' => 'Niue', - 'NZ' => 'New Zealand', - 'OM' => 'Oman', - 'PA' => 'Panama', - 'PE' => 'Peru', - 'PF' => 'French Polynesia', - 'PG' => 'Papua New Guinea', - 'PH' => 'Philippines', - 'PK' => 'Pakistan', - 'PL' => 'Poland', - 'PM' => 'Saint Pierre and Miquelon', - 'PN' => 'Pitcairn', - 'PR' => 'Puerto Rico', - 'PS' => 'Palestine', - 'PT' => 'Portugal', - 'PW' => 'Palau', - 'PY' => 'Paraguay', - 'QA' => 'Qatar', - 'RE' => 'Réunion', - 'RO' => 'Romania', - 'RS' => 'Serbia', - 'RU' => 'Russian Federation', - 'RW' => 'Rwanda', - 'SA' => 'Saudi Arabia', - 'SB' => 'Solomon Islands', - 'SC' => 'Seychelles', - 'SD' => 'Sudan', - 'SE' => 'Sweden', - 'SG' => 'Singapore', - 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', - 'SI' => 'Slovenia', - 'SJ' => 'Svalbard and Jan Mayen', - 'SK' => 'Slovakia', - 'SL' => 'Sierra Leone', - 'SM' => 'San Marino', - 'SN' => 'Senegal', - 'SO' => 'Somalia', - 'SR' => 'Suriname', - 'SS' => 'South Sudan', - 'ST' => 'Sao Tome and Principe', - 'SV' => 'El Salvador', - 'SX' => 'Sint Maarten (Dutch part)', - 'SY' => 'Syrian Arab Republic', - 'SZ' => 'Eswatini', - 'TC' => 'Turks and Caicos Islands', - 'TD' => 'Chad', - 'TF' => 'French Southern Territories', - 'TG' => 'Togo', - 'TH' => 'Thailand', - 'TJ' => 'Tajikistan', - 'TK' => 'Tokelau', - 'TL' => 'Timor-Leste', - 'TM' => 'Turkmenistan', - 'TN' => 'Tunisia', - 'TO' => 'Tonga', - 'TR' => 'Turkey', - 'TT' => 'Trinidad and Tobago', - 'TV' => 'Tuvalu', - 'TW' => 'Taiwan', - 'TZ' => 'Tanzania', - 'UA' => 'Ukraine', - 'UG' => 'Uganda', - 'UM' => 'United States Minor Outlying Islands', - 'US' => 'United States of America', - 'UY' => 'Uruguay', - 'UZ' => 'Uzbekistan', - 'VA' => 'Holy See', - 'VC' => 'Saint Vincent and the Grenadines', - 'VE' => 'Venezuela', - 'VG' => 'Virgin Islands (British)', - 'VI' => 'Virgin Islands (U.S.)', - 'VN' => 'Viet Nam', - 'VU' => 'Vanuatu', - 'WF' => 'Wallis and Futuna', - 'WS' => 'Samoa', - 'YE' => 'Yemen', - 'YT' => 'Mayotte', - 'ZA' => 'South Africa', - 'ZM' => 'Zambia', - 'ZW' => 'Zimbabwe', -]; diff --git a/vendor/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php b/vendor/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php deleted file mode 100644 index 64b5d97..0000000 --- a/vendor/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\MessageFormatter; - -use ReflectionMethod; -use Symfony\Component\Translation\Formatter\MessageFormatter; -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; - -// @codeCoverageIgnoreStart -$transMethod = new ReflectionMethod(MessageFormatterInterface::class, 'format'); - -require $transMethod->getParameters()[0]->hasType() - ? __DIR__.'/../../../lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php' - : __DIR__.'/../../../lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php'; -// @codeCoverageIgnoreEnd - -final class MessageFormatterMapper extends LazyMessageFormatter -{ - /** - * Wrapped formatter. - * - * @var MessageFormatterInterface - */ - protected $formatter; - - public function __construct(?MessageFormatterInterface $formatter = null) - { - $this->formatter = $formatter ?? new MessageFormatter(); - } - - protected function transformLocale(?string $locale): ?string - { - return $locale ? preg_replace('/[_@][A-Za-z][a-z]{2,}/', '', $locale) : $locale; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Month.php b/vendor/nesbot/carbon/src/Carbon/Month.php deleted file mode 100644 index 47b279f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Month.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Carbon\Exceptions\InvalidFormatException; - -enum Month: int -{ - // Using constants is only safe starting from PHP 8.2 - case January = 1; // CarbonInterface::JANUARY - case February = 2; // CarbonInterface::FEBRUARY - case March = 3; // CarbonInterface::MARCH - case April = 4; // CarbonInterface::APRIL - case May = 5; // CarbonInterface::MAY - case June = 6; // CarbonInterface::JUNE - case July = 7; // CarbonInterface::JULY - case August = 8; // CarbonInterface::AUGUST - case September = 9; // CarbonInterface::SEPTEMBER - case October = 10; // CarbonInterface::OCTOBER - case November = 11; // CarbonInterface::NOVEMBER - case December = 12; // CarbonInterface::DECEMBER - - public static function int(self|int|null $value): ?int - { - return $value instanceof self ? $value->value : $value; - } - - public static function fromNumber(int $number): self - { - $month = $number % CarbonInterface::MONTHS_PER_YEAR; - - return self::from($month + ($month < 1 ? CarbonInterface::MONTHS_PER_YEAR : 0)); - } - - public static function fromName(string $name, ?string $locale = null): self - { - try { - return self::from(CarbonImmutable::parseFromLocale("$name 1", $locale)->month); - } catch (InvalidFormatException $exception) { - // Possibly current language expect a dot after short name, but it's missing - if ($locale !== null && !mb_strlen($name) < 4 && !str_ends_with($name, '.')) { - try { - return self::from(CarbonImmutable::parseFromLocale("$name. 1", $locale)->month); - } catch (InvalidFormatException $e) { - // Throw previous error - } - } - - throw $exception; - } - } - - public function ofTheYear(CarbonImmutable|int|null $now = null): CarbonImmutable - { - if (\is_int($now)) { - return CarbonImmutable::create($now, $this->value); - } - - $modifier = $this->name.' 1st'; - - return $now?->modify($modifier) ?? new CarbonImmutable($modifier); - } - - public function locale(string $locale, ?CarbonImmutable $now = null): CarbonImmutable - { - return $this->ofTheYear($now)->locale($locale); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php b/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php deleted file mode 100644 index 7327586..0000000 --- a/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php +++ /dev/null @@ -1,137 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\PHPStan; - -use Carbon\CarbonInterface; -use Carbon\FactoryImmutable; -use Closure; -use InvalidArgumentException; -use PHPStan\Reflection\ClassReflection; -use PHPStan\Reflection\MethodReflection; -use PHPStan\Reflection\MethodsClassReflectionExtension; -use PHPStan\Reflection\ReflectionProvider; -use PHPStan\Type\ClosureTypeFactory; -use ReflectionFunction; -use ReflectionMethod; -use stdClass; -use Throwable; - -/** - * Class MacroExtension. - * - * @codeCoverageIgnore Pure PHPStan wrapper. - */ -final class MacroExtension implements MethodsClassReflectionExtension -{ - /** - * @var ReflectionProvider - */ - protected $reflectionProvider; - - /** - * @var ClosureTypeFactory - */ - protected $closureTypeFactory; - - /** - * Extension constructor. - * - * @param ReflectionProvider $reflectionProvider - * @param ClosureTypeFactory $closureTypeFactory - */ - public function __construct( - ReflectionProvider $reflectionProvider, - ClosureTypeFactory $closureTypeFactory - ) { - $this->reflectionProvider = $reflectionProvider; - $this->closureTypeFactory = $closureTypeFactory; - } - - /** - * {@inheritdoc} - */ - public function hasMethod(ClassReflection $classReflection, string $methodName): bool - { - if ( - $classReflection->getName() !== CarbonInterface::class && - !$classReflection->isSubclassOf(CarbonInterface::class) - ) { - return false; - } - - $className = $classReflection->getName(); - - return \is_callable([$className, 'hasMacro']) && - $className::hasMacro($methodName); - } - - /** - * {@inheritdoc} - */ - public function getMethod(ClassReflection $classReflection, string $methodName): MethodReflection - { - $macros = FactoryImmutable::getDefaultInstance()->getSettings()['macros'] ?? []; - $macro = $macros[$methodName] ?? throw new InvalidArgumentException("Macro '$methodName' not found"); - $static = false; - $final = false; - $deprecated = false; - $docComment = null; - - if (\is_array($macro) && \count($macro) === 2 && \is_string($macro[1])) { - \assert($macro[1] !== ''); - - $reflection = new ReflectionMethod($macro[0], $macro[1]); - $closure = \is_object($macro[0]) ? $reflection->getClosure($macro[0]) : $reflection->getClosure(); - - $static = $reflection->isStatic(); - $final = $reflection->isFinal(); - $deprecated = $reflection->isDeprecated(); - $docComment = $reflection->getDocComment() ?: null; - } elseif (\is_string($macro)) { - $reflection = new ReflectionFunction($macro); - $closure = $reflection->getClosure(); - $deprecated = $reflection->isDeprecated(); - $docComment = $reflection->getDocComment() ?: null; - } elseif ($macro instanceof Closure) { - $closure = $macro; - - try { - $boundClosure = Closure::bind($closure, new stdClass()); - $static = (!$boundClosure || (new ReflectionFunction($boundClosure))->getClosureThis() === null); - } catch (Throwable) { - $static = true; - } - - $reflection = new ReflectionFunction($macro); - $deprecated = $reflection->isDeprecated(); - $docComment = $reflection->getDocComment() ?: null; - } - - if (!isset($closure)) { - throw new InvalidArgumentException('Could not create reflection from the spec given'); // @codeCoverageIgnore - } - - $closureType = $this->closureTypeFactory->fromClosureObject($closure); - - return new MacroMethodReflection( - $classReflection, - $methodName, - $closureType, - $static, - $final, - $deprecated, - $docComment, - ); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php b/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php deleted file mode 100644 index b710f54..0000000 --- a/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php +++ /dev/null @@ -1,124 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\PHPStan; - -use PHPStan\Reflection\ClassReflection; -use PHPStan\Reflection\MethodReflection; -use PHPStan\Reflection\ParametersAcceptor; -use PHPStan\TrinaryLogic; -use PHPStan\Type\Type; - -use function preg_match; - -class MacroMethodReflection implements MethodReflection -{ - private ClassReflection $declaringClass; - private string $methodName; - private ParametersAcceptor $macroClosureType; - private bool $static; - private bool $final; - private bool $deprecated; - private ?string $docComment; - - public function __construct( - ClassReflection $declaringClass, - string $methodName, - ParametersAcceptor $macroClosureType, - bool $static, - bool $final, - bool $deprecated, - ?string $docComment - ) { - $this->declaringClass = $declaringClass; - $this->methodName = $methodName; - $this->macroClosureType = $macroClosureType; - $this->static = $static; - $this->final = $final; - $this->deprecated = $deprecated; - $this->docComment = $docComment; - } - - public function getDeclaringClass(): ClassReflection - { - return $this->declaringClass; - } - - public function isStatic(): bool - { - return $this->static; - } - - public function isPrivate(): bool - { - return false; - } - - public function isPublic(): bool - { - return true; - } - - public function getDocComment(): ?string - { - return $this->docComment; - } - - public function getName(): string - { - return $this->methodName; - } - - public function getPrototype(): \PHPStan\Reflection\ClassMemberReflection - { - return $this; - } - - public function getVariants(): array - { - return [$this->macroClosureType]; - } - - public function isDeprecated(): TrinaryLogic - { - return TrinaryLogic::createFromBoolean( - $this->deprecated || - preg_match('/@deprecated/i', $this->getDocComment() ?: '') - ); - } - - public function getDeprecatedDescription(): ?string - { - return null; - } - - public function isFinal(): TrinaryLogic - { - return TrinaryLogic::createFromBoolean($this->final); - } - - public function isInternal(): TrinaryLogic - { - return TrinaryLogic::createNo(); - } - - public function getThrowType(): ?Type - { - return null; - } - - public function hasSideEffects(): TrinaryLogic - { - return TrinaryLogic::createMaybe(); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php b/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php deleted file mode 100644 index b21b9c5..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php +++ /dev/null @@ -1,469 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\Exceptions\UnknownUnitException; -use Carbon\Unit; -use Carbon\WeekDay; - -/** - * Trait Boundaries. - * - * startOf, endOf and derived method for each unit. - * - * Depends on the following properties: - * - * @property int $year - * @property int $month - * @property int $daysInMonth - * @property int $quarter - * - * Depends on the following methods: - * - * @method $this setTime(int $hour, int $minute, int $second = 0, int $microseconds = 0) - * @method $this setDate(int $year, int $month, int $day) - * @method $this addMonths(int $value = 1) - */ -trait Boundaries -{ - /** - * Resets the time to 00:00:00 start of day - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfDay(); - * ``` - * - * @return static - */ - public function startOfDay() - { - return $this->setTime(0, 0, 0, 0); - } - - /** - * Resets the time to 23:59:59.999999 end of day - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfDay(); - * ``` - * - * @return static - */ - public function endOfDay() - { - return $this->setTime(static::HOURS_PER_DAY - 1, static::MINUTES_PER_HOUR - 1, static::SECONDS_PER_MINUTE - 1, static::MICROSECONDS_PER_SECOND - 1); - } - - /** - * Resets the date to the first day of the month and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMonth(); - * ``` - * - * @return static - */ - public function startOfMonth() - { - return $this->setDate($this->year, $this->month, 1)->startOfDay(); - } - - /** - * Resets the date to end of the month and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMonth(); - * ``` - * - * @return static - */ - public function endOfMonth() - { - return $this->setDate($this->year, $this->month, $this->daysInMonth)->endOfDay(); - } - - /** - * Resets the date to the first day of the quarter and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfQuarter(); - * ``` - * - * @return static - */ - public function startOfQuarter() - { - $month = ($this->quarter - 1) * static::MONTHS_PER_QUARTER + 1; - - return $this->setDate($this->year, $month, 1)->startOfDay(); - } - - /** - * Resets the date to end of the quarter and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfQuarter(); - * ``` - * - * @return static - */ - public function endOfQuarter() - { - return $this->startOfQuarter()->addMonths(static::MONTHS_PER_QUARTER - 1)->endOfMonth(); - } - - /** - * Resets the date to the first day of the year and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfYear(); - * ``` - * - * @return static - */ - public function startOfYear() - { - return $this->setDate($this->year, 1, 1)->startOfDay(); - } - - /** - * Resets the date to end of the year and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfYear(); - * ``` - * - * @return static - */ - public function endOfYear() - { - return $this->setDate($this->year, 12, 31)->endOfDay(); - } - - /** - * Resets the date to the first day of the decade and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfDecade(); - * ``` - * - * @return static - */ - public function startOfDecade() - { - $year = $this->year - $this->year % static::YEARS_PER_DECADE; - - return $this->setDate($year, 1, 1)->startOfDay(); - } - - /** - * Resets the date to end of the decade and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfDecade(); - * ``` - * - * @return static - */ - public function endOfDecade() - { - $year = $this->year - $this->year % static::YEARS_PER_DECADE + static::YEARS_PER_DECADE - 1; - - return $this->setDate($year, 12, 31)->endOfDay(); - } - - /** - * Resets the date to the first day of the century and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfCentury(); - * ``` - * - * @return static - */ - public function startOfCentury() - { - $year = $this->year - ($this->year - 1) % static::YEARS_PER_CENTURY; - - return $this->setDate($year, 1, 1)->startOfDay(); - } - - /** - * Resets the date to end of the century and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfCentury(); - * ``` - * - * @return static - */ - public function endOfCentury() - { - $year = $this->year - 1 - ($this->year - 1) % static::YEARS_PER_CENTURY + static::YEARS_PER_CENTURY; - - return $this->setDate($year, 12, 31)->endOfDay(); - } - - /** - * Resets the date to the first day of the millennium and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMillennium(); - * ``` - * - * @return static - */ - public function startOfMillennium() - { - $year = $this->year - ($this->year - 1) % static::YEARS_PER_MILLENNIUM; - - return $this->setDate($year, 1, 1)->startOfDay(); - } - - /** - * Resets the date to end of the millennium and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMillennium(); - * ``` - * - * @return static - */ - public function endOfMillennium() - { - $year = $this->year - 1 - ($this->year - 1) % static::YEARS_PER_MILLENNIUM + static::YEARS_PER_MILLENNIUM; - - return $this->setDate($year, 12, 31)->endOfDay(); - } - - /** - * Resets the date to the first day of week (defined in $weekStartsAt) and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->startOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek(Carbon::SUNDAY) . "\n"; - * ``` - * - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week - * - * @return static - */ - public function startOfWeek(WeekDay|int|null $weekStartsAt = null): static - { - return $this - ->subDays( - (static::DAYS_PER_WEEK + $this->dayOfWeek - (WeekDay::int($weekStartsAt) ?? $this->firstWeekDay)) % - static::DAYS_PER_WEEK, - ) - ->startOfDay(); - } - - /** - * Resets the date to end of week (defined in $weekEndsAt) and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->endOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek(Carbon::SATURDAY) . "\n"; - * ``` - * - * @param WeekDay|int|null $weekEndsAt optional end allow you to specify the day of week to use to end the week - * - * @return static - */ - public function endOfWeek(WeekDay|int|null $weekEndsAt = null): static - { - return $this - ->addDays( - (static::DAYS_PER_WEEK - $this->dayOfWeek + (WeekDay::int($weekEndsAt) ?? $this->lastWeekDay)) % - static::DAYS_PER_WEEK, - ) - ->endOfDay(); - } - - /** - * Modify to start of current hour, minutes and seconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfHour(); - * ``` - */ - public function startOfHour(): static - { - return $this->setTime($this->hour, 0, 0, 0); - } - - /** - * Modify to end of current hour, minutes and seconds become 59 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfHour(); - * ``` - */ - public function endOfHour(): static - { - return $this->setTime($this->hour, static::MINUTES_PER_HOUR - 1, static::SECONDS_PER_MINUTE - 1, static::MICROSECONDS_PER_SECOND - 1); - } - - /** - * Modify to start of current minute, seconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMinute(); - * ``` - */ - public function startOfMinute(): static - { - return $this->setTime($this->hour, $this->minute, 0, 0); - } - - /** - * Modify to end of current minute, seconds become 59 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMinute(); - * ``` - */ - public function endOfMinute(): static - { - return $this->setTime($this->hour, $this->minute, static::SECONDS_PER_MINUTE - 1, static::MICROSECONDS_PER_SECOND - 1); - } - - /** - * Modify to start of current second, microseconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOfSecond() - * ->format('H:i:s.u'); - * ``` - */ - public function startOfSecond(): static - { - return $this->setTime($this->hour, $this->minute, $this->second, 0); - } - - /** - * Modify to end of current second, microseconds become 999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->endOfSecond() - * ->format('H:i:s.u'); - * ``` - */ - public function endOfSecond(): static - { - return $this->setTime($this->hour, $this->minute, $this->second, static::MICROSECONDS_PER_SECOND - 1); - } - - /** - * Modify to start of current millisecond, microseconds such as 12345 become 123000 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOfSecond() - * ->format('H:i:s.u'); - * ``` - */ - public function startOfMillisecond(): static - { - $millisecond = (int) floor($this->micro / 1000); - - return $this->setTime($this->hour, $this->minute, $this->second, $millisecond * 1000); - } - - /** - * Modify to end of current millisecond, microseconds such as 12345 become 123999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->endOfSecond() - * ->format('H:i:s.u'); - * ``` - */ - public function endOfMillisecond(): static - { - $millisecond = (int) floor($this->micro / 1000); - - return $this->setTime($this->hour, $this->minute, $this->second, $millisecond * 1000 + 999); - } - - /** - * Modify to start of current given unit. - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOf(Unit::Month) - * ->endOf(Unit::Week, Carbon::FRIDAY); - * ``` - */ - public function startOf(Unit|string $unit, mixed ...$params): static - { - $ucfUnit = ucfirst($unit instanceof Unit ? $unit->value : static::singularUnit($unit)); - $method = "startOf$ucfUnit"; - if (!method_exists($this, $method)) { - throw new UnknownUnitException($unit); - } - - return $this->$method(...$params); - } - - /** - * Modify to end of current given unit. - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOf(Unit::Month) - * ->endOf(Unit::Week, Carbon::FRIDAY); - * ``` - */ - public function endOf(Unit|string $unit, mixed ...$params): static - { - $ucfUnit = ucfirst($unit instanceof Unit ? $unit->value : static::singularUnit($unit)); - $method = "endOf$ucfUnit"; - if (!method_exists($this, $method)) { - throw new UnknownUnitException($unit); - } - - return $this->$method(...$params); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php b/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php deleted file mode 100644 index 4c00e42..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\Exceptions\InvalidCastException; -use DateTimeInterface; - -/** - * Trait Cast. - * - * Utils to cast into an other class. - */ -trait Cast -{ - /** - * Cast the current instance into the given class. - * - * @template T - * - * @param class-string $className The $className::instance() method will be called to cast the current object. - * - * @return T - */ - public function cast(string $className): mixed - { - if (!method_exists($className, 'instance')) { - if (is_a($className, DateTimeInterface::class, true)) { - return $className::createFromFormat('U.u', $this->rawFormat('U.u')) - ->setTimezone($this->getTimezone()); - } - - throw new InvalidCastException("$className has not the instance() method needed to cast the date."); - } - - return $className::instance($this); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php b/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php deleted file mode 100644 index 87e1698..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php +++ /dev/null @@ -1,1333 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use BackedEnum; -use BadMethodCallException; -use Carbon\CarbonConverterInterface; -use Carbon\CarbonInterface; -use Carbon\Exceptions\BadComparisonUnitException; -use Carbon\FactoryImmutable; -use Carbon\Month; -use Carbon\Unit; -use Carbon\WeekDay; -use Closure; -use DateInterval; -use DateTimeInterface; -use InvalidArgumentException; - -/** - * Trait Comparison. - * - * Comparison utils and testers. All the following methods return booleans. - * nowWithSameTz - * - * Depends on the following methods: - * - * @method static resolveCarbon($date) - * @method static copy() - * @method static nowWithSameTz() - * @method static static yesterday($timezone = null) - * @method static static tomorrow($timezone = null) - */ -trait Comparison -{ - protected bool $endOfTime = false; - - protected bool $startOfTime = false; - - /** - * Determines if the instance is equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->eq(Carbon::parse('2018-07-25 12:45:16')); // true - * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:17'); // false - * ``` - * - * @see equalTo() - */ - public function eq(DateTimeInterface|string $date): bool - { - return $this->equalTo($date); - } - - /** - * Determines if the instance is equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->equalTo(Carbon::parse('2018-07-25 12:45:16')); // true - * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:17'); // false - * ``` - */ - public function equalTo(DateTimeInterface|string $date): bool - { - return $this == $this->resolveCarbon($date); - } - - /** - * Determines if the instance is not equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->ne(Carbon::parse('2018-07-25 12:45:16')); // false - * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:17'); // true - * ``` - * - * @see notEqualTo() - */ - public function ne(DateTimeInterface|string $date): bool - { - return $this->notEqualTo($date); - } - - /** - * Determines if the instance is not equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo(Carbon::parse('2018-07-25 12:45:16')); // false - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:17'); // true - * ``` - */ - public function notEqualTo(DateTimeInterface|string $date): bool - { - return !$this->equalTo($date); - } - - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:17'); // false - * ``` - * - * @see greaterThan() - */ - public function gt(DateTimeInterface|string $date): bool - { - return $this->greaterThan($date); - } - - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:17'); // false - * ``` - */ - public function greaterThan(DateTimeInterface|string $date): bool - { - return $this > $this->resolveCarbon($date); - } - - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:17'); // false - * ``` - * - * @see greaterThan() - */ - public function isAfter(DateTimeInterface|string $date): bool - { - return $this->greaterThan($date); - } - - /** - * Determines if the instance is greater (after) than or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:17'); // false - * ``` - * - * @see greaterThanOrEqualTo() - */ - public function gte(DateTimeInterface|string $date): bool - { - return $this->greaterThanOrEqualTo($date); - } - - /** - * Determines if the instance is greater (after) than or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:17'); // false - * ``` - */ - public function greaterThanOrEqualTo(DateTimeInterface|string $date): bool - { - return $this >= $this->resolveCarbon($date); - } - - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:17'); // true - * ``` - * - * @see lessThan() - */ - public function lt(DateTimeInterface|string $date): bool - { - return $this->lessThan($date); - } - - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:17'); // true - * ``` - */ - public function lessThan(DateTimeInterface|string $date): bool - { - return $this < $this->resolveCarbon($date); - } - - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:17'); // true - * ``` - * - * @see lessThan() - */ - public function isBefore(DateTimeInterface|string $date): bool - { - return $this->lessThan($date); - } - - /** - * Determines if the instance is less (before) or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:17'); // true - * ``` - * - * @see lessThanOrEqualTo() - */ - public function lte(DateTimeInterface|string $date): bool - { - return $this->lessThanOrEqualTo($date); - } - - /** - * Determines if the instance is less (before) or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:17'); // true - * ``` - */ - public function lessThanOrEqualTo(DateTimeInterface|string $date): bool - { - return $this <= $this->resolveCarbon($date); - } - - /** - * Determines if the instance is between two others. - * - * The third argument allow you to specify if bounds are included or not (true by default) - * but for when you including/excluding bounds may produce different results in your application, - * we recommend to use the explicit methods ->betweenIncluded() or ->betweenExcluded() instead. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->between('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->between('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01', false); // false - * ``` - * - * @param bool $equal Indicates if an equal to comparison should be done - */ - public function between(DateTimeInterface|string $date1, DateTimeInterface|string $date2, bool $equal = true): bool - { - $date1 = $this->resolveCarbon($date1); - $date2 = $this->resolveCarbon($date2); - - if ($date1->greaterThan($date2)) { - [$date1, $date2] = [$date2, $date1]; - } - - if ($equal) { - return $this >= $date1 && $this <= $date2; - } - - return $this > $date1 && $this < $date2; - } - - /** - * Determines if the instance is between two others, bounds included. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->betweenIncluded('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-25', '2018-08-01'); // true - * ``` - */ - public function betweenIncluded(DateTimeInterface|string $date1, DateTimeInterface|string $date2): bool - { - return $this->between($date1, $date2, true); - } - - /** - * Determines if the instance is between two others, bounds excluded. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->betweenExcluded('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-25', '2018-08-01'); // false - * ``` - */ - public function betweenExcluded(DateTimeInterface|string $date1, DateTimeInterface|string $date2): bool - { - return $this->between($date1, $date2, false); - } - - /** - * Determines if the instance is between two others - * - * @example - * ``` - * Carbon::parse('2018-07-25')->isBetween('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->isBetween('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01', false); // false - * ``` - * - * @param bool $equal Indicates if an equal to comparison should be done - */ - public function isBetween(DateTimeInterface|string $date1, DateTimeInterface|string $date2, bool $equal = true): bool - { - return $this->between($date1, $date2, $equal); - } - - /** - * Determines if the instance is a weekday. - * - * @example - * ``` - * Carbon::parse('2019-07-14')->isWeekday(); // false - * Carbon::parse('2019-07-15')->isWeekday(); // true - * ``` - */ - public function isWeekday(): bool - { - return !$this->isWeekend(); - } - - /** - * Determines if the instance is a weekend day. - * - * @example - * ``` - * Carbon::parse('2019-07-14')->isWeekend(); // true - * Carbon::parse('2019-07-15')->isWeekend(); // false - * ``` - */ - public function isWeekend(): bool - { - return \in_array( - $this->dayOfWeek, - $this->transmitFactory(static fn () => static::getWeekendDays()), - true, - ); - } - - /** - * Determines if the instance is yesterday. - * - * @example - * ``` - * Carbon::yesterday()->isYesterday(); // true - * Carbon::tomorrow()->isYesterday(); // false - * ``` - */ - public function isYesterday(): bool - { - return $this->toDateString() === $this->transmitFactory( - fn () => static::yesterday($this->getTimezone())->toDateString(), - ); - } - - /** - * Determines if the instance is today. - * - * @example - * ``` - * Carbon::today()->isToday(); // true - * Carbon::tomorrow()->isToday(); // false - * ``` - */ - public function isToday(): bool - { - return $this->toDateString() === $this->nowWithSameTz()->toDateString(); - } - - /** - * Determines if the instance is tomorrow. - * - * @example - * ``` - * Carbon::tomorrow()->isTomorrow(); // true - * Carbon::yesterday()->isTomorrow(); // false - * ``` - */ - public function isTomorrow(): bool - { - return $this->toDateString() === $this->transmitFactory( - fn () => static::tomorrow($this->getTimezone())->toDateString(), - ); - } - - /** - * Determines if the instance is in the future, ie. greater (after) than now. - * - * @example - * ``` - * Carbon::now()->addHours(5)->isFuture(); // true - * Carbon::now()->subHours(5)->isFuture(); // false - * ``` - */ - public function isFuture(): bool - { - return $this->greaterThan($this->nowWithSameTz()); - } - - /** - * Determines if the instance is in the past, ie. less (before) than now. - * - * @example - * ``` - * Carbon::now()->subHours(5)->isPast(); // true - * Carbon::now()->addHours(5)->isPast(); // false - * ``` - */ - public function isPast(): bool - { - return $this->lessThan($this->nowWithSameTz()); - } - - /** - * Determines if the instance is a leap year. - * - * @example - * ``` - * Carbon::parse('2020-01-01')->isLeapYear(); // true - * Carbon::parse('2019-01-01')->isLeapYear(); // false - * ``` - */ - public function isLeapYear(): bool - { - return $this->rawFormat('L') === '1'; - } - - /** - * Determines if the instance is a long year (using calendar year). - * - * ⚠️ This method completely ignores month and day to use the numeric year number, - * it's not correct if the exact date matters. For instance as `2019-12-30` is already - * in the first week of the 2020 year, if you want to know from this date if ISO week - * year 2020 is a long year, use `isLongIsoYear` instead. - * - * @example - * ``` - * Carbon::create(2015)->isLongYear(); // true - * Carbon::create(2016)->isLongYear(); // false - * ``` - * - * @see https://en.wikipedia.org/wiki/ISO_8601#Week_dates - */ - public function isLongYear(): bool - { - return static::create($this->year, 12, 28, 0, 0, 0, $this->tz)->weekOfYear === static::WEEKS_PER_YEAR + 1; - } - - /** - * Determines if the instance is a long year (using ISO 8601 year). - * - * @example - * ``` - * Carbon::parse('2015-01-01')->isLongIsoYear(); // true - * Carbon::parse('2016-01-01')->isLongIsoYear(); // true - * Carbon::parse('2016-01-03')->isLongIsoYear(); // false - * Carbon::parse('2019-12-29')->isLongIsoYear(); // false - * Carbon::parse('2019-12-30')->isLongIsoYear(); // true - * ``` - * - * @see https://en.wikipedia.org/wiki/ISO_8601#Week_dates - */ - public function isLongIsoYear(): bool - { - return static::create($this->isoWeekYear, 12, 28, 0, 0, 0, $this->tz)->weekOfYear === 53; - } - - /** - * Compares the formatted values of the two dates. - * - * @example - * ``` - * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-12-13')); // true - * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-06-14')); // false - * ``` - * - * @param string $format date formats to compare. - * @param DateTimeInterface|string $date instance to compare with or null to use current day. - */ - public function isSameAs(string $format, DateTimeInterface|string $date): bool - { - return $this->rawFormat($format) === $this->resolveCarbon($date)->rawFormat($format); - } - - /** - * Determines if the instance is in the current unit given. - * - * @example - * ``` - * Carbon::parse('2019-01-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // true - * Carbon::parse('2018-12-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // false - * ``` - * - * @param string $unit singular unit string - * @param DateTimeInterface|string $date instance to compare with or null to use current day. - * - * @throws BadComparisonUnitException - * - * @return bool - */ - public function isSameUnit(string $unit, DateTimeInterface|string $date): bool - { - if ($unit === /* @call isSameUnit */ 'quarter') { - $other = $this->resolveCarbon($date); - - return $other->year === $this->year && $other->quarter === $this->quarter; - } - - $units = [ - // @call isSameUnit - 'year' => 'Y', - // @call isSameUnit - 'month' => 'Y-n', - // @call isSameUnit - 'week' => 'o-W', - // @call isSameUnit - 'day' => 'Y-m-d', - // @call isSameUnit - 'hour' => 'Y-m-d H', - // @call isSameUnit - 'minute' => 'Y-m-d H:i', - // @call isSameUnit - 'second' => 'Y-m-d H:i:s', - // @call isSameUnit - 'milli' => 'Y-m-d H:i:s.v', - // @call isSameUnit - 'millisecond' => 'Y-m-d H:i:s.v', - // @call isSameUnit - 'micro' => 'Y-m-d H:i:s.u', - // @call isSameUnit - 'microsecond' => 'Y-m-d H:i:s.u', - ]; - - if (isset($units[$unit])) { - return $this->isSameAs($units[$unit], $date); - } - - if (isset($this->$unit)) { - return $this->resolveCarbon($date)->$unit === $this->$unit; - } - - if ($this->isLocalStrictModeEnabled()) { - throw new BadComparisonUnitException($unit); - } - - return false; - } - - /** - * Determines if the instance is in the current unit given. - * - * @example - * ``` - * Carbon::now()->isCurrentUnit('hour'); // true - * Carbon::now()->subHours(2)->isCurrentUnit('hour'); // false - * ``` - * - * @param string $unit The unit to test. - * - * @throws BadMethodCallException - */ - public function isCurrentUnit(string $unit): bool - { - return $this->{'isSame'.ucfirst($unit)}('now'); - } - - /** - * Checks if the passed in date is in the same quarter as the instance quarter (and year if needed). - * - * @example - * ``` - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-03-01')); // true - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-04-01')); // false - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01')); // false - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01'), false); // true - * ``` - * - * @param DateTimeInterface|string $date The instance to compare with or null to use current day. - * @param bool $ofSameYear Check if it is the same month in the same year. - * - * @return bool - */ - public function isSameQuarter(DateTimeInterface|string $date, bool $ofSameYear = true): bool - { - $date = $this->resolveCarbon($date); - - return $this->quarter === $date->quarter && (!$ofSameYear || $this->isSameYear($date)); - } - - /** - * Checks if the passed in date is in the same month as the instance´s month. - * - * @example - * ``` - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-01-01')); // true - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-02-01')); // false - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01')); // false - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01'), false); // true - * ``` - * - * @param DateTimeInterface|string $date The instance to compare with or null to use the current date. - * @param bool $ofSameYear Check if it is the same month in the same year. - * - * @return bool - */ - public function isSameMonth(DateTimeInterface|string $date, bool $ofSameYear = true): bool - { - return $this->isSameAs($ofSameYear ? 'Y-m' : 'm', $date); - } - - /** - * Checks if this day is a specific day of the week. - * - * @example - * ``` - * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::WEDNESDAY); // true - * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::FRIDAY); // false - * Carbon::parse('2019-07-17')->isDayOfWeek('Wednesday'); // true - * Carbon::parse('2019-07-17')->isDayOfWeek('Friday'); // false - * ``` - * - * @param int|string $dayOfWeek - * - * @return bool - */ - public function isDayOfWeek($dayOfWeek): bool - { - if (\is_string($dayOfWeek) && \defined($constant = static::class.'::'.strtoupper($dayOfWeek))) { - $dayOfWeek = \constant($constant); - } - - return $this->dayOfWeek === $dayOfWeek; - } - - /** - * Check if its the birthday. Compares the date/month values of the two dates. - * - * @example - * ``` - * Carbon::now()->subYears(5)->isBirthday(); // true - * Carbon::now()->subYears(5)->subDay()->isBirthday(); // false - * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-05')); // true - * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-06')); // false - * ``` - * - * @param DateTimeInterface|string|null $date The instance to compare with or null to use current day. - * - * @return bool - */ - public function isBirthday(DateTimeInterface|string|null $date = null): bool - { - return $this->isSameAs('md', $date ?? 'now'); - } - - /** - * Check if today is the last day of the Month - * - * @example - * ``` - * Carbon::parse('2019-02-28')->isLastOfMonth(); // true - * Carbon::parse('2019-03-28')->isLastOfMonth(); // false - * Carbon::parse('2019-03-30')->isLastOfMonth(); // false - * Carbon::parse('2019-03-31')->isLastOfMonth(); // true - * Carbon::parse('2019-04-30')->isLastOfMonth(); // true - * ``` - */ - public function isLastOfMonth(): bool - { - return $this->day === $this->daysInMonth; - } - - /** - * Check if the instance is start of a given unit (tolerating a given interval). - * - * @example - * ``` - * // Check if a date-time is the first 15 minutes of the hour it's in - * Carbon::parse('2019-02-28 20:13:00')->isStartOfUnit(Unit::Hour, '15 minutes'); // true - * ``` - */ - public function isStartOfUnit( - Unit $unit, - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - mixed ...$params, - ): bool { - $interval ??= match ($unit) { - Unit::Day, Unit::Hour, Unit::Minute, Unit::Second, Unit::Millisecond, Unit::Microsecond => Unit::Microsecond, - default => Unit::Day, - }; - - $startOfUnit = $this->avoidMutation()->startOf($unit, ...$params); - $startOfUnitDateTime = $startOfUnit->rawFormat('Y-m-d H:i:s.u'); - $maximumDateTime = $startOfUnit - ->add($interval instanceof Unit ? '1 '.$interval->value : $interval) - ->rawFormat('Y-m-d H:i:s.u'); - - if ($maximumDateTime < $startOfUnitDateTime) { - return false; - } - - return $this->rawFormat('Y-m-d H:i:s.u') < $maximumDateTime; - } - - /** - * Check if the instance is end of a given unit (tolerating a given interval). - * - * @example - * ``` - * // Check if a date-time is the last 15 minutes of the hour it's in - * Carbon::parse('2019-02-28 20:13:00')->isEndOfUnit(Unit::Hour, '15 minutes'); // false - * ``` - */ - public function isEndOfUnit( - Unit $unit, - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - mixed ...$params, - ): bool { - $interval ??= match ($unit) { - Unit::Day, Unit::Hour, Unit::Minute, Unit::Second, Unit::Millisecond, Unit::Microsecond => Unit::Microsecond, - default => Unit::Day, - }; - - $endOfUnit = $this->avoidMutation()->endOf($unit, ...$params); - $endOfUnitDateTime = $endOfUnit->rawFormat('Y-m-d H:i:s.u'); - $minimumDateTime = $endOfUnit - ->sub($interval instanceof Unit ? '1 '.$interval->value : $interval) - ->rawFormat('Y-m-d H:i:s.u'); - - if ($minimumDateTime > $endOfUnitDateTime) { - return false; - } - - return $this->rawFormat('Y-m-d H:i:s.u') > $minimumDateTime; - } - - /** - * Determines if the instance is start of millisecond (first microsecond by default but interval can be customized). - */ - public function isStartOfMillisecond( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isStartOfUnit(Unit::Millisecond, $interval); - } - - /** - * Determines if the instance is end of millisecond (last microsecond by default but interval can be customized). - */ - public function isEndOfMillisecond( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isEndOfUnit(Unit::Millisecond, $interval); - } - - /** - * Determines if the instance is start of second (first microsecond by default but interval can be customized). - */ - public function isStartOfSecond( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isStartOfUnit(Unit::Second, $interval); - } - - /** - * Determines if the instance is end of second (last microsecond by default but interval can be customized). - */ - public function isEndOfSecond( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isEndOfUnit(Unit::Second, $interval); - } - - /** - * Determines if the instance is start of minute (first microsecond by default but interval can be customized). - */ - public function isStartOfMinute( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isStartOfUnit(Unit::Minute, $interval); - } - - /** - * Determines if the instance is end of minute (last microsecond by default but interval can be customized). - */ - public function isEndOfMinute( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isEndOfUnit(Unit::Minute, $interval); - } - - /** - * Determines if the instance is start of hour (first microsecond by default but interval can be customized). - */ - public function isStartOfHour( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isStartOfUnit(Unit::Hour, $interval); - } - - /** - * Determines if the instance is end of hour (last microsecond by default but interval can be customized). - */ - public function isEndOfHour( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isEndOfUnit(Unit::Hour, $interval); - } - - /** - * Check if the instance is start of day / midnight. - * - * @example - * ``` - * Carbon::parse('2019-02-28 00:00:00')->isStartOfDay(); // true - * Carbon::parse('2019-02-28 00:00:00.999999')->isStartOfDay(); // true - * Carbon::parse('2019-02-28 00:00:01')->isStartOfDay(); // false - * Carbon::parse('2019-02-28 00:00:00.000000')->isStartOfDay(true); // true - * Carbon::parse('2019-02-28 00:00:00.000012')->isStartOfDay(true); // false - * ``` - * - * @param bool $checkMicroseconds check time at microseconds precision - * @param Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval if an interval is specified it will be used as precision - * for instance with "15 minutes", it checks if current date-time - * is in the last 15 minutes of the day, with Unit::Hour, it - * checks if it's in the last hour of the day. - */ - public function isStartOfDay( - Unit|DateInterval|Closure|CarbonConverterInterface|string|bool $checkMicroseconds = false, - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - if ($checkMicroseconds === true) { - @trigger_error( - "Since 3.8.0, it's deprecated to use \$checkMicroseconds.\n". - "It will be removed in 4.0.0.\n". - "Instead, you should use either isStartOfDay(interval: Unit::Microsecond) or isStartOfDay(interval: Unit::Second)\n". - 'And you can now use any custom interval as precision, such as isStartOfDay(interval: "15 minutes")', - \E_USER_DEPRECATED, - ); - } - - if ($interval === null && !\is_bool($checkMicroseconds)) { - $interval = $checkMicroseconds; - } - - if ($interval !== null) { - if ($interval instanceof Unit) { - $interval = '1 '.$interval->value; - } - - $date = $this->rawFormat('Y-m-d'); - $time = $this->rawFormat('H:i:s.u'); - $maximum = $this->avoidMutation()->startOfDay()->add($interval); - $maximumDate = $maximum->rawFormat('Y-m-d'); - - if ($date === $maximumDate) { - return $time < $maximum->rawFormat('H:i:s.u'); - } - - return $maximumDate > $date; - } - - /* @var CarbonInterface $this */ - return $checkMicroseconds - ? $this->rawFormat('H:i:s.u') === '00:00:00.000000' - : $this->rawFormat('H:i:s') === '00:00:00'; - } - - /** - * Check if the instance is end of day. - * - * @example - * ``` - * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:58.999999')->isEndOfDay(); // false - * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(true); // true - * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(true); // false - * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(true); // false - * ``` - * - * @param bool $checkMicroseconds check time at microseconds precision - * @param Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval if an interval is specified it will be used as precision - * for instance with "15 minutes", it checks if current date-time - * is in the last 15 minutes of the day, with Unit::Hour, it - * checks if it's in the last hour of the day. - */ - public function isEndOfDay( - Unit|DateInterval|Closure|CarbonConverterInterface|string|bool $checkMicroseconds = false, - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - if ($checkMicroseconds === true) { - @trigger_error( - "Since 3.8.0, it's deprecated to use \$checkMicroseconds.\n". - "It will be removed in 4.0.0.\n". - "Instead, you should use either isEndOfDay(interval: Unit::Microsecond) or isEndOfDay(interval: Unit::Second)\n". - 'And you can now use any custom interval as precision, such as isEndOfDay(interval: "15 minutes")', - \E_USER_DEPRECATED, - ); - } - - if ($interval === null && !\is_bool($checkMicroseconds)) { - $interval = $checkMicroseconds; - } - - if ($interval !== null) { - $date = $this->rawFormat('Y-m-d'); - $time = $this->rawFormat('H:i:s.u'); - $minimum = $this->avoidMutation() - ->endOfDay() - ->sub($interval instanceof Unit ? '1 '.$interval->value : $interval); - $minimumDate = $minimum->rawFormat('Y-m-d'); - - if ($date === $minimumDate) { - return $time > $minimum->rawFormat('H:i:s.u'); - } - - return $minimumDate < $date; - } - - /* @var CarbonInterface $this */ - return $checkMicroseconds - ? $this->rawFormat('H:i:s.u') === '23:59:59.999999' - : $this->rawFormat('H:i:s') === '23:59:59'; - } - - /** - * Determines if the instance is start of week (first day by default but interval can be customized). - * - * @example - * ``` - * Carbon::parse('2024-08-31')->startOfWeek()->isStartOfWeek(); // true - * Carbon::parse('2024-08-31')->isStartOfWeek(); // false - * ``` - */ - public function isStartOfWeek( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - WeekDay|int|null $weekStartsAt = null, - ): bool { - return $this->isStartOfUnit(Unit::Week, $interval, $weekStartsAt); - } - - /** - * Determines if the instance is end of week (last day by default but interval can be customized). - * - * @example - * ``` - * Carbon::parse('2024-08-31')->endOfWeek()->isEndOfWeek(); // true - * Carbon::parse('2024-08-31')->isEndOfWeek(); // false - * ``` - */ - public function isEndOfWeek( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - WeekDay|int|null $weekEndsAt = null, - ): bool { - return $this->isEndOfUnit(Unit::Week, $interval, $weekEndsAt); - } - - /** - * Determines if the instance is start of month (first day by default but interval can be customized). - */ - public function isStartOfMonth( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isStartOfUnit(Unit::Month, $interval); - } - - /** - * Determines if the instance is end of month (last day by default but interval can be customized). - */ - public function isEndOfMonth( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isEndOfUnit(Unit::Month, $interval); - } - - /** - * Determines if the instance is start of quarter (first day by default but interval can be customized). - */ - public function isStartOfQuarter( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isStartOfUnit(Unit::Quarter, $interval); - } - - /** - * Determines if the instance is end of quarter (last day by default but interval can be customized). - */ - public function isEndOfQuarter( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isEndOfUnit(Unit::Quarter, $interval); - } - - /** - * Determines if the instance is start of year (first day by default but interval can be customized). - */ - public function isStartOfYear( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isStartOfUnit(Unit::Year, $interval); - } - - /** - * Determines if the instance is end of year (last day by default but interval can be customized). - */ - public function isEndOfYear( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isEndOfUnit(Unit::Year, $interval); - } - - /** - * Determines if the instance is start of decade (first day by default but interval can be customized). - */ - public function isStartOfDecade( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isStartOfUnit(Unit::Decade, $interval); - } - - /** - * Determines if the instance is end of decade (last day by default but interval can be customized). - */ - public function isEndOfDecade( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isEndOfUnit(Unit::Decade, $interval); - } - - /** - * Determines if the instance is start of century (first day by default but interval can be customized). - */ - public function isStartOfCentury( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isStartOfUnit(Unit::Century, $interval); - } - - /** - * Determines if the instance is end of century (last day by default but interval can be customized). - */ - public function isEndOfCentury( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isEndOfUnit(Unit::Century, $interval); - } - - /** - * Determines if the instance is start of millennium (first day by default but interval can be customized). - */ - public function isStartOfMillennium( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isStartOfUnit(Unit::Millennium, $interval); - } - - /** - * Determines if the instance is end of millennium (last day by default but interval can be customized). - */ - public function isEndOfMillennium( - Unit|DateInterval|Closure|CarbonConverterInterface|string|null $interval = null, - ): bool { - return $this->isEndOfUnit(Unit::Millennium, $interval); - } - - /** - * Check if the instance is start of day / midnight. - * - * @example - * ``` - * Carbon::parse('2019-02-28 00:00:00')->isMidnight(); // true - * Carbon::parse('2019-02-28 00:00:00.999999')->isMidnight(); // true - * Carbon::parse('2019-02-28 00:00:01')->isMidnight(); // false - * ``` - */ - public function isMidnight(): bool - { - return $this->isStartOfDay(); - } - - /** - * Check if the instance is midday. - * - * @example - * ``` - * Carbon::parse('2019-02-28 11:59:59.999999')->isMidday(); // false - * Carbon::parse('2019-02-28 12:00:00')->isMidday(); // true - * Carbon::parse('2019-02-28 12:00:00.999999')->isMidday(); // true - * Carbon::parse('2019-02-28 12:00:01')->isMidday(); // false - * ``` - */ - public function isMidday(): bool - { - /* @var CarbonInterface $this */ - return $this->rawFormat('G:i:s') === static::$midDayAt.':00:00'; - } - - /** - * Checks if the (date)time string is in a given format. - * - * @example - * ``` - * Carbon::hasFormat('11:12:45', 'h:i:s'); // true - * Carbon::hasFormat('13:12:45', 'h:i:s'); // false - * ``` - */ - public static function hasFormat(string $date, string $format): bool - { - return FactoryImmutable::getInstance()->hasFormat($date, $format); - } - - /** - * Checks if the (date)time string is in a given format. - * - * @example - * ``` - * Carbon::hasFormatWithModifiers('31/08/2015', 'd#m#Y'); // true - * Carbon::hasFormatWithModifiers('31/08/2015', 'm#d#Y'); // false - * ``` - * - * @param string $date - * @param string $format - * - * @return bool - */ - public static function hasFormatWithModifiers(?string $date, string $format): bool - { - return FactoryImmutable::getInstance()->hasFormatWithModifiers($date, $format); - } - - /** - * Checks if the (date)time string is in a given format and valid to create a - * new instance. - * - * @example - * ``` - * Carbon::canBeCreatedFromFormat('11:12:45', 'h:i:s'); // true - * Carbon::canBeCreatedFromFormat('13:12:45', 'h:i:s'); // false - * ``` - */ - public static function canBeCreatedFromFormat(?string $date, string $format): bool - { - if ($date === null) { - return false; - } - - try { - // Try to create a DateTime object. Throws an InvalidArgumentException if the provided time string - // doesn't match the format in any way. - if (!static::rawCreateFromFormat($format, $date)) { - return false; - } - } catch (InvalidArgumentException) { - return false; - } - - return static::hasFormatWithModifiers($date, $format); - } - - /** - * Returns true if the current date matches the given string. - * - * @example - * ``` - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2018')); // false - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('06-02')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06-02')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('Sunday')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('June')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:45')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:00')); // false - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12h')); // true - * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3pm')); // true - * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3am')); // false - * ``` - * - * @param string $tester day name, month name, hour, date, etc. as string - */ - public function is(WeekDay|Month|string $tester): bool - { - if ($tester instanceof BackedEnum) { - $tester = $tester->name; - } - - $tester = trim($tester); - - if (preg_match('/^\d+$/', $tester)) { - return $this->year === (int) $tester; - } - - if (preg_match('/^(?:Jan|January|Feb|February|Mar|March|Apr|April|May|Jun|June|Jul|July|Aug|August|Sep|September|Oct|October|Nov|November|Dec|December)$/i', $tester)) { - return $this->isSameMonth( - $this->transmitFactory(static fn () => static::parse($tester)), - false, - ); - } - - if (preg_match('/^\d{3,}-\d{1,2}$/', $tester)) { - return $this->isSameMonth( - $this->transmitFactory(static fn () => static::parse($tester)), - ); - } - - if (preg_match('/^\d{1,2}-\d{1,2}$/', $tester)) { - return $this->isSameDay( - $this->transmitFactory(fn () => static::parse($this->year.'-'.$tester)), - ); - } - - $modifier = preg_replace('/(\d)h$/i', '$1:00', $tester); - - /* @var CarbonInterface $max */ - $median = $this->transmitFactory(static fn () => static::parse('5555-06-15 12:30:30.555555')) - ->modify($modifier); - $current = $this->avoidMutation(); - /* @var CarbonInterface $other */ - $other = $this->avoidMutation()->modify($modifier); - - if ($current->eq($other)) { - return true; - } - - if (preg_match('/\d:\d{1,2}:\d{1,2}$/', $tester)) { - return $current->startOfSecond()->eq($other); - } - - if (preg_match('/\d:\d{1,2}$/', $tester)) { - return $current->startOfMinute()->eq($other); - } - - if (preg_match('/\d(?:h|am|pm)$/', $tester)) { - return $current->startOfHour()->eq($other); - } - - if (preg_match( - '/^(?:january|february|march|april|may|june|july|august|september|october|november|december)(?:\s+\d+)?$/i', - $tester, - )) { - return $current->startOfMonth()->eq($other->startOfMonth()); - } - - $units = [ - 'month' => [1, 'year'], - 'day' => [1, 'month'], - 'hour' => [0, 'day'], - 'minute' => [0, 'hour'], - 'second' => [0, 'minute'], - 'microsecond' => [0, 'second'], - ]; - - foreach ($units as $unit => [$minimum, $startUnit]) { - if ($minimum === $median->$unit) { - $current = $current->startOf($startUnit); - - break; - } - } - - return $current->eq($other); - } - - /** - * Returns true if the date was created using CarbonImmutable::startOfTime() - * - * @return bool - */ - public function isStartOfTime(): bool - { - return $this->startOfTime ?? false; - } - - /** - * Returns true if the date was created using CarbonImmutable::endOfTime() - * - * @return bool - */ - public function isEndOfTime(): bool - { - return $this->endOfTime ?? false; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php b/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php deleted file mode 100644 index 764c5d4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php +++ /dev/null @@ -1,556 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\Carbon; -use Carbon\CarbonImmutable; -use Carbon\CarbonInterface; -use Carbon\CarbonInterval; -use Carbon\CarbonPeriod; -use Carbon\CarbonPeriodImmutable; -use Carbon\Exceptions\UnitException; -use Closure; -use DateTime; -use DateTimeImmutable; -use DateTimeInterface; - -/** - * Trait Converter. - * - * Change date into different string formats and types and - * handle the string cast. - * - * Depends on the following methods: - * - * @method static copy() - */ -trait Converter -{ - use ToStringFormat; - - /** - * Returns the formatted date string on success or FALSE on failure. - * - * @see https://php.net/manual/en/datetime.format.php - */ - public function format(string $format): string - { - $function = $this->localFormatFunction - ?? $this->getFactory()->getSettings()['formatFunction'] - ?? static::$formatFunction; - - if (!$function) { - return $this->rawFormat($format); - } - - if (\is_string($function) && method_exists($this, $function)) { - $function = [$this, $function]; - } - - return $function(...\func_get_args()); - } - - /** - * @see https://php.net/manual/en/datetime.format.php - */ - public function rawFormat(string $format): string - { - return parent::format($format); - } - - /** - * Format the instance as a string using the set format - * - * @example - * ``` - * echo Carbon::now(); // Carbon instances can be cast to string - * ``` - */ - public function __toString(): string - { - $format = $this->localToStringFormat - ?? $this->getFactory()->getSettings()['toStringFormat'] - ?? null; - - return $format instanceof Closure - ? $format($this) - : $this->rawFormat($format ?: ( - \defined('static::DEFAULT_TO_STRING_FORMAT') - ? static::DEFAULT_TO_STRING_FORMAT - : CarbonInterface::DEFAULT_TO_STRING_FORMAT - )); - } - - /** - * Format the instance as date - * - * @example - * ``` - * echo Carbon::now()->toDateString(); - * ``` - */ - public function toDateString(): string - { - return $this->rawFormat('Y-m-d'); - } - - /** - * Format the instance as a readable date - * - * @example - * ``` - * echo Carbon::now()->toFormattedDateString(); - * ``` - */ - public function toFormattedDateString(): string - { - return $this->rawFormat('M j, Y'); - } - - /** - * Format the instance with the day, and a readable date - * - * @example - * ``` - * echo Carbon::now()->toFormattedDayDateString(); - * ``` - */ - public function toFormattedDayDateString(): string - { - return $this->rawFormat('D, M j, Y'); - } - - /** - * Format the instance as time - * - * @example - * ``` - * echo Carbon::now()->toTimeString(); - * ``` - */ - public function toTimeString(string $unitPrecision = 'second'): string - { - return $this->rawFormat(static::getTimeFormatByPrecision($unitPrecision)); - } - - /** - * Format the instance as date and time - * - * @example - * ``` - * echo Carbon::now()->toDateTimeString(); - * ``` - */ - public function toDateTimeString(string $unitPrecision = 'second'): string - { - return $this->rawFormat('Y-m-d '.static::getTimeFormatByPrecision($unitPrecision)); - } - - /** - * Return a format from H:i to H:i:s.u according to given unit precision. - * - * @param string $unitPrecision "minute", "second", "millisecond" or "microsecond" - */ - public static function getTimeFormatByPrecision(string $unitPrecision): string - { - return match (static::singularUnit($unitPrecision)) { - 'minute' => 'H:i', - 'second' => 'H:i:s', - 'm', 'millisecond' => 'H:i:s.v', - 'µ', 'microsecond' => 'H:i:s.u', - default => throw new UnitException('Precision unit expected among: minute, second, millisecond and microsecond.'), - }; - } - - /** - * Format the instance as date and time T-separated with no timezone - * - * @example - * ``` - * echo Carbon::now()->toDateTimeLocalString(); - * echo "\n"; - * echo Carbon::now()->toDateTimeLocalString('minute'); // You can specify precision among: minute, second, millisecond and microsecond - * ``` - */ - public function toDateTimeLocalString(string $unitPrecision = 'second'): string - { - return $this->rawFormat('Y-m-d\T'.static::getTimeFormatByPrecision($unitPrecision)); - } - - /** - * Format the instance with day, date and time - * - * @example - * ``` - * echo Carbon::now()->toDayDateTimeString(); - * ``` - */ - public function toDayDateTimeString(): string - { - return $this->rawFormat('D, M j, Y g:i A'); - } - - /** - * Format the instance as ATOM - * - * @example - * ``` - * echo Carbon::now()->toAtomString(); - * ``` - */ - public function toAtomString(): string - { - return $this->rawFormat(DateTime::ATOM); - } - - /** - * Format the instance as COOKIE - * - * @example - * ``` - * echo Carbon::now()->toCookieString(); - * ``` - */ - public function toCookieString(): string - { - return $this->rawFormat(DateTimeInterface::COOKIE); - } - - /** - * Format the instance as ISO8601 - * - * @example - * ``` - * echo Carbon::now()->toIso8601String(); - * ``` - */ - public function toIso8601String(): string - { - return $this->toAtomString(); - } - - /** - * Format the instance as RFC822 - * - * @example - * ``` - * echo Carbon::now()->toRfc822String(); - * ``` - */ - public function toRfc822String(): string - { - return $this->rawFormat(DateTimeInterface::RFC822); - } - - /** - * Convert the instance to UTC and return as Zulu ISO8601 - * - * @example - * ``` - * echo Carbon::now()->toIso8601ZuluString(); - * ``` - */ - public function toIso8601ZuluString(string $unitPrecision = 'second'): string - { - return $this->avoidMutation() - ->utc() - ->rawFormat('Y-m-d\T'.static::getTimeFormatByPrecision($unitPrecision).'\Z'); - } - - /** - * Format the instance as RFC850 - * - * @example - * ``` - * echo Carbon::now()->toRfc850String(); - * ``` - */ - public function toRfc850String(): string - { - return $this->rawFormat(DateTimeInterface::RFC850); - } - - /** - * Format the instance as RFC1036 - * - * @example - * ``` - * echo Carbon::now()->toRfc1036String(); - * ``` - */ - public function toRfc1036String(): string - { - return $this->rawFormat(DateTimeInterface::RFC1036); - } - - /** - * Format the instance as RFC1123 - * - * @example - * ``` - * echo Carbon::now()->toRfc1123String(); - * ``` - */ - public function toRfc1123String(): string - { - return $this->rawFormat(DateTimeInterface::RFC1123); - } - - /** - * Format the instance as RFC2822 - * - * @example - * ``` - * echo Carbon::now()->toRfc2822String(); - * ``` - */ - public function toRfc2822String(): string - { - return $this->rawFormat(DateTimeInterface::RFC2822); - } - - /** - * Format the instance as RFC3339. - * - * @example - * ``` - * echo Carbon::now()->toRfc3339String() . "\n"; - * echo Carbon::now()->toRfc3339String(true) . "\n"; - * ``` - */ - public function toRfc3339String(bool $extended = false): string - { - return $this->rawFormat($extended ? DateTimeInterface::RFC3339_EXTENDED : DateTimeInterface::RFC3339); - } - - /** - * Format the instance as RSS - * - * @example - * ``` - * echo Carbon::now()->toRssString(); - * ``` - */ - public function toRssString(): string - { - return $this->rawFormat(DateTimeInterface::RSS); - } - - /** - * Format the instance as W3C - * - * @example - * ``` - * echo Carbon::now()->toW3cString(); - * ``` - */ - public function toW3cString(): string - { - return $this->rawFormat(DateTimeInterface::W3C); - } - - /** - * Format the instance as RFC7231 - * - * @example - * ``` - * echo Carbon::now()->toRfc7231String(); - * ``` - */ - public function toRfc7231String(): string - { - return $this->avoidMutation() - ->setTimezone('GMT') - ->rawFormat(\defined('static::RFC7231_FORMAT') ? static::RFC7231_FORMAT : CarbonInterface::RFC7231_FORMAT); - } - - /** - * Get default array representation. - * - * @example - * ``` - * var_dump(Carbon::now()->toArray()); - * ``` - */ - public function toArray(): array - { - return [ - 'year' => $this->year, - 'month' => $this->month, - 'day' => $this->day, - 'dayOfWeek' => $this->dayOfWeek, - 'dayOfYear' => $this->dayOfYear, - 'hour' => $this->hour, - 'minute' => $this->minute, - 'second' => $this->second, - 'micro' => $this->micro, - 'timestamp' => $this->timestamp, - 'formatted' => $this->rawFormat(\defined('static::DEFAULT_TO_STRING_FORMAT') ? static::DEFAULT_TO_STRING_FORMAT : CarbonInterface::DEFAULT_TO_STRING_FORMAT), - 'timezone' => $this->timezone, - ]; - } - - /** - * Get default object representation. - * - * @example - * ``` - * var_dump(Carbon::now()->toObject()); - * ``` - */ - public function toObject(): object - { - return (object) $this->toArray(); - } - - /** - * Returns english human-readable complete date string. - * - * @example - * ``` - * echo Carbon::now()->toString(); - * ``` - */ - public function toString(): string - { - return $this->avoidMutation()->locale('en')->isoFormat('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - } - - /** - * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z, if $keepOffset truthy, offset will be kept: - * 1977-04-22T01:00:00-05:00). - * - * @example - * ``` - * echo Carbon::now('America/Toronto')->toISOString() . "\n"; - * echo Carbon::now('America/Toronto')->toISOString(true) . "\n"; - * ``` - * - * @param bool $keepOffset Pass true to keep the date offset. Else forced to UTC. - */ - public function toISOString(bool $keepOffset = false): ?string - { - if (!$this->isValid()) { - return null; - } - - $yearFormat = $this->year < 0 || $this->year > 9999 ? 'YYYYYY' : 'YYYY'; - $timezoneFormat = $keepOffset ? 'Z' : '[Z]'; - $date = $keepOffset ? $this : $this->avoidMutation()->utc(); - - return $date->isoFormat("$yearFormat-MM-DD[T]HH:mm:ss.SSSSSS$timezoneFormat"); - } - - /** - * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z) with UTC timezone. - * - * @example - * ``` - * echo Carbon::now('America/Toronto')->toJSON(); - * ``` - */ - public function toJSON(): ?string - { - return $this->toISOString(); - } - - /** - * Return native DateTime PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDateTime()); - * ``` - */ - public function toDateTime(): DateTime - { - return DateTime::createFromFormat('U.u', $this->rawFormat('U.u')) - ->setTimezone($this->getTimezone()); - } - - /** - * Return native toDateTimeImmutable PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDateTimeImmutable()); - * ``` - */ - public function toDateTimeImmutable(): DateTimeImmutable - { - return DateTimeImmutable::createFromFormat('U.u', $this->rawFormat('U.u')) - ->setTimezone($this->getTimezone()); - } - - /** - * @alias toDateTime - * - * Return native DateTime PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDate()); - * ``` - */ - public function toDate(): DateTime - { - return $this->toDateTime(); - } - - /** - * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). - * - * @param \DateTimeInterface|Carbon|CarbonImmutable|int|null $end period end date or recurrences count if int - * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit - * @param string|null $unit if specified, $interval must be an integer - */ - public function toPeriod($end = null, $interval = null, $unit = null): CarbonPeriod - { - if ($unit) { - $interval = CarbonInterval::make("$interval ".static::pluralUnit($unit)); - } - - $isDefaultInterval = !$interval; - $interval ??= CarbonInterval::day(); - $class = $this->isMutable() ? CarbonPeriod::class : CarbonPeriodImmutable::class; - - if (\is_int($end) || (\is_string($end) && ctype_digit($end))) { - $end = (int) $end; - } - - $end ??= 1; - - if (!\is_int($end)) { - $end = $this->resolveCarbon($end); - } - - return new $class( - raw: [$this, CarbonInterval::make($interval), $end], - dateClass: static::class, - isDefaultInterval: $isDefaultInterval, - ); - } - - /** - * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). - * - * @param \DateTimeInterface|Carbon|CarbonImmutable|null $end period end date - * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit - * @param string|null $unit if specified, $interval must be an integer - */ - public function range($end = null, $interval = null, $unit = null): CarbonPeriod - { - return $this->toPeriod($end, $interval, $unit); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php b/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php deleted file mode 100644 index 31631b7..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php +++ /dev/null @@ -1,938 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\Carbon; -use Carbon\CarbonImmutable; -use Carbon\CarbonInterface; -use Carbon\Exceptions\InvalidDateException; -use Carbon\Exceptions\InvalidFormatException; -use Carbon\Exceptions\InvalidTimeZoneException; -use Carbon\Exceptions\OutOfRangeException; -use Carbon\Exceptions\UnitException; -use Carbon\Month; -use Carbon\Translator; -use Carbon\WeekDay; -use Closure; -use DateMalformedStringException; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use Exception; -use ReturnTypeWillChange; -use Symfony\Contracts\Translation\TranslatorInterface; - -/** - * Trait Creator. - * - * Static creators. - * - * Depends on the following methods: - * - * @method static Carbon|CarbonImmutable getTestNow() - */ -trait Creator -{ - use ObjectInitialisation; - use LocalFactory; - - /** - * The errors that can occur. - */ - protected static ?array $lastErrors = null; - - /** - * Create a new Carbon instance. - * - * Please see the testing aids section (specifically static::setTestNow()) - * for more on the possibility of this constructor returning a test instance. - * - * @throws InvalidFormatException - */ - public function __construct( - DateTimeInterface|WeekDay|Month|string|int|float|null $time = null, - DateTimeZone|string|int|null $timezone = null, - ) { - $this->initLocalFactory(); - - if ($time instanceof Month) { - $time = $time->name.' 1'; - } elseif ($time instanceof WeekDay) { - $time = $time->name; - } elseif ($time instanceof DateTimeInterface) { - $time = $this->constructTimezoneFromDateTime($time, $timezone)->format('Y-m-d H:i:s.u'); - } - - if (\is_string($time) && str_starts_with($time, '@')) { - $time = static::createFromTimestampUTC(substr($time, 1))->format('Y-m-d\TH:i:s.uP'); - } elseif (is_numeric($time) && (!\is_string($time) || !preg_match('/^\d{1,14}$/', $time))) { - $time = static::createFromTimestampUTC($time)->format('Y-m-d\TH:i:s.uP'); - } - - // If the class has a test now set, and we are trying to create a now() - // instance then override as required - $isNow = \in_array($time, [null, '', 'now'], true); - $timezone = static::safeCreateDateTimeZone($timezone) ?? null; - - if ( - ($this->clock || ( - method_exists(static::class, 'hasTestNow') && - method_exists(static::class, 'getTestNow') && - static::hasTestNow() - )) && - ($isNow || static::hasRelativeKeywords($time)) - ) { - $this->mockConstructorParameters($time, $timezone); - } - - try { - parent::__construct($time ?? 'now', $timezone); - } catch (Exception $exception) { - throw new InvalidFormatException($exception->getMessage(), 0, $exception); - } - - $this->constructedObjectId = spl_object_hash($this); - - self::setLastErrors(parent::getLastErrors()); - } - - /** - * Get timezone from a datetime instance. - */ - private function constructTimezoneFromDateTime( - DateTimeInterface $date, - DateTimeZone|string|int|null &$timezone, - ): DateTimeInterface { - if ($timezone !== null) { - $safeTz = static::safeCreateDateTimeZone($timezone); - - if ($safeTz) { - $date = ($date instanceof DateTimeImmutable ? $date : clone $date)->setTimezone($safeTz); - } - - return $date; - } - - $timezone = $date->getTimezone(); - - return $date; - } - - /** - * Update constructedObjectId on cloned. - */ - public function __clone(): void - { - $this->constructedObjectId = spl_object_hash($this); - } - - /** - * Create a Carbon instance from a DateTime one. - */ - public static function instance(DateTimeInterface $date): static - { - if ($date instanceof static) { - return clone $date; - } - - $instance = parent::createFromFormat('U.u', $date->format('U.u')) - ->setTimezone($date->getTimezone()); - - if ($date instanceof CarbonInterface) { - $settings = $date->getSettings(); - - if (!$date->hasLocalTranslator()) { - unset($settings['locale']); - } - - $instance->settings($settings); - } - - return $instance; - } - - /** - * Create a carbon instance from a string. - * - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * - * @throws InvalidFormatException - */ - public static function rawParse( - DateTimeInterface|WeekDay|Month|string|int|float|null $time, - DateTimeZone|string|int|null $timezone = null, - ): static { - if ($time instanceof DateTimeInterface) { - return static::instance($time); - } - - try { - return new static($time, $timezone); - } catch (Exception $exception) { - // @codeCoverageIgnoreStart - try { - $date = @static::now($timezone)->change($time); - } catch (DateMalformedStringException|InvalidFormatException) { - $date = null; - } - // @codeCoverageIgnoreEnd - - return $date - ?? throw new InvalidFormatException("Could not parse '$time': ".$exception->getMessage(), 0, $exception); - } - } - - /** - * Create a carbon instance from a string. - * - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * - * @throws InvalidFormatException - */ - public static function parse( - DateTimeInterface|WeekDay|Month|string|int|float|null $time, - DateTimeZone|string|int|null $timezone = null, - ): static { - $function = static::$parseFunction; - - if (!$function) { - return static::rawParse($time, $timezone); - } - - if (\is_string($function) && method_exists(static::class, $function)) { - $function = [static::class, $function]; - } - - return $function(...\func_get_args()); - } - - /** - * Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). - * - * @param string $time date/time string in the given language (may also contain English). - * @param string|null $locale if locale is null or not specified, current global locale will be - * used instead. - * @param DateTimeZone|string|int|null $timezone optional timezone for the new instance. - * - * @throws InvalidFormatException - */ - public static function parseFromLocale( - string $time, - ?string $locale = null, - DateTimeZone|string|int|null $timezone = null, - ): static { - return static::rawParse(static::translateTimeString($time, $locale, static::DEFAULT_LOCALE), $timezone); - } - - /** - * Get a Carbon instance for the current date and time. - */ - public static function now(DateTimeZone|string|int|null $timezone = null): static - { - return new static(null, $timezone); - } - - /** - * Create a Carbon instance for today. - */ - public static function today(DateTimeZone|string|int|null $timezone = null): static - { - return static::rawParse('today', $timezone); - } - - /** - * Create a Carbon instance for tomorrow. - */ - public static function tomorrow(DateTimeZone|string|int|null $timezone = null): static - { - return static::rawParse('tomorrow', $timezone); - } - - /** - * Create a Carbon instance for yesterday. - */ - public static function yesterday(DateTimeZone|string|int|null $timezone = null): static - { - return static::rawParse('yesterday', $timezone); - } - - private static function assertBetween($unit, $value, $min, $max): void - { - if (static::isStrictModeEnabled() && ($value < $min || $value > $max)) { - throw new OutOfRangeException($unit, $min, $max, $value); - } - } - - private static function createNowInstance($timezone) - { - if (!static::hasTestNow()) { - return static::now($timezone); - } - - $now = static::getTestNow(); - - if ($now instanceof Closure) { - return $now(static::now($timezone)); - } - - $now = $now->avoidMutation(); - - return $timezone === null ? $now : $now->setTimezone($timezone); - } - - /** - * Create a new Carbon instance from a specific date and time. - * - * If any of $year, $month or $day are set to null their now() values will - * be used. - * - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * - * If $hour is not null then the default values for $minute and $second - * will be 0. - * - * @param DateTimeInterface|string|int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $timezone = null): ?self - { - $month = self::monthToInt($month); - - if ((\is_string($year) && !is_numeric($year)) || $year instanceof DateTimeInterface) { - return static::parse($year, $timezone ?? (\is_string($month) || $month instanceof DateTimeZone ? $month : null)); - } - - $defaults = null; - $getDefault = function ($unit) use ($timezone, &$defaults) { - if ($defaults === null) { - $now = self::createNowInstance($timezone); - - $defaults = array_combine([ - 'year', - 'month', - 'day', - 'hour', - 'minute', - 'second', - ], explode('-', $now->rawFormat('Y-n-j-G-i-s.u'))); - } - - return $defaults[$unit]; - }; - - $year = $year ?? $getDefault('year'); - $month = $month ?? $getDefault('month'); - $day = $day ?? $getDefault('day'); - $hour = $hour ?? $getDefault('hour'); - $minute = $minute ?? $getDefault('minute'); - $second = (float) ($second ?? $getDefault('second')); - - self::assertBetween('month', $month, 0, 99); - self::assertBetween('day', $day, 0, 99); - self::assertBetween('hour', $hour, 0, 99); - self::assertBetween('minute', $minute, 0, 99); - self::assertBetween('second', $second, 0, 99); - - $fixYear = null; - - if ($year < 0) { - $fixYear = $year; - $year = 0; - } elseif ($year > 9999) { - $fixYear = $year - 9999; - $year = 9999; - } - - $second = ($second < 10 ? '0' : '').number_format($second, 6); - $instance = static::rawCreateFromFormat('!Y-n-j G:i:s.u', \sprintf('%s-%s-%s %s:%02s:%02s', $year, $month, $day, $hour, $minute, $second), $timezone); - - if ($instance && $fixYear !== null) { - $instance = $instance->addYears($fixYear); - } - - return $instance ?? null; - } - - /** - * Create a new safe Carbon instance from a specific date and time. - * - * If any of $year, $month or $day are set to null their now() values will - * be used. - * - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * - * If $hour is not null then the default values for $minute and $second - * will be 0. - * - * If one of the set values is not valid, an InvalidDateException - * will be thrown. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidDateException - * - * @return static|null - */ - public static function createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $timezone = null): ?self - { - $month = self::monthToInt($month); - $fields = static::getRangesByUnit(); - - foreach ($fields as $field => $range) { - if ($$field !== null && (!\is_int($$field) || $$field < $range[0] || $$field > $range[1])) { - if (static::isStrictModeEnabled()) { - throw new InvalidDateException($field, $$field); - } - - return null; - } - } - - $instance = static::create($year, $month, $day, $hour, $minute, $second, $timezone); - - foreach (array_reverse($fields) as $field => $range) { - if ($$field !== null && (!\is_int($$field) || $$field !== $instance->$field)) { - if (static::isStrictModeEnabled()) { - throw new InvalidDateException($field, $$field); - } - - return null; - } - } - - return $instance; - } - - /** - * Create a new Carbon instance from a specific date and time using strict validation. - * - * @see create() - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $timezone = null): static - { - $initialStrictMode = static::isStrictModeEnabled(); - static::useStrictMode(true); - - try { - $date = static::create($year, $month, $day, $hour, $minute, $second, $timezone); - } finally { - static::useStrictMode($initialStrictMode); - } - - return $date; - } - - /** - * Create a Carbon instance from just a date. The time portion is set to now. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createFromDate($year = null, $month = null, $day = null, $timezone = null) - { - return static::create($year, $month, $day, null, null, null, $timezone); - } - - /** - * Create a Carbon instance from just a date. The time portion is set to midnight. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createMidnightDate($year = null, $month = null, $day = null, $timezone = null) - { - return static::create($year, $month, $day, 0, 0, 0, $timezone); - } - - /** - * Create a Carbon instance from just a time. The date portion is set to today. - * - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createFromTime($hour = 0, $minute = 0, $second = 0, $timezone = null): static - { - return static::create(null, null, null, $hour, $minute, $second, $timezone); - } - - /** - * Create a Carbon instance from a time string. The date portion is set to today. - * - * @throws InvalidFormatException - */ - public static function createFromTimeString(string $time, DateTimeZone|string|int|null $timezone = null): static - { - return static::today($timezone)->setTimeFromTimeString($time); - } - - private static function createFromFormatAndTimezone( - string $format, - string $time, - DateTimeZone|string|int|null $originalTimezone, - ): ?DateTimeInterface { - if ($originalTimezone === null) { - return parent::createFromFormat($format, $time) ?: null; - } - - $timezone = \is_int($originalTimezone) ? self::getOffsetTimezone($originalTimezone) : $originalTimezone; - - $timezone = static::safeCreateDateTimeZone($timezone, $originalTimezone); - - return parent::createFromFormat($format, $time, $timezone) ?: null; - } - - private static function getOffsetTimezone(int $offset): string - { - $minutes = (int) ($offset * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE); - - return @timezone_name_from_abbr('', $minutes, 1) ?: throw new InvalidTimeZoneException( - "Invalid offset timezone $offset", - ); - } - - /** - * Create a Carbon instance from a specific format. - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function rawCreateFromFormat(string $format, string $time, $timezone = null): ?self - { - // Work-around for https://bugs.php.net/bug.php?id=80141 - $format = preg_replace('/(?getTimezone(); - } - - $mock = $mock->copy(); - - // Prepend mock datetime only if the format does not contain non escaped unix epoch reset flag. - if (!preg_match("/{$nonEscaped}[!|]/", $format)) { - if (preg_match('/[HhGgisvuB]/', $format)) { - $mock = $mock->setTime(0, 0); - } - - $format = static::MOCK_DATETIME_FORMAT.' '.$format; - $time = ($mock instanceof self ? $mock->rawFormat(static::MOCK_DATETIME_FORMAT) : $mock->format(static::MOCK_DATETIME_FORMAT)).' '.$time; - } - - // Regenerate date from the modified format to base result on the mocked instance instead of now. - $date = self::createFromFormatAndTimezone($format, $time, $timezone); - } - - if ($date instanceof DateTimeInterface) { - $instance = static::instance($date); - $instance::setLastErrors($lastErrors); - - return $instance; - } - - if (static::isStrictModeEnabled()) { - throw new InvalidFormatException(implode(PHP_EOL, (array) $lastErrors['errors'])); - } - - return null; - } - - /** - * Create a Carbon instance from a specific format. - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static|null - */ - #[ReturnTypeWillChange] - public static function createFromFormat($format, $time, $timezone = null): ?self - { - $function = static::$createFromFormatFunction; - - // format is a single numeric unit - if (\is_int($time) && \in_array(ltrim($format, '!'), ['U', 'Y', 'y', 'X', 'x', 'm', 'n', 'd', 'j', 'w', 'W', 'H', 'h', 'G', 'g', 'i', 's', 'u', 'z', 'v'], true)) { - $time = (string) $time; - } - - if (!\is_string($time)) { - @trigger_error( - 'createFromFormat() $time parameter will only accept string or integer for 1-letter format representing a numeric unit in the next version', - \E_USER_DEPRECATED, - ); - $time = (string) $time; - } - - if (!$function) { - return static::rawCreateFromFormat($format, $time, $timezone); - } - - if (\is_string($function) && method_exists(static::class, $function)) { - $function = [static::class, $function]; - } - - return $function(...\func_get_args()); - } - - /** - * Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|int|null $timezone optional timezone - * @param string|null $locale locale to be used for LTS, LT, LL, LLL, etc. macro-formats (en by fault, unneeded if no such macro-format in use) - * @param TranslatorInterface|null $translator optional custom translator to use for macro-formats - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function createFromIsoFormat( - string $format, - string $time, - $timezone = null, - ?string $locale = self::DEFAULT_LOCALE, - ?TranslatorInterface $translator = null - ): ?self { - $format = preg_replace_callback('/(? static::getTranslationMessageWith($translator, 'formats.LT', $locale), - 'LTS' => static::getTranslationMessageWith($translator, 'formats.LTS', $locale), - 'L' => static::getTranslationMessageWith($translator, 'formats.L', $locale), - 'LL' => static::getTranslationMessageWith($translator, 'formats.LL', $locale), - 'LLL' => static::getTranslationMessageWith($translator, 'formats.LLL', $locale), - 'LLLL' => static::getTranslationMessageWith($translator, 'formats.LLLL', $locale), - ]; - } - - return $formats[$code] ?? preg_replace_callback( - '/MMMM|MM|DD|dddd/', - static fn (array $code) => mb_substr($code[0], 1), - $formats[strtoupper($code)] ?? '', - ); - }, $format); - - $format = preg_replace_callback('/(? 'd', - 'OM' => 'M', - 'OY' => 'Y', - 'OH' => 'G', - 'Oh' => 'g', - 'Om' => 'i', - 'Os' => 's', - 'D' => 'd', - 'DD' => 'd', - 'Do' => 'd', - 'd' => '!', - 'dd' => '!', - 'ddd' => 'D', - 'dddd' => 'D', - 'DDD' => 'z', - 'DDDD' => 'z', - 'DDDo' => 'z', - 'e' => '!', - 'E' => '!', - 'H' => 'G', - 'HH' => 'H', - 'h' => 'g', - 'hh' => 'h', - 'k' => 'G', - 'kk' => 'G', - 'hmm' => 'gi', - 'hmmss' => 'gis', - 'Hmm' => 'Gi', - 'Hmmss' => 'Gis', - 'm' => 'i', - 'mm' => 'i', - 'a' => 'a', - 'A' => 'a', - 's' => 's', - 'ss' => 's', - 'S' => '*', - 'SS' => '*', - 'SSS' => '*', - 'SSSS' => '*', - 'SSSSS' => '*', - 'SSSSSS' => 'u', - 'SSSSSSS' => 'u*', - 'SSSSSSSS' => 'u*', - 'SSSSSSSSS' => 'u*', - 'M' => 'm', - 'MM' => 'm', - 'MMM' => 'M', - 'MMMM' => 'M', - 'Mo' => 'm', - 'Q' => '!', - 'Qo' => '!', - 'G' => '!', - 'GG' => '!', - 'GGG' => '!', - 'GGGG' => '!', - 'GGGGG' => '!', - 'g' => '!', - 'gg' => '!', - 'ggg' => '!', - 'gggg' => '!', - 'ggggg' => '!', - 'W' => '!', - 'WW' => '!', - 'Wo' => '!', - 'w' => '!', - 'ww' => '!', - 'wo' => '!', - 'x' => 'U???', - 'X' => 'U', - 'Y' => 'Y', - 'YY' => 'y', - 'YYYY' => 'Y', - 'YYYYY' => 'Y', - 'YYYYYY' => 'Y', - 'z' => 'e', - 'zz' => 'e', - 'Z' => 'e', - 'ZZ' => 'e', - ]; - } - - $format = $replacements[$code] ?? '?'; - - if ($format === '!') { - throw new InvalidFormatException("Format $code not supported for creation."); - } - - return $format; - }, $format); - - return static::rawCreateFromFormat($format, $time, $timezone); - } - - /** - * Create a Carbon instance from a specific format and a string in a given language. - * - * @param string $format Datetime format - * @param string $locale - * @param string $time - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function createFromLocaleFormat(string $format, string $locale, string $time, $timezone = null): ?self - { - $format = preg_replace_callback( - '/(?:\\\\[a-zA-Z]|[bfkqCEJKQRV]){2,}/', - static function (array $match) use ($locale): string { - $word = str_replace('\\', '', $match[0]); - $translatedWord = static::translateTimeString($word, $locale, static::DEFAULT_LOCALE); - - return $word === $translatedWord - ? $match[0] - : preg_replace('/[a-zA-Z]/', '\\\\$0', $translatedWord); - }, - $format - ); - - return static::rawCreateFromFormat($format, static::translateTimeString($time, $locale, static::DEFAULT_LOCALE), $timezone); - } - - /** - * Create a Carbon instance from a specific ISO format and a string in a given language. - * - * @param string $format Datetime ISO format - * @param string $locale - * @param string $time - * @param DateTimeZone|string|int|null $timezone - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function createFromLocaleIsoFormat(string $format, string $locale, string $time, $timezone = null): ?self - { - $time = static::translateTimeString($time, $locale, static::DEFAULT_LOCALE, CarbonInterface::TRANSLATE_MONTHS | CarbonInterface::TRANSLATE_DAYS | CarbonInterface::TRANSLATE_MERIDIEM); - - return static::createFromIsoFormat($format, $time, $timezone, $locale); - } - - /** - * Make a Carbon instance from given variable if possible. - * - * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals - * and recurrences). Throw an exception for invalid format, but otherwise return null. - * - * @param mixed $var - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function make($var, DateTimeZone|string|null $timezone = null): ?self - { - if ($var instanceof DateTimeInterface) { - return static::instance($var); - } - - $date = null; - - if (\is_string($var)) { - $var = trim($var); - - if (!preg_match('/^P[\dT]/', $var) && - !preg_match('/^R\d/', $var) && - preg_match('/[a-z\d]/i', $var) - ) { - $date = static::parse($var, $timezone); - } - } - - return $date; - } - - /** - * Set last errors. - * - * @param array|bool $lastErrors - * - * @return void - */ - private static function setLastErrors($lastErrors): void - { - if (\is_array($lastErrors) || $lastErrors === false) { - static::$lastErrors = \is_array($lastErrors) ? $lastErrors : [ - 'warning_count' => 0, - 'warnings' => [], - 'error_count' => 0, - 'errors' => [], - ]; - } - } - - /** - * {@inheritdoc} - */ - public static function getLastErrors(): array|false - { - return static::$lastErrors ?? false; - } - - private static function monthToInt(mixed $value, string $unit = 'month'): mixed - { - if ($value instanceof Month) { - if ($unit !== 'month') { - throw new UnitException("Month enum cannot be used to set $unit"); - } - - return Month::int($value); - } - - return $value; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Date.php b/vendor/nesbot/carbon/src/Carbon/Traits/Date.php deleted file mode 100644 index 8ac81ea..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Date.php +++ /dev/null @@ -1,2971 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use BadMethodCallException; -use Carbon\Carbon; -use Carbon\CarbonInterface; -use Carbon\CarbonPeriod; -use Carbon\CarbonTimeZone; -use Carbon\Exceptions\BadComparisonUnitException; -use Carbon\Exceptions\ImmutableException; -use Carbon\Exceptions\InvalidTimeZoneException; -use Carbon\Exceptions\UnitException; -use Carbon\Exceptions\UnknownGetterException; -use Carbon\Exceptions\UnknownMethodException; -use Carbon\Exceptions\UnknownSetterException; -use Carbon\Exceptions\UnknownUnitException; -use Carbon\FactoryImmutable; -use Carbon\Month; -use Carbon\Translator; -use Carbon\Unit; -use Carbon\WeekDay; -use Closure; -use DateInterval; -use DatePeriod; -use DateTime; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use Generator; -use InvalidArgumentException; -use ReflectionException; -use Symfony\Component\Clock\NativeClock; -use Throwable; - -/** - * A simple API extension for DateTime. - * - * - * - * @property string $localeDayOfWeek the day of week in current locale - * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale - * @property string $localeMonth the month in current locale - * @property string $shortLocaleMonth the abbreviated month in current locale - * @property int $year - * @property int $yearIso - * @property int $month - * @property int $day - * @property int $hour - * @property int $minute - * @property int $second - * @property int $micro - * @property int $microsecond - * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English - * @property int $milliseconds - * @property int $millisecond - * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium - * @property int $dayOfCentury The value of the day starting from the beginning of the current century - * @property int $dayOfDecade The value of the day starting from the beginning of the current decade - * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium - * @property int $dayOfMonth The value of the day starting from the beginning of the current month - * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter - * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property int $dayOfYear 1 through 366 - * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century - * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium - * @property int $hourOfCentury The value of the hour starting from the beginning of the current century - * @property int $hourOfDay The value of the hour starting from the beginning of the current day - * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade - * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium - * @property int $hourOfMonth The value of the hour starting from the beginning of the current month - * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter - * @property int $hourOfWeek The value of the hour starting from the beginning of the current week - * @property int $hourOfYear The value of the hour starting from the beginning of the current year - * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century - * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day - * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade - * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour - * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium - * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond - * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute - * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month - * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter - * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second - * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week - * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year - * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century - * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day - * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade - * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour - * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium - * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute - * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month - * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter - * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second - * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week - * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year - * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century - * @property int $minuteOfDay The value of the minute starting from the beginning of the current day - * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade - * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour - * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium - * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month - * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter - * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week - * @property int $minuteOfYear The value of the minute starting from the beginning of the current year - * @property int $monthOfCentury The value of the month starting from the beginning of the current century - * @property int $monthOfDecade The value of the month starting from the beginning of the current decade - * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium - * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter - * @property int $monthOfYear The value of the month starting from the beginning of the current year - * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century - * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade - * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium - * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year - * @property int $secondOfCentury The value of the second starting from the beginning of the current century - * @property int $secondOfDay The value of the second starting from the beginning of the current day - * @property int $secondOfDecade The value of the second starting from the beginning of the current decade - * @property int $secondOfHour The value of the second starting from the beginning of the current hour - * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium - * @property int $secondOfMinute The value of the second starting from the beginning of the current minute - * @property int $secondOfMonth The value of the second starting from the beginning of the current month - * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter - * @property int $secondOfWeek The value of the second starting from the beginning of the current week - * @property int $secondOfYear The value of the second starting from the beginning of the current year - * @property int $weekOfCentury The value of the week starting from the beginning of the current century - * @property int $weekOfDecade The value of the week starting from the beginning of the current decade - * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium - * @property int $weekOfMonth 1 through 5 - * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter - * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property int $yearOfCentury The value of the year starting from the beginning of the current century - * @property int $yearOfDecade The value of the year starting from the beginning of the current decade - * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium - * @property-read int $daysInCentury The number of days contained in the current century - * @property-read int $daysInDecade The number of days contained in the current decade - * @property-read int $daysInMillennium The number of days contained in the current millennium - * @property-read int $daysInMonth number of days in the given month - * @property-read int $daysInQuarter The number of days contained in the current quarter - * @property-read int $daysInWeek The number of days contained in the current week - * @property-read int $daysInYear 365 or 366 - * @property-read int $decadesInCentury The number of decades contained in the current century - * @property-read int $decadesInMillennium The number of decades contained in the current millennium - * @property-read int $hoursInCentury The number of hours contained in the current century - * @property-read int $hoursInDay The number of hours contained in the current day - * @property-read int $hoursInDecade The number of hours contained in the current decade - * @property-read int $hoursInMillennium The number of hours contained in the current millennium - * @property-read int $hoursInMonth The number of hours contained in the current month - * @property-read int $hoursInQuarter The number of hours contained in the current quarter - * @property-read int $hoursInWeek The number of hours contained in the current week - * @property-read int $hoursInYear The number of hours contained in the current year - * @property-read int $microsecondsInCentury The number of microseconds contained in the current century - * @property-read int $microsecondsInDay The number of microseconds contained in the current day - * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade - * @property-read int $microsecondsInHour The number of microseconds contained in the current hour - * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium - * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond - * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute - * @property-read int $microsecondsInMonth The number of microseconds contained in the current month - * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter - * @property-read int $microsecondsInSecond The number of microseconds contained in the current second - * @property-read int $microsecondsInWeek The number of microseconds contained in the current week - * @property-read int $microsecondsInYear The number of microseconds contained in the current year - * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century - * @property-read int $millisecondsInDay The number of milliseconds contained in the current day - * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade - * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour - * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium - * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute - * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month - * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter - * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second - * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week - * @property-read int $millisecondsInYear The number of milliseconds contained in the current year - * @property-read int $minutesInCentury The number of minutes contained in the current century - * @property-read int $minutesInDay The number of minutes contained in the current day - * @property-read int $minutesInDecade The number of minutes contained in the current decade - * @property-read int $minutesInHour The number of minutes contained in the current hour - * @property-read int $minutesInMillennium The number of minutes contained in the current millennium - * @property-read int $minutesInMonth The number of minutes contained in the current month - * @property-read int $minutesInQuarter The number of minutes contained in the current quarter - * @property-read int $minutesInWeek The number of minutes contained in the current week - * @property-read int $minutesInYear The number of minutes contained in the current year - * @property-read int $monthsInCentury The number of months contained in the current century - * @property-read int $monthsInDecade The number of months contained in the current decade - * @property-read int $monthsInMillennium The number of months contained in the current millennium - * @property-read int $monthsInQuarter The number of months contained in the current quarter - * @property-read int $monthsInYear The number of months contained in the current year - * @property-read int $quartersInCentury The number of quarters contained in the current century - * @property-read int $quartersInDecade The number of quarters contained in the current decade - * @property-read int $quartersInMillennium The number of quarters contained in the current millennium - * @property-read int $quartersInYear The number of quarters contained in the current year - * @property-read int $secondsInCentury The number of seconds contained in the current century - * @property-read int $secondsInDay The number of seconds contained in the current day - * @property-read int $secondsInDecade The number of seconds contained in the current decade - * @property-read int $secondsInHour The number of seconds contained in the current hour - * @property-read int $secondsInMillennium The number of seconds contained in the current millennium - * @property-read int $secondsInMinute The number of seconds contained in the current minute - * @property-read int $secondsInMonth The number of seconds contained in the current month - * @property-read int $secondsInQuarter The number of seconds contained in the current quarter - * @property-read int $secondsInWeek The number of seconds contained in the current week - * @property-read int $secondsInYear The number of seconds contained in the current year - * @property-read int $weeksInCentury The number of weeks contained in the current century - * @property-read int $weeksInDecade The number of weeks contained in the current decade - * @property-read int $weeksInMillennium The number of weeks contained in the current millennium - * @property-read int $weeksInMonth The number of weeks contained in the current month - * @property-read int $weeksInQuarter The number of weeks contained in the current quarter - * @property-read int $weeksInYear 51 through 53 - * @property-read int $yearsInCentury The number of years contained in the current century - * @property-read int $yearsInDecade The number of years contained in the current decade - * @property-read int $yearsInMillennium The number of years contained in the current millennium - * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method CarbonInterface years(int $value) Set current instance year to the given value. - * @method CarbonInterface year(int $value) Set current instance year to the given value. - * @method CarbonInterface setYears(int $value) Set current instance year to the given value. - * @method CarbonInterface setYear(int $value) Set current instance year to the given value. - * @method CarbonInterface months(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface month(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface setMonths(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface setMonth(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface days(int $value) Set current instance day to the given value. - * @method CarbonInterface day(int $value) Set current instance day to the given value. - * @method CarbonInterface setDays(int $value) Set current instance day to the given value. - * @method CarbonInterface setDay(int $value) Set current instance day to the given value. - * @method CarbonInterface hours(int $value) Set current instance hour to the given value. - * @method CarbonInterface hour(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHours(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHour(int $value) Set current instance hour to the given value. - * @method CarbonInterface minutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface minute(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinute(int $value) Set current instance minute to the given value. - * @method CarbonInterface seconds(int $value) Set current instance second to the given value. - * @method CarbonInterface second(int $value) Set current instance second to the given value. - * @method CarbonInterface setSeconds(int $value) Set current instance second to the given value. - * @method CarbonInterface setSecond(int $value) Set current instance second to the given value. - * @method CarbonInterface millis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface millisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface micros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface micro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microsecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface addYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addYear() Add one year to the instance (using date interval). - * @method CarbonInterface subYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subYear() Sub one year to the instance (using date interval). - * @method CarbonInterface addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearsWithoutOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithoutOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsWithNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMonth() Add one month to the instance (using date interval). - * @method CarbonInterface subMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMonth() Sub one month to the instance (using date interval). - * @method CarbonInterface addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthsWithoutOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithoutOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsWithNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDay() Add one day to the instance (using date interval). - * @method CarbonInterface subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDay() Sub one day to the instance (using date interval). - * @method CarbonInterface addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addHour() Add one hour to the instance (using date interval). - * @method CarbonInterface subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subHour() Sub one hour to the instance (using date interval). - * @method CarbonInterface addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMinute() Add one minute to the instance (using date interval). - * @method CarbonInterface subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMinute() Sub one minute to the instance (using date interval). - * @method CarbonInterface addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addSecond() Add one second to the instance (using date interval). - * @method CarbonInterface subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subSecond() Sub one second to the instance (using date interval). - * @method CarbonInterface addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMilli() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMilli() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillisecond() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillisecond() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicro() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicro() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicrosecond() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillennium() Add one millennium to the instance (using date interval). - * @method CarbonInterface subMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillennium() Sub one millennium to the instance (using date interval). - * @method CarbonInterface addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniaWithoutOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithoutOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaWithNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addCentury() Add one century to the instance (using date interval). - * @method CarbonInterface subCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subCentury() Sub one century to the instance (using date interval). - * @method CarbonInterface addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturiesWithoutOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithoutOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesWithNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDecade() Add one decade to the instance (using date interval). - * @method CarbonInterface subDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDecade() Sub one decade to the instance (using date interval). - * @method CarbonInterface addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadesWithoutOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithoutOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesWithNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addQuarter() Add one quarter to the instance (using date interval). - * @method CarbonInterface subQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subQuarter() Sub one quarter to the instance (using date interval). - * @method CarbonInterface addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuartersWithoutOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithoutOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersWithNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeek() Add one week to the instance (using date interval). - * @method CarbonInterface subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeek() Sub one week to the instance (using date interval). - * @method CarbonInterface addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeekday() Add one weekday to the instance (using date interval). - * @method CarbonInterface subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeekday() Sub one weekday to the instance (using date interval). - * @method CarbonInterface addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMicro() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonInterface addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMicrosecond() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonInterface addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMilli() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonInterface addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMillisecond() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonInterface addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCSecond() Add one second to the instance (using timestamp). - * @method CarbonInterface subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. - * @method CarbonInterface addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMinute() Add one minute to the instance (using timestamp). - * @method CarbonInterface subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. - * @method CarbonInterface addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCHour() Add one hour to the instance (using timestamp). - * @method CarbonInterface subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. - * @method CarbonInterface addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCDay() Add one day to the instance (using timestamp). - * @method CarbonInterface subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. - * @method CarbonInterface addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCWeek() Add one week to the instance (using timestamp). - * @method CarbonInterface subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. - * @method CarbonInterface addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMonth() Add one month to the instance (using timestamp). - * @method CarbonInterface subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. - * @method CarbonInterface addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCQuarter() Add one quarter to the instance (using timestamp). - * @method CarbonInterface subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. - * @method CarbonInterface addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCYear() Add one year to the instance (using timestamp). - * @method CarbonInterface subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. - * @method CarbonInterface addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCDecade() Add one decade to the instance (using timestamp). - * @method CarbonInterface subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. - * @method CarbonInterface addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCCentury() Add one century to the instance (using timestamp). - * @method CarbonInterface subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. - * @method CarbonInterface addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMillennium() Add one millennium to the instance (using timestamp). - * @method CarbonInterface subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. - * @method CarbonInterface roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method CarbonInterface ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium - * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value - * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value - * @method int daysInCentury() Return the number of days contained in the current century - * @method int daysInDecade() Return the number of days contained in the current decade - * @method int daysInMillennium() Return the number of days contained in the current millennium - * @method int daysInMonth() Return the number of days contained in the current month - * @method int daysInQuarter() Return the number of days contained in the current quarter - * @method int daysInWeek() Return the number of days contained in the current week - * @method int daysInYear() Return the number of days contained in the current year - * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value - * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value - * @method int decadesInCentury() Return the number of decades contained in the current century - * @method int decadesInMillennium() Return the number of decades contained in the current millennium - * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value - * @method int hoursInCentury() Return the number of hours contained in the current century - * @method int hoursInDay() Return the number of hours contained in the current day - * @method int hoursInDecade() Return the number of hours contained in the current decade - * @method int hoursInMillennium() Return the number of hours contained in the current millennium - * @method int hoursInMonth() Return the number of hours contained in the current month - * @method int hoursInQuarter() Return the number of hours contained in the current quarter - * @method int hoursInWeek() Return the number of hours contained in the current week - * @method int hoursInYear() Return the number of hours contained in the current year - * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value - * @method int microsecondsInCentury() Return the number of microseconds contained in the current century - * @method int microsecondsInDay() Return the number of microseconds contained in the current day - * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade - * @method int microsecondsInHour() Return the number of microseconds contained in the current hour - * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium - * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond - * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute - * @method int microsecondsInMonth() Return the number of microseconds contained in the current month - * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter - * @method int microsecondsInSecond() Return the number of microseconds contained in the current second - * @method int microsecondsInWeek() Return the number of microseconds contained in the current week - * @method int microsecondsInYear() Return the number of microseconds contained in the current year - * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value - * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century - * @method int millisecondsInDay() Return the number of milliseconds contained in the current day - * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade - * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour - * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium - * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute - * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month - * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter - * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second - * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week - * @method int millisecondsInYear() Return the number of milliseconds contained in the current year - * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value - * @method int minutesInCentury() Return the number of minutes contained in the current century - * @method int minutesInDay() Return the number of minutes contained in the current day - * @method int minutesInDecade() Return the number of minutes contained in the current decade - * @method int minutesInHour() Return the number of minutes contained in the current hour - * @method int minutesInMillennium() Return the number of minutes contained in the current millennium - * @method int minutesInMonth() Return the number of minutes contained in the current month - * @method int minutesInQuarter() Return the number of minutes contained in the current quarter - * @method int minutesInWeek() Return the number of minutes contained in the current week - * @method int minutesInYear() Return the number of minutes contained in the current year - * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value - * @method int monthsInCentury() Return the number of months contained in the current century - * @method int monthsInDecade() Return the number of months contained in the current decade - * @method int monthsInMillennium() Return the number of months contained in the current millennium - * @method int monthsInQuarter() Return the number of months contained in the current quarter - * @method int monthsInYear() Return the number of months contained in the current year - * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value - * @method int quartersInCentury() Return the number of quarters contained in the current century - * @method int quartersInDecade() Return the number of quarters contained in the current decade - * @method int quartersInMillennium() Return the number of quarters contained in the current millennium - * @method int quartersInYear() Return the number of quarters contained in the current year - * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value - * @method int secondsInCentury() Return the number of seconds contained in the current century - * @method int secondsInDay() Return the number of seconds contained in the current day - * @method int secondsInDecade() Return the number of seconds contained in the current decade - * @method int secondsInHour() Return the number of seconds contained in the current hour - * @method int secondsInMillennium() Return the number of seconds contained in the current millennium - * @method int secondsInMinute() Return the number of seconds contained in the current minute - * @method int secondsInMonth() Return the number of seconds contained in the current month - * @method int secondsInQuarter() Return the number of seconds contained in the current quarter - * @method int secondsInWeek() Return the number of seconds contained in the current week - * @method int secondsInYear() Return the number of seconds contained in the current year - * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value - * @method int weeksInCentury() Return the number of weeks contained in the current century - * @method int weeksInDecade() Return the number of weeks contained in the current decade - * @method int weeksInMillennium() Return the number of weeks contained in the current millennium - * @method int weeksInMonth() Return the number of weeks contained in the current month - * @method int weeksInQuarter() Return the number of weeks contained in the current quarter - * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value - * @method int yearsInCentury() Return the number of years contained in the current century - * @method int yearsInDecade() Return the number of years contained in the current decade - * @method int yearsInMillennium() Return the number of years contained in the current millennium - * - * - */ -trait Date -{ - use Boundaries; - use Comparison; - use Converter; - use Creator; - use Difference; - use Macro; - use MagicParameter; - use Modifiers; - use Mutability; - use ObjectInitialisation; - use Options; - use Rounding; - use Serialization; - use Test; - use Timestamp; - use Units; - use Week; - - /** - * Names of days of the week. - * - * @var array - */ - protected static $days = [ - // @call isDayOfWeek - CarbonInterface::SUNDAY => 'Sunday', - // @call isDayOfWeek - CarbonInterface::MONDAY => 'Monday', - // @call isDayOfWeek - CarbonInterface::TUESDAY => 'Tuesday', - // @call isDayOfWeek - CarbonInterface::WEDNESDAY => 'Wednesday', - // @call isDayOfWeek - CarbonInterface::THURSDAY => 'Thursday', - // @call isDayOfWeek - CarbonInterface::FRIDAY => 'Friday', - // @call isDayOfWeek - CarbonInterface::SATURDAY => 'Saturday', - ]; - - /** - * List of unit and magic methods associated as doc-comments. - * - * @var array - */ - protected static $units = [ - // @call setUnit - // @call addUnit - 'year', - // @call setUnit - // @call addUnit - 'month', - // @call setUnit - // @call addUnit - 'day', - // @call setUnit - // @call addUnit - 'hour', - // @call setUnit - // @call addUnit - 'minute', - // @call setUnit - // @call addUnit - 'second', - // @call setUnit - // @call addUnit - 'milli', - // @call setUnit - // @call addUnit - 'millisecond', - // @call setUnit - // @call addUnit - 'micro', - // @call setUnit - // @call addUnit - 'microsecond', - ]; - - /** - * Creates a DateTimeZone from a string, DateTimeZone or integer offset. - * - * @param DateTimeZone|string|int|false|null $object original value to get CarbonTimeZone from it. - * @param DateTimeZone|string|int|false|null $objectDump dump of the object for error messages. - * - * @throws InvalidTimeZoneException - * - * @return CarbonTimeZone|null - */ - protected static function safeCreateDateTimeZone( - DateTimeZone|string|int|false|null $object, - DateTimeZone|string|int|false|null $objectDump = null, - ): ?CarbonTimeZone { - return CarbonTimeZone::instance($object, $objectDump); - } - - /** - * Get the TimeZone associated with the Carbon instance (as CarbonTimeZone). - * - * @link https://php.net/manual/en/datetime.gettimezone.php - */ - public function getTimezone(): CarbonTimeZone - { - return $this->transmitFactory(fn () => CarbonTimeZone::instance(parent::getTimezone())); - } - - /** - * List of minimum and maximums for each unit. - */ - protected static function getRangesByUnit(int $daysInMonth = 31): array - { - return [ - // @call roundUnit - 'year' => [1, 9999], - // @call roundUnit - 'month' => [1, static::MONTHS_PER_YEAR], - // @call roundUnit - 'day' => [1, $daysInMonth], - // @call roundUnit - 'hour' => [0, static::HOURS_PER_DAY - 1], - // @call roundUnit - 'minute' => [0, static::MINUTES_PER_HOUR - 1], - // @call roundUnit - 'second' => [0, static::SECONDS_PER_MINUTE - 1], - ]; - } - - /** - * Get a copy of the instance. - * - * @return static - */ - public function copy() - { - return clone $this; - } - - /** - * @alias copy - * - * Get a copy of the instance. - * - * @return static - */ - public function clone() - { - return clone $this; - } - - /** - * Clone the current instance if it's mutable. - * - * This method is convenient to ensure you don't mutate the initial object - * but avoid to make a useless copy of it if it's already immutable. - * - * @return static - */ - public function avoidMutation(): static - { - if ($this instanceof DateTimeImmutable) { - return $this; - } - - return clone $this; - } - - /** - * Returns a present instance in the same timezone. - * - * @return static - */ - public function nowWithSameTz(): static - { - $timezone = $this->getTimezone(); - - return $this->getClock()?->nowAs(static::class, $timezone) ?? static::now($timezone); - } - - /** - * Return the Carbon instance passed through, a now instance in the same timezone - * if null given or parse the input if string given. - * - * @param Carbon|\Carbon\CarbonPeriod|\Carbon\CarbonInterval|\DateInterval|\DatePeriod|DateTimeInterface|string|null $date - * - * @return static - */ - public function carbonize($date = null) - { - if ($date instanceof DateInterval) { - return $this->avoidMutation()->add($date); - } - - if ($date instanceof DatePeriod || $date instanceof CarbonPeriod) { - $date = $date->getStartDate(); - } - - return $this->resolveCarbon($date); - } - - /////////////////////////////////////////////////////////////////// - ///////////////////////// GETTERS AND SETTERS ///////////////////// - /////////////////////////////////////////////////////////////////// - - /** - * Get a part of the Carbon object. - * - * @throws UnknownGetterException - * - * @return string|int|bool|DateTimeZone|null - */ - public function __get(string $name): mixed - { - return $this->get($name); - } - - /** - * Get a part of the Carbon object. - * - * @throws UnknownGetterException - * - * @return string|int|bool|DateTimeZone - */ - public function get(Unit|string $name): mixed - { - static $localizedFormats = [ - // @property string the day of week in current locale - 'localeDayOfWeek' => 'dddd', - // @property string the abbreviated day of week in current locale - 'shortLocaleDayOfWeek' => 'ddd', - // @property string the month in current locale - 'localeMonth' => 'MMMM', - // @property string the abbreviated month in current locale - 'shortLocaleMonth' => 'MMM', - ]; - - $name = Unit::toName($name); - - if (isset($localizedFormats[$name])) { - return $this->isoFormat($localizedFormats[$name]); - } - - static $formats = [ - // @property int - 'year' => 'Y', - // @property int - 'yearIso' => 'o', - // @--property-read int - // @--property-write Month|int - // @property int - 'month' => 'n', - // @property int - 'day' => 'j', - // @property int - 'hour' => 'G', - // @property int - 'minute' => 'i', - // @property int - 'second' => 's', - // @property int - 'micro' => 'u', - // @property int - 'microsecond' => 'u', - // @property int 0 (for Sunday) through 6 (for Saturday) - 'dayOfWeek' => 'w', - // @property int 1 (for Monday) through 7 (for Sunday) - 'dayOfWeekIso' => 'N', - // @property int ISO-8601 week number of year, weeks starting on Monday - 'weekOfYear' => 'W', - // @property-read int number of days in the given month - 'daysInMonth' => 't', - // @property int|float|string seconds since the Unix Epoch - 'timestamp' => 'U', - // @property-read string "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - 'latinMeridiem' => 'a', - // @property-read string "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - 'latinUpperMeridiem' => 'A', - // @property string the day of week in English - 'englishDayOfWeek' => 'l', - // @property string the abbreviated day of week in English - 'shortEnglishDayOfWeek' => 'D', - // @property string the month in English - 'englishMonth' => 'F', - // @property string the abbreviated month in English - 'shortEnglishMonth' => 'M', - // @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - 'timezoneAbbreviatedName' => 'T', - // @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - 'tzAbbrName' => 'T', - ]; - - switch (true) { - case isset($formats[$name]): - $value = $this->rawFormat($formats[$name]); - - return is_numeric($value) ? (int) $value : $value; - - // @property-read string long name of weekday translated according to Carbon locale, in english if no translation available for current language - case $name === 'dayName': - return $this->getTranslatedDayName(); - // @property-read string short name of weekday translated according to Carbon locale, in english if no translation available for current language - case $name === 'shortDayName': - return $this->getTranslatedShortDayName(); - // @property-read string very short name of weekday translated according to Carbon locale, in english if no translation available for current language - case $name === 'minDayName': - return $this->getTranslatedMinDayName(); - // @property-read string long name of month translated according to Carbon locale, in english if no translation available for current language - case $name === 'monthName': - return $this->getTranslatedMonthName(); - // @property-read string short name of month translated according to Carbon locale, in english if no translation available for current language - case $name === 'shortMonthName': - return $this->getTranslatedShortMonthName(); - // @property-read string lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - case $name === 'meridiem': - return $this->meridiem(true); - // @property-read string uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - case $name === 'upperMeridiem': - return $this->meridiem(); - // @property-read int current hour from 1 to 24 - case $name === 'noZeroHour': - return $this->hour ?: 24; - // @property int - case $name === 'milliseconds': - // @property int - case $name === 'millisecond': - // @property int - case $name === 'milli': - return (int) floor(((int) $this->rawFormat('u')) / 1000); - - // @property int 1 through 53 - case $name === 'week': - return (int) $this->week(); - - // @property int 1 through 53 - case $name === 'isoWeek': - return (int) $this->isoWeek(); - - // @property int year according to week format - case $name === 'weekYear': - return (int) $this->weekYear(); - - // @property int year according to ISO week format - case $name === 'isoWeekYear': - return (int) $this->isoWeekYear(); - - // @property-read int 51 through 53 - case $name === 'weeksInYear': - return $this->weeksInYear(); - - // @property-read int 51 through 53 - case $name === 'isoWeeksInYear': - return $this->isoWeeksInYear(); - - // @property int 1 through 5 - case $name === 'weekOfMonth': - return (int) ceil($this->day / static::DAYS_PER_WEEK); - - // @property-read int 1 through 5 - case $name === 'weekNumberInMonth': - return (int) ceil(($this->day + $this->avoidMutation()->startOfMonth()->dayOfWeekIso - 1) / static::DAYS_PER_WEEK); - - // @property-read int 0 through 6 - case $name === 'firstWeekDay': - return (int) $this->getTranslationMessage('first_day_of_week'); - - // @property-read int 0 through 6 - case $name === 'lastWeekDay': - return $this->transmitFactory(fn () => static::weekRotate((int) $this->getTranslationMessage('first_day_of_week'), -1)); - - // @property int 1 through 366 - case $name === 'dayOfYear': - return 1 + (int) ($this->rawFormat('z')); - - // @property-read int 365 or 366 - case $name === 'daysInYear': - return static::DAYS_PER_YEAR + ($this->isLeapYear() ? 1 : 0); - - // @property int does a diffInYears() with default parameters - case $name === 'age': - return (int) $this->diffInYears(); - - // @property-read int the quarter of this instance, 1 - 4 - case $name === 'quarter': - return (int) ceil($this->month / static::MONTHS_PER_QUARTER); - - // @property-read int the decade of this instance - // @call isSameUnit - case $name === 'decade': - return (int) ceil($this->year / static::YEARS_PER_DECADE); - - // @property-read int the century of this instance - // @call isSameUnit - case $name === 'century': - $factor = 1; - $year = $this->year; - - if ($year < 0) { - $year = -$year; - $factor = -1; - } - - return (int) ($factor * ceil($year / static::YEARS_PER_CENTURY)); - - // @property-read int the millennium of this instance - // @call isSameUnit - case $name === 'millennium': - $factor = 1; - $year = $this->year; - - if ($year < 0) { - $year = -$year; - $factor = -1; - } - - return (int) ($factor * ceil($year / static::YEARS_PER_MILLENNIUM)); - - // @property int the timezone offset in seconds from UTC - case $name === 'offset': - return $this->getOffset(); - - // @property int the timezone offset in minutes from UTC - case $name === 'offsetMinutes': - return $this->getOffset() / static::SECONDS_PER_MINUTE; - - // @property int the timezone offset in hours from UTC - case $name === 'offsetHours': - return $this->getOffset() / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR; - - // @property-read bool daylight savings time indicator, true if DST, false otherwise - case $name === 'dst': - return $this->rawFormat('I') === '1'; - - // @property-read bool checks if the timezone is local, true if local, false otherwise - case $name === 'local': - return $this->getOffset() === $this->avoidMutation()->setTimezone(date_default_timezone_get())->getOffset(); - - // @property-read bool checks if the timezone is UTC, true if UTC, false otherwise - case $name === 'utc': - return $this->getOffset() === 0; - - // @--property-write DateTimeZone|string|int $timezone the current timezone - // @--property-write DateTimeZone|string|int $tz alias of $timezone - // @--property-read CarbonTimeZone $timezone the current timezone - // @--property-read CarbonTimeZone $tz alias of $timezone - // @property CarbonTimeZone $timezone the current timezone - // @property CarbonTimeZone $tz alias of $timezone - case $name === 'timezone' || $name === 'tz': - return $this->getTimezone(); - - // @property-read string $timezoneName the current timezone name - // @property-read string $tzName alias of $timezoneName - case $name === 'timezoneName' || $name === 'tzName': - return $this->getTimezone()->getName(); - - // @property-read string locale of the current instance - case $name === 'locale': - return $this->getTranslatorLocale(); - - case preg_match('/^([a-z]{2,})(In|Of)([A-Z][a-z]+)$/', $name, $match): - [, $firstUnit, $operator, $secondUnit] = $match; - - try { - $start = $this->avoidMutation()->startOf($secondUnit); - $value = $operator === 'Of' - ? (\in_array($firstUnit, [ - // Unit with indexes starting at 1 (other units start at 0) - 'day', - 'week', - 'month', - 'quarter', - ], true) ? 1 : 0) + floor($start->diffInUnit($firstUnit, $this)) - : round($start->diffInUnit($firstUnit, $start->avoidMutation()->add($secondUnit, 1))); - - return (int) $value; - } catch (UnknownUnitException) { - // default to macro - } - - default: - $macro = $this->getLocalMacro('get'.ucfirst($name)); - - if ($macro) { - return $this->executeCallableWithContext($macro); - } - - throw new UnknownGetterException($name); - } - } - - /** - * Check if an attribute exists on the object - * - * @param string $name - * - * @return bool - */ - public function __isset($name) - { - try { - $this->__get($name); - } catch (UnknownGetterException | ReflectionException) { - return false; - } - - return true; - } - - /** - * Set a part of the Carbon object - * - * @param string $name - * @param string|int|DateTimeZone $value - * - * @throws UnknownSetterException|ReflectionException - * - * @return void - */ - public function __set($name, $value) - { - if ($this->constructedObjectId === spl_object_hash($this)) { - $this->set($name, $value); - - return; - } - - $this->$name = $value; - } - - /** - * Set a part of the Carbon object. - * - * @throws ImmutableException|UnknownSetterException - * - * @return $this - */ - public function set(Unit|array|string $name, DateTimeZone|Month|string|int|float|null $value = null): static - { - if ($this->isImmutable()) { - throw new ImmutableException(\sprintf('%s class', static::class)); - } - - if (\is_array($name)) { - foreach ($name as $key => $value) { - $this->set($key, $value); - } - - return $this; - } - - $name = Unit::toName($name); - - switch ($name) { - case 'milliseconds': - case 'millisecond': - case 'milli': - case 'microseconds': - case 'microsecond': - case 'micro': - if (str_starts_with($name, 'milli')) { - $value *= 1000; - } - - while ($value < 0) { - $this->subSecond(); - $value += static::MICROSECONDS_PER_SECOND; - } - - while ($value >= static::MICROSECONDS_PER_SECOND) { - $this->addSecond(); - $value -= static::MICROSECONDS_PER_SECOND; - } - - $this->modify($this->rawFormat('H:i:s.').str_pad((string) round($value), 6, '0', STR_PAD_LEFT)); - - break; - - case 'year': - case 'month': - case 'day': - case 'hour': - case 'minute': - case 'second': - [$year, $month, $day, $hour, $minute, $second] = array_map('intval', explode('-', $this->rawFormat('Y-n-j-G-i-s'))); - $$name = self::monthToInt($value, $name); - $this->setDateTime($year, $month, $day, $hour, $minute, $second); - - break; - - case 'week': - $this->week($value); - - break; - - case 'isoWeek': - $this->isoWeek($value); - - break; - - case 'weekYear': - $this->weekYear($value); - - break; - - case 'isoWeekYear': - $this->isoWeekYear($value); - - break; - - case 'dayOfYear': - $this->addDays($value - $this->dayOfYear); - - break; - - case 'dayOfWeek': - $this->addDays($value - $this->dayOfWeek); - - break; - - case 'dayOfWeekIso': - $this->addDays($value - $this->dayOfWeekIso); - - break; - - case 'timestamp': - $this->setTimestamp($value); - - break; - - case 'offset': - $this->setTimezone(static::safeCreateDateTimeZone($value / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR)); - - break; - - case 'offsetMinutes': - $this->setTimezone(static::safeCreateDateTimeZone($value / static::MINUTES_PER_HOUR)); - - break; - - case 'offsetHours': - $this->setTimezone(static::safeCreateDateTimeZone($value)); - - break; - - case 'timezone': - case 'tz': - $this->setTimezone($value); - - break; - - default: - if (preg_match('/^([a-z]{2,})Of([A-Z][a-z]+)$/', $name, $match)) { - [, $firstUnit, $secondUnit] = $match; - - try { - $start = $this->avoidMutation()->startOf($secondUnit); - $currentValue = (\in_array($firstUnit, [ - // Unit with indexes starting at 1 (other units start at 0) - 'day', - 'week', - 'month', - 'quarter', - ], true) ? 1 : 0) + (int) floor($start->diffInUnit($firstUnit, $this)); - - // We check $value a posteriori to give precedence to UnknownUnitException - if (!\is_int($value)) { - throw new UnitException("->$name expects integer value"); - } - - $this->addUnit($firstUnit, $value - $currentValue); - - break; - } catch (UnknownUnitException) { - // default to macro - } - } - - $macro = $this->getLocalMacro('set'.ucfirst($name)); - - if ($macro) { - $this->executeCallableWithContext($macro, $value); - - break; - } - - if ($this->isLocalStrictModeEnabled()) { - throw new UnknownSetterException($name); - } - - $this->$name = $value; - } - - return $this; - } - - /** - * Get the translation of the current week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * @param string $keySuffix "", "_short" or "_min" - * @param string|null $defaultValue default value if translation missing - */ - public function getTranslatedDayName( - ?string $context = null, - string $keySuffix = '', - ?string $defaultValue = null, - ): string { - return $this->getTranslatedFormByRegExp('weekdays', $keySuffix, $context, $this->dayOfWeek, $defaultValue ?: $this->englishDayOfWeek); - } - - /** - * Get the translation of the current short week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - */ - public function getTranslatedShortDayName(?string $context = null): string - { - return $this->getTranslatedDayName($context, '_short', $this->shortEnglishDayOfWeek); - } - - /** - * Get the translation of the current abbreviated week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - */ - public function getTranslatedMinDayName(?string $context = null): string - { - return $this->getTranslatedDayName($context, '_min', $this->shortEnglishDayOfWeek); - } - - /** - * Get the translation of the current month day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * @param string $keySuffix "" or "_short" - * @param string|null $defaultValue default value if translation missing - */ - public function getTranslatedMonthName( - ?string $context = null, - string $keySuffix = '', - ?string $defaultValue = null, - ): string { - return $this->getTranslatedFormByRegExp('months', $keySuffix, $context, $this->month - 1, $defaultValue ?: $this->englishMonth); - } - - /** - * Get the translation of the current short month day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - */ - public function getTranslatedShortMonthName(?string $context = null): string - { - return $this->getTranslatedMonthName($context, '_short', $this->shortEnglishMonth); - } - - /** - * Get/set the day of year. - * - * @template T of int|null - * - * @param int|null $value new value for day of year if using as setter. - * - * @psalm-param T $value - * - * @return static|int - * - * @psalm-return (T is int ? static : int) - */ - public function dayOfYear(?int $value = null): static|int - { - $dayOfYear = $this->dayOfYear; - - return $value === null ? $dayOfYear : $this->addDays($value - $dayOfYear); - } - - /** - * Get/set the weekday from 0 (Sunday) to 6 (Saturday). - * - * @param WeekDay|int|null $value new value for weekday if using as setter. - */ - public function weekday(WeekDay|int|null $value = null): static|int - { - if ($value === null) { - return $this->dayOfWeek; - } - - $firstDay = (int) ($this->getTranslationMessage('first_day_of_week') ?? 0); - $dayOfWeek = ($this->dayOfWeek + 7 - $firstDay) % 7; - - return $this->addDays(((WeekDay::int($value) + 7 - $firstDay) % 7) - $dayOfWeek); - } - - /** - * Get/set the ISO weekday from 1 (Monday) to 7 (Sunday). - * - * @param WeekDay|int|null $value new value for weekday if using as setter. - */ - public function isoWeekday(WeekDay|int|null $value = null): static|int - { - $dayOfWeekIso = $this->dayOfWeekIso; - - return $value === null ? $dayOfWeekIso : $this->addDays(WeekDay::int($value) - $dayOfWeekIso); - } - - /** - * Return the number of days since the start of the week (using the current locale or the first parameter - * if explicitly given). - * - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week, - * if not provided, start of week is inferred from the locale - * (Sunday for en_US, Monday for de_DE, etc.) - */ - public function getDaysFromStartOfWeek(WeekDay|int|null $weekStartsAt = null): int - { - $firstDay = (int) (WeekDay::int($weekStartsAt) ?? $this->getTranslationMessage('first_day_of_week') ?? 0); - - return ($this->dayOfWeek + 7 - $firstDay) % 7; - } - - /** - * Set the day (keeping the current time) to the start of the week + the number of days passed as the first - * parameter. First day of week is driven by the locale unless explicitly set with the second parameter. - * - * @param int $numberOfDays number of days to add after the start of the current week - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week, - * if not provided, start of week is inferred from the locale - * (Sunday for en_US, Monday for de_DE, etc.) - */ - public function setDaysFromStartOfWeek(int $numberOfDays, WeekDay|int|null $weekStartsAt = null): static - { - return $this->addDays($numberOfDays - $this->getDaysFromStartOfWeek(WeekDay::int($weekStartsAt))); - } - - /** - * Set any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value new value for the input unit - * @param string $overflowUnit unit name to not overflow - */ - public function setUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static - { - try { - $start = $this->avoidMutation()->startOf($overflowUnit); - $end = $this->avoidMutation()->endOf($overflowUnit); - /** @var static $date */ - $date = $this->$valueUnit($value); - - if ($date < $start) { - return $date->mutateIfMutable($start); - } - - if ($date > $end) { - return $date->mutateIfMutable($end); - } - - return $date; - } catch (BadMethodCallException | ReflectionException $exception) { - throw new UnknownUnitException($valueUnit, 0, $exception); - } - } - - /** - * Add any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value amount to add to the input unit - * @param string $overflowUnit unit name to not overflow - */ - public function addUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static - { - return $this->setUnitNoOverflow($valueUnit, $this->$valueUnit + $value, $overflowUnit); - } - - /** - * Subtract any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value amount to subtract to the input unit - * @param string $overflowUnit unit name to not overflow - */ - public function subUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static - { - return $this->setUnitNoOverflow($valueUnit, $this->$valueUnit - $value, $overflowUnit); - } - - /** - * Returns the minutes offset to UTC if no arguments passed, else set the timezone with given minutes shift passed. - */ - public function utcOffset(?int $minuteOffset = null): static|int - { - if ($minuteOffset === null) { - return $this->offsetMinutes; - } - - return $this->setTimezone(CarbonTimeZone::createFromMinuteOffset($minuteOffset)); - } - - /** - * Set the date with gregorian year, month and day numbers. - * - * @see https://php.net/manual/en/datetime.setdate.php - */ - public function setDate(int $year, int $month, int $day): static - { - return parent::setDate($year, $month, $day); - } - - /** - * Set a date according to the ISO 8601 standard - using weeks and day offsets rather than specific dates. - * - * @see https://php.net/manual/en/datetime.setisodate.php - */ - public function setISODate(int $year, int $week, int $day = 1): static - { - return parent::setISODate($year, $week, $day); - } - - /** - * Set the date and time all together. - */ - public function setDateTime( - int $year, - int $month, - int $day, - int $hour, - int $minute, - int $second = 0, - int $microseconds = 0, - ): static { - return $this->setDate($year, $month, $day)->setTime($hour, $minute, $second, $microseconds); - } - - /** - * Resets the current time of the DateTime object to a different time. - * - * @see https://php.net/manual/en/datetime.settime.php - */ - public function setTime(int $hour, int $minute, int $second = 0, int $microseconds = 0): static - { - return parent::setTime($hour, $minute, $second, $microseconds); - } - - /** - * Set the instance's timestamp. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - */ - public function setTimestamp(float|int|string $timestamp): static - { - [$seconds, $microseconds] = self::getIntegerAndDecimalParts($timestamp); - - return parent::setTimestamp((int) $seconds)->setMicroseconds((int) $microseconds); - } - - /** - * Set the time by time string. - */ - public function setTimeFromTimeString(string $time): static - { - if (!str_contains($time, ':')) { - $time .= ':0'; - } - - return $this->modify($time); - } - - /** - * @alias setTimezone - */ - public function timezone(DateTimeZone|string|int $value): static - { - return $this->setTimezone($value); - } - - /** - * Set the timezone or returns the timezone name if no arguments passed. - */ - public function tz(DateTimeZone|string|int|null $value = null): static|string - { - if ($value === null) { - return $this->tzName; - } - - return $this->setTimezone($value); - } - - /** - * Set the instance's timezone from a string or object. - */ - public function setTimezone(DateTimeZone|string|int $timeZone): static - { - return parent::setTimezone(static::safeCreateDateTimeZone($timeZone)); - } - - /** - * Set the instance's timezone from a string or object and add/subtract the offset difference. - */ - public function shiftTimezone(DateTimeZone|string $value): static - { - $dateTimeString = $this->format('Y-m-d H:i:s.u'); - - return $this - ->setTimezone($value) - ->modify($dateTimeString); - } - - /** - * Set the instance's timezone to UTC. - */ - public function utc(): static - { - return $this->setTimezone('UTC'); - } - - /** - * Set the year, month, and date for this instance to that of the passed instance. - */ - public function setDateFrom(DateTimeInterface|string $date): static - { - $date = $this->resolveCarbon($date); - - return $this->setDate($date->year, $date->month, $date->day); - } - - /** - * Set the hour, minute, second and microseconds for this instance to that of the passed instance. - */ - public function setTimeFrom(DateTimeInterface|string $date): static - { - $date = $this->resolveCarbon($date); - - return $this->setTime($date->hour, $date->minute, $date->second, $date->microsecond); - } - - /** - * Set the date and time for this instance to that of the passed instance. - */ - public function setDateTimeFrom(DateTimeInterface|string $date): static - { - $date = $this->resolveCarbon($date); - - return $this->modify($date->rawFormat('Y-m-d H:i:s.u')); - } - - /** - * Get the days of the week. - */ - public static function getDays(): array - { - return static::$days; - } - - /////////////////////////////////////////////////////////////////// - /////////////////////// WEEK SPECIAL DAYS ///////////////////////// - /////////////////////////////////////////////////////////////////// - - /** - * Get the first day of week. - * - * @return int - */ - public static function getWeekStartsAt(?string $locale = null): int - { - return (int) static::getTranslationMessageWith( - $locale ? Translator::get($locale) : static::getTranslator(), - 'first_day_of_week', - ); - } - - /** - * Get the last day of week. - * - * @param string $locale local to consider the last day of week. - * - * @return int - */ - public static function getWeekEndsAt(?string $locale = null): int - { - return static::weekRotate(static::getWeekStartsAt($locale), -1); - } - - /** - * Get weekend days - */ - public static function getWeekendDays(): array - { - return FactoryImmutable::getInstance()->getWeekendDays(); - } - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider week-end is always saturday and sunday, and if you have some custom - * week-end days to handle, give to those days an other name and create a macro for them: - * - * ``` - * Carbon::macro('isDayOff', function ($date) { - * return $date->isSunday() || $date->isMonday(); - * }); - * Carbon::macro('isNotDayOff', function ($date) { - * return !$date->isDayOff(); - * }); - * if ($someDate->isDayOff()) ... - * if ($someDate->isNotDayOff()) ... - * // Add 5 not-off days - * $count = 5; - * while ($someDate->isDayOff() || ($count-- > 0)) { - * $someDate->addDay(); - * } - * ``` - * - * Set weekend days - */ - public static function setWeekendDays(array $days): void - { - FactoryImmutable::getDefaultInstance()->setWeekendDays($days); - } - - /** - * Determine if a time string will produce a relative date. - * - * @return bool true if time match a relative date, false if absolute or invalid time string - */ - public static function hasRelativeKeywords(?string $time): bool - { - if (!$time || strtotime($time) === false) { - return false; - } - - $date1 = new DateTime('2000-01-01T00:00:00Z'); - $date1->modify($time); - $date2 = new DateTime('2001-12-25T00:00:00Z'); - $date2->modify($time); - - return $date1 != $date2; - } - - /////////////////////////////////////////////////////////////////// - /////////////////////// STRING FORMATTING ///////////////////////// - /////////////////////////////////////////////////////////////////// - - /** - * Returns list of locale formats for ISO formatting. - * - * @param string|null $locale current locale used if null - */ - public function getIsoFormats(?string $locale = null): array - { - return [ - 'LT' => $this->getTranslationMessage('formats.LT', $locale), - 'LTS' => $this->getTranslationMessage('formats.LTS', $locale), - 'L' => $this->getTranslationMessage('formats.L', $locale), - 'LL' => $this->getTranslationMessage('formats.LL', $locale), - 'LLL' => $this->getTranslationMessage('formats.LLL', $locale), - 'LLLL' => $this->getTranslationMessage('formats.LLLL', $locale), - 'l' => $this->getTranslationMessage('formats.l', $locale), - 'll' => $this->getTranslationMessage('formats.ll', $locale), - 'lll' => $this->getTranslationMessage('formats.lll', $locale), - 'llll' => $this->getTranslationMessage('formats.llll', $locale), - ]; - } - - /** - * Returns list of calendar formats for ISO formatting. - * - * @param string|null $locale current locale used if null - */ - public function getCalendarFormats(?string $locale = null): array - { - return [ - 'sameDay' => $this->getTranslationMessage('calendar.sameDay', $locale, '[Today at] LT'), - 'nextDay' => $this->getTranslationMessage('calendar.nextDay', $locale, '[Tomorrow at] LT'), - 'nextWeek' => $this->getTranslationMessage('calendar.nextWeek', $locale, 'dddd [at] LT'), - 'lastDay' => $this->getTranslationMessage('calendar.lastDay', $locale, '[Yesterday at] LT'), - 'lastWeek' => $this->getTranslationMessage('calendar.lastWeek', $locale, '[Last] dddd [at] LT'), - 'sameElse' => $this->getTranslationMessage('calendar.sameElse', $locale, 'L'), - ]; - } - - /** - * Returns list of locale units for ISO formatting. - */ - public static function getIsoUnits(): array - { - static $units = null; - - $units ??= [ - 'OD' => ['getAltNumber', ['day']], - 'OM' => ['getAltNumber', ['month']], - 'OY' => ['getAltNumber', ['year']], - 'OH' => ['getAltNumber', ['hour']], - 'Oh' => ['getAltNumber', ['h']], - 'Om' => ['getAltNumber', ['minute']], - 'Os' => ['getAltNumber', ['second']], - 'D' => 'day', - 'DD' => ['rawFormat', ['d']], - 'Do' => ['ordinal', ['day', 'D']], - 'd' => 'dayOfWeek', - 'dd' => static fn (CarbonInterface $date, $originalFormat = null) => $date->getTranslatedMinDayName( - $originalFormat, - ), - 'ddd' => static fn (CarbonInterface $date, $originalFormat = null) => $date->getTranslatedShortDayName( - $originalFormat, - ), - 'dddd' => static fn (CarbonInterface $date, $originalFormat = null) => $date->getTranslatedDayName( - $originalFormat, - ), - 'DDD' => 'dayOfYear', - 'DDDD' => ['getPaddedUnit', ['dayOfYear', 3]], - 'DDDo' => ['ordinal', ['dayOfYear', 'DDD']], - 'e' => ['weekday', []], - 'E' => 'dayOfWeekIso', - 'H' => ['rawFormat', ['G']], - 'HH' => ['rawFormat', ['H']], - 'h' => ['rawFormat', ['g']], - 'hh' => ['rawFormat', ['h']], - 'k' => 'noZeroHour', - 'kk' => ['getPaddedUnit', ['noZeroHour']], - 'hmm' => ['rawFormat', ['gi']], - 'hmmss' => ['rawFormat', ['gis']], - 'Hmm' => ['rawFormat', ['Gi']], - 'Hmmss' => ['rawFormat', ['Gis']], - 'm' => 'minute', - 'mm' => ['rawFormat', ['i']], - 'a' => 'meridiem', - 'A' => 'upperMeridiem', - 's' => 'second', - 'ss' => ['getPaddedUnit', ['second']], - 'S' => static fn (CarbonInterface $date) => (string) floor($date->micro / 100000), - 'SS' => static fn (CarbonInterface $date) => self::floorZeroPad($date->micro / 10000, 2), - 'SSS' => static fn (CarbonInterface $date) => self::floorZeroPad($date->micro / 1000, 3), - 'SSSS' => static fn (CarbonInterface $date) => self::floorZeroPad($date->micro / 100, 4), - 'SSSSS' => static fn (CarbonInterface $date) => self::floorZeroPad($date->micro / 10, 5), - 'SSSSSS' => ['getPaddedUnit', ['micro', 6]], - 'SSSSSSS' => static fn (CarbonInterface $date) => self::floorZeroPad($date->micro * 10, 7), - 'SSSSSSSS' => static fn (CarbonInterface $date) => self::floorZeroPad($date->micro * 100, 8), - 'SSSSSSSSS' => static fn (CarbonInterface $date) => self::floorZeroPad($date->micro * 1000, 9), - 'M' => 'month', - 'MM' => ['rawFormat', ['m']], - 'MMM' => static function (CarbonInterface $date, $originalFormat = null) { - $month = $date->getTranslatedShortMonthName($originalFormat); - $suffix = $date->getTranslationMessage('mmm_suffix'); - if ($suffix && $month !== $date->monthName) { - $month .= $suffix; - } - - return $month; - }, - 'MMMM' => static fn (CarbonInterface $date, $originalFormat = null) => $date->getTranslatedMonthName( - $originalFormat, - ), - 'Mo' => ['ordinal', ['month', 'M']], - 'Q' => 'quarter', - 'Qo' => ['ordinal', ['quarter', 'M']], - 'G' => 'isoWeekYear', - 'GG' => ['getPaddedUnit', ['isoWeekYear']], - 'GGG' => ['getPaddedUnit', ['isoWeekYear', 3]], - 'GGGG' => ['getPaddedUnit', ['isoWeekYear', 4]], - 'GGGGG' => ['getPaddedUnit', ['isoWeekYear', 5]], - 'g' => 'weekYear', - 'gg' => ['getPaddedUnit', ['weekYear']], - 'ggg' => ['getPaddedUnit', ['weekYear', 3]], - 'gggg' => ['getPaddedUnit', ['weekYear', 4]], - 'ggggg' => ['getPaddedUnit', ['weekYear', 5]], - 'W' => 'isoWeek', - 'WW' => ['getPaddedUnit', ['isoWeek']], - 'Wo' => ['ordinal', ['isoWeek', 'W']], - 'w' => 'week', - 'ww' => ['getPaddedUnit', ['week']], - 'wo' => ['ordinal', ['week', 'w']], - 'x' => ['valueOf', []], - 'X' => 'timestamp', - 'Y' => 'year', - 'YY' => ['rawFormat', ['y']], - 'YYYY' => ['getPaddedUnit', ['year', 4]], - 'YYYYY' => ['getPaddedUnit', ['year', 5]], - 'YYYYYY' => static fn (CarbonInterface $date) => ($date->year < 0 ? '' : '+'). - $date->getPaddedUnit('year', 6), - 'z' => ['rawFormat', ['T']], - 'zz' => 'tzName', - 'Z' => ['getOffsetString', []], - 'ZZ' => ['getOffsetString', ['']], - ]; - - return $units; - } - - /** - * Returns a unit of the instance padded with 0 by default or any other string if specified. - * - * @param string $unit Carbon unit name - * @param int $length Length of the output (2 by default) - * @param string $padString String to use for padding ("0" by default) - * @param int $padType Side(s) to pad (STR_PAD_LEFT by default) - */ - public function getPaddedUnit($unit, $length = 2, $padString = '0', $padType = STR_PAD_LEFT): string - { - return ($this->$unit < 0 ? '-' : '').str_pad((string) abs($this->$unit), $length, $padString, $padType); - } - - /** - * Return a property with its ordinal. - */ - public function ordinal(string $key, ?string $period = null): string - { - $number = $this->$key; - $result = $this->translate('ordinal', [ - ':number' => $number, - ':period' => (string) $period, - ]); - - return (string) ($result === 'ordinal' ? $number : $result); - } - - /** - * Return the meridiem of the current time in the current locale. - * - * @param bool $isLower if true, returns lowercase variant if available in the current locale. - */ - public function meridiem(bool $isLower = false): string - { - $hour = $this->hour; - $index = $hour < static::HOURS_PER_DAY / 2 ? 0 : 1; - - if ($isLower) { - $key = 'meridiem.'.($index + 2); - $result = $this->translate($key); - - if ($result !== $key) { - return $result; - } - } - - $key = "meridiem.$index"; - $result = $this->translate($key); - if ($result === $key) { - $result = $this->translate('meridiem', [ - ':hour' => $this->hour, - ':minute' => $this->minute, - ':isLower' => $isLower, - ]); - - if ($result === 'meridiem') { - return $isLower ? $this->latinMeridiem : $this->latinUpperMeridiem; - } - } elseif ($isLower) { - $result = mb_strtolower($result); - } - - return $result; - } - - /** - * Returns the alternative number for a given date property if available in the current locale. - * - * @param string $key date property - */ - public function getAltNumber(string $key): string - { - return $this->translateNumber((int) (\strlen($key) > 1 ? $this->$key : $this->rawFormat($key))); - } - - /** - * Format in the current language using ISO replacement patterns. - * - * @param string|null $originalFormat provide context if a chunk has been passed alone - */ - public function isoFormat(string $format, ?string $originalFormat = null): string - { - $result = ''; - $length = mb_strlen($format); - $originalFormat ??= $format; - $inEscaped = false; - $formats = null; - $units = null; - - for ($i = 0; $i < $length; $i++) { - $char = mb_substr($format, $i, 1); - - if ($char === '\\') { - $result .= mb_substr($format, ++$i, 1); - - continue; - } - - if ($char === '[' && !$inEscaped) { - $inEscaped = true; - - continue; - } - - if ($char === ']' && $inEscaped) { - $inEscaped = false; - - continue; - } - - if ($inEscaped) { - $result .= $char; - - continue; - } - - $input = mb_substr($format, $i); - - if (preg_match('/^(LTS|LT|l{1,4}|L{1,4})/', $input, $match)) { - if ($formats === null) { - $formats = $this->getIsoFormats(); - } - - $code = $match[0]; - $sequence = $formats[$code] ?? preg_replace_callback( - '/MMMM|MM|DD|dddd/', - static fn ($code) => mb_substr($code[0], 1), - $formats[strtoupper($code)] ?? '', - ); - $rest = mb_substr($format, $i + mb_strlen($code)); - $format = mb_substr($format, 0, $i).$sequence.$rest; - $length = mb_strlen($format); - $input = $sequence.$rest; - } - - if (preg_match('/^'.CarbonInterface::ISO_FORMAT_REGEXP.'/', $input, $match)) { - $code = $match[0]; - - if ($units === null) { - $units = static::getIsoUnits(); - } - - $sequence = $units[$code] ?? ''; - - if ($sequence instanceof Closure) { - $sequence = $sequence($this, $originalFormat); - } elseif (\is_array($sequence)) { - try { - $sequence = $this->{$sequence[0]}(...$sequence[1]); - } catch (ReflectionException | InvalidArgumentException | BadMethodCallException) { - $sequence = ''; - } - } elseif (\is_string($sequence)) { - $sequence = $this->$sequence ?? $code; - } - - $format = mb_substr($format, 0, $i).$sequence.mb_substr($format, $i + mb_strlen($code)); - $i += mb_strlen((string) $sequence) - 1; - $length = mb_strlen($format); - $char = $sequence; - } - - $result .= $char; - } - - return $result; - } - - /** - * List of replacements from date() format to isoFormat(). - */ - public static function getFormatsToIsoReplacements(): array - { - static $replacements = null; - - $replacements ??= [ - 'd' => true, - 'D' => 'ddd', - 'j' => true, - 'l' => 'dddd', - 'N' => true, - 'S' => static fn ($date) => str_replace((string) $date->rawFormat('j'), '', $date->isoFormat('Do')), - 'w' => true, - 'z' => true, - 'W' => true, - 'F' => 'MMMM', - 'm' => true, - 'M' => 'MMM', - 'n' => true, - 't' => true, - 'L' => true, - 'o' => true, - 'Y' => true, - 'y' => true, - 'a' => 'a', - 'A' => 'A', - 'B' => true, - 'g' => true, - 'G' => true, - 'h' => true, - 'H' => true, - 'i' => true, - 's' => true, - 'u' => true, - 'v' => true, - 'E' => true, - 'I' => true, - 'O' => true, - 'P' => true, - 'Z' => true, - 'c' => true, - 'r' => true, - 'U' => true, - 'T' => true, - ]; - - return $replacements; - } - - /** - * Format as ->format() do (using date replacements patterns from https://php.net/manual/en/function.date.php) - * but translate words whenever possible (months, day names, etc.) using the current locale. - */ - public function translatedFormat(string $format): string - { - $replacements = static::getFormatsToIsoReplacements(); - $context = ''; - $isoFormat = ''; - $length = mb_strlen($format); - - for ($i = 0; $i < $length; $i++) { - $char = mb_substr($format, $i, 1); - - if ($char === '\\') { - $replacement = mb_substr($format, $i, 2); - $isoFormat .= $replacement; - $i++; - - continue; - } - - if (!isset($replacements[$char])) { - $replacement = preg_match('/^[A-Za-z]$/', $char) ? "\\$char" : $char; - $isoFormat .= $replacement; - $context .= $replacement; - - continue; - } - - $replacement = $replacements[$char]; - - if ($replacement === true) { - static $contextReplacements = null; - - if ($contextReplacements === null) { - $contextReplacements = [ - 'm' => 'MM', - 'd' => 'DD', - 't' => 'D', - 'j' => 'D', - 'N' => 'e', - 'w' => 'e', - 'n' => 'M', - 'o' => 'YYYY', - 'Y' => 'YYYY', - 'y' => 'YY', - 'g' => 'h', - 'G' => 'H', - 'h' => 'hh', - 'H' => 'HH', - 'i' => 'mm', - 's' => 'ss', - ]; - } - - $isoFormat .= '['.$this->rawFormat($char).']'; - $context .= $contextReplacements[$char] ?? ' '; - - continue; - } - - if ($replacement instanceof Closure) { - $replacement = '['.$replacement($this).']'; - $isoFormat .= $replacement; - $context .= $replacement; - - continue; - } - - $isoFormat .= $replacement; - $context .= $replacement; - } - - return $this->isoFormat($isoFormat, $context); - } - - /** - * Returns the offset hour and minute formatted with +/- and a given separator (":" by default). - * For example, if the time zone is 9 hours 30 minutes, you'll get "+09:30", with "@@" as first - * argument, "+09@@30", with "" as first argument, "+0930". Negative offset will return something - * like "-12:00". - * - * @param string $separator string to place between hours and minutes (":" by default) - */ - public function getOffsetString(string $separator = ':'): string - { - $second = $this->getOffset(); - $symbol = $second < 0 ? '-' : '+'; - $minute = abs($second) / static::SECONDS_PER_MINUTE; - $hour = self::floorZeroPad($minute / static::MINUTES_PER_HOUR, 2); - $minute = self::floorZeroPad(((int) $minute) % static::MINUTES_PER_HOUR, 2); - - return "$symbol$hour$separator$minute"; - } - - /** - * Dynamically handle calls to the class. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @throws BadMethodCallException - */ - public static function __callStatic(string $method, array $parameters): mixed - { - if (!static::hasMacro($method)) { - foreach (static::getGenericMacros() as $callback) { - try { - return static::executeStaticCallable($callback, $method, ...$parameters); - } catch (BadMethodCallException) { - continue; - } - } - - if (static::isStrictModeEnabled()) { - throw new UnknownMethodException(\sprintf('%s::%s', static::class, $method)); - } - - return null; - } - - return static::executeStaticCallable(static::getMacro($method), ...$parameters); - } - - /** - * Set specified unit to new given value. - * - * @param string $unit year, month, day, hour, minute, second or microsecond - * @param Month|int $value new value for given unit - */ - public function setUnit(string $unit, Month|int|float|null $value = null): static - { - if (\is_float($value)) { - $int = (int) $value; - - if ((float) $int !== $value) { - throw new InvalidArgumentException( - "$unit cannot be changed to float value $value, integer expected", - ); - } - - $value = $int; - } - - $unit = static::singularUnit($unit); - $value = self::monthToInt($value, $unit); - $dateUnits = ['year', 'month', 'day']; - - if (\in_array($unit, $dateUnits)) { - return $this->setDate(...array_map( - fn ($name) => (int) ($name === $unit ? $value : $this->$name), - $dateUnits, - )); - } - - $units = ['hour', 'minute', 'second', 'micro']; - - if ($unit === 'millisecond' || $unit === 'milli') { - $value *= 1000; - $unit = 'micro'; - } elseif ($unit === 'microsecond') { - $unit = 'micro'; - } - - return $this->setTime(...array_map( - fn ($name) => (int) ($name === $unit ? $value : $this->$name), - $units, - )); - } - - /** - * Returns standardized singular of a given singular/plural unit name (in English). - */ - public static function singularUnit(string $unit): string - { - $unit = rtrim(mb_strtolower($unit), 's'); - - return match ($unit) { - 'centurie' => 'century', - 'millennia' => 'millennium', - default => $unit, - }; - } - - /** - * Returns standardized plural of a given singular/plural unit name (in English). - */ - public static function pluralUnit(string $unit): string - { - $unit = rtrim(strtolower($unit), 's'); - - return match ($unit) { - 'century' => 'centuries', - 'millennium', 'millennia' => 'millennia', - default => "{$unit}s", - }; - } - - public static function sleep(int|float $seconds): void - { - if (static::hasTestNow()) { - static::setTestNow(static::getTestNow()->avoidMutation()->addSeconds($seconds)); - - return; - } - - (new NativeClock('UTC'))->sleep($seconds); - } - - /** - * Dynamically handle calls to the class. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @throws UnknownMethodException|BadMethodCallException|ReflectionException|Throwable - */ - public function __call(string $method, array $parameters): mixed - { - $unit = rtrim($method, 's'); - - return $this->callDiffAlias($unit, $parameters) - ?? $this->callHumanDiffAlias($unit, $parameters) - ?? $this->callRoundMethod($unit, $parameters) - ?? $this->callIsMethod($unit, $parameters) - ?? $this->callModifierMethod($unit, $parameters) - ?? $this->callPeriodMethod($method, $parameters) - ?? $this->callGetOrSetMethod($method, $parameters) - ?? $this->callMacroMethod($method, $parameters); - } - - /** - * Return the Carbon instance passed through, a now instance in the same timezone - * if null given or parse the input if string given. - */ - protected function resolveCarbon(DateTimeInterface|string|null $date): self - { - if (!$date) { - return $this->nowWithSameTz(); - } - - if (\is_string($date)) { - return $this->transmitFactory(fn () => static::parse($date, $this->getTimezone())); - } - - return $date instanceof self ? $date : $this->transmitFactory(static fn () => static::instance($date)); - } - - protected static function weekRotate(int $day, int $rotation): int - { - return (static::DAYS_PER_WEEK + $rotation % static::DAYS_PER_WEEK + $day) % static::DAYS_PER_WEEK; - } - - protected function executeCallable(callable $macro, ...$parameters) - { - if ($macro instanceof Closure) { - $boundMacro = @$macro->bindTo($this, static::class) ?: @$macro->bindTo(null, static::class); - - return \call_user_func_array($boundMacro ?: $macro, $parameters); - } - - return \call_user_func_array($macro, $parameters); - } - - protected function executeCallableWithContext(callable $macro, ...$parameters) - { - return static::bindMacroContext($this, function () use (&$macro, &$parameters) { - return $this->executeCallable($macro, ...$parameters); - }); - } - - protected function getAllGenericMacros(): Generator - { - yield from $this->localGenericMacros ?? []; - yield from $this->transmitFactory(static fn () => static::getGenericMacros()); - } - - protected static function getGenericMacros(): Generator - { - foreach ((FactoryImmutable::getInstance()->getSettings()['genericMacros'] ?? []) as $list) { - foreach ($list as $macro) { - yield $macro; - } - } - } - - protected static function executeStaticCallable(callable $macro, ...$parameters) - { - return static::bindMacroContext(null, function () use (&$macro, &$parameters) { - if ($macro instanceof Closure) { - $boundMacro = @Closure::bind($macro, null, static::class); - - return \call_user_func_array($boundMacro ?: $macro, $parameters); - } - - return \call_user_func_array($macro, $parameters); - }); - } - - protected function getTranslatedFormByRegExp($baseKey, $keySuffix, $context, $subKey, $defaultValue) - { - $key = $baseKey.$keySuffix; - $standaloneKey = "{$key}_standalone"; - $baseTranslation = $this->getTranslationMessage($key); - - if ($baseTranslation instanceof Closure) { - return $baseTranslation($this, $context, $subKey) ?: $defaultValue; - } - - if ( - $this->getTranslationMessage("$standaloneKey.$subKey") && - (!$context || (($regExp = $this->getTranslationMessage("{$baseKey}_regexp")) && !preg_match($regExp, $context))) - ) { - $key = $standaloneKey; - } - - return $this->getTranslationMessage("$key.$subKey", null, $defaultValue); - } - - private function callGetOrSetMethod(string $method, array $parameters): mixed - { - if (preg_match('/^([a-z]{2,})(In|Of)([A-Z][a-z]+)$/', $method)) { - $localStrictModeEnabled = $this->localStrictModeEnabled; - $this->localStrictModeEnabled = true; - - try { - return $this->callGetOrSet($method, $parameters[0] ?? null); - } catch (UnknownGetterException|UnknownSetterException|ImmutableException) { - // continue to macro - } finally { - $this->localStrictModeEnabled = $localStrictModeEnabled; - } - } - - return null; - } - - private function callGetOrSet(string $name, mixed $value): mixed - { - if ($value !== null) { - if (\is_string($value) || \is_int($value) || \is_float($value) || $value instanceof DateTimeZone || $value instanceof Month) { - return $this->set($name, $value); - } - - return null; - } - - return $this->get($name); - } - - private function getUTCUnit(string $unit): ?string - { - if (str_starts_with($unit, 'Real')) { - return substr($unit, 4); - } - - if (str_starts_with($unit, 'UTC')) { - return substr($unit, 3); - } - - return null; - } - - private function callDiffAlias(string $method, array $parameters): mixed - { - if (preg_match('/^(diff|floatDiff)In(Real|UTC|Utc)?(.+)$/', $method, $match)) { - $mode = strtoupper($match[2] ?? ''); - $betterMethod = $match[1] === 'floatDiff' ? str_replace('floatDiff', 'diff', $method) : null; - - if ($mode === 'REAL') { - $mode = 'UTC'; - $betterMethod = str_replace($match[2], 'UTC', $betterMethod ?? $method); - } - - if ($betterMethod) { - @trigger_error( - "Use the method $betterMethod instead to make it more explicit about what it does.\n". - 'On next major version, "float" prefix will be removed (as all diff are now returning floating numbers)'. - ' and "Real" methods will be removed in favor of "UTC" because what it actually does is to convert both'. - ' dates to UTC timezone before comparison, while by default it does it only if both dates don\'t have'. - ' exactly the same timezone (Note: 2 timezones with the same offset but different names are considered'. - " different as it's not safe to assume they will always have the same offset).", - \E_USER_DEPRECATED, - ); - } - - $unit = self::pluralUnit($match[3]); - $diffMethod = 'diffIn'.ucfirst($unit); - - if (\in_array($unit, ['days', 'weeks', 'months', 'quarters', 'years'])) { - $parameters['utc'] = ($mode === 'UTC'); - } - - if (method_exists($this, $diffMethod)) { - return $this->$diffMethod(...$parameters); - } - } - - return null; - } - - private function callHumanDiffAlias(string $method, array $parameters): ?string - { - $diffSizes = [ - // @mode diffForHumans - 'short' => true, - // @mode diffForHumans - 'long' => false, - ]; - $diffSyntaxModes = [ - // @call diffForHumans - 'Absolute' => CarbonInterface::DIFF_ABSOLUTE, - // @call diffForHumans - 'Relative' => CarbonInterface::DIFF_RELATIVE_AUTO, - // @call diffForHumans - 'RelativeToNow' => CarbonInterface::DIFF_RELATIVE_TO_NOW, - // @call diffForHumans - 'RelativeToOther' => CarbonInterface::DIFF_RELATIVE_TO_OTHER, - ]; - $sizePattern = implode('|', array_keys($diffSizes)); - $syntaxPattern = implode('|', array_keys($diffSyntaxModes)); - - if (preg_match("/^(?$sizePattern)(?$syntaxPattern)DiffForHuman$/", $method, $match)) { - $dates = array_filter($parameters, function ($parameter) { - return $parameter instanceof DateTimeInterface; - }); - $other = null; - - if (\count($dates)) { - $key = key($dates); - $other = current($dates); - array_splice($parameters, $key, 1); - } - - return $this->diffForHumans($other, $diffSyntaxModes[$match['syntax']], $diffSizes[$match['size']], ...$parameters); - } - - return null; - } - - private function callIsMethod(string $unit, array $parameters): ?bool - { - if (!str_starts_with($unit, 'is')) { - return null; - } - - $word = substr($unit, 2); - - if (\in_array($word, static::$days, true)) { - return $this->isDayOfWeek($word); - } - - return match ($word) { - // @call is Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - 'Utc', 'UTC' => $this->utc, - // @call is Check if the current instance has non-UTC timezone. - 'Local' => $this->local, - // @call is Check if the current instance is a valid date. - 'Valid' => $this->year !== 0, - // @call is Check if the current instance is in a daylight saving time. - 'DST' => $this->dst, - default => $this->callComparatorMethod($word, $parameters), - }; - } - - private function callComparatorMethod(string $unit, array $parameters): ?bool - { - $start = substr($unit, 0, 4); - $factor = -1; - - if ($start === 'Last') { - $start = 'Next'; - $factor = 1; - } - - if ($start === 'Next') { - $lowerUnit = strtolower(substr($unit, 4)); - - if (static::isModifiableUnit($lowerUnit)) { - return $this->avoidMutation()->addUnit($lowerUnit, $factor, false)->isSameUnit($lowerUnit, ...($parameters ?: ['now'])); - } - } - - if ($start === 'Same') { - try { - return $this->isSameUnit(strtolower(substr($unit, 4)), ...$parameters); - } catch (BadComparisonUnitException) { - // Try next - } - } - - if (str_starts_with($unit, 'Current')) { - try { - return $this->isCurrentUnit(strtolower(substr($unit, 7))); - } catch (BadComparisonUnitException | BadMethodCallException) { - // Try next - } - } - - return null; - } - - private function callModifierMethod(string $unit, array $parameters): ?static - { - $action = substr($unit, 0, 3); - $overflow = null; - - if ($action === 'set') { - $unit = strtolower(substr($unit, 3)); - } - - if (\in_array($unit, static::$units, true)) { - return $this->setUnit($unit, ...$parameters); - } - - if ($action === 'add' || $action === 'sub') { - $unit = substr($unit, 3); - $utcUnit = $this->getUTCUnit($unit); - - if ($utcUnit) { - $unit = static::singularUnit($utcUnit); - - return $this->{"{$action}UTCUnit"}($unit, ...$parameters); - } - - if (preg_match('/^(Month|Quarter|Year|Decade|Century|Centurie|Millennium|Millennia)s?(No|With|Without|WithNo)Overflow$/', $unit, $match)) { - $unit = $match[1]; - $overflow = $match[2] === 'With'; - } - - $unit = static::singularUnit($unit); - } - - if (static::isModifiableUnit($unit)) { - return $this->{"{$action}Unit"}($unit, $this->getMagicParameter($parameters, 0, 'value', 1), $overflow); - } - - return null; - } - - private function callPeriodMethod(string $method, array $parameters): ?CarbonPeriod - { - if (str_ends_with($method, 'Until')) { - try { - $unit = static::singularUnit(substr($method, 0, -5)); - - return $this->range( - $this->getMagicParameter($parameters, 0, 'endDate', $this), - $this->getMagicParameter($parameters, 1, 'factor', 1), - $unit - ); - } catch (InvalidArgumentException) { - // Try macros - } - } - - return null; - } - - private function callMacroMethod(string $method, array $parameters): mixed - { - return static::bindMacroContext($this, function () use (&$method, &$parameters) { - $macro = $this->getLocalMacro($method); - - if (!$macro) { - foreach ($this->getAllGenericMacros() as $callback) { - try { - return $this->executeCallable($callback, $method, ...$parameters); - } catch (BadMethodCallException) { - continue; - } - } - - if ($this->isLocalStrictModeEnabled()) { - throw new UnknownMethodException($method); - } - - return null; - } - - return $this->executeCallable($macro, ...$parameters); - }); - } - - private static function floorZeroPad(int|float $value, int $length): string - { - return str_pad((string) floor($value), $length, '0', STR_PAD_LEFT); - } - - /** - * @template T of CarbonInterface - * - * @param T $date - * - * @return T - */ - private function mutateIfMutable(CarbonInterface $date): CarbonInterface - { - return $this instanceof DateTimeImmutable - ? $date - : $this->modify('@'.$date->rawFormat('U.u'))->setTimezone($date->getTimezone()); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php b/vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php deleted file mode 100644 index 71660c3..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\CarbonInterface; -use Carbon\CarbonInterval; - -trait DeprecatedPeriodProperties -{ - /** - * Period start in PHP < 8.2. - * - * @var CarbonInterface - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period start. - */ - public $start; - - /** - * Period end in PHP < 8.2. - * - * @var CarbonInterface|null - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period end. - */ - public $end; - - /** - * Period current iterated date in PHP < 8.2. - * - * @var CarbonInterface|null - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period current iterated date. - */ - public $current; - - /** - * Period interval in PHP < 8.2. - * - * @var CarbonInterval|null - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period interval. - */ - public $interval; - - /** - * Period recurrences in PHP < 8.2. - * - * @var int|float|null - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period recurrences. - */ - public $recurrences; - - /** - * Period start included option in PHP < 8.2. - * - * @var bool - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period start included option. - */ - public $include_start_date; - - /** - * Period end included option in PHP < 8.2. - * - * @var bool - * - * @deprecated PHP 8.2 this property is no longer in sync with the actual period end included option. - */ - public $include_end_date; -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php b/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php deleted file mode 100644 index db5fe1d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php +++ /dev/null @@ -1,855 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\Carbon; -use Carbon\CarbonImmutable; -use Carbon\CarbonInterface; -use Carbon\CarbonInterval; -use Carbon\CarbonPeriod; -use Carbon\Exceptions\UnknownUnitException; -use Carbon\Unit; -use Closure; -use DateInterval; -use DateTimeInterface; - -/** - * Trait Difference. - * - * Depends on the following methods: - * - * @method bool lessThan($date) - * @method static copy() - * @method static resolveCarbon($date = null) - */ -trait Difference -{ - /** - * Get the difference as a DateInterval instance. - * Return relative interval (negative if $absolute flag is not set to true and the given date is before - * current one). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return DateInterval - */ - public function diffAsDateInterval($date = null, bool $absolute = false): DateInterval - { - $other = $this->resolveCarbon($date); - - // Work-around for https://bugs.php.net/bug.php?id=81458 - // It was initially introduced for https://bugs.php.net/bug.php?id=80998 - // The very specific case of 80998 was fixed in PHP 8.1beta3, but it introduced 81458 - // So we still need to keep this for now - if ($other->tz !== $this->tz) { - $other = $other->avoidMutation()->setTimezone($this->tz); - } - - return parent::diff($other, $absolute); - } - - /** - * Get the difference as a CarbonInterval instance. - * Return relative interval (negative if $absolute flag is not set to true and the given date is before - * current one). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return CarbonInterval - */ - public function diffAsCarbonInterval($date = null, bool $absolute = false, array $skip = []): CarbonInterval - { - return CarbonInterval::diff($this, $this->resolveCarbon($date), $absolute, $skip) - ->setLocalTranslator($this->getLocalTranslator()); - } - - /** - * @alias diffAsCarbonInterval - * - * Get the difference as a DateInterval instance. - * Return relative interval (negative if $absolute flag is not set to true and the given date is before - * current one). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return CarbonInterval - */ - public function diff($date = null, bool $absolute = false, array $skip = []): CarbonInterval - { - return $this->diffAsCarbonInterval($date, $absolute, $skip); - } - - /** - * @param Unit|string $unit microsecond, millisecond, second, minute, - * hour, day, week, month, quarter, year, - * century, millennium - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInUnit(Unit|string $unit, $date = null, bool $absolute = false, bool $utc = false): float - { - $unit = static::pluralUnit($unit instanceof Unit ? $unit->value : rtrim($unit, 'z')); - $method = 'diffIn'.$unit; - - if (!method_exists($this, $method)) { - throw new UnknownUnitException($unit); - } - - return $this->$method($date, $absolute, $utc); - } - - /** - * Get the difference in years - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInYears($date = null, bool $absolute = false, bool $utc = false): float - { - $start = $this; - $end = $this->resolveCarbon($date); - - if ($utc) { - $start = $start->avoidMutation()->utc(); - $end = $end->avoidMutation()->utc(); - } - - $ascending = ($start <= $end); - $sign = $absolute || $ascending ? 1 : -1; - - if (!$ascending) { - [$start, $end] = [$end, $start]; - } - - $yearsDiff = (int) $start->diff($end, $absolute)->format('%r%y'); - /** @var Carbon|CarbonImmutable $floorEnd */ - $floorEnd = $start->avoidMutation()->addYears($yearsDiff); - - if ($floorEnd >= $end) { - return $sign * $yearsDiff; - } - - /** @var Carbon|CarbonImmutable $ceilEnd */ - $ceilEnd = $start->avoidMutation()->addYears($yearsDiff + 1); - - $daysToFloor = $floorEnd->diffInDays($end); - $daysToCeil = $end->diffInDays($ceilEnd); - - return $sign * ($yearsDiff + $daysToFloor / ($daysToCeil + $daysToFloor)); - } - - /** - * Get the difference in quarters. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInQuarters($date = null, bool $absolute = false, bool $utc = false): float - { - return $this->diffInMonths($date, $absolute, $utc) / static::MONTHS_PER_QUARTER; - } - - /** - * Get the difference in months. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInMonths($date = null, bool $absolute = false, bool $utc = false): float - { - $start = $this; - $end = $this->resolveCarbon($date); - - // Compare using UTC - if ($utc || ($end->timezoneName !== $start->timezoneName)) { - $start = $start->avoidMutation()->utc(); - $end = $end->avoidMutation()->utc(); - } - - [$yearStart, $monthStart, $dayStart] = explode('-', $start->format('Y-m-dHisu')); - [$yearEnd, $monthEnd, $dayEnd] = explode('-', $end->format('Y-m-dHisu')); - - $monthsDiff = (((int) $yearEnd) - ((int) $yearStart)) * static::MONTHS_PER_YEAR + - ((int) $monthEnd) - ((int) $monthStart); - - if ($monthsDiff > 0) { - $monthsDiff -= ($dayStart > $dayEnd ? 1 : 0); - } elseif ($monthsDiff < 0) { - $monthsDiff += ($dayStart < $dayEnd ? 1 : 0); - } - - $ascending = ($start <= $end); - $sign = $absolute || $ascending ? 1 : -1; - $monthsDiff = abs($monthsDiff); - - if (!$ascending) { - [$start, $end] = [$end, $start]; - } - - /** @var Carbon|CarbonImmutable $floorEnd */ - $floorEnd = $start->avoidMutation()->addMonths($monthsDiff); - - if ($floorEnd >= $end) { - return $sign * $monthsDiff; - } - - /** @var Carbon|CarbonImmutable $ceilEnd */ - $ceilEnd = $start->avoidMutation()->addMonths($monthsDiff + 1); - - $daysToFloor = $floorEnd->diffInDays($end); - $daysToCeil = $end->diffInDays($ceilEnd); - - return $sign * ($monthsDiff + $daysToFloor / ($daysToCeil + $daysToFloor)); - } - - /** - * Get the difference in weeks. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInWeeks($date = null, bool $absolute = false, bool $utc = false): float - { - return $this->diffInDays($date, $absolute, $utc) / static::DAYS_PER_WEEK; - } - - /** - * Get the difference in days. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * @param bool $utc Always convert dates to UTC before comparing (if not set, it will do it only if timezones are different) - * - * @return float - */ - public function diffInDays($date = null, bool $absolute = false, bool $utc = false): float - { - $date = $this->resolveCarbon($date); - $current = $this; - - // Compare using UTC - if ($utc || ($date->timezoneName !== $current->timezoneName)) { - $date = $date->avoidMutation()->utc(); - $current = $current->avoidMutation()->utc(); - } - - $negative = ($date < $current); - [$start, $end] = $negative ? [$date, $current] : [$current, $date]; - $interval = $start->diffAsDateInterval($end); - $daysA = $this->getIntervalDayDiff($interval); - $floorEnd = $start->avoidMutation()->addDays($daysA); - $daysB = $daysA + ($floorEnd <= $end ? 1 : -1); - $ceilEnd = $start->avoidMutation()->addDays($daysB); - $microsecondsBetween = $floorEnd->diffInMicroseconds($ceilEnd); - $microsecondsToEnd = $floorEnd->diffInMicroseconds($end); - - return ($negative && !$absolute ? -1 : 1) - * ($daysA * ($microsecondsBetween - $microsecondsToEnd) + $daysB * $microsecondsToEnd) - / $microsecondsBetween; - } - - /** - * Get the difference in days using a filter closure. - * - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInDaysFiltered(Closure $callback, $date = null, bool $absolute = false): int - { - return $this->diffFiltered(CarbonInterval::day(), $callback, $date, $absolute); - } - - /** - * Get the difference in hours using a filter closure. - * - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInHoursFiltered(Closure $callback, $date = null, bool $absolute = false): int - { - return $this->diffFiltered(CarbonInterval::hour(), $callback, $date, $absolute); - } - - /** - * Get the difference by the given interval using a filter closure. - * - * @param CarbonInterval $ci An interval to traverse by - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffFiltered(CarbonInterval $ci, Closure $callback, $date = null, bool $absolute = false): int - { - $start = $this; - $end = $this->resolveCarbon($date); - $inverse = false; - - if ($end < $start) { - $start = $end; - $end = $this; - $inverse = true; - } - - $options = CarbonPeriod::EXCLUDE_END_DATE | ($this->isMutable() ? 0 : CarbonPeriod::IMMUTABLE); - $diff = $ci->toPeriod($start, $end, $options)->filter($callback)->count(); - - return $inverse && !$absolute ? -$diff : $diff; - } - - /** - * Get the difference in weekdays. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInWeekdays($date = null, bool $absolute = false): int - { - return $this->diffInDaysFiltered( - static fn (CarbonInterface $date) => $date->isWeekday(), - $this->resolveCarbon($date)->avoidMutation()->modify($this->format('H:i:s.u')), - $absolute, - ); - } - - /** - * Get the difference in weekend days using a filter. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInWeekendDays($date = null, bool $absolute = false): int - { - return $this->diffInDaysFiltered( - static fn (CarbonInterface $date) => $date->isWeekend(), - $this->resolveCarbon($date)->avoidMutation()->modify($this->format('H:i:s.u')), - $absolute, - ); - } - - /** - * Get the difference in hours. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function diffInHours($date = null, bool $absolute = false): float - { - return $this->diffInMinutes($date, $absolute) / static::MINUTES_PER_HOUR; - } - - /** - * Get the difference in minutes. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function diffInMinutes($date = null, bool $absolute = false): float - { - return $this->diffInSeconds($date, $absolute) / static::SECONDS_PER_MINUTE; - } - - /** - * Get the difference in seconds. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function diffInSeconds($date = null, bool $absolute = false): float - { - return $this->diffInMilliseconds($date, $absolute) / static::MILLISECONDS_PER_SECOND; - } - - /** - * Get the difference in microseconds. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function diffInMicroseconds($date = null, bool $absolute = false): float - { - /** @var CarbonInterface $date */ - $date = $this->resolveCarbon($date); - $value = ($date->timestamp - $this->timestamp) * static::MICROSECONDS_PER_SECOND + - $date->micro - $this->micro; - - return $absolute ? abs($value) : $value; - } - - /** - * Get the difference in milliseconds. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function diffInMilliseconds($date = null, bool $absolute = false): float - { - return $this->diffInMicroseconds($date, $absolute) / static::MICROSECONDS_PER_MILLISECOND; - } - - /** - * The number of seconds since midnight. - * - * @return float - */ - public function secondsSinceMidnight(): float - { - return $this->diffInSeconds($this->copy()->startOfDay(), true); - } - - /** - * The number of seconds until 23:59:59. - * - * @return float - */ - public function secondsUntilEndOfDay(): float - { - return $this->diffInSeconds($this->copy()->endOfDay(), true); - } - - /** - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - * - * @example - * ``` - * echo Carbon::tomorrow()->diffForHumans() . "\n"; - * echo Carbon::tomorrow()->diffForHumans(['parts' => 2]) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(['parts' => 3, 'join' => true]) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday()) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday(), ['short' => true]) . "\n"; - * ``` - * - * @param Carbon|DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * ⦿ 'syntax' entry (see below) - * ⦿ 'short' entry (see below) - * ⦿ 'parts' entry (see below) - * ⦿ 'options' entry (see below) - * ⦿ 'skip' entry, list of units to skip (array of strings or a single string, - * ` it can be the unit name (singular or plural) or its shortcut - * ` (y, m, w, d, h, min, s, ms, µs). - * ⦿ 'aUnit' entry, prefer "an hour" over "1 hour" if true - * ⦿ 'altNumbers' entry, use alternative numbers if available - * ` (from the current language if true is passed, from the given language(s) - * ` if array or string is passed) - * ⦿ 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * ⦿ 'other' entry (see above) - * ⦿ 'minimumUnit' entry determines the smallest unit of time to display can be long or - * ` short form of the units, e.g. 'hour' or 'h' (default value: s) - * ⦿ 'locale' language in which the diff should be output (has no effect if 'translator' key is set) - * ⦿ 'translator' a custom translator to use to translator the output. - * if int passed, it adds modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - */ - public function diffForHumans($other = null, $syntax = null, $short = false, $parts = 1, $options = null): string - { - /* @var CarbonInterface $this */ - if (\is_array($other)) { - $other['syntax'] = \array_key_exists('syntax', $other) ? $other['syntax'] : $syntax; - $syntax = $other; - $other = $syntax['other'] ?? null; - } - - $intSyntax = &$syntax; - - if (\is_array($syntax)) { - $syntax['syntax'] = $syntax['syntax'] ?? null; - $intSyntax = &$syntax['syntax']; - } - - $intSyntax = (int) ($intSyntax ?? static::DIFF_RELATIVE_AUTO); - $intSyntax = $intSyntax === static::DIFF_RELATIVE_AUTO && $other === null ? static::DIFF_RELATIVE_TO_NOW : $intSyntax; - - $parts = min(7, max(1, (int) $parts)); - $skip = \is_array($syntax) ? ($syntax['skip'] ?? []) : []; - $options ??= $this->localHumanDiffOptions ?? $this->transmitFactory( - static fn () => static::getHumanDiffOptions(), - ); - - return $this->diff($other, skip: (array) $skip)->forHumans($syntax, (bool) $short, $parts, $options); - } - - /** - * @alias diffForHumans - * - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function from($other = null, $syntax = null, $short = false, $parts = 1, $options = null) - { - return $this->diffForHumans($other, $syntax, $short, $parts, $options); - } - - /** - * @alias diffForHumans - * - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - */ - public function since($other = null, $syntax = null, $short = false, $parts = 1, $options = null) - { - return $this->diffForHumans($other, $syntax, $short, $parts, $options); - } - - /** - * Get the difference in a human readable format in the current locale from an other - * instance given (or now if null given) to current instance. - * - * When comparing a value in the past to default now: - * 1 hour from now - * 5 months from now - * - * When comparing a value in the future to default now: - * 1 hour ago - * 5 months ago - * - * When comparing a value in the past to another value: - * 1 hour after - * 5 months after - * - * When comparing a value in the future to another value: - * 1 hour before - * 5 months before - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function to($other = null, $syntax = null, $short = false, $parts = 1, $options = null) - { - if (!$syntax && !$other) { - $syntax = CarbonInterface::DIFF_RELATIVE_TO_NOW; - } - - return $this->resolveCarbon($other)->diffForHumans($this, $syntax, $short, $parts, $options); - } - - /** - * @alias to - * - * Get the difference in a human readable format in the current locale from an other - * instance given (or now if null given) to current instance. - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function until($other = null, $syntax = null, $short = false, $parts = 1, $options = null) - { - return $this->to($other, $syntax, $short, $parts, $options); - } - - /** - * Get the difference in a human readable format in the current locale from current - * instance to now. - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function fromNow($syntax = null, $short = false, $parts = 1, $options = null) - { - $other = null; - - if ($syntax instanceof DateTimeInterface) { - [$other, $syntax, $short, $parts, $options] = array_pad(\func_get_args(), 5, null); - } - - return $this->from($other, $syntax, $short, $parts, $options); - } - - /** - * Get the difference in a human readable format in the current locale from an other - * instance given to now - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single part) - * @param int $options human diff options - * - * @return string - */ - public function toNow($syntax = null, $short = false, $parts = 1, $options = null) - { - return $this->to(null, $syntax, $short, $parts, $options); - } - - /** - * Get the difference in a human readable format in the current locale from an other - * instance given to now - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single part) - * @param int $options human diff options - * - * @return string - */ - public function ago($syntax = null, $short = false, $parts = 1, $options = null) - { - $other = null; - - if ($syntax instanceof DateTimeInterface) { - [$other, $syntax, $short, $parts, $options] = array_pad(\func_get_args(), 5, null); - } - - return $this->from($other, $syntax, $short, $parts, $options); - } - - /** - * Get the difference in a human-readable format in the current locale from current instance to another - * instance given (or now if null given). - * - * @return string - */ - public function timespan($other = null, $timezone = null): string - { - if (\is_string($other)) { - $other = $this->transmitFactory(static fn () => static::parse($other, $timezone)); - } - - return $this->diffForHumans($other, [ - 'join' => ', ', - 'syntax' => CarbonInterface::DIFF_ABSOLUTE, - 'parts' => INF, - ]); - } - - /** - * Returns either day of week + time (e.g. "Last Friday at 3:30 PM") if reference time is within 7 days, - * or a calendar date (e.g. "10/29/2017") otherwise. - * - * Language, date and time formats will change according to the current locale. - * - * @param Carbon|\DateTimeInterface|string|null $referenceTime - * @param array $formats - * - * @return string - */ - public function calendar($referenceTime = null, array $formats = []) - { - /** @var CarbonInterface $current */ - $current = $this->avoidMutation()->startOfDay(); - /** @var CarbonInterface $other */ - $other = $this->resolveCarbon($referenceTime)->avoidMutation()->setTimezone($this->getTimezone())->startOfDay(); - $diff = $other->diffInDays($current, false); - $format = $diff <= -static::DAYS_PER_WEEK ? 'sameElse' : ( - $diff < -1 ? 'lastWeek' : ( - $diff < 0 ? 'lastDay' : ( - $diff < 1 ? 'sameDay' : ( - $diff < 2 ? 'nextDay' : ( - $diff < static::DAYS_PER_WEEK ? 'nextWeek' : 'sameElse' - ) - ) - ) - ) - ); - $format = array_merge($this->getCalendarFormats(), $formats)[$format]; - if ($format instanceof Closure) { - $format = $format($current, $other) ?? ''; - } - - return $this->isoFormat((string) $format); - } - - private function getIntervalDayDiff(DateInterval $interval): int - { - return (int) $interval->format('%r%a'); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php b/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php deleted file mode 100644 index e27c7ba..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\CarbonInterval; -use Carbon\Exceptions\InvalidIntervalException; -use DateInterval; - -/** - * Trait to call rounding methods to interval or the interval of a period. - */ -trait IntervalRounding -{ - protected function callRoundMethod(string $method, array $parameters): ?static - { - $action = substr($method, 0, 4); - - if ($action !== 'ceil') { - $action = substr($method, 0, 5); - } - - if (\in_array($action, ['round', 'floor', 'ceil'])) { - return $this->{$action.'Unit'}(substr($method, \strlen($action)), ...$parameters); - } - - return null; - } - - protected function roundWith(DateInterval|string|float|int $precision, callable|string $function): ?static - { - $unit = 'second'; - - if ($precision instanceof DateInterval) { - $precision = CarbonInterval::instance($precision)->forHumans(['locale' => 'en']); - } - - if (\is_string($precision) && preg_match('/^\s*(?\d+)?\s*(?\w+)(?\W.*)?$/', $precision, $match)) { - if (trim($match['other'] ?? '') !== '') { - throw new InvalidIntervalException('Rounding is only possible with single unit intervals.'); - } - - $precision = (int) ($match['precision'] ?: 1); - $unit = $match['unit']; - } - - return $this->roundUnit($unit, $precision, $function); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php b/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php deleted file mode 100644 index 2eaf984..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\Callback; -use Carbon\Carbon; -use Carbon\CarbonImmutable; -use Carbon\CarbonInterface; -use Closure; -use DateTimeImmutable; -use DateTimeInterface; - -trait IntervalStep -{ - /** - * Step to apply instead of a fixed interval to get the new date. - * - * @var Closure|null - */ - protected $step; - - /** - * Get the dynamic step in use. - * - * @return Closure - */ - public function getStep(): ?Closure - { - return $this->step; - } - - /** - * Set a step to apply instead of a fixed interval to get the new date. - * - * Or pass null to switch to fixed interval. - * - * @param Closure|null $step - */ - public function setStep(?Closure $step): void - { - $this->step = $step; - } - - /** - * Take a date and apply either the step if set, or the current interval else. - * - * The interval/step is applied negatively (typically subtraction instead of addition) if $negated is true. - * - * @param DateTimeInterface $dateTime - * @param bool $negated - * - * @return CarbonInterface - */ - public function convertDate(DateTimeInterface $dateTime, bool $negated = false): CarbonInterface - { - /** @var CarbonInterface $carbonDate */ - $carbonDate = $dateTime instanceof CarbonInterface ? $dateTime : $this->resolveCarbon($dateTime); - - if ($this->step) { - $carbonDate = Callback::parameter($this->step, $carbonDate->avoidMutation()); - - return $carbonDate->modify(($this->step)($carbonDate, $negated)->format('Y-m-d H:i:s.u e O')); - } - - if ($negated) { - return $carbonDate->rawSub($this); - } - - return $carbonDate->rawAdd($this); - } - - /** - * Convert DateTimeImmutable instance to CarbonImmutable instance and DateTime instance to Carbon instance. - */ - private function resolveCarbon(DateTimeInterface $dateTime): Carbon|CarbonImmutable - { - if ($dateTime instanceof DateTimeImmutable) { - return CarbonImmutable::instance($dateTime); - } - - return Carbon::instance($dateTime); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/LocalFactory.php b/vendor/nesbot/carbon/src/Carbon/Traits/LocalFactory.php deleted file mode 100644 index a039854..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/LocalFactory.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\Factory; -use Carbon\FactoryImmutable; -use Carbon\WrapperClock; -use Closure; - -/** - * Remember the factory that was the current at the creation of the object. - */ -trait LocalFactory -{ - /** - * The clock that generated the current instance (or FactoryImmutable::getDefaultInstance() if none) - */ - private ?WrapperClock $clock = null; - - public function getClock(): ?WrapperClock - { - return $this->clock; - } - - private function initLocalFactory(): void - { - $this->clock = FactoryImmutable::getCurrentClock(); - } - - /** - * Trigger the given action using the local factory of the object, so it will be transmitted - * to any object also using this trait and calling initLocalFactory() in its constructor. - * - * @template T - * - * @param Closure(): T $action - * - * @return T - */ - private function transmitFactory(Closure $action): mixed - { - $previousClock = FactoryImmutable::getCurrentClock(); - FactoryImmutable::setCurrentClock($this->clock); - - try { - return $action(); - } finally { - FactoryImmutable::setCurrentClock($previousClock); - } - } - - private function getFactory(): Factory - { - return $this->getClock()?->getFactory() ?? FactoryImmutable::getDefaultInstance(); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php b/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php deleted file mode 100644 index 611ae5c..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php +++ /dev/null @@ -1,728 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\CarbonInterface; -use Carbon\Exceptions\InvalidTypeException; -use Carbon\Exceptions\NotLocaleAwareException; -use Carbon\Language; -use Carbon\Translator; -use Carbon\TranslatorStrongTypeInterface; -use Closure; -use Symfony\Component\Translation\TranslatorBagInterface; -use Symfony\Contracts\Translation\LocaleAwareInterface; -use Symfony\Contracts\Translation\TranslatorInterface; - -/** - * Trait Localization. - * - * Embed default and locale translators and translation base methods. - */ -trait Localization -{ - use StaticLocalization; - - /** - * Specific translator of the current instance. - */ - protected ?TranslatorInterface $localTranslator = null; - - /** - * Return true if the current instance has its own translator. - */ - public function hasLocalTranslator(): bool - { - return isset($this->localTranslator); - } - - /** - * Get the translator of the current instance or the default if none set. - */ - public function getLocalTranslator(): TranslatorInterface - { - return $this->localTranslator ?? $this->transmitFactory(static fn () => static::getTranslator()); - } - - /** - * Set the translator for the current instance. - */ - public function setLocalTranslator(TranslatorInterface $translator): self - { - $this->localTranslator = $translator; - - return $this; - } - - /** - * Returns raw translation message for a given key. - * - * @param TranslatorInterface|null $translator the translator to use - * @param string $key key to find - * @param string|null $locale current locale used if null - * @param string|null $default default value if translation returns the key - * - * @return string|Closure|null - */ - public static function getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null) - { - if (!($translator instanceof TranslatorBagInterface && $translator instanceof TranslatorInterface)) { - throw new InvalidTypeException( - 'Translator does not implement '.TranslatorInterface::class.' and '.TranslatorBagInterface::class.'. '. - (\is_object($translator) ? \get_class($translator) : \gettype($translator)).' has been given.', - ); - } - - if (!$locale && $translator instanceof LocaleAwareInterface) { - $locale = $translator->getLocale(); - } - - $result = self::getFromCatalogue($translator, $translator->getCatalogue($locale), $key); - - return $result === $key ? $default : $result; - } - - /** - * Returns raw translation message for a given key. - * - * @param string $key key to find - * @param string|null $locale current locale used if null - * @param string|null $default default value if translation returns the key - * @param TranslatorInterface $translator an optional translator to use - * - * @return string - */ - public function getTranslationMessage(string $key, ?string $locale = null, ?string $default = null, $translator = null) - { - return static::getTranslationMessageWith($translator ?? $this->getLocalTranslator(), $key, $locale, $default); - } - - /** - * Translate using translation string or callback available. - * - * @param TranslatorInterface $translator an optional translator to use - * @param string $key key to find - * @param array $parameters replacement parameters - * @param int|float|null $number number if plural - * - * @return string - */ - public static function translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null): string - { - $message = static::getTranslationMessageWith($translator, $key, null, $key); - if ($message instanceof Closure) { - return (string) $message(...array_values($parameters)); - } - - if ($number !== null) { - $parameters['%count%'] = $number; - } - if (isset($parameters['%count%'])) { - $parameters[':count'] = $parameters['%count%']; - } - - return (string) $translator->trans($key, $parameters); - } - - /** - * Translate using translation string or callback available. - * - * @param string $key key to find - * @param array $parameters replacement parameters - * @param string|int|float|null $number number if plural - * @param TranslatorInterface|null $translator an optional translator to use - * @param bool $altNumbers pass true to use alternative numbers - * - * @return string - */ - public function translate( - string $key, - array $parameters = [], - string|int|float|null $number = null, - ?TranslatorInterface $translator = null, - bool $altNumbers = false, - ): string { - $translation = static::translateWith($translator ?? $this->getLocalTranslator(), $key, $parameters, $number); - - if ($number !== null && $altNumbers) { - return str_replace((string) $number, $this->translateNumber((int) $number), $translation); - } - - return $translation; - } - - /** - * Returns the alternative number for a given integer if available in the current locale. - * - * @param int $number - * - * @return string - */ - public function translateNumber(int $number): string - { - $translateKey = "alt_numbers.$number"; - $symbol = $this->translate($translateKey); - - if ($symbol !== $translateKey) { - return $symbol; - } - - if ($number > 99 && $this->translate('alt_numbers.99') !== 'alt_numbers.99') { - $start = ''; - foreach ([10000, 1000, 100] as $exp) { - $key = "alt_numbers_pow.$exp"; - if ($number >= $exp && $number < $exp * 10 && ($pow = $this->translate($key)) !== $key) { - $unit = floor($number / $exp); - $number -= $unit * $exp; - $start .= ($unit > 1 ? $this->translate("alt_numbers.$unit") : '').$pow; - } - } - $result = ''; - while ($number) { - $chunk = $number % 100; - $result = $this->translate("alt_numbers.$chunk").$result; - $number = floor($number / 100); - } - - return "$start$result"; - } - - if ($number > 9 && $this->translate('alt_numbers.9') !== 'alt_numbers.9') { - $result = ''; - while ($number) { - $chunk = $number % 10; - $result = $this->translate("alt_numbers.$chunk").$result; - $number = floor($number / 10); - } - - return $result; - } - - return (string) $number; - } - - /** - * Translate a time string from a locale to an other. - * - * @param string $timeString date/time/duration string to translate (may also contain English) - * @param string|null $from input locale of the $timeString parameter (`Carbon::getLocale()` by default) - * @param string|null $to output locale of the result returned (`"en"` by default) - * @param int $mode specify what to translate with options: - * - CarbonInterface::TRANSLATE_ALL (default) - * - CarbonInterface::TRANSLATE_MONTHS - * - CarbonInterface::TRANSLATE_DAYS - * - CarbonInterface::TRANSLATE_UNITS - * - CarbonInterface::TRANSLATE_MERIDIEM - * You can use pipe to group: CarbonInterface::TRANSLATE_MONTHS | CarbonInterface::TRANSLATE_DAYS - * - * @return string - */ - public static function translateTimeString( - string $timeString, - ?string $from = null, - ?string $to = null, - int $mode = CarbonInterface::TRANSLATE_ALL, - ): string { - // Fallback source and destination locales - $from = $from ?: static::getLocale(); - $to = $to ?: CarbonInterface::DEFAULT_LOCALE; - - if ($from === $to) { - return $timeString; - } - - // Standardize apostrophe - $timeString = strtr($timeString, ['’' => "'"]); - - $fromTranslations = []; - $toTranslations = []; - - foreach (['from', 'to'] as $key) { - $language = $$key; - $translator = Translator::get($language); - $translations = $translator->getMessages(); - - if (!isset($translations[$language])) { - return $timeString; - } - - $translationKey = $key.'Translations'; - $messages = $translations[$language]; - $months = $messages['months'] ?? []; - $weekdays = $messages['weekdays'] ?? []; - $meridiem = $messages['meridiem'] ?? ['AM', 'PM']; - - if (isset($messages['ordinal_words'])) { - $timeString = self::replaceOrdinalWords( - $timeString, - $key === 'from' ? array_flip($messages['ordinal_words']) : $messages['ordinal_words'] - ); - } - - if ($key === 'from') { - foreach (['months', 'weekdays'] as $variable) { - $list = $messages[$variable.'_standalone'] ?? null; - - if ($list) { - foreach ($$variable as $index => &$name) { - $name .= '|'.$messages[$variable.'_standalone'][$index]; - } - } - } - } - - $$translationKey = array_merge( - $mode & CarbonInterface::TRANSLATE_MONTHS ? static::getTranslationArray($months, static::MONTHS_PER_YEAR, $timeString) : [], - $mode & CarbonInterface::TRANSLATE_MONTHS ? static::getTranslationArray($messages['months_short'] ?? [], static::MONTHS_PER_YEAR, $timeString) : [], - $mode & CarbonInterface::TRANSLATE_DAYS ? static::getTranslationArray($weekdays, static::DAYS_PER_WEEK, $timeString) : [], - $mode & CarbonInterface::TRANSLATE_DAYS ? static::getTranslationArray($messages['weekdays_short'] ?? [], static::DAYS_PER_WEEK, $timeString) : [], - $mode & CarbonInterface::TRANSLATE_DIFF ? static::translateWordsByKeys([ - 'diff_now', - 'diff_today', - 'diff_yesterday', - 'diff_tomorrow', - 'diff_before_yesterday', - 'diff_after_tomorrow', - ], $messages, $key) : [], - $mode & CarbonInterface::TRANSLATE_UNITS ? static::translateWordsByKeys([ - 'year', - 'month', - 'week', - 'day', - 'hour', - 'minute', - 'second', - ], $messages, $key) : [], - $mode & CarbonInterface::TRANSLATE_MERIDIEM ? array_map(function ($hour) use ($meridiem) { - if (\is_array($meridiem)) { - return $meridiem[$hour < static::HOURS_PER_DAY / 2 ? 0 : 1]; - } - - return $meridiem($hour, 0, false); - }, range(0, 23)) : [], - ); - } - - return substr(preg_replace_callback('/(?<=[\d\s+.\/,_-])('.implode('|', $fromTranslations).')(?=[\d\s+.\/,_-])/iu', function ($match) use ($fromTranslations, $toTranslations) { - [$chunk] = $match; - - foreach ($fromTranslations as $index => $word) { - if (preg_match("/^$word\$/iu", $chunk)) { - return $toTranslations[$index] ?? ''; - } - } - - return $chunk; // @codeCoverageIgnore - }, " $timeString "), 1, -1); - } - - /** - * Translate a time string from the current locale (`$date->locale()`) to an other. - * - * @param string $timeString time string to translate - * @param string|null $to output locale of the result returned ("en" by default) - * - * @return string - */ - public function translateTimeStringTo(string $timeString, ?string $to = null): string - { - return static::translateTimeString($timeString, $this->getTranslatorLocale(), $to); - } - - /** - * Get/set the locale for the current instance. - * - * @param string|null $locale - * @param string ...$fallbackLocales - * - * @return $this|string - */ - public function locale(?string $locale = null, string ...$fallbackLocales): static|string - { - if ($locale === null) { - return $this->getTranslatorLocale(); - } - - if (!$this->localTranslator || $this->getTranslatorLocale($this->localTranslator) !== $locale) { - $translator = Translator::get($locale); - - if (!empty($fallbackLocales)) { - $translator->setFallbackLocales($fallbackLocales); - - foreach ($fallbackLocales as $fallbackLocale) { - $messages = Translator::get($fallbackLocale)->getMessages(); - - if (isset($messages[$fallbackLocale])) { - $translator->setMessages($fallbackLocale, $messages[$fallbackLocale]); - } - } - } - - $this->localTranslator = $translator; - } - - return $this; - } - - /** - * Get the current translator locale. - * - * @return string - */ - public static function getLocale(): string - { - return static::getLocaleAwareTranslator()->getLocale(); - } - - /** - * Set the current translator locale and indicate if the source locale file exists. - * Pass 'auto' as locale to use the closest language to the current LC_TIME locale. - * - * @param string $locale locale ex. en - */ - public static function setLocale(string $locale): void - { - static::getLocaleAwareTranslator()->setLocale($locale); - } - - /** - * Set the fallback locale. - * - * @see https://symfony.com/doc/current/components/translation.html#fallback-locales - * - * @param string $locale - */ - public static function setFallbackLocale(string $locale): void - { - $translator = static::getTranslator(); - - if (method_exists($translator, 'setFallbackLocales')) { - $translator->setFallbackLocales([$locale]); - - if ($translator instanceof Translator) { - $preferredLocale = $translator->getLocale(); - $translator->setMessages($preferredLocale, array_replace_recursive( - $translator->getMessages()[$locale] ?? [], - Translator::get($locale)->getMessages()[$locale] ?? [], - $translator->getMessages($preferredLocale), - )); - } - } - } - - /** - * Get the fallback locale. - * - * @see https://symfony.com/doc/current/components/translation.html#fallback-locales - */ - public static function getFallbackLocale(): ?string - { - $translator = static::getTranslator(); - - if (method_exists($translator, 'getFallbackLocales')) { - return $translator->getFallbackLocales()[0] ?? null; - } - - return null; - } - - /** - * Set the current locale to the given, execute the passed function, reset the locale to previous one, - * then return the result of the closure (or null if the closure was void). - * - * @param string $locale locale ex. en - * @param callable $func - * - * @return mixed - */ - public static function executeWithLocale(string $locale, callable $func): mixed - { - $currentLocale = static::getLocale(); - static::setLocale($locale); - $newLocale = static::getLocale(); - $result = $func( - $newLocale === 'en' && strtolower(substr((string) $locale, 0, 2)) !== 'en' - ? false - : $newLocale, - static::getTranslator(), - ); - static::setLocale($currentLocale); - - return $result; - } - - /** - * Returns true if the given locale is internally supported and has short-units support. - * Support is considered enabled if either year, day or hour has a short variant translated. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasShortUnits(string $locale): bool - { - return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { - return ($newLocale && (($y = static::translateWith($translator, 'y')) !== 'y' && $y !== static::translateWith($translator, 'year'))) || ( - ($y = static::translateWith($translator, 'd')) !== 'd' && - $y !== static::translateWith($translator, 'day') - ) || ( - ($y = static::translateWith($translator, 'h')) !== 'h' && - $y !== static::translateWith($translator, 'hour') - ); - }); - } - - /** - * Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffSyntax(string $locale): bool - { - return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { - if (!$newLocale) { - return false; - } - - foreach (['ago', 'from_now', 'before', 'after'] as $key) { - if ($translator instanceof TranslatorBagInterface && - self::getFromCatalogue($translator, $translator->getCatalogue($newLocale), $key) instanceof Closure - ) { - continue; - } - - if ($translator->trans($key) === $key) { - return false; - } - } - - return true; - }); - } - - /** - * Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). - * Support is considered enabled if the 3 words are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffOneDayWords(string $locale): bool - { - return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { - return $newLocale && - $translator->trans('diff_now') !== 'diff_now' && - $translator->trans('diff_yesterday') !== 'diff_yesterday' && - $translator->trans('diff_tomorrow') !== 'diff_tomorrow'; - }); - } - - /** - * Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). - * Support is considered enabled if the 2 words are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffTwoDayWords(string $locale): bool - { - return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { - return $newLocale && - $translator->trans('diff_before_yesterday') !== 'diff_before_yesterday' && - $translator->trans('diff_after_tomorrow') !== 'diff_after_tomorrow'; - }); - } - - /** - * Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasPeriodSyntax($locale) - { - return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { - return $newLocale && - $translator->trans('period_recurrences') !== 'period_recurrences' && - $translator->trans('period_interval') !== 'period_interval' && - $translator->trans('period_start_date') !== 'period_start_date' && - $translator->trans('period_end_date') !== 'period_end_date'; - }); - } - - /** - * Returns the list of internally available locales and already loaded custom locales. - * (It will ignore custom translator dynamic loading.) - * - * @return array - */ - public static function getAvailableLocales() - { - $translator = static::getLocaleAwareTranslator(); - - return $translator instanceof Translator - ? $translator->getAvailableLocales() - : [$translator->getLocale()]; - } - - /** - * Returns list of Language object for each available locale. This object allow you to get the ISO name, native - * name, region and variant of the locale. - * - * @return Language[] - */ - public static function getAvailableLocalesInfo() - { - $languages = []; - foreach (static::getAvailableLocales() as $id) { - $languages[$id] = new Language($id); - } - - return $languages; - } - - /** - * Get the locale of a given translator. - * - * If null or omitted, current local translator is used. - * If no local translator is in use, current global translator is used. - */ - protected function getTranslatorLocale($translator = null): ?string - { - if (\func_num_args() === 0) { - $translator = $this->getLocalTranslator(); - } - - $translator = static::getLocaleAwareTranslator($translator); - - return $translator?->getLocale(); - } - - /** - * Throw an error if passed object is not LocaleAwareInterface. - * - * @param LocaleAwareInterface|null $translator - * - * @return LocaleAwareInterface|null - */ - protected static function getLocaleAwareTranslator($translator = null) - { - if (\func_num_args() === 0) { - $translator = static::getTranslator(); - } - - if ($translator && !($translator instanceof LocaleAwareInterface || method_exists($translator, 'getLocale'))) { - throw new NotLocaleAwareException($translator); // @codeCoverageIgnore - } - - return $translator; - } - - /** - * @param mixed $translator - * @param \Symfony\Component\Translation\MessageCatalogueInterface $catalogue - * - * @return mixed - */ - private static function getFromCatalogue($translator, $catalogue, string $id, string $domain = 'messages') - { - return $translator instanceof TranslatorStrongTypeInterface - ? $translator->getFromCatalogue($catalogue, $id, $domain) - : $catalogue->get($id, $domain); // @codeCoverageIgnore - } - - /** - * Return the word cleaned from its translation codes. - * - * @param string $word - * - * @return string - */ - private static function cleanWordFromTranslationString($word) - { - $word = str_replace([':count', '%count', ':time'], '', $word); - $word = strtr($word, ['’' => "'"]); - $word = preg_replace('/({\d+(,(\d+|Inf))?}|[\[\]]\d+(,(\d+|Inf))?[\[\]])/', '', $word); - - return trim($word); - } - - /** - * Translate a list of words. - * - * @param string[] $keys keys to translate. - * @param string[] $messages messages bag handling translations. - * @param string $key 'to' (to get the translation) or 'from' (to get the detection RegExp pattern). - * - * @return string[] - */ - private static function translateWordsByKeys($keys, $messages, $key): array - { - return array_map(function ($wordKey) use ($messages, $key) { - $message = $key === 'from' && isset($messages[$wordKey.'_regexp']) - ? $messages[$wordKey.'_regexp'] - : ($messages[$wordKey] ?? null); - - if (!$message) { - return '>>DO NOT REPLACE<<'; - } - - $parts = explode('|', $message); - - return $key === 'to' - ? self::cleanWordFromTranslationString(end($parts)) - : '(?:'.implode('|', array_map([static::class, 'cleanWordFromTranslationString'], $parts)).')'; - }, $keys); - } - - /** - * Get an array of translations based on the current date. - * - * @param callable $translation - * @param int $length - * @param string $timeString - * - * @return string[] - */ - private static function getTranslationArray($translation, $length, $timeString): array - { - $filler = '>>DO NOT REPLACE<<'; - - if (\is_array($translation)) { - return array_pad($translation, $length, $filler); - } - - $list = []; - $date = static::now(); - - for ($i = 0; $i < $length; $i++) { - $list[] = $translation($date, $timeString, $i) ?? $filler; - } - - return $list; - } - - private static function replaceOrdinalWords(string $timeString, array $ordinalWords): string - { - return preg_replace_callback('/(? - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\FactoryImmutable; - -/** - * Trait Macros. - * - * Allows users to register macros within the Carbon class. - */ -trait Macro -{ - use Mixin; - - /** - * Register a custom macro. - * - * Pass null macro to remove it. - * - * @example - * ``` - * $userSettings = [ - * 'locale' => 'pt', - * 'timezone' => 'America/Sao_Paulo', - * ]; - * Carbon::macro('userFormat', function () use ($userSettings) { - * return $this->copy()->locale($userSettings['locale'])->tz($userSettings['timezone'])->calendar(); - * }); - * echo Carbon::yesterday()->hours(11)->userFormat(); - * ``` - */ - public static function macro(string $name, ?callable $macro): void - { - FactoryImmutable::getDefaultInstance()->macro($name, $macro); - } - - /** - * Remove all macros and generic macros. - */ - public static function resetMacros(): void - { - FactoryImmutable::getDefaultInstance()->resetMacros(); - } - - /** - * Register a custom macro. - * - * @param callable $macro - * @param int $priority marco with higher priority is tried first - * - * @return void - */ - public static function genericMacro(callable $macro, int $priority = 0): void - { - FactoryImmutable::getDefaultInstance()->genericMacro($macro, $priority); - } - - /** - * Checks if macro is registered globally. - * - * @param string $name - * - * @return bool - */ - public static function hasMacro(string $name): bool - { - return FactoryImmutable::getInstance()->hasMacro($name); - } - - /** - * Get the raw callable macro registered globally for a given name. - */ - public static function getMacro(string $name): ?callable - { - return FactoryImmutable::getInstance()->getMacro($name); - } - - /** - * Checks if macro is registered globally or locally. - */ - public function hasLocalMacro(string $name): bool - { - return ($this->localMacros && isset($this->localMacros[$name])) || $this->transmitFactory( - static fn () => static::hasMacro($name), - ); - } - - /** - * Get the raw callable macro registered globally or locally for a given name. - */ - public function getLocalMacro(string $name): ?callable - { - return ($this->localMacros ?? [])[$name] ?? $this->transmitFactory( - static fn () => static::getMacro($name), - ); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php b/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php deleted file mode 100644 index d6595f1..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -/** - * Trait MagicParameter. - * - * Allows to retrieve parameter in magic calls by index or name. - */ -trait MagicParameter -{ - private function getMagicParameter(array $parameters, int $index, string $key, $default) - { - if (\array_key_exists($index, $parameters)) { - return $parameters[$index]; - } - - if (\array_key_exists($key, $parameters)) { - return $parameters[$key]; - } - - return $default; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php b/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php deleted file mode 100644 index 3aedfa2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php +++ /dev/null @@ -1,208 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\CarbonInterface; -use Carbon\CarbonInterval; -use Carbon\CarbonPeriod; -use Closure; -use Generator; -use ReflectionClass; -use ReflectionException; -use ReflectionMethod; -use Throwable; - -/** - * Trait Mixin. - * - * Allows mixing in entire classes with multiple macros. - */ -trait Mixin -{ - /** - * Stack of macro instance contexts. - */ - protected static array $macroContextStack = []; - - /** - * Mix another object into the class. - * - * @example - * ``` - * Carbon::mixin(new class { - * public function addMoon() { - * return function () { - * return $this->addDays(30); - * }; - * } - * public function subMoon() { - * return function () { - * return $this->subDays(30); - * }; - * } - * }); - * $fullMoon = Carbon::create('2018-12-22'); - * $nextFullMoon = $fullMoon->addMoon(); - * $blackMoon = Carbon::create('2019-01-06'); - * $previousBlackMoon = $blackMoon->subMoon(); - * echo "$nextFullMoon\n"; - * echo "$previousBlackMoon\n"; - * ``` - * - * @throws ReflectionException - */ - public static function mixin(object|string $mixin): void - { - \is_string($mixin) && trait_exists($mixin) - ? self::loadMixinTrait($mixin) - : self::loadMixinClass($mixin); - } - - /** - * @throws ReflectionException - */ - private static function loadMixinClass(object|string $mixin): void - { - $methods = (new ReflectionClass($mixin))->getMethods( - ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED, - ); - - foreach ($methods as $method) { - if ($method->isConstructor() || $method->isDestructor()) { - continue; - } - - $macro = $method->invoke($mixin); - - if (\is_callable($macro)) { - static::macro($method->name, $macro); - } - } - } - - private static function loadMixinTrait(string $trait): void - { - $context = eval(self::getAnonymousClassCodeForTrait($trait)); - $className = \get_class($context); - $baseClass = static::class; - - foreach (self::getMixableMethods($context) as $name) { - $closureBase = Closure::fromCallable([$context, $name]); - - static::macro($name, function (...$parameters) use ($closureBase, $className, $baseClass) { - $downContext = isset($this) ? ($this) : new $baseClass(); - $context = isset($this) ? $this->cast($className) : new $className(); - - try { - // @ is required to handle error if not converted into exceptions - $closure = @$closureBase->bindTo($context); - } catch (Throwable) { // @codeCoverageIgnore - $closure = $closureBase; // @codeCoverageIgnore - } - - // in case of errors not converted into exceptions - $closure = $closure ?: $closureBase; - - $result = $closure(...$parameters); - - if (!($result instanceof $className)) { - return $result; - } - - if ($downContext instanceof CarbonInterface && $result instanceof CarbonInterface) { - if ($context !== $result) { - $downContext = $downContext->copy(); - } - - return $downContext - ->setTimezone($result->getTimezone()) - ->modify($result->format('Y-m-d H:i:s.u')) - ->settings($result->getSettings()); - } - - if ($downContext instanceof CarbonInterval && $result instanceof CarbonInterval) { - if ($context !== $result) { - $downContext = $downContext->copy(); - } - - $downContext->copyProperties($result); - self::copyStep($downContext, $result); - self::copyNegativeUnits($downContext, $result); - - return $downContext->settings($result->getSettings()); - } - - if ($downContext instanceof CarbonPeriod && $result instanceof CarbonPeriod) { - if ($context !== $result) { - $downContext = $downContext->copy(); - } - - return $downContext - ->setDates($result->getStartDate(), $result->getEndDate()) - ->setRecurrences($result->getRecurrences()) - ->setOptions($result->getOptions()) - ->settings($result->getSettings()); - } - - return $result; - }); - } - } - - private static function getAnonymousClassCodeForTrait(string $trait): string - { - return 'return new class() extends '.static::class.' {use '.$trait.';};'; - } - - private static function getMixableMethods(self $context): Generator - { - foreach (get_class_methods($context) as $name) { - if (method_exists(static::class, $name)) { - continue; - } - - yield $name; - } - } - - /** - * Stack a Carbon context from inside calls of self::this() and execute a given action. - */ - protected static function bindMacroContext(?self $context, callable $callable): mixed - { - static::$macroContextStack[] = $context; - - try { - return $callable(); - } finally { - array_pop(static::$macroContextStack); - } - } - - /** - * Return the current context from inside a macro callee or a null if static. - */ - protected static function context(): ?static - { - return end(static::$macroContextStack) ?: null; - } - - /** - * Return the current context from inside a macro callee or a new one if static. - */ - protected static function this(): static - { - return end(static::$macroContextStack) ?: new static(); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php b/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php deleted file mode 100644 index 7fc0f9f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php +++ /dev/null @@ -1,476 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\CarbonInterface; -use Carbon\Exceptions\InvalidFormatException; -use ReturnTypeWillChange; - -/** - * Trait Modifiers. - * - * Returns dates relative to current date using modifier short-hand. - */ -trait Modifiers -{ - /** - * Midday/noon hour. - * - * @var int - */ - protected static $midDayAt = 12; - - /** - * get midday/noon hour - * - * @return int - */ - public static function getMidDayAt() - { - return static::$midDayAt; - } - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider mid-day is always 12pm, then if you need to test if it's an other - * hour, test it explicitly: - * $date->format('G') == 13 - * or to set explicitly to a given hour: - * $date->setTime(13, 0, 0, 0) - * - * Set midday/noon hour - * - * @param int $hour midday hour - * - * @return void - */ - public static function setMidDayAt($hour) - { - static::$midDayAt = $hour; - } - - /** - * Modify to midday, default to self::$midDayAt - * - * @return static - */ - public function midDay() - { - return $this->setTime(static::$midDayAt, 0, 0, 0); - } - - /** - * Modify to the next occurrence of a given modifier such as a day of - * the week. If no modifier is provided, modify to the next occurrence - * of the current day of the week. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param string|int|null $modifier - * - * @return static - */ - public function next($modifier = null) - { - if ($modifier === null) { - $modifier = $this->dayOfWeek; - } - - return $this->change( - 'next '.(\is_string($modifier) ? $modifier : static::$days[$modifier]), - ); - } - - /** - * Go forward or backward to the next week- or weekend-day. - * - * @param bool $weekday - * @param bool $forward - * - * @return static - */ - private function nextOrPreviousDay($weekday = true, $forward = true) - { - /** @var CarbonInterface $date */ - $date = $this; - $step = $forward ? 1 : -1; - - do { - $date = $date->addDays($step); - } while ($weekday ? $date->isWeekend() : $date->isWeekday()); - - return $date; - } - - /** - * Go forward to the next weekday. - * - * @return static - */ - public function nextWeekday() - { - return $this->nextOrPreviousDay(); - } - - /** - * Go backward to the previous weekday. - * - * @return static - */ - public function previousWeekday() - { - return $this->nextOrPreviousDay(true, false); - } - - /** - * Go forward to the next weekend day. - * - * @return static - */ - public function nextWeekendDay() - { - return $this->nextOrPreviousDay(false); - } - - /** - * Go backward to the previous weekend day. - * - * @return static - */ - public function previousWeekendDay() - { - return $this->nextOrPreviousDay(false, false); - } - - /** - * Modify to the previous occurrence of a given modifier such as a day of - * the week. If no dayOfWeek is provided, modify to the previous occurrence - * of the current day of the week. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param string|int|null $modifier - * - * @return static - */ - public function previous($modifier = null) - { - if ($modifier === null) { - $modifier = $this->dayOfWeek; - } - - return $this->change( - 'last '.(\is_string($modifier) ? $modifier : static::$days[$modifier]), - ); - } - - /** - * Modify to the first occurrence of a given day of the week - * in the current month. If no dayOfWeek is provided, modify to the - * first day of the current month. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek - * - * @return static - */ - public function firstOfMonth($dayOfWeek = null) - { - $date = $this->startOfDay(); - - if ($dayOfWeek === null) { - return $date->day(1); - } - - return $date->modify('first '.static::$days[$dayOfWeek].' of '.$date->rawFormat('F').' '.$date->year); - } - - /** - * Modify to the last occurrence of a given day of the week - * in the current month. If no dayOfWeek is provided, modify to the - * last day of the current month. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek - * - * @return static - */ - public function lastOfMonth($dayOfWeek = null) - { - $date = $this->startOfDay(); - - if ($dayOfWeek === null) { - return $date->day($date->daysInMonth); - } - - return $date->modify('last '.static::$days[$dayOfWeek].' of '.$date->rawFormat('F').' '.$date->year); - } - - /** - * Modify to the given occurrence of a given day of the week - * in the current month. If the calculated occurrence is outside the scope - * of the current month, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfMonth($nth, $dayOfWeek) - { - $date = $this->avoidMutation()->firstOfMonth(); - $check = $date->rawFormat('Y-m'); - $date = $date->modify('+'.$nth.' '.static::$days[$dayOfWeek]); - - return $date->rawFormat('Y-m') === $check ? $this->modify((string) $date) : false; - } - - /** - * Modify to the first occurrence of a given day of the week - * in the current quarter. If no dayOfWeek is provided, modify to the - * first day of the current quarter. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function firstOfQuarter($dayOfWeek = null) - { - return $this->setDate($this->year, $this->quarter * static::MONTHS_PER_QUARTER - 2, 1)->firstOfMonth($dayOfWeek); - } - - /** - * Modify to the last occurrence of a given day of the week - * in the current quarter. If no dayOfWeek is provided, modify to the - * last day of the current quarter. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function lastOfQuarter($dayOfWeek = null) - { - return $this->setDate($this->year, $this->quarter * static::MONTHS_PER_QUARTER, 1)->lastOfMonth($dayOfWeek); - } - - /** - * Modify to the given occurrence of a given day of the week - * in the current quarter. If the calculated occurrence is outside the scope - * of the current quarter, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfQuarter($nth, $dayOfWeek) - { - $date = $this->avoidMutation()->day(1)->month($this->quarter * static::MONTHS_PER_QUARTER); - $lastMonth = $date->month; - $year = $date->year; - $date = $date->firstOfQuarter()->modify('+'.$nth.' '.static::$days[$dayOfWeek]); - - return ($lastMonth < $date->month || $year !== $date->year) ? false : $this->modify((string) $date); - } - - /** - * Modify to the first occurrence of a given day of the week - * in the current year. If no dayOfWeek is provided, modify to the - * first day of the current year. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function firstOfYear($dayOfWeek = null) - { - return $this->month(1)->firstOfMonth($dayOfWeek); - } - - /** - * Modify to the last occurrence of a given day of the week - * in the current year. If no dayOfWeek is provided, modify to the - * last day of the current year. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function lastOfYear($dayOfWeek = null) - { - return $this->month(static::MONTHS_PER_YEAR)->lastOfMonth($dayOfWeek); - } - - /** - * Modify to the given occurrence of a given day of the week - * in the current year. If the calculated occurrence is outside the scope - * of the current year, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfYear($nth, $dayOfWeek) - { - $date = $this->avoidMutation()->firstOfYear()->modify('+'.$nth.' '.static::$days[$dayOfWeek]); - - return $this->year === $date->year ? $this->modify((string) $date) : false; - } - - /** - * Modify the current instance to the average of a given instance (default now) and the current instance - * (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|null $date - * - * @return static - */ - public function average($date = null) - { - return $this->addRealMicroseconds((int) ($this->diffInMicroseconds($this->resolveCarbon($date), false) / 2)); - } - - /** - * Get the closest date from the instance (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return static - */ - public function closest($date1, $date2) - { - return $this->diffInMicroseconds($date1, true) < $this->diffInMicroseconds($date2, true) ? $date1 : $date2; - } - - /** - * Get the farthest date from the instance (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return static - */ - public function farthest($date1, $date2) - { - return $this->diffInMicroseconds($date1, true) > $this->diffInMicroseconds($date2, true) ? $date1 : $date2; - } - - /** - * Get the minimum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return static - */ - public function min($date = null) - { - $date = $this->resolveCarbon($date); - - return $this->lt($date) ? $this : $date; - } - - /** - * Get the minimum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see min() - * - * @return static - */ - public function minimum($date = null) - { - return $this->min($date); - } - - /** - * Get the maximum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return static - */ - public function max($date = null) - { - $date = $this->resolveCarbon($date); - - return $this->gt($date) ? $this : $date; - } - - /** - * Get the maximum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see max() - * - * @return static - */ - public function maximum($date = null) - { - return $this->max($date); - } - - /** - * Calls \DateTime::modify if mutable or \DateTimeImmutable::modify else. - * - * @see https://php.net/manual/en/datetime.modify.php - * - * @return static - */ - #[ReturnTypeWillChange] - public function modify($modify) - { - return parent::modify((string) $modify) - ?: throw new InvalidFormatException('Could not modify with: '.var_export($modify, true)); - } - - /** - * Similar to native modify() method of DateTime but can handle more grammars. - * - * @example - * ``` - * echo Carbon::now()->change('next 2pm'); - * ``` - * - * @link https://php.net/manual/en/datetime.modify.php - * - * @param string $modifier - * - * @return static - */ - public function change($modifier) - { - return $this->modify(preg_replace_callback('/^(next|previous|last)\s+(\d{1,2}(h|am|pm|:\d{1,2}(:\d{1,2})?))$/i', function ($match) { - $match[2] = str_replace('h', ':00', $match[2]); - $test = $this->avoidMutation()->modify($match[2]); - $method = $match[1] === 'next' ? 'lt' : 'gt'; - $match[1] = $test->$method($this) ? $match[1].' day' : 'today'; - - return $match[1].' '.$match[2]; - }, strtr(trim($modifier), [ - ' at ' => ' ', - 'just now' => 'now', - 'after tomorrow' => 'tomorrow +1 day', - 'before yesterday' => 'yesterday -1 day', - ]))); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php b/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php deleted file mode 100644 index 9f45f58..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\Carbon; -use Carbon\CarbonImmutable; - -/** - * Trait Mutability. - * - * Utils to know if the current object is mutable or immutable and convert it. - */ -trait Mutability -{ - use Cast; - - /** - * Returns true if the current class/instance is mutable. - */ - public static function isMutable(): bool - { - return false; - } - - /** - * Returns true if the current class/instance is immutable. - */ - public static function isImmutable(): bool - { - return !static::isMutable(); - } - - /** - * Return a mutable copy of the instance. - * - * @return Carbon - */ - public function toMutable() - { - /** @var Carbon $date */ - $date = $this->cast(Carbon::class); - - return $date; - } - - /** - * Return a immutable copy of the instance. - * - * @return CarbonImmutable - */ - public function toImmutable() - { - /** @var CarbonImmutable $date */ - $date = $this->cast(CarbonImmutable::class); - - return $date; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php b/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php deleted file mode 100644 index 463a74d..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -trait ObjectInitialisation -{ - /** - * True when parent::__construct has been called. - * - * @var string - */ - protected $constructedObjectId; -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Options.php b/vendor/nesbot/carbon/src/Carbon/Traits/Options.php deleted file mode 100644 index c1022df..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Options.php +++ /dev/null @@ -1,213 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\CarbonInterface; -use DateTimeInterface; -use Throwable; - -/** - * Trait Options. - * - * Embed base methods to change settings of Carbon classes. - * - * Depends on the following methods: - * - * @method static shiftTimezone($timezone) Set the timezone - */ -trait Options -{ - use StaticOptions; - use Localization; - - /** - * Indicates if months should be calculated with overflow. - * Specific setting. - */ - protected ?bool $localMonthsOverflow = null; - - /** - * Indicates if years should be calculated with overflow. - * Specific setting. - */ - protected ?bool $localYearsOverflow = null; - - /** - * Indicates if the strict mode is in use. - * Specific setting. - */ - protected ?bool $localStrictModeEnabled = null; - - /** - * Options for diffForHumans and forHumans methods. - */ - protected ?int $localHumanDiffOptions = null; - - /** - * Format to use on string cast. - * - * @var string|callable|null - */ - protected $localToStringFormat = null; - - /** - * Format to use on JSON serialization. - * - * @var string|callable|null - */ - protected $localSerializer = null; - - /** - * Instance-specific macros. - */ - protected ?array $localMacros = null; - - /** - * Instance-specific generic macros. - */ - protected ?array $localGenericMacros = null; - - /** - * Function to call instead of format. - * - * @var string|callable|null - */ - protected $localFormatFunction = null; - - /** - * Set specific options. - * - strictMode: true|false|null - * - monthOverflow: true|false|null - * - yearOverflow: true|false|null - * - humanDiffOptions: int|null - * - toStringFormat: string|Closure|null - * - toJsonFormat: string|Closure|null - * - locale: string|null - * - timezone: \DateTimeZone|string|int|null - * - macros: array|null - * - genericMacros: array|null - * - * @param array $settings - * - * @return $this|static - */ - public function settings(array $settings): static - { - $this->localStrictModeEnabled = $settings['strictMode'] ?? null; - $this->localMonthsOverflow = $settings['monthOverflow'] ?? null; - $this->localYearsOverflow = $settings['yearOverflow'] ?? null; - $this->localHumanDiffOptions = $settings['humanDiffOptions'] ?? null; - $this->localToStringFormat = $settings['toStringFormat'] ?? null; - $this->localSerializer = $settings['toJsonFormat'] ?? null; - $this->localMacros = $settings['macros'] ?? null; - $this->localGenericMacros = $settings['genericMacros'] ?? null; - $this->localFormatFunction = $settings['formatFunction'] ?? null; - - if (isset($settings['locale'])) { - $locales = $settings['locale']; - - if (!\is_array($locales)) { - $locales = [$locales]; - } - - $this->locale(...$locales); - } elseif (isset($settings['translator']) && property_exists($this, 'localTranslator')) { - $this->localTranslator = $settings['translator']; - } - - if (isset($settings['innerTimezone'])) { - return $this->setTimezone($settings['innerTimezone']); - } - - if (isset($settings['timezone'])) { - return $this->shiftTimezone($settings['timezone']); - } - - return $this; - } - - /** - * Returns current local settings. - */ - public function getSettings(): array - { - $settings = []; - $map = [ - 'localStrictModeEnabled' => 'strictMode', - 'localMonthsOverflow' => 'monthOverflow', - 'localYearsOverflow' => 'yearOverflow', - 'localHumanDiffOptions' => 'humanDiffOptions', - 'localToStringFormat' => 'toStringFormat', - 'localSerializer' => 'toJsonFormat', - 'localMacros' => 'macros', - 'localGenericMacros' => 'genericMacros', - 'locale' => 'locale', - 'tzName' => 'timezone', - 'localFormatFunction' => 'formatFunction', - ]; - - foreach ($map as $property => $key) { - $value = $this->$property ?? null; - - if ($value !== null && ($key !== 'locale' || $value !== 'en' || $this->localTranslator)) { - $settings[$key] = $value; - } - } - - return $settings; - } - - /** - * Show truthy properties on var_dump(). - */ - public function __debugInfo(): array - { - $infos = array_filter(get_object_vars($this), static function ($var) { - return $var; - }); - - foreach (['dumpProperties', 'constructedObjectId', 'constructed', 'originalInput'] as $property) { - if (isset($infos[$property])) { - unset($infos[$property]); - } - } - - $this->addExtraDebugInfos($infos); - - if (\array_key_exists('carbonRecurrences', $infos)) { - $infos['recurrences'] = $infos['carbonRecurrences']; - unset($infos['carbonRecurrences']); - } - - return $infos; - } - - protected function isLocalStrictModeEnabled(): bool - { - return $this->localStrictModeEnabled - ?? $this->transmitFactory(static fn () => static::isStrictModeEnabled()); - } - - protected function addExtraDebugInfos(array &$infos): void - { - if ($this instanceof DateTimeInterface) { - try { - $infos['date'] ??= $this->format(CarbonInterface::MOCK_DATETIME_FORMAT); - $infos['timezone'] ??= $this->tzName ?? $this->timezoneSetting ?? $this->timezone ?? null; - } catch (Throwable) { - // noop - } - } - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php b/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php deleted file mode 100644 index 4239c66..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php +++ /dev/null @@ -1,226 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\CarbonInterface; -use Carbon\Exceptions\UnknownUnitException; -use Carbon\WeekDay; -use DateInterval; - -/** - * Trait Rounding. - * - * Round, ceil, floor units. - * - * Depends on the following methods: - * - * @method static copy() - * @method static startOfWeek(int $weekStartsAt = null) - */ -trait Rounding -{ - use IntervalRounding; - - /** - * Round the current instance at the given unit with given precision if specified and the given function. - */ - public function roundUnit( - string $unit, - DateInterval|string|float|int $precision = 1, - callable|string $function = 'round', - ): static { - $metaUnits = [ - // @call roundUnit - 'millennium' => [static::YEARS_PER_MILLENNIUM, 'year'], - // @call roundUnit - 'century' => [static::YEARS_PER_CENTURY, 'year'], - // @call roundUnit - 'decade' => [static::YEARS_PER_DECADE, 'year'], - // @call roundUnit - 'quarter' => [static::MONTHS_PER_QUARTER, 'month'], - // @call roundUnit - 'millisecond' => [1000, 'microsecond'], - ]; - $normalizedUnit = static::singularUnit($unit); - $ranges = array_merge(static::getRangesByUnit($this->daysInMonth), [ - // @call roundUnit - 'microsecond' => [0, 999999], - ]); - $factor = 1; - - if ($normalizedUnit === 'week') { - $normalizedUnit = 'day'; - $precision *= static::DAYS_PER_WEEK; - } - - if (isset($metaUnits[$normalizedUnit])) { - [$factor, $normalizedUnit] = $metaUnits[$normalizedUnit]; - } - - $precision *= $factor; - - if (!isset($ranges[$normalizedUnit])) { - throw new UnknownUnitException($unit); - } - - $found = false; - $fraction = 0; - $arguments = null; - $initialValue = null; - $factor = $this->year < 0 ? -1 : 1; - $changes = []; - $minimumInc = null; - - foreach ($ranges as $unit => [$minimum, $maximum]) { - if ($normalizedUnit === $unit) { - $arguments = [$this->$unit, $minimum]; - $initialValue = $this->$unit; - $fraction = $precision - floor($precision); - $found = true; - - continue; - } - - if ($found) { - $delta = $maximum + 1 - $minimum; - $factor /= $delta; - $fraction *= $delta; - $inc = ($this->$unit - $minimum) * $factor; - - if ($inc !== 0.0) { - $minimumInc = $minimumInc ?? ($arguments[0] / pow(2, 52)); - - // If value is still the same when adding a non-zero increment/decrement, - // it means precision got lost in the addition - if (abs($inc) < $minimumInc) { - $inc = $minimumInc * ($inc < 0 ? -1 : 1); - } - - // If greater than $precision, assume precision loss caused an overflow - if ($function !== 'floor' || abs($arguments[0] + $inc - $initialValue) >= $precision) { - $arguments[0] += $inc; - } - } - - $changes[$unit] = round( - $minimum + ($fraction ? $fraction * $function(($this->$unit - $minimum) / $fraction) : 0), - ); - - // Cannot use modulo as it lose double precision - while ($changes[$unit] >= $delta) { - $changes[$unit] -= $delta; - } - - $fraction -= floor($fraction); - } - } - - [$value, $minimum] = $arguments; - $normalizedValue = floor($function(($value - $minimum) / $precision) * $precision + $minimum); - - /** @var CarbonInterface $result */ - $result = $this; - - foreach ($changes as $unit => $value) { - $result = $result->$unit($value); - } - - return $result->$normalizedUnit($normalizedValue); - } - - /** - * Truncate the current instance at the given unit with given precision if specified. - */ - public function floorUnit(string $unit, DateInterval|string|float|int $precision = 1): static - { - return $this->roundUnit($unit, $precision, 'floor'); - } - - /** - * Ceil the current instance at the given unit with given precision if specified. - */ - public function ceilUnit(string $unit, DateInterval|string|float|int $precision = 1): static - { - return $this->roundUnit($unit, $precision, 'ceil'); - } - - /** - * Round the current instance second with given precision if specified. - */ - public function round(DateInterval|string|float|int $precision = 1, callable|string $function = 'round'): static - { - return $this->roundWith($precision, $function); - } - - /** - * Round the current instance second with given precision if specified. - */ - public function floor(DateInterval|string|float|int $precision = 1): static - { - return $this->round($precision, 'floor'); - } - - /** - * Ceil the current instance second with given precision if specified. - */ - public function ceil(DateInterval|string|float|int $precision = 1): static - { - return $this->round($precision, 'ceil'); - } - - /** - * Round the current instance week. - * - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week - */ - public function roundWeek(WeekDay|int|null $weekStartsAt = null): static - { - return $this->closest( - $this->avoidMutation()->floorWeek($weekStartsAt), - $this->avoidMutation()->ceilWeek($weekStartsAt), - ); - } - - /** - * Truncate the current instance week. - * - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week - */ - public function floorWeek(WeekDay|int|null $weekStartsAt = null): static - { - return $this->startOfWeek($weekStartsAt); - } - - /** - * Ceil the current instance week. - * - * @param WeekDay|int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week - */ - public function ceilWeek(WeekDay|int|null $weekStartsAt = null): static - { - if ($this->isMutable()) { - $startOfWeek = $this->avoidMutation()->startOfWeek($weekStartsAt); - - return $startOfWeek != $this ? - $this->startOfWeek($weekStartsAt)->addWeek() : - $this; - } - - $startOfWeek = $this->startOfWeek($weekStartsAt); - - return $startOfWeek != $this ? - $startOfWeek->addWeek() : - $this->avoidMutation(); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php b/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php deleted file mode 100644 index d3cb6a4..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php +++ /dev/null @@ -1,318 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\Exceptions\InvalidFormatException; -use Carbon\FactoryImmutable; -use DateTimeZone; -use ReturnTypeWillChange; -use Throwable; - -/** - * Trait Serialization. - * - * Serialization and JSON stuff. - * - * Depends on the following properties: - * - * @property int $year - * @property int $month - * @property int $daysInMonth - * @property int $quarter - * - * Depends on the following methods: - * - * @method string|static locale(string $locale = null, string ...$fallbackLocales) - * @method string toJSON() - */ -trait Serialization -{ - use ObjectInitialisation; - - /** - * List of key to use for dump/serialization. - * - * @var string[] - */ - protected array $dumpProperties = ['date', 'timezone_type', 'timezone']; - - /** - * Locale to dump comes here before serialization. - * - * @var string|null - */ - protected $dumpLocale; - - /** - * Embed date properties to dump in a dedicated variables so it won't overlap native - * DateTime ones. - * - * @var array|null - */ - protected $dumpDateProperties; - - /** - * Return a serialized string of the instance. - */ - public function serialize(): string - { - return serialize($this); - } - - /** - * Create an instance from a serialized string. - * - * @param string $value - * - * @throws InvalidFormatException - * - * @return static - */ - public static function fromSerialized($value): static - { - $instance = @unserialize((string) $value); - - if (!$instance instanceof static) { - throw new InvalidFormatException("Invalid serialized value: $value"); - } - - return $instance; - } - - /** - * The __set_state handler. - * - * @param string|array $dump - * - * @return static - */ - #[ReturnTypeWillChange] - public static function __set_state($dump): static - { - if (\is_string($dump)) { - return static::parse($dump); - } - - /** @var \DateTimeInterface $date */ - $date = get_parent_class(static::class) && method_exists(parent::class, '__set_state') - ? parent::__set_state((array) $dump) - : (object) $dump; - - return static::instance($date); - } - - /** - * Returns the list of properties to dump on serialize() called on. - * - * Only used by PHP < 7.4. - * - * @return array - */ - public function __sleep() - { - $properties = $this->getSleepProperties(); - - if ($this->localTranslator ?? null) { - $properties[] = 'dumpLocale'; - $this->dumpLocale = $this->locale ?? null; - } - - return $properties; - } - - /** - * Returns the values to dump on serialize() called on. - * - * Only used by PHP >= 7.4. - * - * @return array - */ - public function __serialize(): array - { - // @codeCoverageIgnoreStart - if (isset($this->timezone_type, $this->timezone, $this->date)) { - return [ - 'date' => $this->date, - 'timezone_type' => $this->timezone_type, - 'timezone' => $this->dumpTimezone($this->timezone), - ]; - } - // @codeCoverageIgnoreEnd - - $timezone = $this->getTimezone(); - $export = [ - 'date' => $this->format('Y-m-d H:i:s.u'), - 'timezone_type' => $timezone->getType(), - 'timezone' => $timezone->getName(), - ]; - - // @codeCoverageIgnoreStart - if (\extension_loaded('msgpack') && isset($this->constructedObjectId)) { - $timezone = $this->timezone ?? null; - $export['dumpDateProperties'] = [ - 'date' => $this->format('Y-m-d H:i:s.u'), - 'timezone' => $this->dumpTimezone($timezone), - ]; - } - // @codeCoverageIgnoreEnd - - if ($this->localTranslator ?? null) { - $export['dumpLocale'] = $this->locale ?? null; - } - - return $export; - } - - /** - * Set locale if specified on unserialize() called. - * - * Only used by PHP < 7.4. - */ - public function __wakeup(): void - { - if (parent::class && method_exists(parent::class, '__wakeup')) { - // @codeCoverageIgnoreStart - try { - parent::__wakeup(); - } catch (Throwable $exception) { - try { - // FatalError occurs when calling msgpack_unpack() in PHP 7.4 or later. - ['date' => $date, 'timezone' => $timezone] = $this->dumpDateProperties; - parent::__construct($date, $timezone); - } catch (Throwable) { - throw $exception; - } - } - // @codeCoverageIgnoreEnd - } - - $this->constructedObjectId = spl_object_hash($this); - - if (isset($this->dumpLocale)) { - $this->locale($this->dumpLocale); - $this->dumpLocale = null; - } - - $this->cleanupDumpProperties(); - } - - /** - * Set locale if specified on unserialize() called. - * - * Only used by PHP >= 7.4. - */ - public function __unserialize(array $data): void - { - // @codeCoverageIgnoreStart - try { - $this->__construct($data['date'] ?? null, $data['timezone'] ?? null); - } catch (Throwable $exception) { - if (!isset($data['dumpDateProperties']['date'], $data['dumpDateProperties']['timezone'])) { - throw $exception; - } - - try { - // FatalError occurs when calling msgpack_unpack() in PHP 7.4 or later. - ['date' => $date, 'timezone' => $timezone] = $data['dumpDateProperties']; - $this->__construct($date, $timezone); - } catch (Throwable) { - throw $exception; - } - } - // @codeCoverageIgnoreEnd - - if (isset($data['dumpLocale'])) { - $this->locale($data['dumpLocale']); - } - } - - /** - * Prepare the object for JSON serialization. - */ - public function jsonSerialize(): mixed - { - $serializer = $this->localSerializer - ?? $this->getFactory()->getSettings()['toJsonFormat'] - ?? null; - - if ($serializer) { - return \is_string($serializer) - ? $this->rawFormat($serializer) - : $serializer($this); - } - - return $this->toJSON(); - } - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather transform Carbon object before the serialization. - * - * JSON serialize all Carbon instances using the given callback. - */ - public static function serializeUsing(string|callable|null $format): void - { - FactoryImmutable::getDefaultInstance()->serializeUsing($format); - } - - /** - * Cleanup properties attached to the public scope of DateTime when a dump of the date is requested. - * foreach ($date as $_) {} - * serializer($date) - * var_export($date) - * get_object_vars($date) - */ - public function cleanupDumpProperties(): self - { - // @codeCoverageIgnoreStart - if (PHP_VERSION < 8.2) { - foreach ($this->dumpProperties as $property) { - if (isset($this->$property)) { - unset($this->$property); - } - } - } - // @codeCoverageIgnoreEnd - - return $this; - } - - private function getSleepProperties(): array - { - $properties = $this->dumpProperties; - - // @codeCoverageIgnoreStart - if (!\extension_loaded('msgpack')) { - return $properties; - } - - if (isset($this->constructedObjectId)) { - $timezone = $this->timezone ?? null; - $this->dumpDateProperties = [ - 'date' => $this->format('Y-m-d H:i:s.u'), - 'timezone' => $this->dumpTimezone($timezone), - ]; - - $properties[] = 'dumpDateProperties'; - } - - return $properties; - // @codeCoverageIgnoreEnd - } - - private function dumpTimezone(mixed $timezone): mixed - { - return $timezone instanceof DateTimeZone ? $timezone->getName() : $timezone; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php b/vendor/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php deleted file mode 100644 index cb1e9e6..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\FactoryImmutable; -use Symfony\Contracts\Translation\TranslatorInterface; - -/** - * Static config for localization. - */ -trait StaticLocalization -{ - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - */ - public static function setHumanDiffOptions(int $humanDiffOptions): void - { - FactoryImmutable::getDefaultInstance()->setHumanDiffOptions($humanDiffOptions); - } - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - */ - public static function enableHumanDiffOption(int $humanDiffOption): void - { - FactoryImmutable::getDefaultInstance()->enableHumanDiffOption($humanDiffOption); - } - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - */ - public static function disableHumanDiffOption(int $humanDiffOption): void - { - FactoryImmutable::getDefaultInstance()->disableHumanDiffOption($humanDiffOption); - } - - /** - * Return default humanDiff() options (merged flags as integer). - */ - public static function getHumanDiffOptions(): int - { - return FactoryImmutable::getInstance()->getHumanDiffOptions(); - } - - /** - * Set the default translator instance to use. - * - * @param TranslatorInterface $translator - * - * @return void - */ - public static function setTranslator(TranslatorInterface $translator): void - { - FactoryImmutable::getDefaultInstance()->setTranslator($translator); - } - - /** - * Initialize the default translator instance if necessary. - */ - public static function getTranslator(): TranslatorInterface - { - return FactoryImmutable::getInstance()->getTranslator(); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/StaticOptions.php b/vendor/nesbot/carbon/src/Carbon/Traits/StaticOptions.php deleted file mode 100644 index 44dd284..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/StaticOptions.php +++ /dev/null @@ -1,164 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\FactoryImmutable; - -/** - * Options related to a static variable. - */ -trait StaticOptions -{ - /////////////////////////////////////////////////////////////////// - ///////////// Behavior customization for sub-classes ////////////// - /////////////////////////////////////////////////////////////////// - - /** - * Function to call instead of format. - * - * @var string|callable|null - */ - protected static $formatFunction; - - /** - * Function to call instead of createFromFormat. - * - * @var string|callable|null - */ - protected static $createFromFormatFunction; - - /** - * Function to call instead of parse. - * - * @var string|callable|null - */ - protected static $parseFunction; - - /////////////////////////////////////////////////////////////////// - ///////////// Use default factory for static options ////////////// - /////////////////////////////////////////////////////////////////// - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - * - * Enable the strict mode (or disable with passing false). - * - * @param bool $strictModeEnabled - */ - public static function useStrictMode(bool $strictModeEnabled = true): void - { - FactoryImmutable::getDefaultInstance()->useStrictMode($strictModeEnabled); - } - - /** - * Returns true if the strict mode is globally in use, false else. - * (It can be overridden in specific instances.) - * - * @return bool - */ - public static function isStrictModeEnabled(): bool - { - return FactoryImmutable::getInstance()->isStrictModeEnabled(); - } - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Indicates if months should be calculated with overflow. - * - * @param bool $monthsOverflow - * - * @return void - */ - public static function useMonthsOverflow(bool $monthsOverflow = true): void - { - FactoryImmutable::getDefaultInstance()->useMonthsOverflow($monthsOverflow); - } - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Reset the month overflow behavior. - * - * @return void - */ - public static function resetMonthsOverflow(): void - { - FactoryImmutable::getDefaultInstance()->resetMonthsOverflow(); - } - - /** - * Get the month overflow global behavior (can be overridden in specific instances). - * - * @return bool - */ - public static function shouldOverflowMonths(): bool - { - return FactoryImmutable::getInstance()->shouldOverflowMonths(); - } - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Indicates if years should be calculated with overflow. - * - * @param bool $yearsOverflow - * - * @return void - */ - public static function useYearsOverflow(bool $yearsOverflow = true): void - { - FactoryImmutable::getDefaultInstance()->useYearsOverflow($yearsOverflow); - } - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Reset the month overflow behavior. - * - * @return void - */ - public static function resetYearsOverflow(): void - { - FactoryImmutable::getDefaultInstance()->resetYearsOverflow(); - } - - /** - * Get the month overflow global behavior (can be overridden in specific instances). - * - * @return bool - */ - public static function shouldOverflowYears(): bool - { - return FactoryImmutable::getInstance()->shouldOverflowYears(); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Test.php b/vendor/nesbot/carbon/src/Carbon/Traits/Test.php deleted file mode 100644 index c642dbd..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Test.php +++ /dev/null @@ -1,185 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\CarbonInterface; -use Carbon\CarbonTimeZone; -use Carbon\Factory; -use Carbon\FactoryImmutable; -use Closure; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; - -trait Test -{ - /////////////////////////////////////////////////////////////////// - ///////////////////////// TESTING AIDS //////////////////////////// - /////////////////////////////////////////////////////////////////// - - /** - * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * - * Note the timezone parameter was left out of the examples above and - * has no affect as the mock value will be returned regardless of its value. - * - * Only the moment is mocked with setTestNow(), the timezone will still be the one passed - * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). - * - * To clear the test instance call this method using the default - * parameter of null. - * - * /!\ Use this method for unit tests only. - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - */ - public static function setTestNow(mixed $testNow = null): void - { - FactoryImmutable::getDefaultInstance()->setTestNow($testNow); - } - - /** - * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * - * It will also align default timezone (e.g. call date_default_timezone_set()) with - * the second argument or if null, with the timezone of the given date object. - * - * To clear the test instance call this method using the default - * parameter of null. - * - * /!\ Use this method for unit tests only. - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - */ - public static function setTestNowAndTimezone($testNow = null, $timezone = null): void - { - FactoryImmutable::getDefaultInstance()->setTestNowAndTimezone($testNow, $timezone); - } - - /** - * Temporarily sets a static date to be used within the callback. - * Using setTestNow to set the date, executing the callback, then - * clearing the test instance. - * - * /!\ Use this method for unit tests only. - * - * @template T - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - * @param Closure(): T $callback - * - * @return T - */ - public static function withTestNow(mixed $testNow, callable $callback): mixed - { - return FactoryImmutable::getDefaultInstance()->withTestNow($testNow, $callback); - } - - /** - * Get the Carbon instance (real or mock) to be returned when a "now" - * instance is created. - * - * @return Closure|CarbonInterface|null the current instance used for testing - */ - public static function getTestNow(): Closure|CarbonInterface|null - { - return FactoryImmutable::getInstance()->getTestNow(); - } - - /** - * Determine if there is a valid test instance set. A valid test instance - * is anything that is not null. - * - * @return bool true if there is a test instance, otherwise false - */ - public static function hasTestNow(): bool - { - return FactoryImmutable::getInstance()->hasTestNow(); - } - - /** - * Get the mocked date passed in setTestNow() and if it's a Closure, execute it. - */ - protected static function getMockedTestNow(DateTimeZone|string|int|null $timezone): ?CarbonInterface - { - $testNow = FactoryImmutable::getInstance()->handleTestNowClosure(static::getTestNow(), $timezone); - - if ($testNow === null) { - return null; - } - - $testNow = $testNow->avoidMutation(); - - return $timezone ? $testNow->setTimezone($timezone) : $testNow; - } - - private function mockConstructorParameters(&$time, ?CarbonTimeZone $timezone): void - { - $clock = $this->clock?->unwrap(); - $now = $clock instanceof Factory - ? $clock->getTestNow() - : $this->nowFromClock($timezone); - $testInstance = $now ?? self::getMockedTestNowClone($timezone); - - if (!$testInstance) { - return; - } - - if ($testInstance instanceof DateTimeInterface) { - $testInstance = $testInstance->setTimezone($timezone ?? date_default_timezone_get()); - } - - if (static::hasRelativeKeywords($time)) { - $testInstance = $testInstance->modify($time); - } - - $factory = $this->getClock()?->unwrap(); - - if (!($factory instanceof Factory)) { - $factory = FactoryImmutable::getInstance(); - } - - $testInstance = $factory->handleTestNowClosure($testInstance, $timezone); - - $time = $testInstance instanceof self - ? $testInstance->rawFormat(static::MOCK_DATETIME_FORMAT) - : $testInstance->format(static::MOCK_DATETIME_FORMAT); - } - - private function getMockedTestNowClone($timezone): CarbonInterface|self|null - { - $mock = static::getMockedTestNow($timezone); - - return $mock ? clone $mock : null; - } - - private function nowFromClock(?CarbonTimeZone $timezone): ?DateTimeImmutable - { - $now = $this->clock?->now(); - - return $now && $timezone ? $now->setTimezone($timezone) : null; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php b/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php deleted file mode 100644 index 3536b70..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php +++ /dev/null @@ -1,191 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use DateTimeZone; - -/** - * Trait Timestamp. - */ -trait Timestamp -{ - /** - * Create a Carbon instance from a timestamp and set the timezone (UTC by default). - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - */ - public static function createFromTimestamp( - float|int|string $timestamp, - DateTimeZone|string|int|null $timezone = null, - ): static { - $date = static::createFromTimestampUTC($timestamp); - - return $timezone === null ? $date : $date->setTimezone($timezone); - } - - /** - * Create a Carbon instance from a timestamp keeping the timezone to UTC. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - */ - public static function createFromTimestampUTC(float|int|string $timestamp): static - { - [$integer, $decimal] = self::getIntegerAndDecimalParts($timestamp); - $delta = floor($decimal / static::MICROSECONDS_PER_SECOND); - $integer += $delta; - $decimal -= $delta * static::MICROSECONDS_PER_SECOND; - $decimal = str_pad((string) $decimal, 6, '0', STR_PAD_LEFT); - - return static::rawCreateFromFormat('U u', "$integer $decimal"); - } - - /** - * Create a Carbon instance from a timestamp in milliseconds. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $timestamp - * - * @return static - */ - public static function createFromTimestampMsUTC($timestamp): static - { - [$milliseconds, $microseconds] = self::getIntegerAndDecimalParts($timestamp, 3); - $sign = $milliseconds < 0 || ($milliseconds === 0.0 && $microseconds < 0) ? -1 : 1; - $milliseconds = abs($milliseconds); - $microseconds = $sign * abs($microseconds) + static::MICROSECONDS_PER_MILLISECOND * ($milliseconds % static::MILLISECONDS_PER_SECOND); - $seconds = $sign * floor($milliseconds / static::MILLISECONDS_PER_SECOND); - $delta = floor($microseconds / static::MICROSECONDS_PER_SECOND); - $seconds = (int) ($seconds + $delta); - $microseconds -= $delta * static::MICROSECONDS_PER_SECOND; - $microseconds = str_pad((string) (int) $microseconds, 6, '0', STR_PAD_LEFT); - - return static::rawCreateFromFormat('U u', "$seconds $microseconds"); - } - - /** - * Create a Carbon instance from a timestamp in milliseconds. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - */ - public static function createFromTimestampMs( - float|int|string $timestamp, - DateTimeZone|string|int|null $timezone = null, - ): static { - $date = static::createFromTimestampMsUTC($timestamp); - - return $timezone === null ? $date : $date->setTimezone($timezone); - } - - /** - * Set the instance's timestamp. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - */ - public function timestamp(float|int|string $timestamp): static - { - return $this->setTimestamp($timestamp); - } - - /** - * Returns a timestamp rounded with the given precision (6 by default). - * - * @example getPreciseTimestamp() 1532087464437474 (microsecond maximum precision) - * @example getPreciseTimestamp(6) 1532087464437474 - * @example getPreciseTimestamp(5) 153208746443747 (1/100000 second precision) - * @example getPreciseTimestamp(4) 15320874644375 (1/10000 second precision) - * @example getPreciseTimestamp(3) 1532087464437 (millisecond precision) - * @example getPreciseTimestamp(2) 153208746444 (1/100 second precision) - * @example getPreciseTimestamp(1) 15320874644 (1/10 second precision) - * @example getPreciseTimestamp(0) 1532087464 (second precision) - * @example getPreciseTimestamp(-1) 153208746 (10 second precision) - * @example getPreciseTimestamp(-2) 15320875 (100 second precision) - * - * @param int $precision - * - * @return float - */ - public function getPreciseTimestamp($precision = 6): float - { - return round(((float) $this->rawFormat('Uu')) / pow(10, 6 - $precision)); - } - - /** - * Returns the milliseconds timestamps used amongst other by Date javascript objects. - * - * @return float - */ - public function valueOf(): float - { - return $this->getPreciseTimestamp(3); - } - - /** - * Returns the timestamp with millisecond precision. - * - * @return int - */ - public function getTimestampMs(): int - { - return (int) $this->getPreciseTimestamp(3); - } - - /** - * @alias getTimestamp - * - * Returns the UNIX timestamp for the current date. - * - * @return int - */ - public function unix(): int - { - return $this->getTimestamp(); - } - - /** - * Return an array with integer part digits and decimals digits split from one or more positive numbers - * (such as timestamps) as string with the given number of decimals (6 by default). - * - * By splitting integer and decimal, this method obtain a better precision than - * number_format when the input is a string. - * - * @param float|int|string $numbers one or more numbers - * @param int $decimals number of decimals precision (6 by default) - * - * @return array 0-index is integer part, 1-index is decimal part digits - */ - private static function getIntegerAndDecimalParts($numbers, $decimals = 6): array - { - if (\is_int($numbers) || \is_float($numbers)) { - $numbers = number_format($numbers, $decimals, '.', ''); - } - - $sign = str_starts_with($numbers, '-') ? -1 : 1; - $integer = 0; - $decimal = 0; - - foreach (preg_split('`[^\d.]+`', $numbers) as $chunk) { - [$integerPart, $decimalPart] = explode('.', "$chunk."); - - $integer += (int) $integerPart; - $decimal += (float) ("0.$decimalPart"); - } - - $overflow = floor($decimal); - $integer += $overflow; - $decimal -= $overflow; - - return [$sign * $integer, $decimal === 0.0 ? 0.0 : $sign * round($decimal * pow(10, $decimals))]; - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php b/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php deleted file mode 100644 index 5f0b367..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\FactoryImmutable; -use Closure; - -/** - * Trait ToStringFormat. - * - * Handle global format customization for string cast of the object. - */ -trait ToStringFormat -{ - /** - * Reset the format used to the default when type juggling a Carbon instance to a string - * - * @return void - */ - public static function resetToStringFormat(): void - { - FactoryImmutable::getDefaultInstance()->resetToStringFormat(); - } - - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather let Carbon object being cast to string with DEFAULT_TO_STRING_FORMAT, and - * use other method or custom format passed to format() method if you need to dump another string - * format. - * - * Set the default format used when type juggling a Carbon instance to a string. - * - * @param string|Closure|null $format - * - * @return void - */ - public static function setToStringFormat(string|Closure|null $format): void - { - FactoryImmutable::getDefaultInstance()->setToStringFormat($format); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Units.php b/vendor/nesbot/carbon/src/Carbon/Traits/Units.php deleted file mode 100644 index 5953721..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Units.php +++ /dev/null @@ -1,469 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\CarbonConverterInterface; -use Carbon\CarbonInterface; -use Carbon\CarbonInterval; -use Carbon\Exceptions\InvalidFormatException; -use Carbon\Exceptions\InvalidIntervalException; -use Carbon\Exceptions\UnitException; -use Carbon\Exceptions\UnsupportedUnitException; -use Carbon\Unit; -use Closure; -use DateInterval; -use DateMalformedStringException; -use ReturnTypeWillChange; - -/** - * Trait Units. - * - * Add, subtract and set units. - */ -trait Units -{ - /** - * @deprecated Prefer to use add addUTCUnit() which more accurately defines what it's doing. - * - * Add seconds to the instance using timestamp. Positive $value travels - * forward while negative $value travels into the past. - * - * @param string $unit - * @param int|float|null $value - * - * @return static - */ - public function addRealUnit(string $unit, $value = 1): static - { - return $this->addUTCUnit($unit, $value); - } - - /** - * Add seconds to the instance using timestamp. Positive $value travels - * forward while negative $value travels into the past. - * - * @param string $unit - * @param int|float|null $value - * - * @return static - */ - public function addUTCUnit(string $unit, $value = 1): static - { - $value ??= 0; - - switch ($unit) { - // @call addUTCUnit - case 'micro': - - // @call addUTCUnit - case 'microsecond': - /* @var CarbonInterface $this */ - $diff = $this->microsecond + $value; - $time = $this->getTimestamp(); - $seconds = (int) floor($diff / static::MICROSECONDS_PER_SECOND); - $time += $seconds; - $diff -= $seconds * static::MICROSECONDS_PER_SECOND; - $microtime = str_pad((string) $diff, 6, '0', STR_PAD_LEFT); - $timezone = $this->tz; - - return $this->tz('UTC')->modify("@$time.$microtime")->setTimezone($timezone); - - // @call addUTCUnit - case 'milli': - // @call addUTCUnit - case 'millisecond': - return $this->addUTCUnit('microsecond', $value * static::MICROSECONDS_PER_MILLISECOND); - - // @call addUTCUnit - case 'second': - break; - - // @call addUTCUnit - case 'minute': - $value *= static::SECONDS_PER_MINUTE; - - break; - - // @call addUTCUnit - case 'hour': - $value *= static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - - break; - - // @call addUTCUnit - case 'day': - $value *= static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - - break; - - // @call addUTCUnit - case 'week': - $value *= static::DAYS_PER_WEEK * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - - break; - - // @call addUTCUnit - case 'month': - $value *= 30 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - - break; - - // @call addUTCUnit - case 'quarter': - $value *= static::MONTHS_PER_QUARTER * 30 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - - break; - - // @call addUTCUnit - case 'year': - $value *= 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - - break; - - // @call addUTCUnit - case 'decade': - $value *= static::YEARS_PER_DECADE * 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - - break; - - // @call addUTCUnit - case 'century': - $value *= static::YEARS_PER_CENTURY * 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - - break; - - // @call addUTCUnit - case 'millennium': - $value *= static::YEARS_PER_MILLENNIUM * 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - - break; - - default: - if ($this->isLocalStrictModeEnabled()) { - throw new UnitException("Invalid unit for real timestamp add/sub: '$unit'"); - } - - return $this; - } - - $seconds = (int) $value; - $microseconds = (int) round( - (abs($value) - abs($seconds)) * ($value < 0 ? -1 : 1) * static::MICROSECONDS_PER_SECOND, - ); - $date = $this->setTimestamp($this->getTimestamp() + $seconds); - - return $microseconds ? $date->addUTCUnit('microsecond', $microseconds) : $date; - } - - /** - * @deprecated Prefer to use add subUTCUnit() which more accurately defines what it's doing. - * - * Subtract seconds to the instance using timestamp. Positive $value travels - * into the past while negative $value travels forward. - * - * @param string $unit - * @param int $value - * - * @return static - */ - public function subRealUnit($unit, $value = 1): static - { - return $this->addUTCUnit($unit, -$value); - } - - /** - * Subtract seconds to the instance using timestamp. Positive $value travels - * into the past while negative $value travels forward. - * - * @param string $unit - * @param int $value - * - * @return static - */ - public function subUTCUnit($unit, $value = 1): static - { - return $this->addUTCUnit($unit, -$value); - } - - /** - * Returns true if a property can be changed via setter. - * - * @param string $unit - * - * @return bool - */ - public static function isModifiableUnit($unit): bool - { - static $modifiableUnits = [ - // @call addUnit - 'millennium', - // @call addUnit - 'century', - // @call addUnit - 'decade', - // @call addUnit - 'quarter', - // @call addUnit - 'week', - // @call addUnit - 'weekday', - ]; - - return \in_array($unit, $modifiableUnits, true) || \in_array($unit, static::$units, true); - } - - /** - * Call native PHP DateTime/DateTimeImmutable add() method. - * - * @param DateInterval $interval - * - * @return static - */ - public function rawAdd(DateInterval $interval): static - { - return parent::add($interval); - } - - /** - * Add given units or interval to the current instance. - * - * @example $date->add('hour', 3) - * @example $date->add(15, 'days') - * @example $date->add(CarbonInterval::days(4)) - * - * @param Unit|string|DateInterval|Closure|CarbonConverterInterface $unit - * @param int|float $value - * @param bool|null $overflow - * - * @return static - */ - #[ReturnTypeWillChange] - public function add($unit, $value = 1, ?bool $overflow = null): static - { - $unit = Unit::toNameIfUnit($unit); - $value = Unit::toNameIfUnit($value); - - if (\is_string($unit) && \func_num_args() === 1) { - $unit = CarbonInterval::make($unit, [], true); - } - - if ($unit instanceof CarbonConverterInterface) { - $unit = Closure::fromCallable([$unit, 'convertDate']); - } - - if ($unit instanceof Closure) { - $result = $this->resolveCarbon($unit($this, false)); - - if ($this !== $result && $this->isMutable()) { - return $this->modify($result->rawFormat('Y-m-d H:i:s.u e O')); - } - - return $result; - } - - if ($unit instanceof DateInterval) { - return parent::add($unit); - } - - if (is_numeric($unit)) { - [$value, $unit] = [$unit, $value]; - } - - return $this->addUnit((string) $unit, $value, $overflow); - } - - /** - * Add given units to the current instance. - */ - public function addUnit(Unit|string $unit, $value = 1, ?bool $overflow = null): static - { - $unit = Unit::toName($unit); - - $originalArgs = \func_get_args(); - - $date = $this; - - if (!is_numeric($value) || !(float) $value) { - return $date->isMutable() ? $date : $date->copy(); - } - - $unit = self::singularUnit($unit); - $metaUnits = [ - 'millennium' => [static::YEARS_PER_MILLENNIUM, 'year'], - 'century' => [static::YEARS_PER_CENTURY, 'year'], - 'decade' => [static::YEARS_PER_DECADE, 'year'], - 'quarter' => [static::MONTHS_PER_QUARTER, 'month'], - ]; - - if (isset($metaUnits[$unit])) { - [$factor, $unit] = $metaUnits[$unit]; - $value *= $factor; - } - - if ($unit === 'weekday') { - $weekendDays = $this->transmitFactory(static fn () => static::getWeekendDays()); - - if ($weekendDays !== [static::SATURDAY, static::SUNDAY]) { - $absoluteValue = abs($value); - $sign = $value / max(1, $absoluteValue); - $weekDaysCount = static::DAYS_PER_WEEK - min(static::DAYS_PER_WEEK - 1, \count(array_unique($weekendDays))); - $weeks = floor($absoluteValue / $weekDaysCount); - - for ($diff = $absoluteValue % $weekDaysCount; $diff; $diff--) { - /** @var static $date */ - $date = $date->addDays($sign); - - while (\in_array($date->dayOfWeek, $weekendDays, true)) { - $date = $date->addDays($sign); - } - } - - $value = $weeks * $sign; - $unit = 'week'; - } - - $timeString = $date->toTimeString(); - } elseif ($canOverflow = (\in_array($unit, [ - 'month', - 'year', - ]) && ($overflow === false || ( - $overflow === null && - ($ucUnit = ucfirst($unit).'s') && - !($this->{'local'.$ucUnit.'Overflow'} ?? static::{'shouldOverflow'.$ucUnit}()) - )))) { - $day = $date->day; - } - - if ($unit === 'milli' || $unit === 'millisecond') { - $unit = 'microsecond'; - $value *= static::MICROSECONDS_PER_MILLISECOND; - } - - $previousException = null; - - try { - $date = self::rawAddUnit($date, $unit, $value); - - if (isset($timeString)) { - $date = $date?->setTimeFromTimeString($timeString); - } elseif (isset($canOverflow, $day) && $canOverflow && $day !== $date?->day) { - $date = $date?->modify('last day of previous month'); - } - } catch (DateMalformedStringException|InvalidFormatException|UnsupportedUnitException $exception) { - $date = null; - $previousException = $exception; - } - - return $date ?? throw new UnitException( - 'Unable to add unit '.var_export($originalArgs, true), - previous: $previousException, - ); - } - - /** - * Subtract given units to the current instance. - */ - public function subUnit(Unit|string $unit, $value = 1, ?bool $overflow = null): static - { - return $this->addUnit($unit, -$value, $overflow); - } - - /** - * Call native PHP DateTime/DateTimeImmutable sub() method. - */ - public function rawSub(DateInterval $interval): static - { - return parent::sub($interval); - } - - /** - * Subtract given units or interval to the current instance. - * - * @example $date->sub('hour', 3) - * @example $date->sub(15, 'days') - * @example $date->sub(CarbonInterval::days(4)) - * - * @param Unit|string|DateInterval|Closure|CarbonConverterInterface $unit - * @param int|float $value - * @param bool|null $overflow - * - * @return static - */ - #[ReturnTypeWillChange] - public function sub($unit, $value = 1, ?bool $overflow = null): static - { - if (\is_string($unit) && \func_num_args() === 1) { - $unit = CarbonInterval::make($unit, [], true); - } - - if ($unit instanceof CarbonConverterInterface) { - $unit = Closure::fromCallable([$unit, 'convertDate']); - } - - if ($unit instanceof Closure) { - $result = $this->resolveCarbon($unit($this, true)); - - if ($this !== $result && $this->isMutable()) { - return $this->modify($result->rawFormat('Y-m-d H:i:s.u e O')); - } - - return $result; - } - - if ($unit instanceof DateInterval) { - return parent::sub($unit); - } - - if (is_numeric($unit)) { - [$value, $unit] = [$unit, $value]; - } - - return $this->addUnit((string) $unit, -(float) $value, $overflow); - } - - /** - * Subtract given units or interval to the current instance. - * - * @see sub() - * - * @param string|DateInterval $unit - * @param int|float $value - * @param bool|null $overflow - * - * @return static - */ - public function subtract($unit, $value = 1, ?bool $overflow = null): static - { - if (\is_string($unit) && \func_num_args() === 1) { - $unit = CarbonInterval::make($unit, [], true); - } - - return $this->sub($unit, $value, $overflow); - } - - private static function rawAddUnit(self $date, string $unit, int|float $value): ?static - { - try { - return $date->rawAdd( - CarbonInterval::fromString(abs($value)." $unit")->invert($value < 0), - ); - } catch (InvalidIntervalException $exception) { - try { - return $date->modify("$value $unit"); - } catch (InvalidFormatException) { - throw new UnsupportedUnitException($unit, previous: $exception); - } - } - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Week.php b/vendor/nesbot/carbon/src/Carbon/Traits/Week.php deleted file mode 100644 index 0101d05..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Week.php +++ /dev/null @@ -1,223 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon\Traits; - -use Carbon\CarbonInterval; - -/** - * Trait Week. - * - * week and ISO week number, year and count in year. - * - * Depends on the following properties: - * - * @property int $daysInYear - * @property int $dayOfWeek - * @property int $dayOfYear - * @property int $year - * - * Depends on the following methods: - * - * @method static addWeeks(int $weeks = 1) - * @method static copy() - * @method static dayOfYear(int $dayOfYear) - * @method string getTranslationMessage(string $key, ?string $locale = null, ?string $default = null, $translator = null) - * @method static next(int|string $modifier = null) - * @method static startOfWeek(int $day = null) - * @method static subWeeks(int $weeks = 1) - * @method static year(int $year = null) - */ -trait Week -{ - /** - * Set/get the week number of year using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int|static - */ - public function isoWeekYear($year = null, $dayOfWeek = null, $dayOfYear = null) - { - return $this->weekYear( - $year, - $dayOfWeek ?? static::MONDAY, - $dayOfYear ?? static::THURSDAY, - ); - } - - /** - * Set/get the week number of year using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int|static - */ - public function weekYear($year = null, $dayOfWeek = null, $dayOfYear = null) - { - $dayOfWeek = $dayOfWeek ?? $this->getTranslationMessage('first_day_of_week') ?? static::SUNDAY; - $dayOfYear = $dayOfYear ?? $this->getTranslationMessage('day_of_first_week_of_year') ?? 1; - - if ($year !== null) { - $year = (int) round($year); - - if ($this->weekYear(null, $dayOfWeek, $dayOfYear) === $year) { - return $this->avoidMutation(); - } - - $week = $this->week(null, $dayOfWeek, $dayOfYear); - $day = $this->dayOfWeek; - $date = $this->year($year); - - $date = match ($date->weekYear(null, $dayOfWeek, $dayOfYear) - $year) { - CarbonInterval::POSITIVE => $date->subWeeks(static::WEEKS_PER_YEAR / 2), - CarbonInterval::NEGATIVE => $date->addWeeks(static::WEEKS_PER_YEAR / 2), - default => $date, - }; - - $date = $date - ->addWeeks($week - $date->week(null, $dayOfWeek, $dayOfYear)) - ->startOfWeek($dayOfWeek); - - if ($date->dayOfWeek === $day) { - return $date; - } - - return $date->next($day); - } - - $year = $this->year; - $day = $this->dayOfYear; - $date = $this->avoidMutation()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - - if ($date->year === $year && $day < $date->dayOfYear) { - return $year - 1; - } - - $date = $this->avoidMutation()->addYear()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - - if ($date->year === $year && $day >= $date->dayOfYear) { - return $year + 1; - } - - return $year; - } - - /** - * Get the number of weeks of the current week-year using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int - */ - public function isoWeeksInYear($dayOfWeek = null, $dayOfYear = null) - { - return $this->weeksInYear( - $dayOfWeek ?? static::MONDAY, - $dayOfYear ?? static::THURSDAY, - ); - } - - /** - * Get the number of weeks of the current week-year using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int - */ - public function weeksInYear($dayOfWeek = null, $dayOfYear = null) - { - $dayOfWeek = $dayOfWeek ?? $this->getTranslationMessage('first_day_of_week') ?? static::SUNDAY; - $dayOfYear = $dayOfYear ?? $this->getTranslationMessage('day_of_first_week_of_year') ?? 1; - $year = $this->year; - $start = $this->avoidMutation()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - $startDay = $start->dayOfYear; - if ($start->year !== $year) { - $startDay -= $start->daysInYear; - } - $end = $this->avoidMutation()->addYear()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - $endDay = $end->dayOfYear; - if ($end->year !== $year) { - $endDay += $this->daysInYear; - } - - return (int) round(($endDay - $startDay) / static::DAYS_PER_WEEK); - } - - /** - * Get/set the week number using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $week - * @param int|null $dayOfWeek - * @param int|null $dayOfYear - * - * @return int|static - */ - public function week($week = null, $dayOfWeek = null, $dayOfYear = null) - { - $date = $this; - $dayOfWeek = $dayOfWeek ?? $this->getTranslationMessage('first_day_of_week') ?? 0; - $dayOfYear = $dayOfYear ?? $this->getTranslationMessage('day_of_first_week_of_year') ?? 1; - - if ($week !== null) { - return $date->addWeeks(round($week) - $this->week(null, $dayOfWeek, $dayOfYear)); - } - - $start = $date->avoidMutation()->shiftTimezone('UTC')->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - $end = $date->avoidMutation()->shiftTimezone('UTC')->startOfWeek($dayOfWeek); - - if ($start > $end) { - $start = $start->subWeeks(static::WEEKS_PER_YEAR / 2)->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - } - - $week = (int) ($start->diffInDays($end) / static::DAYS_PER_WEEK + 1); - - return $week > $end->weeksInYear($dayOfWeek, $dayOfYear) ? 1 : $week; - } - - /** - * Get/set the week number using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $week - * @param int|null $dayOfWeek - * @param int|null $dayOfYear - * - * @return int|static - */ - public function isoWeek($week = null, $dayOfWeek = null, $dayOfYear = null) - { - return $this->week( - $week, - $dayOfWeek ?? static::MONDAY, - $dayOfYear ?? static::THURSDAY, - ); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/Translator.php b/vendor/nesbot/carbon/src/Carbon/Translator.php deleted file mode 100644 index 9f523b2..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Translator.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use ReflectionMethod; -use Symfony\Component\Translation; -use Symfony\Contracts\Translation\TranslatorInterface; - -$transMethod = new ReflectionMethod( - class_exists(TranslatorInterface::class) - ? TranslatorInterface::class - : Translation\Translator::class, - 'trans', -); - -require $transMethod->hasReturnType() - ? __DIR__.'/../../lazy/Carbon/TranslatorStrongType.php' - : __DIR__.'/../../lazy/Carbon/TranslatorWeakType.php'; - -class Translator extends LazyTranslator -{ - // Proxy dynamically loaded LazyTranslator in a static way -} diff --git a/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php b/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php deleted file mode 100644 index ab9933e..0000000 --- a/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Carbon\Exceptions\ImmutableException; -use Symfony\Component\Config\ConfigCacheFactoryInterface; -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; - -class TranslatorImmutable extends Translator -{ - private bool $constructed = false; - - public function __construct($locale, ?MessageFormatterInterface $formatter = null, $cacheDir = null, $debug = false) - { - parent::__construct($locale, $formatter, $cacheDir, $debug); - $this->constructed = true; - } - - /** - * @codeCoverageIgnore - */ - public function setDirectories(array $directories): static - { - $this->disallowMutation(__METHOD__); - - return parent::setDirectories($directories); - } - - public function setLocale($locale): void - { - $this->disallowMutation(__METHOD__); - - parent::setLocale($locale); - } - - /** - * @codeCoverageIgnore - */ - public function setMessages(string $locale, array $messages): static - { - $this->disallowMutation(__METHOD__); - - return parent::setMessages($locale, $messages); - } - - /** - * @codeCoverageIgnore - */ - public function setTranslations(array $messages): static - { - $this->disallowMutation(__METHOD__); - - return parent::setTranslations($messages); - } - - /** - * @codeCoverageIgnore - */ - public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory): void - { - $this->disallowMutation(__METHOD__); - - parent::setConfigCacheFactory($configCacheFactory); - } - - public function resetMessages(?string $locale = null): bool - { - $this->disallowMutation(__METHOD__); - - return parent::resetMessages($locale); - } - - /** - * @codeCoverageIgnore - */ - public function setFallbackLocales(array $locales): void - { - $this->disallowMutation(__METHOD__); - - parent::setFallbackLocales($locales); - } - - private function disallowMutation($method) - { - if ($this->constructed) { - throw new ImmutableException($method.' not allowed on '.static::class); - } - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php b/vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php deleted file mode 100644 index 54a7980..0000000 --- a/vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Symfony\Component\Translation\MessageCatalogueInterface; - -/** - * Mark translator using strong type from symfony/translation >= 6. - */ -interface TranslatorStrongTypeInterface -{ - public function getFromCatalogue(MessageCatalogueInterface $catalogue, string $id, string $domain = 'messages'); -} diff --git a/vendor/nesbot/carbon/src/Carbon/Unit.php b/vendor/nesbot/carbon/src/Carbon/Unit.php deleted file mode 100644 index dc6b326..0000000 --- a/vendor/nesbot/carbon/src/Carbon/Unit.php +++ /dev/null @@ -1,119 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -enum Unit: string -{ - case Microsecond = 'microsecond'; - case Millisecond = 'millisecond'; - case Second = 'second'; - case Minute = 'minute'; - case Hour = 'hour'; - case Day = 'day'; - case Week = 'week'; - case Month = 'month'; - case Quarter = 'quarter'; - case Year = 'year'; - case Decade = 'decade'; - case Century = 'century'; - case Millennium = 'millennium'; - - public static function toName(self|string $unit): string - { - return $unit instanceof self ? $unit->value : $unit; - } - - /** @internal */ - public static function toNameIfUnit(mixed $unit): mixed - { - return $unit instanceof self ? $unit->value : $unit; - } - - public static function fromName(string $name, ?string $locale = null): self - { - if ($locale !== null) { - $messages = Translator::get($locale)->getMessages($locale) ?? []; - - if ($messages !== []) { - $lowerName = mb_strtolower($name); - - foreach (self::cases() as $unit) { - foreach (['', '_from_now', '_ago', '_after', '_before'] as $suffix) { - $message = $messages[$unit->value.$suffix] ?? null; - - if (\is_string($message)) { - $words = explode('|', mb_strtolower(preg_replace( - '/[{\[\]].+?[}\[\]]/', - '', - str_replace(':count', '', $message), - ))); - - foreach ($words as $word) { - if (trim($word) === $lowerName) { - return $unit; - } - } - } - } - } - } - } - - return self::from(CarbonImmutable::singularUnit($name)); - } - - public function singular(?string $locale = null): string - { - if ($locale !== null) { - return trim(Translator::get($locale)->trans($this->value, [ - '%count%' => 1, - ':count' => 1, - ]), "1 \n\r\t\v\0"); - } - - return $this->value; - } - - public function plural(?string $locale = null): string - { - if ($locale !== null) { - return trim(Translator::get($locale)->trans($this->value, [ - '%count%' => 9, - ':count' => 9, - ]), "9 \n\r\t\v\0"); - } - - return CarbonImmutable::pluralUnit($this->value); - } - - public function interval(int|float $value = 1): CarbonInterval - { - return CarbonInterval::fromString("$value $this->name"); - } - - public function locale(string $locale): CarbonInterval - { - return $this->interval()->locale($locale); - } - - public function toPeriod(...$params): CarbonPeriod - { - return $this->interval()->toPeriod(...$params); - } - - public function stepBy(mixed $interval, Unit|string|null $unit = null): CarbonPeriod - { - return $this->interval()->stepBy($interval, $unit); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/WeekDay.php b/vendor/nesbot/carbon/src/Carbon/WeekDay.php deleted file mode 100644 index 69f69ce..0000000 --- a/vendor/nesbot/carbon/src/Carbon/WeekDay.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use Carbon\Exceptions\InvalidFormatException; - -enum WeekDay: int -{ - // Using constants is only safe starting from PHP 8.2 - case Sunday = 0; // CarbonInterface::SUNDAY - case Monday = 1; // CarbonInterface::MONDAY - case Tuesday = 2; // CarbonInterface::TUESDAY - case Wednesday = 3; // CarbonInterface::WEDNESDAY - case Thursday = 4; // CarbonInterface::THURSDAY - case Friday = 5; // CarbonInterface::FRIDAY - case Saturday = 6; // CarbonInterface::SATURDAY - - public static function int(self|int|null $value): ?int - { - return $value instanceof self ? $value->value : $value; - } - - public static function fromNumber(int $number): self - { - $day = $number % CarbonInterface::DAYS_PER_WEEK; - - return self::from($day + ($day < 0 ? CarbonInterface::DAYS_PER_WEEK : 0)); - } - - public static function fromName(string $name, ?string $locale = null): self - { - try { - return self::from(CarbonImmutable::parseFromLocale($name, $locale)->dayOfWeek); - } catch (InvalidFormatException $exception) { - // Possibly current language expect a dot after short name, but it's missing - if ($locale !== null && !mb_strlen($name) < 4 && !str_ends_with($name, '.')) { - try { - return self::from(CarbonImmutable::parseFromLocale($name.'.', $locale)->dayOfWeek); - } catch (InvalidFormatException) { - // Throw previous error - } - } - - throw $exception; - } - } - - public function next(?CarbonImmutable $now = null): CarbonImmutable - { - return $now?->modify($this->name) ?? new CarbonImmutable($this->name); - } - - public function locale(string $locale, ?CarbonImmutable $now = null): CarbonImmutable - { - return $this->next($now)->locale($locale); - } -} diff --git a/vendor/nesbot/carbon/src/Carbon/WrapperClock.php b/vendor/nesbot/carbon/src/Carbon/WrapperClock.php deleted file mode 100644 index 7fb184f..0000000 --- a/vendor/nesbot/carbon/src/Carbon/WrapperClock.php +++ /dev/null @@ -1,187 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Carbon; - -use DateTime; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use Psr\Clock\ClockInterface as PsrClockInterface; -use RuntimeException; -use Symfony\Component\Clock\ClockInterface; - -final class WrapperClock implements ClockInterface -{ - public function __construct( - private PsrClockInterface|Factory|DateTimeInterface $currentClock, - ) { - } - - public function unwrap(): PsrClockInterface|Factory|DateTimeInterface - { - return $this->currentClock; - } - - public function getFactory(): Factory - { - if ($this->currentClock instanceof Factory) { - return $this->currentClock; - } - - if ($this->currentClock instanceof DateTime) { - $factory = new Factory(); - $factory->setTestNowAndTimezone($this->currentClock); - - return $factory; - } - - if ($this->currentClock instanceof DateTimeImmutable) { - $factory = new FactoryImmutable(); - $factory->setTestNowAndTimezone($this->currentClock); - - return $factory; - } - - $factory = new FactoryImmutable(); - $factory->setTestNowAndTimezone(fn () => $this->currentClock->now()); - - return $factory; - } - - private function nowRaw(): DateTimeInterface - { - if ($this->currentClock instanceof DateTimeInterface) { - return $this->currentClock; - } - - if ($this->currentClock instanceof Factory) { - return $this->currentClock->__call('now', []); - } - - return $this->currentClock->now(); - } - - public function now(): DateTimeImmutable - { - $now = $this->nowRaw(); - - return $now instanceof DateTimeImmutable - ? $now - : new CarbonImmutable($now); - } - - /** - * @template T of CarbonInterface - * - * @param class-string $class - * - * @return T - */ - public function nowAs(string $class, DateTimeZone|string|int|null $timezone = null): CarbonInterface - { - $now = $this->nowRaw(); - $date = $now instanceof $class ? $now : $class::instance($now); - - return $timezone === null ? $date : $date->setTimezone($timezone); - } - - public function nowAsCarbon(DateTimeZone|string|int|null $timezone = null): CarbonInterface - { - $now = $this->nowRaw(); - - return $now instanceof CarbonInterface - ? ($timezone === null ? $now : $now->setTimezone($timezone)) - : $this->dateAsCarbon($now, $timezone); - } - - private function dateAsCarbon(DateTimeInterface $date, DateTimeZone|string|int|null $timezone): CarbonInterface - { - return $date instanceof DateTimeImmutable - ? new CarbonImmutable($date, $timezone) - : new Carbon($date, $timezone); - } - - public function sleep(float|int $seconds): void - { - if ($seconds === 0 || $seconds === 0.0) { - return; - } - - if ($seconds < 0) { - throw new RuntimeException('Expected positive number of seconds, '.$seconds.' given'); - } - - if ($this->currentClock instanceof DateTimeInterface) { - $this->currentClock = $this->addSeconds($this->currentClock, $seconds); - - return; - } - - if ($this->currentClock instanceof ClockInterface) { - $this->currentClock->sleep($seconds); - - return; - } - - $this->currentClock = $this->addSeconds($this->currentClock->now(), $seconds); - } - - public function withTimeZone(DateTimeZone|string $timezone): static - { - if ($this->currentClock instanceof ClockInterface) { - return new self($this->currentClock->withTimeZone($timezone)); - } - - $now = $this->currentClock instanceof DateTimeInterface - ? $this->currentClock - : $this->currentClock->now(); - - if (!($now instanceof DateTimeImmutable)) { - $now = clone $now; - } - - if (\is_string($timezone)) { - $timezone = new DateTimeZone($timezone); - } - - return new self($now->setTimezone($timezone)); - } - - private function addSeconds(DateTimeInterface $date, float|int $seconds): DateTimeInterface - { - $secondsPerHour = CarbonInterface::SECONDS_PER_MINUTE * CarbonInterface::MINUTES_PER_HOUR; - $hours = number_format( - floor($seconds / $secondsPerHour), - thousands_separator: '', - ); - $microseconds = number_format( - ($seconds - $hours * $secondsPerHour) * CarbonInterface::MICROSECONDS_PER_SECOND, - thousands_separator: '', - ); - - if (!($date instanceof DateTimeImmutable)) { - $date = clone $date; - } - - if ($hours !== '0') { - $date = $date->modify("$hours hours"); - } - - if ($microseconds !== '0') { - $date = $date->modify("$microseconds microseconds"); - } - - return $date; - } -} diff --git a/vendor/nikic/fast-route/.gitignore b/vendor/nikic/fast-route/.gitignore deleted file mode 100644 index e378a07..0000000 --- a/vendor/nikic/fast-route/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/vendor/ -.idea/ - -# ignore lock file since we have no extra dependencies -composer.lock diff --git a/vendor/nikic/fast-route/.hhconfig b/vendor/nikic/fast-route/.hhconfig deleted file mode 100644 index 0c2153c..0000000 --- a/vendor/nikic/fast-route/.hhconfig +++ /dev/null @@ -1 +0,0 @@ -assume_php=false diff --git a/vendor/nikic/fast-route/.travis.yml b/vendor/nikic/fast-route/.travis.yml deleted file mode 100644 index 10f8381..0000000 --- a/vendor/nikic/fast-route/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -sudo: false -language: php - -php: - - 5.4 - - 5.5 - - 5.6 - - 7.0 - - 7.1 - - 7.2 - - hhvm - -script: - - ./vendor/bin/phpunit - -before_install: - - travis_retry composer self-update - -install: - - composer install diff --git a/vendor/nikic/fast-route/FastRoute.hhi b/vendor/nikic/fast-route/FastRoute.hhi deleted file mode 100644 index 8d50738..0000000 --- a/vendor/nikic/fast-route/FastRoute.hhi +++ /dev/null @@ -1,126 +0,0 @@ -; - } - - class RouteCollector { - public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator); - public function addRoute(mixed $httpMethod, string $route, mixed $handler): void; - public function getData(): array; - } - - class Route { - public function __construct(string $httpMethod, mixed $handler, string $regex, array $variables); - public function matches(string $str): bool; - } - - interface DataGenerator { - public function addRoute(string $httpMethod, array $routeData, mixed $handler); - public function getData(): array; - } - - interface Dispatcher { - const int NOT_FOUND = 0; - const int FOUND = 1; - const int METHOD_NOT_ALLOWED = 2; - public function dispatch(string $httpMethod, string $uri): array; - } - - function simpleDispatcher( - (function(RouteCollector): void) $routeDefinitionCallback, - shape( - ?'routeParser' => classname, - ?'dataGenerator' => classname, - ?'dispatcher' => classname, - ?'routeCollector' => classname, - ) $options = shape()): Dispatcher; - - function cachedDispatcher( - (function(RouteCollector): void) $routeDefinitionCallback, - shape( - ?'routeParser' => classname, - ?'dataGenerator' => classname, - ?'dispatcher' => classname, - ?'routeCollector' => classname, - ?'cacheDisabled' => bool, - ?'cacheFile' => string, - ) $options = shape()): Dispatcher; -} - -namespace FastRoute\DataGenerator { - abstract class RegexBasedAbstract implements \FastRoute\DataGenerator { - protected abstract function getApproxChunkSize(); - protected abstract function processChunk($regexToRoutesMap); - - public function addRoute(string $httpMethod, array $routeData, mixed $handler): void; - public function getData(): array; - } - - class CharCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array $regexToRoutesMap): array; - } - - class GroupCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array $regexToRoutesMap): array; - } - - class GroupPosBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array $regexToRoutesMap): array; - } - - class MarkBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array $regexToRoutesMap): array; - } -} - -namespace FastRoute\Dispatcher { - abstract class RegexBasedAbstract implements \FastRoute\Dispatcher { - protected abstract function dispatchVariableRoute(array $routeData, string $uri): array; - - public function dispatch(string $httpMethod, string $uri): array; - } - - class GroupPosBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array $routeData, string $uri): array; - } - - class GroupCountBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array $routeData, string $uri): array; - } - - class CharCountBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array $routeData, string $uri): array; - } - - class MarkBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array $routeData, string $uri): array; - } -} - -namespace FastRoute\RouteParser { - class Std implements \FastRoute\RouteParser { - const string VARIABLE_REGEX = <<<'REGEX' -\{ - \s* ([a-zA-Z][a-zA-Z0-9_]*) \s* - (?: - : \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*) - )? -\} -REGEX; - const string DEFAULT_DISPATCH_REGEX = '[^/]+'; - public function parse(string $route): array; - } -} diff --git a/vendor/nikic/fast-route/LICENSE b/vendor/nikic/fast-route/LICENSE deleted file mode 100644 index 478e764..0000000 --- a/vendor/nikic/fast-route/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2013 by Nikita Popov. - -Some rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/nikic/fast-route/README.md b/vendor/nikic/fast-route/README.md deleted file mode 100644 index 91bd466..0000000 --- a/vendor/nikic/fast-route/README.md +++ /dev/null @@ -1,313 +0,0 @@ -FastRoute - Fast request router for PHP -======================================= - -This library provides a fast implementation of a regular expression based router. [Blog post explaining how the -implementation works and why it is fast.][blog_post] - -Install -------- - -To install with composer: - -```sh -composer require nikic/fast-route -``` - -Requires PHP 5.4 or newer. - -Usage ------ - -Here's a basic usage example: - -```php -addRoute('GET', '/users', 'get_all_users_handler'); - // {id} must be a number (\d+) - $r->addRoute('GET', '/user/{id:\d+}', 'get_user_handler'); - // The /{title} suffix is optional - $r->addRoute('GET', '/articles/{id:\d+}[/{title}]', 'get_article_handler'); -}); - -// Fetch method and URI from somewhere -$httpMethod = $_SERVER['REQUEST_METHOD']; -$uri = $_SERVER['REQUEST_URI']; - -// Strip query string (?foo=bar) and decode URI -if (false !== $pos = strpos($uri, '?')) { - $uri = substr($uri, 0, $pos); -} -$uri = rawurldecode($uri); - -$routeInfo = $dispatcher->dispatch($httpMethod, $uri); -switch ($routeInfo[0]) { - case FastRoute\Dispatcher::NOT_FOUND: - // ... 404 Not Found - break; - case FastRoute\Dispatcher::METHOD_NOT_ALLOWED: - $allowedMethods = $routeInfo[1]; - // ... 405 Method Not Allowed - break; - case FastRoute\Dispatcher::FOUND: - $handler = $routeInfo[1]; - $vars = $routeInfo[2]; - // ... call $handler with $vars - break; -} -``` - -### Defining routes - -The routes are defined by calling the `FastRoute\simpleDispatcher()` function, which accepts -a callable taking a `FastRoute\RouteCollector` instance. The routes are added by calling -`addRoute()` on the collector instance: - -```php -$r->addRoute($method, $routePattern, $handler); -``` - -The `$method` is an uppercase HTTP method string for which a certain route should match. It -is possible to specify multiple valid methods using an array: - -```php -// These two calls -$r->addRoute('GET', '/test', 'handler'); -$r->addRoute('POST', '/test', 'handler'); -// Are equivalent to this one call -$r->addRoute(['GET', 'POST'], '/test', 'handler'); -``` - -By default the `$routePattern` uses a syntax where `{foo}` specifies a placeholder with name `foo` -and matching the regex `[^/]+`. To adjust the pattern the placeholder matches, you can specify -a custom pattern by writing `{bar:[0-9]+}`. Some examples: - -```php -// Matches /user/42, but not /user/xyz -$r->addRoute('GET', '/user/{id:\d+}', 'handler'); - -// Matches /user/foobar, but not /user/foo/bar -$r->addRoute('GET', '/user/{name}', 'handler'); - -// Matches /user/foo/bar as well -$r->addRoute('GET', '/user/{name:.+}', 'handler'); -``` - -Custom patterns for route placeholders cannot use capturing groups. For example `{lang:(en|de)}` -is not a valid placeholder, because `()` is a capturing group. Instead you can use either -`{lang:en|de}` or `{lang:(?:en|de)}`. - -Furthermore parts of the route enclosed in `[...]` are considered optional, so that `/foo[bar]` -will match both `/foo` and `/foobar`. Optional parts are only supported in a trailing position, -not in the middle of a route. - -```php -// This route -$r->addRoute('GET', '/user/{id:\d+}[/{name}]', 'handler'); -// Is equivalent to these two routes -$r->addRoute('GET', '/user/{id:\d+}', 'handler'); -$r->addRoute('GET', '/user/{id:\d+}/{name}', 'handler'); - -// Multiple nested optional parts are possible as well -$r->addRoute('GET', '/user[/{id:\d+}[/{name}]]', 'handler'); - -// This route is NOT valid, because optional parts can only occur at the end -$r->addRoute('GET', '/user[/{id:\d+}]/{name}', 'handler'); -``` - -The `$handler` parameter does not necessarily have to be a callback, it could also be a controller -class name or any other kind of data you wish to associate with the route. FastRoute only tells you -which handler corresponds to your URI, how you interpret it is up to you. - -#### Shorcut methods for common request methods - -For the `GET`, `POST`, `PUT`, `PATCH`, `DELETE` and `HEAD` request methods shortcut methods are available. For example: - -```php -$r->get('/get-route', 'get_handler'); -$r->post('/post-route', 'post_handler'); -``` - -Is equivalent to: - -```php -$r->addRoute('GET', '/get-route', 'get_handler'); -$r->addRoute('POST', '/post-route', 'post_handler'); -``` - -#### Route Groups - -Additionally, you can specify routes inside of a group. All routes defined inside a group will have a common prefix. - -For example, defining your routes as: - -```php -$r->addGroup('/admin', function (RouteCollector $r) { - $r->addRoute('GET', '/do-something', 'handler'); - $r->addRoute('GET', '/do-another-thing', 'handler'); - $r->addRoute('GET', '/do-something-else', 'handler'); -}); -``` - -Will have the same result as: - - ```php -$r->addRoute('GET', '/admin/do-something', 'handler'); -$r->addRoute('GET', '/admin/do-another-thing', 'handler'); -$r->addRoute('GET', '/admin/do-something-else', 'handler'); - ``` - -Nested groups are also supported, in which case the prefixes of all the nested groups are combined. - -### Caching - -The reason `simpleDispatcher` accepts a callback for defining the routes is to allow seamless -caching. By using `cachedDispatcher` instead of `simpleDispatcher` you can cache the generated -routing data and construct the dispatcher from the cached information: - -```php -addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); - $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); - $r->addRoute('GET', '/user/{name}', 'handler2'); -}, [ - 'cacheFile' => __DIR__ . '/route.cache', /* required */ - 'cacheDisabled' => IS_DEBUG_ENABLED, /* optional, enabled by default */ -]); -``` - -The second parameter to the function is an options array, which can be used to specify the cache -file location, among other things. - -### Dispatching a URI - -A URI is dispatched by calling the `dispatch()` method of the created dispatcher. This method -accepts the HTTP method and a URI. Getting those two bits of information (and normalizing them -appropriately) is your job - this library is not bound to the PHP web SAPIs. - -The `dispatch()` method returns an array whose first element contains a status code. It is one -of `Dispatcher::NOT_FOUND`, `Dispatcher::METHOD_NOT_ALLOWED` and `Dispatcher::FOUND`. For the -method not allowed status the second array element contains a list of HTTP methods allowed for -the supplied URI. For example: - - [FastRoute\Dispatcher::METHOD_NOT_ALLOWED, ['GET', 'POST']] - -> **NOTE:** The HTTP specification requires that a `405 Method Not Allowed` response include the -`Allow:` header to detail available methods for the requested resource. Applications using FastRoute -should use the second array element to add this header when relaying a 405 response. - -For the found status the second array element is the handler that was associated with the route -and the third array element is a dictionary of placeholder names to their values. For example: - - /* Routing against GET /user/nikic/42 */ - - [FastRoute\Dispatcher::FOUND, 'handler0', ['name' => 'nikic', 'id' => '42']] - -### Overriding the route parser and dispatcher - -The routing process makes use of three components: A route parser, a data generator and a -dispatcher. The three components adhere to the following interfaces: - -```php - 'FastRoute\\RouteParser\\Std', - 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', - 'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', -]); -``` - -The above options array corresponds to the defaults. By replacing `GroupCountBased` by -`GroupPosBased` you could switch to a different dispatching strategy. - -### A Note on HEAD Requests - -The HTTP spec requires servers to [support both GET and HEAD methods][2616-511]: - -> The methods GET and HEAD MUST be supported by all general-purpose servers - -To avoid forcing users to manually register HEAD routes for each resource we fallback to matching an -available GET route for a given resource. The PHP web SAPI transparently removes the entity body -from HEAD responses so this behavior has no effect on the vast majority of users. - -However, implementers using FastRoute outside the web SAPI environment (e.g. a custom server) MUST -NOT send entity bodies generated in response to HEAD requests. If you are a non-SAPI user this is -*your responsibility*; FastRoute has no purview to prevent you from breaking HTTP in such cases. - -Finally, note that applications MAY always specify their own HEAD method route for a given -resource to bypass this behavior entirely. - -### Credits - -This library is based on a router that [Levi Morrison][levi] implemented for the Aerys server. - -A large number of tests, as well as HTTP compliance considerations, were provided by [Daniel Lowrey][rdlowrey]. - - -[2616-511]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.1 "RFC 2616 Section 5.1.1" -[blog_post]: http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html -[levi]: https://github.com/morrisonlevi -[rdlowrey]: https://github.com/rdlowrey diff --git a/vendor/nikic/fast-route/composer.json b/vendor/nikic/fast-route/composer.json deleted file mode 100644 index fb446a2..0000000 --- a/vendor/nikic/fast-route/composer.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "nikic/fast-route", - "description": "Fast request router for PHP", - "keywords": ["routing", "router"], - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Nikita Popov", - "email": "nikic@php.net" - } - ], - "autoload": { - "psr-4": { - "FastRoute\\": "src/" - }, - "files": ["src/functions.php"] - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|~5.7" - } -} diff --git a/vendor/nikic/fast-route/phpunit.xml b/vendor/nikic/fast-route/phpunit.xml deleted file mode 100644 index 3c807b6..0000000 --- a/vendor/nikic/fast-route/phpunit.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ./test/ - - - - - - ./src/ - - - diff --git a/vendor/nikic/fast-route/psalm.xml b/vendor/nikic/fast-route/psalm.xml deleted file mode 100644 index 0dca5d7..0000000 --- a/vendor/nikic/fast-route/psalm.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/nikic/fast-route/src/BadRouteException.php b/vendor/nikic/fast-route/src/BadRouteException.php deleted file mode 100644 index 62262ec..0000000 --- a/vendor/nikic/fast-route/src/BadRouteException.php +++ /dev/null @@ -1,7 +0,0 @@ - $route) { - $suffixLen++; - $suffix .= "\t"; - - $regexes[] = '(?:' . $regex . '/(\t{' . $suffixLen . '})\t{' . ($count - $suffixLen) . '})'; - $routeMap[$suffix] = [$route->handler, $route->variables]; - } - - $regex = '~^(?|' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'suffix' => '/' . $suffix, 'routeMap' => $routeMap]; - } -} diff --git a/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php b/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php deleted file mode 100644 index 54d9a05..0000000 --- a/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php +++ /dev/null @@ -1,30 +0,0 @@ - $route) { - $numVariables = count($route->variables); - $numGroups = max($numGroups, $numVariables); - - $regexes[] = $regex . str_repeat('()', $numGroups - $numVariables); - $routeMap[$numGroups + 1] = [$route->handler, $route->variables]; - - ++$numGroups; - } - - $regex = '~^(?|' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'routeMap' => $routeMap]; - } -} diff --git a/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php b/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php deleted file mode 100644 index fc4dc0a..0000000 --- a/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php +++ /dev/null @@ -1,27 +0,0 @@ - $route) { - $regexes[] = $regex; - $routeMap[$offset] = [$route->handler, $route->variables]; - - $offset += count($route->variables); - } - - $regex = '~^(?:' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'routeMap' => $routeMap]; - } -} diff --git a/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php b/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php deleted file mode 100644 index 0aebed9..0000000 --- a/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php +++ /dev/null @@ -1,27 +0,0 @@ - $route) { - $regexes[] = $regex . '(*MARK:' . $markName . ')'; - $routeMap[$markName] = [$route->handler, $route->variables]; - - ++$markName; - } - - $regex = '~^(?|' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'routeMap' => $routeMap]; - } -} diff --git a/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php b/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php deleted file mode 100644 index 6457290..0000000 --- a/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php +++ /dev/null @@ -1,186 +0,0 @@ -isStaticRoute($routeData)) { - $this->addStaticRoute($httpMethod, $routeData, $handler); - } else { - $this->addVariableRoute($httpMethod, $routeData, $handler); - } - } - - /** - * @return mixed[] - */ - public function getData() - { - if (empty($this->methodToRegexToRoutesMap)) { - return [$this->staticRoutes, []]; - } - - return [$this->staticRoutes, $this->generateVariableRouteData()]; - } - - /** - * @return mixed[] - */ - private function generateVariableRouteData() - { - $data = []; - foreach ($this->methodToRegexToRoutesMap as $method => $regexToRoutesMap) { - $chunkSize = $this->computeChunkSize(count($regexToRoutesMap)); - $chunks = array_chunk($regexToRoutesMap, $chunkSize, true); - $data[$method] = array_map([$this, 'processChunk'], $chunks); - } - return $data; - } - - /** - * @param int - * @return int - */ - private function computeChunkSize($count) - { - $numParts = max(1, round($count / $this->getApproxChunkSize())); - return (int) ceil($count / $numParts); - } - - /** - * @param mixed[] - * @return bool - */ - private function isStaticRoute($routeData) - { - return count($routeData) === 1 && is_string($routeData[0]); - } - - private function addStaticRoute($httpMethod, $routeData, $handler) - { - $routeStr = $routeData[0]; - - if (isset($this->staticRoutes[$httpMethod][$routeStr])) { - throw new BadRouteException(sprintf( - 'Cannot register two routes matching "%s" for method "%s"', - $routeStr, $httpMethod - )); - } - - if (isset($this->methodToRegexToRoutesMap[$httpMethod])) { - foreach ($this->methodToRegexToRoutesMap[$httpMethod] as $route) { - if ($route->matches($routeStr)) { - throw new BadRouteException(sprintf( - 'Static route "%s" is shadowed by previously defined variable route "%s" for method "%s"', - $routeStr, $route->regex, $httpMethod - )); - } - } - } - - $this->staticRoutes[$httpMethod][$routeStr] = $handler; - } - - private function addVariableRoute($httpMethod, $routeData, $handler) - { - list($regex, $variables) = $this->buildRegexForRoute($routeData); - - if (isset($this->methodToRegexToRoutesMap[$httpMethod][$regex])) { - throw new BadRouteException(sprintf( - 'Cannot register two routes matching "%s" for method "%s"', - $regex, $httpMethod - )); - } - - $this->methodToRegexToRoutesMap[$httpMethod][$regex] = new Route( - $httpMethod, $handler, $regex, $variables - ); - } - - /** - * @param mixed[] - * @return mixed[] - */ - private function buildRegexForRoute($routeData) - { - $regex = ''; - $variables = []; - foreach ($routeData as $part) { - if (is_string($part)) { - $regex .= preg_quote($part, '~'); - continue; - } - - list($varName, $regexPart) = $part; - - if (isset($variables[$varName])) { - throw new BadRouteException(sprintf( - 'Cannot use the same placeholder "%s" twice', $varName - )); - } - - if ($this->regexHasCapturingGroups($regexPart)) { - throw new BadRouteException(sprintf( - 'Regex "%s" for parameter "%s" contains a capturing group', - $regexPart, $varName - )); - } - - $variables[$varName] = $varName; - $regex .= '(' . $regexPart . ')'; - } - - return [$regex, $variables]; - } - - /** - * @param string - * @return bool - */ - private function regexHasCapturingGroups($regex) - { - if (false === strpos($regex, '(')) { - // Needs to have at least a ( to contain a capturing group - return false; - } - - // Semi-accurate detection for capturing groups - return (bool) preg_match( - '~ - (?: - \(\?\( - | \[ [^\]\\\\]* (?: \\\\ . [^\]\\\\]* )* \] - | \\\\ . - ) (*SKIP)(*FAIL) | - \( - (?! - \? (?! <(?![!=]) | P< | \' ) - | \* - ) - ~x', - $regex - ); - } -} diff --git a/vendor/nikic/fast-route/src/Dispatcher.php b/vendor/nikic/fast-route/src/Dispatcher.php deleted file mode 100644 index 4ae72a3..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher.php +++ /dev/null @@ -1,26 +0,0 @@ - 'value', ...]] - * - * @param string $httpMethod - * @param string $uri - * - * @return array - */ - public function dispatch($httpMethod, $uri); -} diff --git a/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php b/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php deleted file mode 100644 index ef1eec1..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php +++ /dev/null @@ -1,31 +0,0 @@ -staticRouteMap, $this->variableRouteData) = $data; - } - - protected function dispatchVariableRoute($routeData, $uri) - { - foreach ($routeData as $data) { - if (!preg_match($data['regex'], $uri . $data['suffix'], $matches)) { - continue; - } - - list($handler, $varNames) = $data['routeMap'][end($matches)]; - - $vars = []; - $i = 0; - foreach ($varNames as $varName) { - $vars[$varName] = $matches[++$i]; - } - return [self::FOUND, $handler, $vars]; - } - - return [self::NOT_FOUND]; - } -} diff --git a/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php b/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php deleted file mode 100644 index 493e7a9..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php +++ /dev/null @@ -1,31 +0,0 @@ -staticRouteMap, $this->variableRouteData) = $data; - } - - protected function dispatchVariableRoute($routeData, $uri) - { - foreach ($routeData as $data) { - if (!preg_match($data['regex'], $uri, $matches)) { - continue; - } - - list($handler, $varNames) = $data['routeMap'][count($matches)]; - - $vars = []; - $i = 0; - foreach ($varNames as $varName) { - $vars[$varName] = $matches[++$i]; - } - return [self::FOUND, $handler, $vars]; - } - - return [self::NOT_FOUND]; - } -} diff --git a/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php b/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php deleted file mode 100644 index 498220e..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php +++ /dev/null @@ -1,33 +0,0 @@ -staticRouteMap, $this->variableRouteData) = $data; - } - - protected function dispatchVariableRoute($routeData, $uri) - { - foreach ($routeData as $data) { - if (!preg_match($data['regex'], $uri, $matches)) { - continue; - } - - // find first non-empty match - for ($i = 1; '' === $matches[$i]; ++$i); - - list($handler, $varNames) = $data['routeMap'][$i]; - - $vars = []; - foreach ($varNames as $varName) { - $vars[$varName] = $matches[$i++]; - } - return [self::FOUND, $handler, $vars]; - } - - return [self::NOT_FOUND]; - } -} diff --git a/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php b/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php deleted file mode 100644 index 22eb09b..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php +++ /dev/null @@ -1,31 +0,0 @@ -staticRouteMap, $this->variableRouteData) = $data; - } - - protected function dispatchVariableRoute($routeData, $uri) - { - foreach ($routeData as $data) { - if (!preg_match($data['regex'], $uri, $matches)) { - continue; - } - - list($handler, $varNames) = $data['routeMap'][$matches['MARK']]; - - $vars = []; - $i = 0; - foreach ($varNames as $varName) { - $vars[$varName] = $matches[++$i]; - } - return [self::FOUND, $handler, $vars]; - } - - return [self::NOT_FOUND]; - } -} diff --git a/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php b/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php deleted file mode 100644 index 206e879..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php +++ /dev/null @@ -1,88 +0,0 @@ -staticRouteMap[$httpMethod][$uri])) { - $handler = $this->staticRouteMap[$httpMethod][$uri]; - return [self::FOUND, $handler, []]; - } - - $varRouteData = $this->variableRouteData; - if (isset($varRouteData[$httpMethod])) { - $result = $this->dispatchVariableRoute($varRouteData[$httpMethod], $uri); - if ($result[0] === self::FOUND) { - return $result; - } - } - - // For HEAD requests, attempt fallback to GET - if ($httpMethod === 'HEAD') { - if (isset($this->staticRouteMap['GET'][$uri])) { - $handler = $this->staticRouteMap['GET'][$uri]; - return [self::FOUND, $handler, []]; - } - if (isset($varRouteData['GET'])) { - $result = $this->dispatchVariableRoute($varRouteData['GET'], $uri); - if ($result[0] === self::FOUND) { - return $result; - } - } - } - - // If nothing else matches, try fallback routes - if (isset($this->staticRouteMap['*'][$uri])) { - $handler = $this->staticRouteMap['*'][$uri]; - return [self::FOUND, $handler, []]; - } - if (isset($varRouteData['*'])) { - $result = $this->dispatchVariableRoute($varRouteData['*'], $uri); - if ($result[0] === self::FOUND) { - return $result; - } - } - - // Find allowed methods for this URI by matching against all other HTTP methods as well - $allowedMethods = []; - - foreach ($this->staticRouteMap as $method => $uriMap) { - if ($method !== $httpMethod && isset($uriMap[$uri])) { - $allowedMethods[] = $method; - } - } - - foreach ($varRouteData as $method => $routeData) { - if ($method === $httpMethod) { - continue; - } - - $result = $this->dispatchVariableRoute($routeData, $uri); - if ($result[0] === self::FOUND) { - $allowedMethods[] = $method; - } - } - - // If there are no allowed methods the route simply does not exist - if ($allowedMethods) { - return [self::METHOD_NOT_ALLOWED, $allowedMethods]; - } - - return [self::NOT_FOUND]; - } -} diff --git a/vendor/nikic/fast-route/src/Route.php b/vendor/nikic/fast-route/src/Route.php deleted file mode 100644 index e1bf7dd..0000000 --- a/vendor/nikic/fast-route/src/Route.php +++ /dev/null @@ -1,47 +0,0 @@ -httpMethod = $httpMethod; - $this->handler = $handler; - $this->regex = $regex; - $this->variables = $variables; - } - - /** - * Tests whether this route matches the given string. - * - * @param string $str - * - * @return bool - */ - public function matches($str) - { - $regex = '~^' . $this->regex . '$~'; - return (bool) preg_match($regex, $str); - } -} diff --git a/vendor/nikic/fast-route/src/RouteCollector.php b/vendor/nikic/fast-route/src/RouteCollector.php deleted file mode 100644 index c1c1762..0000000 --- a/vendor/nikic/fast-route/src/RouteCollector.php +++ /dev/null @@ -1,152 +0,0 @@ -routeParser = $routeParser; - $this->dataGenerator = $dataGenerator; - $this->currentGroupPrefix = ''; - } - - /** - * Adds a route to the collection. - * - * The syntax used in the $route string depends on the used route parser. - * - * @param string|string[] $httpMethod - * @param string $route - * @param mixed $handler - */ - public function addRoute($httpMethod, $route, $handler) - { - $route = $this->currentGroupPrefix . $route; - $routeDatas = $this->routeParser->parse($route); - foreach ((array) $httpMethod as $method) { - foreach ($routeDatas as $routeData) { - $this->dataGenerator->addRoute($method, $routeData, $handler); - } - } - } - - /** - * Create a route group with a common prefix. - * - * All routes created in the passed callback will have the given group prefix prepended. - * - * @param string $prefix - * @param callable $callback - */ - public function addGroup($prefix, callable $callback) - { - $previousGroupPrefix = $this->currentGroupPrefix; - $this->currentGroupPrefix = $previousGroupPrefix . $prefix; - $callback($this); - $this->currentGroupPrefix = $previousGroupPrefix; - } - - /** - * Adds a GET route to the collection - * - * This is simply an alias of $this->addRoute('GET', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function get($route, $handler) - { - $this->addRoute('GET', $route, $handler); - } - - /** - * Adds a POST route to the collection - * - * This is simply an alias of $this->addRoute('POST', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function post($route, $handler) - { - $this->addRoute('POST', $route, $handler); - } - - /** - * Adds a PUT route to the collection - * - * This is simply an alias of $this->addRoute('PUT', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function put($route, $handler) - { - $this->addRoute('PUT', $route, $handler); - } - - /** - * Adds a DELETE route to the collection - * - * This is simply an alias of $this->addRoute('DELETE', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function delete($route, $handler) - { - $this->addRoute('DELETE', $route, $handler); - } - - /** - * Adds a PATCH route to the collection - * - * This is simply an alias of $this->addRoute('PATCH', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function patch($route, $handler) - { - $this->addRoute('PATCH', $route, $handler); - } - - /** - * Adds a HEAD route to the collection - * - * This is simply an alias of $this->addRoute('HEAD', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function head($route, $handler) - { - $this->addRoute('HEAD', $route, $handler); - } - - /** - * Returns the collected route data, as provided by the data generator. - * - * @return array - */ - public function getData() - { - return $this->dataGenerator->getData(); - } -} diff --git a/vendor/nikic/fast-route/src/RouteParser.php b/vendor/nikic/fast-route/src/RouteParser.php deleted file mode 100644 index 6a7685c..0000000 --- a/vendor/nikic/fast-route/src/RouteParser.php +++ /dev/null @@ -1,37 +0,0 @@ - $segment) { - if ($segment === '' && $n !== 0) { - throw new BadRouteException('Empty optional part'); - } - - $currentRoute .= $segment; - $routeDatas[] = $this->parsePlaceholders($currentRoute); - } - return $routeDatas; - } - - /** - * Parses a route string that does not contain optional segments. - * - * @param string - * @return mixed[] - */ - private function parsePlaceholders($route) - { - if (!preg_match_all( - '~' . self::VARIABLE_REGEX . '~x', $route, $matches, - PREG_OFFSET_CAPTURE | PREG_SET_ORDER - )) { - return [$route]; - } - - $offset = 0; - $routeData = []; - foreach ($matches as $set) { - if ($set[0][1] > $offset) { - $routeData[] = substr($route, $offset, $set[0][1] - $offset); - } - $routeData[] = [ - $set[1][0], - isset($set[2]) ? trim($set[2][0]) : self::DEFAULT_DISPATCH_REGEX - ]; - $offset = $set[0][1] + strlen($set[0][0]); - } - - if ($offset !== strlen($route)) { - $routeData[] = substr($route, $offset); - } - - return $routeData; - } -} diff --git a/vendor/nikic/fast-route/src/bootstrap.php b/vendor/nikic/fast-route/src/bootstrap.php deleted file mode 100644 index 0bce3a4..0000000 --- a/vendor/nikic/fast-route/src/bootstrap.php +++ /dev/null @@ -1,12 +0,0 @@ - 'FastRoute\\RouteParser\\Std', - 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', - 'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', - 'routeCollector' => 'FastRoute\\RouteCollector', - ]; - - /** @var RouteCollector $routeCollector */ - $routeCollector = new $options['routeCollector']( - new $options['routeParser'], new $options['dataGenerator'] - ); - $routeDefinitionCallback($routeCollector); - - return new $options['dispatcher']($routeCollector->getData()); - } - - /** - * @param callable $routeDefinitionCallback - * @param array $options - * - * @return Dispatcher - */ - function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) - { - $options += [ - 'routeParser' => 'FastRoute\\RouteParser\\Std', - 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', - 'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', - 'routeCollector' => 'FastRoute\\RouteCollector', - 'cacheDisabled' => false, - ]; - - if (!isset($options['cacheFile'])) { - throw new \LogicException('Must specify "cacheFile" option'); - } - - if (!$options['cacheDisabled'] && file_exists($options['cacheFile'])) { - $dispatchData = require $options['cacheFile']; - if (!is_array($dispatchData)) { - throw new \RuntimeException('Invalid cache file "' . $options['cacheFile'] . '"'); - } - return new $options['dispatcher']($dispatchData); - } - - $routeCollector = new $options['routeCollector']( - new $options['routeParser'], new $options['dataGenerator'] - ); - $routeDefinitionCallback($routeCollector); - - /** @var RouteCollector $routeCollector */ - $dispatchData = $routeCollector->getData(); - if (!$options['cacheDisabled']) { - file_put_contents( - $options['cacheFile'], - ' $this->getDataGeneratorClass(), - 'dispatcher' => $this->getDispatcherClass() - ]; - } - - /** - * @dataProvider provideFoundDispatchCases - */ - public function testFoundDispatches($method, $uri, $callback, $handler, $argDict) - { - $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); - $info = $dispatcher->dispatch($method, $uri); - $this->assertSame($dispatcher::FOUND, $info[0]); - $this->assertSame($handler, $info[1]); - $this->assertSame($argDict, $info[2]); - } - - /** - * @dataProvider provideNotFoundDispatchCases - */ - public function testNotFoundDispatches($method, $uri, $callback) - { - $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); - $routeInfo = $dispatcher->dispatch($method, $uri); - $this->assertArrayNotHasKey(1, $routeInfo, - 'NOT_FOUND result must only contain a single element in the returned info array' - ); - $this->assertSame($dispatcher::NOT_FOUND, $routeInfo[0]); - } - - /** - * @dataProvider provideMethodNotAllowedDispatchCases - */ - public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods) - { - $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); - $routeInfo = $dispatcher->dispatch($method, $uri); - $this->assertArrayHasKey(1, $routeInfo, - 'METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1' - ); - - list($routedStatus, $methodArray) = $dispatcher->dispatch($method, $uri); - $this->assertSame($dispatcher::METHOD_NOT_ALLOWED, $routedStatus); - $this->assertSame($availableMethods, $methodArray); - } - - /** - * @expectedException \FastRoute\BadRouteException - * @expectedExceptionMessage Cannot use the same placeholder "test" twice - */ - public function testDuplicateVariableNameError() - { - \FastRoute\simpleDispatcher(function (RouteCollector $r) { - $r->addRoute('GET', '/foo/{test}/{test:\d+}', 'handler0'); - }, $this->generateDispatcherOptions()); - } - - /** - * @expectedException \FastRoute\BadRouteException - * @expectedExceptionMessage Cannot register two routes matching "/user/([^/]+)" for method "GET" - */ - public function testDuplicateVariableRoute() - { - \FastRoute\simpleDispatcher(function (RouteCollector $r) { - $r->addRoute('GET', '/user/{id}', 'handler0'); // oops, forgot \d+ restriction ;) - $r->addRoute('GET', '/user/{name}', 'handler1'); - }, $this->generateDispatcherOptions()); - } - - /** - * @expectedException \FastRoute\BadRouteException - * @expectedExceptionMessage Cannot register two routes matching "/user" for method "GET" - */ - public function testDuplicateStaticRoute() - { - \FastRoute\simpleDispatcher(function (RouteCollector $r) { - $r->addRoute('GET', '/user', 'handler0'); - $r->addRoute('GET', '/user', 'handler1'); - }, $this->generateDispatcherOptions()); - } - - /** - * @expectedException \FastRoute\BadRouteException - * @expectedExceptionMessage Static route "/user/nikic" is shadowed by previously defined variable route "/user/([^/]+)" for method "GET" - */ - public function testShadowedStaticRoute() - { - \FastRoute\simpleDispatcher(function (RouteCollector $r) { - $r->addRoute('GET', '/user/{name}', 'handler0'); - $r->addRoute('GET', '/user/nikic', 'handler1'); - }, $this->generateDispatcherOptions()); - } - - /** - * @expectedException \FastRoute\BadRouteException - * @expectedExceptionMessage Regex "(en|de)" for parameter "lang" contains a capturing group - */ - public function testCapturing() - { - \FastRoute\simpleDispatcher(function (RouteCollector $r) { - $r->addRoute('GET', '/{lang:(en|de)}', 'handler0'); - }, $this->generateDispatcherOptions()); - } - - public function provideFoundDispatchCases() - { - $cases = []; - - // 0 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/resource/123/456', 'handler0'); - }; - - $method = 'GET'; - $uri = '/resource/123/456'; - $handler = 'handler0'; - $argDict = []; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 1 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/handler0', 'handler0'); - $r->addRoute('GET', '/handler1', 'handler1'); - $r->addRoute('GET', '/handler2', 'handler2'); - }; - - $method = 'GET'; - $uri = '/handler2'; - $handler = 'handler2'; - $argDict = []; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 2 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); - $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); - $r->addRoute('GET', '/user/{name}', 'handler2'); - }; - - $method = 'GET'; - $uri = '/user/rdlowrey'; - $handler = 'handler2'; - $argDict = ['name' => 'rdlowrey']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 3 --------------------------------------------------------------------------------------> - - // reuse $callback from #2 - - $method = 'GET'; - $uri = '/user/12345'; - $handler = 'handler1'; - $argDict = ['id' => '12345']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 4 --------------------------------------------------------------------------------------> - - // reuse $callback from #3 - - $method = 'GET'; - $uri = '/user/NaN'; - $handler = 'handler2'; - $argDict = ['name' => 'NaN']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 5 --------------------------------------------------------------------------------------> - - // reuse $callback from #4 - - $method = 'GET'; - $uri = '/user/rdlowrey/12345'; - $handler = 'handler0'; - $argDict = ['name' => 'rdlowrey', 'id' => '12345']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 6 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler0'); - $r->addRoute('GET', '/user/12345/extension', 'handler1'); - $r->addRoute('GET', '/user/{id:[0-9]+}.{extension}', 'handler2'); - }; - - $method = 'GET'; - $uri = '/user/12345.svg'; - $handler = 'handler2'; - $argDict = ['id' => '12345', 'extension' => 'svg']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 7 ----- Test GET method fallback on HEAD route miss ------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/user/{name}', 'handler0'); - $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler1'); - $r->addRoute('GET', '/static0', 'handler2'); - $r->addRoute('GET', '/static1', 'handler3'); - $r->addRoute('HEAD', '/static1', 'handler4'); - }; - - $method = 'HEAD'; - $uri = '/user/rdlowrey'; - $handler = 'handler0'; - $argDict = ['name' => 'rdlowrey']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 8 ----- Test GET method fallback on HEAD route miss ------------------------------------> - - // reuse $callback from #7 - - $method = 'HEAD'; - $uri = '/user/rdlowrey/1234'; - $handler = 'handler1'; - $argDict = ['name' => 'rdlowrey', 'id' => '1234']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 9 ----- Test GET method fallback on HEAD route miss ------------------------------------> - - // reuse $callback from #8 - - $method = 'HEAD'; - $uri = '/static0'; - $handler = 'handler2'; - $argDict = []; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 10 ---- Test existing HEAD route used if available (no fallback) -----------------------> - - // reuse $callback from #9 - - $method = 'HEAD'; - $uri = '/static1'; - $handler = 'handler4'; - $argDict = []; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 11 ---- More specified routes are not shadowed by less specific of another method ------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/user/{name}', 'handler0'); - $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); - }; - - $method = 'POST'; - $uri = '/user/rdlowrey'; - $handler = 'handler1'; - $argDict = ['name' => 'rdlowrey']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 12 ---- Handler of more specific routes is used, if it occurs first --------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/user/{name}', 'handler0'); - $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); - $r->addRoute('POST', '/user/{name}', 'handler2'); - }; - - $method = 'POST'; - $uri = '/user/rdlowrey'; - $handler = 'handler1'; - $argDict = ['name' => 'rdlowrey']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 13 ---- Route with constant suffix -----------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/user/{name}', 'handler0'); - $r->addRoute('GET', '/user/{name}/edit', 'handler1'); - }; - - $method = 'GET'; - $uri = '/user/rdlowrey/edit'; - $handler = 'handler1'; - $argDict = ['name' => 'rdlowrey']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 14 ---- Handle multiple methods with the same handler ----------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); - $r->addRoute(['DELETE'], '/user', 'handlerDelete'); - $r->addRoute([], '/user', 'handlerNone'); - }; - - $argDict = []; - $cases[] = ['GET', '/user', $callback, 'handlerGetPost', $argDict]; - $cases[] = ['POST', '/user', $callback, 'handlerGetPost', $argDict]; - $cases[] = ['DELETE', '/user', $callback, 'handlerDelete', $argDict]; - - // 17 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('POST', '/user.json', 'handler0'); - $r->addRoute('GET', '/{entity}.json', 'handler1'); - }; - - $cases[] = ['GET', '/user.json', $callback, 'handler1', ['entity' => 'user']]; - - // 18 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '', 'handler0'); - }; - - $cases[] = ['GET', '', $callback, 'handler0', []]; - - // 19 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('HEAD', '/a/{foo}', 'handler0'); - $r->addRoute('GET', '/b/{foo}', 'handler1'); - }; - - $cases[] = ['HEAD', '/b/bar', $callback, 'handler1', ['foo' => 'bar']]; - - // 20 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('HEAD', '/a', 'handler0'); - $r->addRoute('GET', '/b', 'handler1'); - }; - - $cases[] = ['HEAD', '/b', $callback, 'handler1', []]; - - // 21 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/foo', 'handler0'); - $r->addRoute('HEAD', '/{bar}', 'handler1'); - }; - - $cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']]; - - // 22 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('*', '/user', 'handler0'); - $r->addRoute('*', '/{user}', 'handler1'); - $r->addRoute('GET', '/user', 'handler2'); - }; - - $cases[] = ['GET', '/user', $callback, 'handler2', []]; - - // 23 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('*', '/user', 'handler0'); - $r->addRoute('GET', '/user', 'handler1'); - }; - - $cases[] = ['POST', '/user', $callback, 'handler0', []]; - - // 24 ---- - - $cases[] = ['HEAD', '/user', $callback, 'handler1', []]; - - // 25 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/{bar}', 'handler0'); - $r->addRoute('*', '/foo', 'handler1'); - }; - - $cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']]; - - // 26 ---- - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/user', 'handler0'); - $r->addRoute('*', '/{foo:.*}', 'handler1'); - }; - - $cases[] = ['POST', '/bar', $callback, 'handler1', ['foo' => 'bar']]; - - // x --------------------------------------------------------------------------------------> - - return $cases; - } - - public function provideNotFoundDispatchCases() - { - $cases = []; - - // 0 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/resource/123/456', 'handler0'); - }; - - $method = 'GET'; - $uri = '/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 1 --------------------------------------------------------------------------------------> - - // reuse callback from #0 - $method = 'POST'; - $uri = '/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 2 --------------------------------------------------------------------------------------> - - // reuse callback from #1 - $method = 'PUT'; - $uri = '/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 3 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/handler0', 'handler0'); - $r->addRoute('GET', '/handler1', 'handler1'); - $r->addRoute('GET', '/handler2', 'handler2'); - }; - - $method = 'GET'; - $uri = '/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 4 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); - $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); - $r->addRoute('GET', '/user/{name}', 'handler2'); - }; - - $method = 'GET'; - $uri = '/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 5 --------------------------------------------------------------------------------------> - - // reuse callback from #4 - $method = 'GET'; - $uri = '/user/rdlowrey/12345/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 6 --------------------------------------------------------------------------------------> - - // reuse callback from #5 - $method = 'HEAD'; - - $cases[] = [$method, $uri, $callback]; - - // x --------------------------------------------------------------------------------------> - - return $cases; - } - - public function provideMethodNotAllowedDispatchCases() - { - $cases = []; - - // 0 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/resource/123/456', 'handler0'); - }; - - $method = 'POST'; - $uri = '/resource/123/456'; - $allowedMethods = ['GET']; - - $cases[] = [$method, $uri, $callback, $allowedMethods]; - - // 1 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/resource/123/456', 'handler0'); - $r->addRoute('POST', '/resource/123/456', 'handler1'); - $r->addRoute('PUT', '/resource/123/456', 'handler2'); - $r->addRoute('*', '/', 'handler3'); - }; - - $method = 'DELETE'; - $uri = '/resource/123/456'; - $allowedMethods = ['GET', 'POST', 'PUT']; - - $cases[] = [$method, $uri, $callback, $allowedMethods]; - - // 2 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); - $r->addRoute('POST', '/user/{name}/{id:[0-9]+}', 'handler1'); - $r->addRoute('PUT', '/user/{name}/{id:[0-9]+}', 'handler2'); - $r->addRoute('PATCH', '/user/{name}/{id:[0-9]+}', 'handler3'); - }; - - $method = 'DELETE'; - $uri = '/user/rdlowrey/42'; - $allowedMethods = ['GET', 'POST', 'PUT', 'PATCH']; - - $cases[] = [$method, $uri, $callback, $allowedMethods]; - - // 3 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute('POST', '/user/{name}', 'handler1'); - $r->addRoute('PUT', '/user/{name:[a-z]+}', 'handler2'); - $r->addRoute('PATCH', '/user/{name:[a-z]+}', 'handler3'); - }; - - $method = 'GET'; - $uri = '/user/rdlowrey'; - $allowedMethods = ['POST', 'PUT', 'PATCH']; - - $cases[] = [$method, $uri, $callback, $allowedMethods]; - - // 4 --------------------------------------------------------------------------------------> - - $callback = function (RouteCollector $r) { - $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); - $r->addRoute(['DELETE'], '/user', 'handlerDelete'); - $r->addRoute([], '/user', 'handlerNone'); - }; - - $cases[] = ['PUT', '/user', $callback, ['GET', 'POST', 'DELETE']]; - - // 5 - - $callback = function (RouteCollector $r) { - $r->addRoute('POST', '/user.json', 'handler0'); - $r->addRoute('GET', '/{entity}.json', 'handler1'); - }; - - $cases[] = ['PUT', '/user.json', $callback, ['POST', 'GET']]; - - // x --------------------------------------------------------------------------------------> - - return $cases; - } -} diff --git a/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php deleted file mode 100644 index f821ef5..0000000 --- a/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php +++ /dev/null @@ -1,16 +0,0 @@ -markTestSkipped('PHP 5.6 required for MARK support'); - } - } - - protected function getDispatcherClass() - { - return 'FastRoute\\Dispatcher\\MarkBased'; - } - - protected function getDataGeneratorClass() - { - return 'FastRoute\\DataGenerator\\MarkBased'; - } -} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php b/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php deleted file mode 100644 index b6fc53f..0000000 --- a/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php +++ /dev/null @@ -1,44 +0,0 @@ -markTestSkipped('HHVM only'); - } - if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) { - $this->markTestSkipped('classname requires HHVM 3.9+'); - } - - // The typechecker recurses the whole tree, so it makes sure - // that everything in fixtures/ is valid when this runs. - - $output = []; - $exit_code = null; - exec( - 'hh_server --check ' . escapeshellarg(__DIR__ . '/../../') . ' 2>&1', - $output, - $exit_code - ); - if ($exit_code === self::SERVER_ALREADY_RUNNING_CODE) { - $this->assertTrue( - $recurse, - 'Typechecker still running after running hh_client stop' - ); - // Server already running - 3.10 => 3.11 regression: - // https://github.com/facebook/hhvm/issues/6646 - exec('hh_client stop 2>/dev/null'); - $this->testTypechecks(/* recurse = */ false); - return; - - } - $this->assertSame(0, $exit_code, implode("\n", $output)); - } -} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php deleted file mode 100644 index 05a9af2..0000000 --- a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php +++ /dev/null @@ -1,29 +0,0 @@ - {}, - shape( - 'routeParser' => \FastRoute\RouteParser\Std::class, - 'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class, - 'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class, - 'routeCollector' => \FastRoute\RouteCollector::class, - ), - ); -} - -function all_options_cached(): \FastRoute\Dispatcher { - return \FastRoute\cachedDispatcher( - $collector ==> {}, - shape( - 'routeParser' => \FastRoute\RouteParser\Std::class, - 'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class, - 'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class, - 'routeCollector' => \FastRoute\RouteCollector::class, - 'cacheFile' => '/dev/null', - 'cacheDisabled' => false, - ), - ); -} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php deleted file mode 100644 index 61eb541..0000000 --- a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php +++ /dev/null @@ -1,11 +0,0 @@ - {}, shape()); -} - -function empty_options_cached(): \FastRoute\Dispatcher { - return \FastRoute\cachedDispatcher($collector ==> {}, shape()); -} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php deleted file mode 100644 index 44b5422..0000000 --- a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php +++ /dev/null @@ -1,11 +0,0 @@ - {}); -} - -function no_options_cached(): \FastRoute\Dispatcher { - return \FastRoute\cachedDispatcher($collector ==> {}); -} diff --git a/vendor/nikic/fast-route/test/RouteCollectorTest.php b/vendor/nikic/fast-route/test/RouteCollectorTest.php deleted file mode 100644 index cc54407..0000000 --- a/vendor/nikic/fast-route/test/RouteCollectorTest.php +++ /dev/null @@ -1,108 +0,0 @@ -delete('/delete', 'delete'); - $r->get('/get', 'get'); - $r->head('/head', 'head'); - $r->patch('/patch', 'patch'); - $r->post('/post', 'post'); - $r->put('/put', 'put'); - - $expected = [ - ['DELETE', '/delete', 'delete'], - ['GET', '/get', 'get'], - ['HEAD', '/head', 'head'], - ['PATCH', '/patch', 'patch'], - ['POST', '/post', 'post'], - ['PUT', '/put', 'put'], - ]; - - $this->assertSame($expected, $r->routes); - } - - public function testGroups() - { - $r = new DummyRouteCollector(); - - $r->delete('/delete', 'delete'); - $r->get('/get', 'get'); - $r->head('/head', 'head'); - $r->patch('/patch', 'patch'); - $r->post('/post', 'post'); - $r->put('/put', 'put'); - - $r->addGroup('/group-one', function (DummyRouteCollector $r) { - $r->delete('/delete', 'delete'); - $r->get('/get', 'get'); - $r->head('/head', 'head'); - $r->patch('/patch', 'patch'); - $r->post('/post', 'post'); - $r->put('/put', 'put'); - - $r->addGroup('/group-two', function (DummyRouteCollector $r) { - $r->delete('/delete', 'delete'); - $r->get('/get', 'get'); - $r->head('/head', 'head'); - $r->patch('/patch', 'patch'); - $r->post('/post', 'post'); - $r->put('/put', 'put'); - }); - }); - - $r->addGroup('/admin', function (DummyRouteCollector $r) { - $r->get('-some-info', 'admin-some-info'); - }); - $r->addGroup('/admin-', function (DummyRouteCollector $r) { - $r->get('more-info', 'admin-more-info'); - }); - - $expected = [ - ['DELETE', '/delete', 'delete'], - ['GET', '/get', 'get'], - ['HEAD', '/head', 'head'], - ['PATCH', '/patch', 'patch'], - ['POST', '/post', 'post'], - ['PUT', '/put', 'put'], - ['DELETE', '/group-one/delete', 'delete'], - ['GET', '/group-one/get', 'get'], - ['HEAD', '/group-one/head', 'head'], - ['PATCH', '/group-one/patch', 'patch'], - ['POST', '/group-one/post', 'post'], - ['PUT', '/group-one/put', 'put'], - ['DELETE', '/group-one/group-two/delete', 'delete'], - ['GET', '/group-one/group-two/get', 'get'], - ['HEAD', '/group-one/group-two/head', 'head'], - ['PATCH', '/group-one/group-two/patch', 'patch'], - ['POST', '/group-one/group-two/post', 'post'], - ['PUT', '/group-one/group-two/put', 'put'], - ['GET', '/admin-some-info', 'admin-some-info'], - ['GET', '/admin-more-info', 'admin-more-info'], - ]; - - $this->assertSame($expected, $r->routes); - } -} - -class DummyRouteCollector extends RouteCollector -{ - public $routes = []; - - public function __construct() - { - } - - public function addRoute($method, $route, $handler) - { - $route = $this->currentGroupPrefix . $route; - $this->routes[] = [$method, $route, $handler]; - } -} diff --git a/vendor/nikic/fast-route/test/RouteParser/StdTest.php b/vendor/nikic/fast-route/test/RouteParser/StdTest.php deleted file mode 100644 index e13e4de..0000000 --- a/vendor/nikic/fast-route/test/RouteParser/StdTest.php +++ /dev/null @@ -1,154 +0,0 @@ -parse($routeString); - $this->assertSame($expectedRouteDatas, $routeDatas); - } - - /** @dataProvider provideTestParseError */ - public function testParseError($routeString, $expectedExceptionMessage) - { - $parser = new Std(); - $this->setExpectedException('FastRoute\\BadRouteException', $expectedExceptionMessage); - $parser->parse($routeString); - } - - public function provideTestParse() - { - return [ - [ - '/test', - [ - ['/test'], - ] - ], - [ - '/test/{param}', - [ - ['/test/', ['param', '[^/]+']], - ] - ], - [ - '/te{ param }st', - [ - ['/te', ['param', '[^/]+'], 'st'] - ] - ], - [ - '/test/{param1}/test2/{param2}', - [ - ['/test/', ['param1', '[^/]+'], '/test2/', ['param2', '[^/]+']] - ] - ], - [ - '/test/{param:\d+}', - [ - ['/test/', ['param', '\d+']] - ] - ], - [ - '/test/{ param : \d{1,9} }', - [ - ['/test/', ['param', '\d{1,9}']] - ] - ], - [ - '/test[opt]', - [ - ['/test'], - ['/testopt'], - ] - ], - [ - '/test[/{param}]', - [ - ['/test'], - ['/test/', ['param', '[^/]+']], - ] - ], - [ - '/{param}[opt]', - [ - ['/', ['param', '[^/]+']], - ['/', ['param', '[^/]+'], 'opt'] - ] - ], - [ - '/test[/{name}[/{id:[0-9]+}]]', - [ - ['/test'], - ['/test/', ['name', '[^/]+']], - ['/test/', ['name', '[^/]+'], '/', ['id', '[0-9]+']], - ] - ], - [ - '', - [ - [''], - ] - ], - [ - '[test]', - [ - [''], - ['test'], - ] - ], - [ - '/{foo-bar}', - [ - ['/', ['foo-bar', '[^/]+']] - ] - ], - [ - '/{_foo:.*}', - [ - ['/', ['_foo', '.*']] - ] - ], - ]; - } - - public function provideTestParseError() - { - return [ - [ - '/test[opt', - "Number of opening '[' and closing ']' does not match" - ], - [ - '/test[opt[opt2]', - "Number of opening '[' and closing ']' does not match" - ], - [ - '/testopt]', - "Number of opening '[' and closing ']' does not match" - ], - [ - '/test[]', - 'Empty optional part' - ], - [ - '/test[[opt]]', - 'Empty optional part' - ], - [ - '[[test]]', - 'Empty optional part' - ], - [ - '/test[/opt]/required', - 'Optional segments can only occur at the end of a route' - ], - ]; - } -} diff --git a/vendor/nikic/fast-route/test/bootstrap.php b/vendor/nikic/fast-route/test/bootstrap.php deleted file mode 100644 index 3023f41..0000000 --- a/vendor/nikic/fast-route/test/bootstrap.php +++ /dev/null @@ -1,11 +0,0 @@ -clock = $clock; - } - - public function doSomething() - { - /** @var DateTimeImmutable $currentDateAndTime */ - $currentDateAndTime = $this->clock->now(); - // do something useful with that information - } -} -``` - -You can then pick one of the [implementations][implementation-url] of the interface to get a clock. - -If you want to implement the interface, you can require this package and -implement `Psr\Clock\ClockInterface` in your code. - -Don't forget to add `psr/clock-implementation` to your `composer.json`s `provides`-section like this: - -```json -{ - "provides": { - "psr/clock-implementation": "1.0" - } -} -``` - -And please read the [specification text][specification-url] for details on the interface. - -[psr-url]: https://www.php-fig.org/psr/psr-20 -[package-url]: https://packagist.org/packages/psr/clock -[implementation-url]: https://packagist.org/providers/psr/clock-implementation -[specification-url]: https://github.com/php-fig/fig-standards/blob/master/proposed/clock.md diff --git a/vendor/psr/clock/composer.json b/vendor/psr/clock/composer.json deleted file mode 100644 index 77992ed..0000000 --- a/vendor/psr/clock/composer.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "psr/clock", - "description": "Common interface for reading the clock.", - "keywords": ["psr", "psr-20", "time", "clock", "now"], - "homepage": "https://github.com/php-fig/clock", - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "require": { - "php": "^7.0 || ^8.0" - }, - "autoload": { - "psr-4": { - "Psr\\Clock\\": "src/" - } - } -} diff --git a/vendor/psr/clock/src/ClockInterface.php b/vendor/psr/clock/src/ClockInterface.php deleted file mode 100644 index 7b6d8d8..0000000 --- a/vendor/psr/clock/src/ClockInterface.php +++ /dev/null @@ -1,13 +0,0 @@ -=7.4.0" - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - } -} diff --git a/vendor/psr/container/src/ContainerExceptionInterface.php b/vendor/psr/container/src/ContainerExceptionInterface.php deleted file mode 100644 index 0f213f2..0000000 --- a/vendor/psr/container/src/ContainerExceptionInterface.php +++ /dev/null @@ -1,12 +0,0 @@ -logger = $logger; - } - - public function doSomething() - { - if ($this->logger) { - $this->logger->info('Doing work'); - } - - try { - $this->doSomethingElse(); - } catch (Exception $exception) { - $this->logger->error('Oh no!', array('exception' => $exception)); - } - - // do something useful - } -} -``` - -You can then pick one of the implementations of the interface to get a logger. - -If you want to implement the interface, you can require this package and -implement `Psr\Log\LoggerInterface` in your code. Please read the -[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) -for details. diff --git a/vendor/psr/log/composer.json b/vendor/psr/log/composer.json deleted file mode 100644 index 879fc6f..0000000 --- a/vendor/psr/log/composer.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "psr/log", - "description": "Common interface for logging libraries", - "keywords": ["psr", "psr-3", "log"], - "homepage": "https://github.com/php-fig/log", - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "require": { - "php": ">=8.0.0" - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - } -} diff --git a/vendor/psr/log/src/AbstractLogger.php b/vendor/psr/log/src/AbstractLogger.php deleted file mode 100644 index d60a091..0000000 --- a/vendor/psr/log/src/AbstractLogger.php +++ /dev/null @@ -1,15 +0,0 @@ -logger = $logger; - } -} diff --git a/vendor/psr/log/src/LoggerInterface.php b/vendor/psr/log/src/LoggerInterface.php deleted file mode 100644 index cb4cf64..0000000 --- a/vendor/psr/log/src/LoggerInterface.php +++ /dev/null @@ -1,98 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - */ - public function alert(string|\Stringable $message, array $context = []): void - { - $this->log(LogLevel::ALERT, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - */ - public function critical(string|\Stringable $message, array $context = []): void - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - */ - public function error(string|\Stringable $message, array $context = []): void - { - $this->log(LogLevel::ERROR, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - */ - public function warning(string|\Stringable $message, array $context = []): void - { - $this->log(LogLevel::WARNING, $message, $context); - } - - /** - * Normal but significant events. - */ - public function notice(string|\Stringable $message, array $context = []): void - { - $this->log(LogLevel::NOTICE, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - */ - public function info(string|\Stringable $message, array $context = []): void - { - $this->log(LogLevel::INFO, $message, $context); - } - - /** - * Detailed debug information. - */ - public function debug(string|\Stringable $message, array $context = []): void - { - $this->log(LogLevel::DEBUG, $message, $context); - } - - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * - * @throws \Psr\Log\InvalidArgumentException - */ - abstract public function log($level, string|\Stringable $message, array $context = []): void; -} diff --git a/vendor/psr/log/src/NullLogger.php b/vendor/psr/log/src/NullLogger.php deleted file mode 100644 index de0561e..0000000 --- a/vendor/psr/log/src/NullLogger.php +++ /dev/null @@ -1,26 +0,0 @@ -logger) { }` - * blocks. - */ -class NullLogger extends AbstractLogger -{ - /** - * Logs with an arbitrary level. - * - * @param mixed[] $context - * - * @throws \Psr\Log\InvalidArgumentException - */ - public function log($level, string|\Stringable $message, array $context = []): void - { - // noop - } -} diff --git a/vendor/psr/simple-cache/.editorconfig b/vendor/psr/simple-cache/.editorconfig deleted file mode 100644 index 48542cb..0000000 --- a/vendor/psr/simple-cache/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -; This file is for unifying the coding style for different editors and IDEs. -; More information at http://editorconfig.org - -root = true - -[*] -charset = utf-8 -indent_size = 4 -indent_style = space -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true diff --git a/vendor/psr/simple-cache/LICENSE.md b/vendor/psr/simple-cache/LICENSE.md deleted file mode 100644 index e49a7c8..0000000 --- a/vendor/psr/simple-cache/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -# The MIT License (MIT) - -Copyright (c) 2016 PHP Framework Interoperability Group - -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. diff --git a/vendor/psr/simple-cache/README.md b/vendor/psr/simple-cache/README.md deleted file mode 100644 index 43641d1..0000000 --- a/vendor/psr/simple-cache/README.md +++ /dev/null @@ -1,8 +0,0 @@ -PHP FIG Simple Cache PSR -======================== - -This repository holds all interfaces related to PSR-16. - -Note that this is not a cache implementation of its own. It is merely an interface that describes a cache implementation. See [the specification](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-16-simple-cache.md) for more details. - -You can find implementations of the specification by looking for packages providing the [psr/simple-cache-implementation](https://packagist.org/providers/psr/simple-cache-implementation) virtual package. diff --git a/vendor/psr/simple-cache/composer.json b/vendor/psr/simple-cache/composer.json deleted file mode 100644 index f307a84..0000000 --- a/vendor/psr/simple-cache/composer.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "psr/simple-cache", - "description": "Common interfaces for simple caching", - "keywords": ["psr", "psr-16", "cache", "simple-cache", "caching"], - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "require": { - "php": ">=8.0.0" - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - } -} diff --git a/vendor/psr/simple-cache/src/CacheException.php b/vendor/psr/simple-cache/src/CacheException.php deleted file mode 100644 index f61b24c..0000000 --- a/vendor/psr/simple-cache/src/CacheException.php +++ /dev/null @@ -1,10 +0,0 @@ - $keys A list of keys that can be obtained in a single operation. - * @param mixed $default Default value to return for keys that do not exist. - * - * @return iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value. - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $keys is neither an array nor a Traversable, - * or if any of the $keys are not a legal value. - */ - public function getMultiple(iterable $keys, mixed $default = null): iterable; - - /** - * Persists a set of key => value pairs in the cache, with an optional TTL. - * - * @param iterable $values A list of key => value pairs for a multiple-set operation. - * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and - * the driver supports TTL then the library may set a default value - * for it or let the driver take care of that. - * - * @return bool True on success and false on failure. - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $values is neither an array nor a Traversable, - * or if any of the $values are not a legal value. - */ - public function setMultiple(iterable $values, null|int|\DateInterval $ttl = null): bool; - - /** - * Deletes multiple cache items in a single operation. - * - * @param iterable $keys A list of string-based keys to be deleted. - * - * @return bool True if the items were successfully removed. False if there was an error. - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $keys is neither an array nor a Traversable, - * or if any of the $keys are not a legal value. - */ - public function deleteMultiple(iterable $keys): bool; - - /** - * Determines whether an item is present in the cache. - * - * NOTE: It is recommended that has() is only to be used for cache warming type purposes - * and not to be used within your live applications operations for get/set, as this method - * is subject to a race condition where your has() will return true and immediately after, - * another script can remove it making the state of your app out of date. - * - * @param string $key The cache item key. - * - * @return bool - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if the $key string is not a legal value. - */ - public function has(string $key): bool; -} diff --git a/vendor/psr/simple-cache/src/InvalidArgumentException.php b/vendor/psr/simple-cache/src/InvalidArgumentException.php deleted file mode 100644 index 6a9524a..0000000 --- a/vendor/psr/simple-cache/src/InvalidArgumentException.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Clock; - -use Psr\Clock\ClockInterface as PsrClockInterface; - -/** - * A global clock. - * - * @author Nicolas Grekas - */ -final class Clock implements ClockInterface -{ - private static ClockInterface $globalClock; - - public function __construct( - private readonly ?PsrClockInterface $clock = null, - private ?\DateTimeZone $timezone = null, - ) { - } - - /** - * Returns the current global clock. - * - * Note that you should prefer injecting a ClockInterface or using - * ClockAwareTrait when possible instead of using this method. - */ - public static function get(): ClockInterface - { - return self::$globalClock ??= new NativeClock(); - } - - public static function set(PsrClockInterface $clock): void - { - self::$globalClock = $clock instanceof ClockInterface ? $clock : new self($clock); - } - - public function now(): DatePoint - { - $now = ($this->clock ?? self::get())->now(); - - if (!$now instanceof DatePoint) { - $now = DatePoint::createFromInterface($now); - } - - return isset($this->timezone) ? $now->setTimezone($this->timezone) : $now; - } - - public function sleep(float|int $seconds): void - { - $clock = $this->clock ?? self::get(); - - if ($clock instanceof ClockInterface) { - $clock->sleep($seconds); - } else { - (new NativeClock())->sleep($seconds); - } - } - - /** - * @throws \DateInvalidTimeZoneException When $timezone is invalid - */ - public function withTimeZone(\DateTimeZone|string $timezone): static - { - if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) { - $timezone = new \DateTimeZone($timezone); - } elseif (\is_string($timezone)) { - try { - $timezone = new \DateTimeZone($timezone); - } catch (\Exception $e) { - throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e); - } - } - - $clone = clone $this; - $clone->timezone = $timezone; - - return $clone; - } -} diff --git a/vendor/symfony/clock/ClockAwareTrait.php b/vendor/symfony/clock/ClockAwareTrait.php deleted file mode 100644 index e723d7f..0000000 --- a/vendor/symfony/clock/ClockAwareTrait.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Clock; - -use Psr\Clock\ClockInterface; -use Symfony\Contracts\Service\Attribute\Required; - -/** - * A trait to help write time-sensitive classes. - * - * @author Nicolas Grekas - */ -trait ClockAwareTrait -{ - private readonly ClockInterface $clock; - - #[Required] - public function setClock(ClockInterface $clock): void - { - $this->clock = $clock; - } - - protected function now(): DatePoint - { - $now = ($this->clock ??= new Clock())->now(); - - return $now instanceof DatePoint ? $now : DatePoint::createFromInterface($now); - } -} diff --git a/vendor/symfony/clock/ClockInterface.php b/vendor/symfony/clock/ClockInterface.php deleted file mode 100644 index 435775a..0000000 --- a/vendor/symfony/clock/ClockInterface.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Clock; - -use Psr\Clock\ClockInterface as PsrClockInterface; - -/** - * @author Nicolas Grekas - */ -interface ClockInterface extends PsrClockInterface -{ - public function sleep(float|int $seconds): void; - - public function withTimeZone(\DateTimeZone|string $timezone): static; -} diff --git a/vendor/symfony/clock/DatePoint.php b/vendor/symfony/clock/DatePoint.php deleted file mode 100644 index 4df35fe..0000000 --- a/vendor/symfony/clock/DatePoint.php +++ /dev/null @@ -1,169 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Clock; - -/** - * An immmutable DateTime with stricter error handling and return types than the native one. - * - * @author Nicolas Grekas - */ -final class DatePoint extends \DateTimeImmutable -{ - /** - * @throws \DateMalformedStringException When $datetime is invalid - */ - public function __construct(string $datetime = 'now', ?\DateTimeZone $timezone = null, ?parent $reference = null) - { - $now = $reference ?? Clock::get()->now(); - - if ('now' !== $datetime) { - if (!$now instanceof static) { - $now = static::createFromInterface($now); - } - - if (\PHP_VERSION_ID < 80300) { - try { - $builtInDate = new parent($datetime, $timezone ?? $now->getTimezone()); - $timezone = $builtInDate->getTimezone(); - } catch (\Exception $e) { - throw new \DateMalformedStringException($e->getMessage(), $e->getCode(), $e); - } - } else { - $builtInDate = new parent($datetime, $timezone ?? $now->getTimezone()); - $timezone = $builtInDate->getTimezone(); - } - - $now = $now->setTimezone($timezone)->modify($datetime); - - if ('00:00:00.000000' === $builtInDate->format('H:i:s.u')) { - $now = $now->setTime(0, 0); - } - } elseif (null !== $timezone) { - $now = $now->setTimezone($timezone); - } - - $this->__unserialize((array) $now); - } - - /** - * @throws \DateMalformedStringException When $format or $datetime are invalid - */ - public static function createFromFormat(string $format, string $datetime, ?\DateTimeZone $timezone = null): static - { - return parent::createFromFormat($format, $datetime, $timezone) ?: throw new \DateMalformedStringException(static::getLastErrors()['errors'][0] ?? 'Invalid date string or format.'); - } - - public static function createFromInterface(\DateTimeInterface $object): static - { - return parent::createFromInterface($object); - } - - public static function createFromMutable(\DateTime $object): static - { - return parent::createFromMutable($object); - } - - public static function createFromTimestamp(int|float $timestamp): static - { - if (\PHP_VERSION_ID >= 80400) { - return parent::createFromTimestamp($timestamp); - } - - if (\is_int($timestamp) || !$ms = (int) $timestamp - $timestamp) { - return static::createFromFormat('U', (string) $timestamp); - } - - if (!is_finite($timestamp) || \PHP_INT_MAX + 1.0 <= $timestamp || \PHP_INT_MIN > $timestamp) { - throw new \DateRangeError(\sprintf('DateTimeImmutable::createFromTimestamp(): Argument #1 ($timestamp) must be a finite number between %s and %s.999999, %s given', \PHP_INT_MIN, \PHP_INT_MAX, $timestamp)); - } - - if ($timestamp < 0) { - $timestamp = (int) $timestamp - 2.0 + $ms; - } - - return static::createFromFormat('U.u', \sprintf('%.6F', $timestamp)); - } - - public function add(\DateInterval $interval): static - { - return parent::add($interval); - } - - public function sub(\DateInterval $interval): static - { - return parent::sub($interval); - } - - /** - * @throws \DateMalformedStringException When $modifier is invalid - */ - public function modify(string $modifier): static - { - if (\PHP_VERSION_ID < 80300) { - return @parent::modify($modifier) ?: throw new \DateMalformedStringException(error_get_last()['message'] ?? \sprintf('Invalid modifier: "%s".', $modifier)); - } - - return parent::modify($modifier); - } - - public function setTimestamp(int $value): static - { - return parent::setTimestamp($value); - } - - public function setDate(int $year, int $month, int $day): static - { - return parent::setDate($year, $month, $day); - } - - public function setISODate(int $year, int $week, int $day = 1): static - { - return parent::setISODate($year, $week, $day); - } - - public function setTime(int $hour, int $minute, int $second = 0, int $microsecond = 0): static - { - return parent::setTime($hour, $minute, $second, $microsecond); - } - - public function setTimezone(\DateTimeZone $timezone): static - { - return parent::setTimezone($timezone); - } - - public function getTimezone(): \DateTimeZone - { - return parent::getTimezone() ?: throw new \DateInvalidTimeZoneException('The DatePoint object has no timezone.'); - } - - public function setMicrosecond(int $microsecond): static - { - if ($microsecond < 0 || $microsecond > 999999) { - throw new \DateRangeError('DatePoint::setMicrosecond(): Argument #1 ($microsecond) must be between 0 and 999999, '.$microsecond.' given'); - } - - if (\PHP_VERSION_ID < 80400) { - return $this->setTime(...explode('.', $this->format('H.i.s.'.$microsecond))); - } - - return parent::setMicrosecond($microsecond); - } - - public function getMicrosecond(): int - { - if (\PHP_VERSION_ID >= 80400) { - return parent::getMicrosecond(); - } - - return $this->format('u'); - } -} diff --git a/vendor/symfony/clock/LICENSE b/vendor/symfony/clock/LICENSE deleted file mode 100644 index 733c826..0000000 --- a/vendor/symfony/clock/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2022-present Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/clock/MockClock.php b/vendor/symfony/clock/MockClock.php deleted file mode 100644 index 9ba2726..0000000 --- a/vendor/symfony/clock/MockClock.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Clock; - -/** - * A clock that always returns the same date, suitable for testing time-sensitive logic. - * - * Consider using ClockSensitiveTrait in your test cases instead of using this class directly. - * - * @author Nicolas Grekas - */ -final class MockClock implements ClockInterface -{ - private DatePoint $now; - - /** - * @throws \DateMalformedStringException When $now is invalid - * @throws \DateInvalidTimeZoneException When $timezone is invalid - */ - public function __construct(\DateTimeImmutable|string $now = 'now', \DateTimeZone|string|null $timezone = null) - { - if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) { - $timezone = new \DateTimeZone($timezone); - } elseif (\is_string($timezone)) { - try { - $timezone = new \DateTimeZone($timezone); - } catch (\Exception $e) { - throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e); - } - } - - if (\is_string($now)) { - $now = new DatePoint($now, $timezone ?? new \DateTimeZone('UTC')); - } elseif (!$now instanceof DatePoint) { - $now = DatePoint::createFromInterface($now); - } - - $this->now = null !== $timezone ? $now->setTimezone($timezone) : $now; - } - - public function now(): DatePoint - { - return clone $this->now; - } - - public function sleep(float|int $seconds): void - { - $now = (float) $this->now->format('Uu') + $seconds * 1e6; - $now = substr_replace(\sprintf('@%07.0F', $now), '.', -6, 0); - $timezone = $this->now->getTimezone(); - - $this->now = DatePoint::createFromInterface(new \DateTimeImmutable($now, $timezone))->setTimezone($timezone); - } - - /** - * @throws \DateMalformedStringException When $modifier is invalid - */ - public function modify(string $modifier): void - { - if (\PHP_VERSION_ID < 80300) { - $this->now = @$this->now->modify($modifier) ?: throw new \DateMalformedStringException(error_get_last()['message'] ?? \sprintf('Invalid modifier: "%s". Could not modify MockClock.', $modifier)); - - return; - } - - $this->now = $this->now->modify($modifier); - } - - /** - * @throws \DateInvalidTimeZoneException When the timezone name is invalid - */ - public function withTimeZone(\DateTimeZone|string $timezone): static - { - if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) { - $timezone = new \DateTimeZone($timezone); - } elseif (\is_string($timezone)) { - try { - $timezone = new \DateTimeZone($timezone); - } catch (\Exception $e) { - throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e); - } - } - - $clone = clone $this; - $clone->now = $clone->now->setTimezone($timezone); - - return $clone; - } -} diff --git a/vendor/symfony/clock/MonotonicClock.php b/vendor/symfony/clock/MonotonicClock.php deleted file mode 100644 index d27bf9c..0000000 --- a/vendor/symfony/clock/MonotonicClock.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Clock; - -/** - * A monotonic clock suitable for performance profiling. - * - * @author Nicolas Grekas - */ -final class MonotonicClock implements ClockInterface -{ - private int $sOffset; - private int $usOffset; - private \DateTimeZone $timezone; - - /** - * @throws \DateInvalidTimeZoneException When $timezone is invalid - */ - public function __construct(\DateTimeZone|string|null $timezone = null) - { - if (false === $offset = hrtime()) { - throw new \RuntimeException('hrtime() returned false: the runtime environment does not provide access to a monotonic timer.'); - } - - $time = explode(' ', microtime(), 2); - $this->sOffset = $time[1] - $offset[0]; - $this->usOffset = (int) ($time[0] * 1000000) - (int) ($offset[1] / 1000); - - $this->timezone = \is_string($timezone ??= date_default_timezone_get()) ? $this->withTimeZone($timezone)->timezone : $timezone; - } - - public function now(): DatePoint - { - [$s, $us] = hrtime(); - - if (1000000 <= $us = (int) ($us / 1000) + $this->usOffset) { - ++$s; - $us -= 1000000; - } elseif (0 > $us) { - --$s; - $us += 1000000; - } - - if (6 !== \strlen($now = (string) $us)) { - $now = str_pad($now, 6, '0', \STR_PAD_LEFT); - } - - $now = '@'.($s + $this->sOffset).'.'.$now; - - return DatePoint::createFromInterface(new \DateTimeImmutable($now, $this->timezone))->setTimezone($this->timezone); - } - - public function sleep(float|int $seconds): void - { - if (0 < $s = (int) $seconds) { - sleep($s); - } - - if (0 < $us = $seconds - $s) { - usleep((int) ($us * 1E6)); - } - } - - /** - * @throws \DateInvalidTimeZoneException When $timezone is invalid - */ - public function withTimeZone(\DateTimeZone|string $timezone): static - { - if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) { - $timezone = new \DateTimeZone($timezone); - } elseif (\is_string($timezone)) { - try { - $timezone = new \DateTimeZone($timezone); - } catch (\Exception $e) { - throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e); - } - } - - $clone = clone $this; - $clone->timezone = $timezone; - - return $clone; - } -} diff --git a/vendor/symfony/clock/NativeClock.php b/vendor/symfony/clock/NativeClock.php deleted file mode 100644 index b580a88..0000000 --- a/vendor/symfony/clock/NativeClock.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Clock; - -/** - * A clock that relies the system time. - * - * @author Nicolas Grekas - */ -final class NativeClock implements ClockInterface -{ - private \DateTimeZone $timezone; - - /** - * @throws \DateInvalidTimeZoneException When $timezone is invalid - */ - public function __construct(\DateTimeZone|string|null $timezone = null) - { - $this->timezone = \is_string($timezone ??= date_default_timezone_get()) ? $this->withTimeZone($timezone)->timezone : $timezone; - } - - public function now(): DatePoint - { - return DatePoint::createFromInterface(new \DateTimeImmutable('now', $this->timezone)); - } - - public function sleep(float|int $seconds): void - { - if (0 < $s = (int) $seconds) { - sleep($s); - } - - if (0 < $us = $seconds - $s) { - usleep((int) ($us * 1E6)); - } - } - - /** - * @throws \DateInvalidTimeZoneException When $timezone is invalid - */ - public function withTimeZone(\DateTimeZone|string $timezone): static - { - if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) { - $timezone = new \DateTimeZone($timezone); - } elseif (\is_string($timezone)) { - try { - $timezone = new \DateTimeZone($timezone); - } catch (\Exception $e) { - throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e); - } - } - - $clone = clone $this; - $clone->timezone = $timezone; - - return $clone; - } -} diff --git a/vendor/symfony/clock/README.md b/vendor/symfony/clock/README.md deleted file mode 100644 index e80b5d3..0000000 --- a/vendor/symfony/clock/README.md +++ /dev/null @@ -1,47 +0,0 @@ -Clock Component -=============== - -Symfony Clock decouples applications from the system clock. - -Getting Started ---------------- - -```bash -composer require symfony/clock -``` - -```php -use Symfony\Component\Clock\NativeClock; -use Symfony\Component\Clock\ClockInterface; - -class MyClockSensitiveClass -{ - public function __construct( - private ClockInterface $clock, - ) { - // Only if you need to force a timezone: - //$this->clock = $clock->withTimeZone('UTC'); - } - - public function doSomething() - { - $now = $this->clock->now(); - // [...] do something with $now, which is a \DateTimeImmutable object - - $this->clock->sleep(2.5); // Pause execution for 2.5 seconds - } -} - -$clock = new NativeClock(); -$service = new MyClockSensitiveClass($clock); -$service->doSomething(); -``` - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/clock.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/clock/Resources/now.php b/vendor/symfony/clock/Resources/now.php deleted file mode 100644 index 47d086c..0000000 --- a/vendor/symfony/clock/Resources/now.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Clock; - -if (!\function_exists(now::class)) { - /** - * @throws \DateMalformedStringException When the modifier is invalid - */ - function now(string $modifier = 'now'): DatePoint - { - if ('now' !== $modifier) { - return new DatePoint($modifier); - } - - $now = Clock::get()->now(); - - return $now instanceof DatePoint ? $now : DatePoint::createFromInterface($now); - } -} diff --git a/vendor/symfony/clock/Test/ClockSensitiveTrait.php b/vendor/symfony/clock/Test/ClockSensitiveTrait.php deleted file mode 100644 index f71f3a1..0000000 --- a/vendor/symfony/clock/Test/ClockSensitiveTrait.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Clock\Test; - -use PHPUnit\Framework\Attributes\After; -use PHPUnit\Framework\Attributes\Before; -use PHPUnit\Framework\Attributes\BeforeClass; -use Symfony\Component\Clock\Clock; -use Symfony\Component\Clock\ClockInterface; -use Symfony\Component\Clock\MockClock; - -use function Symfony\Component\Clock\now; - -/** - * Helps with mocking the time in your test cases. - * - * This trait provides one self::mockTime() method that freezes the time. - * It restores the global clock after each test case. - * self::mockTime() accepts either a string (eg '+1 days' or '2022-12-22'), - * a DateTimeImmutable, or a boolean (to freeze/restore the global clock). - * - * @author Nicolas Grekas - */ -trait ClockSensitiveTrait -{ - public static function mockTime(string|\DateTimeImmutable|bool $when = true): ClockInterface - { - Clock::set(match (true) { - false === $when => self::saveClockBeforeTest(false), - true === $when => new MockClock(), - $when instanceof \DateTimeImmutable => new MockClock($when), - default => new MockClock(now($when)), - }); - - return Clock::get(); - } - - /** - * @beforeClass - * - * @before - * - * @internal - */ - #[Before] - #[BeforeClass] - public static function saveClockBeforeTest(bool $save = true): ClockInterface - { - static $originalClock; - - if ($save && $originalClock) { - self::restoreClockAfterTest(); - } - - return $save ? $originalClock = Clock::get() : $originalClock; - } - - /** - * @after - * - * @internal - */ - #[After] - protected static function restoreClockAfterTest(): void - { - Clock::set(self::saveClockBeforeTest(false)); - } -} diff --git a/vendor/symfony/clock/composer.json b/vendor/symfony/clock/composer.json deleted file mode 100644 index 491215f..0000000 --- a/vendor/symfony/clock/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "symfony/clock", - "type": "library", - "description": "Decouples applications from the system clock", - "keywords": ["clock", "time", "psr20"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "provide": { - "psr/clock-implementation": "1.0" - }, - "require": { - "php": ">=8.2", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" - }, - "autoload": { - "files": [ "Resources/now.php" ], - "psr-4": { "Symfony\\Component\\Clock\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/vendor/symfony/deprecation-contracts/CHANGELOG.md b/vendor/symfony/deprecation-contracts/CHANGELOG.md deleted file mode 100644 index 7932e26..0000000 --- a/vendor/symfony/deprecation-contracts/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -CHANGELOG -========= - -The changelog is maintained for all Symfony contracts at the following URL: -https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/vendor/symfony/deprecation-contracts/LICENSE b/vendor/symfony/deprecation-contracts/LICENSE deleted file mode 100644 index 0ed3a24..0000000 --- a/vendor/symfony/deprecation-contracts/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020-present Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/deprecation-contracts/README.md b/vendor/symfony/deprecation-contracts/README.md deleted file mode 100644 index 9814864..0000000 --- a/vendor/symfony/deprecation-contracts/README.md +++ /dev/null @@ -1,26 +0,0 @@ -Symfony Deprecation Contracts -============================= - -A generic function and convention to trigger deprecation notices. - -This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices. - -By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component, -the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments. - -The function requires at least 3 arguments: - - the name of the Composer package that is triggering the deprecation - - the version of the package that introduced the deprecation - - the message of the deprecation - - more arguments can be provided: they will be inserted in the message using `printf()` formatting - -Example: -```php -trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin'); -``` - -This will generate the following message: -`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.` - -While not recommended, the deprecation notices can be completely ignored by declaring an empty -`function trigger_deprecation() {}` in your application. diff --git a/vendor/symfony/deprecation-contracts/composer.json b/vendor/symfony/deprecation-contracts/composer.json deleted file mode 100644 index ceb6c07..0000000 --- a/vendor/symfony/deprecation-contracts/composer.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "symfony/deprecation-contracts", - "type": "library", - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=8.1" - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - } -} diff --git a/vendor/symfony/deprecation-contracts/function.php b/vendor/symfony/deprecation-contracts/function.php deleted file mode 100644 index 2d56512..0000000 --- a/vendor/symfony/deprecation-contracts/function.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (!function_exists('trigger_deprecation')) { - /** - * Triggers a silenced deprecation notice. - * - * @param string $package The name of the Composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string $message The message of the deprecation - * @param mixed ...$args Values to insert in the message using printf() formatting - * - * @author Nicolas Grekas - */ - function trigger_deprecation(string $package, string $version, string $message, mixed ...$args): void - { - @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED); - } -} diff --git a/vendor/symfony/polyfill-mbstring/LICENSE b/vendor/symfony/polyfill-mbstring/LICENSE deleted file mode 100644 index 6e3afce..0000000 --- a/vendor/symfony/polyfill-mbstring/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015-present Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php deleted file mode 100644 index 3d45c9d..0000000 --- a/vendor/symfony/polyfill-mbstring/Mbstring.php +++ /dev/null @@ -1,1045 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Mbstring; - -/** - * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. - * - * Implemented: - * - mb_chr - Returns a specific character from its Unicode code point - * - mb_convert_encoding - Convert character encoding - * - mb_convert_variables - Convert character code in variable(s) - * - mb_decode_mimeheader - Decode string in MIME header field - * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED - * - mb_decode_numericentity - Decode HTML numeric string reference to character - * - mb_encode_numericentity - Encode character to HTML numeric string reference - * - mb_convert_case - Perform case folding on a string - * - mb_detect_encoding - Detect character encoding - * - mb_get_info - Get internal settings of mbstring - * - mb_http_input - Detect HTTP input character encoding - * - mb_http_output - Set/Get HTTP output character encoding - * - mb_internal_encoding - Set/Get internal character encoding - * - mb_list_encodings - Returns an array of all supported encodings - * - mb_ord - Returns the Unicode code point of a character - * - mb_output_handler - Callback function converts character encoding in output buffer - * - mb_scrub - Replaces ill-formed byte sequences with substitute characters - * - mb_strlen - Get string length - * - mb_strpos - Find position of first occurrence of string in a string - * - mb_strrpos - Find position of last occurrence of a string in a string - * - mb_str_split - Convert a string to an array - * - mb_strtolower - Make a string lowercase - * - mb_strtoupper - Make a string uppercase - * - mb_substitute_character - Set/Get substitution character - * - mb_substr - Get part of string - * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive - * - mb_stristr - Finds first occurrence of a string within another, case insensitive - * - mb_strrchr - Finds the last occurrence of a character in a string within another - * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive - * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive - * - mb_strstr - Finds first occurrence of a string within another - * - mb_strwidth - Return width of string - * - mb_substr_count - Count the number of substring occurrences - * - mb_ucfirst - Make a string's first character uppercase - * - mb_lcfirst - Make a string's first character lowercase - * - mb_trim - Strip whitespace (or other characters) from the beginning and end of a string - * - mb_ltrim - Strip whitespace (or other characters) from the beginning of a string - * - mb_rtrim - Strip whitespace (or other characters) from the end of a string - * - * Not implemented: - * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) - * - mb_ereg_* - Regular expression with multibyte support - * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable - * - mb_preferred_mime_name - Get MIME charset string - * - mb_regex_encoding - Returns current encoding for multibyte regex as string - * - mb_regex_set_options - Set/Get the default options for mbregex functions - * - mb_send_mail - Send encoded mail - * - mb_split - Split multibyte string using regular expression - * - mb_strcut - Get part of string - * - mb_strimwidth - Get truncated string with specified width - * - * @author Nicolas Grekas - * - * @internal - */ -final class Mbstring -{ - public const MB_CASE_FOLD = \PHP_INT_MAX; - - private const SIMPLE_CASE_FOLD = [ - ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"], - ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'], - ]; - - private static $encodingList = ['ASCII', 'UTF-8']; - private static $language = 'neutral'; - private static $internalEncoding = 'UTF-8'; - - public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) - { - if (\is_array($s)) { - $r = []; - foreach ($s as $str) { - $r[] = self::mb_convert_encoding($str, $toEncoding, $fromEncoding); - } - - return $r; - } - - if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) { - $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); - } else { - $fromEncoding = self::getEncoding($fromEncoding); - } - - $toEncoding = self::getEncoding($toEncoding); - - if ('BASE64' === $fromEncoding) { - $s = base64_decode($s); - $fromEncoding = $toEncoding; - } - - if ('BASE64' === $toEncoding) { - return base64_encode($s); - } - - if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { - if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { - $fromEncoding = 'Windows-1252'; - } - if ('UTF-8' !== $fromEncoding) { - $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); - } - - return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); - } - - if ('HTML-ENTITIES' === $fromEncoding) { - $s = html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); - $fromEncoding = 'UTF-8'; - } - - return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); - } - - public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) - { - $ok = true; - array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { - if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { - $ok = false; - } - }); - - return $ok ? $fromEncoding : false; - } - - public static function mb_decode_mimeheader($s) - { - return iconv_mime_decode($s, 2, self::$internalEncoding); - } - - public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) - { - trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); - } - - public static function mb_decode_numericentity($s, $convmap, $encoding = null) - { - if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { - trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); - - return null; - } - - if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { - return false; - } - - if (null !== $encoding && !\is_scalar($encoding)) { - trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); - - return ''; // Instead of null (cf. mb_encode_numericentity). - } - - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - $cnt = floor(\count($convmap) / 4) * 4; - - for ($i = 0; $i < $cnt; $i += 4) { - // collector_decode_htmlnumericentity ignores $convmap[$i + 3] - $convmap[$i] += $convmap[$i + 2]; - $convmap[$i + 1] += $convmap[$i + 2]; - } - - $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { - $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; - for ($i = 0; $i < $cnt; $i += 4) { - if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { - return self::mb_chr($c - $convmap[$i + 2]); - } - } - - return $m[0]; - }, $s); - - if (null === $encoding) { - return $s; - } - - return iconv('UTF-8', $encoding.'//IGNORE', $s); - } - - public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) - { - if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { - trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); - - return null; - } - - if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { - return false; - } - - if (null !== $encoding && !\is_scalar($encoding)) { - trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); - - return null; // Instead of '' (cf. mb_decode_numericentity). - } - - if (null !== $is_hex && !\is_scalar($is_hex)) { - trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING); - - return null; - } - - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; - - $cnt = floor(\count($convmap) / 4) * 4; - $i = 0; - $len = \strlen($s); - $result = ''; - - while ($i < $len) { - $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; - $uchr = substr($s, $i, $ulen); - $i += $ulen; - $c = self::mb_ord($uchr); - - for ($j = 0; $j < $cnt; $j += 4) { - if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { - $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; - $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; - continue 2; - } - } - $result .= $uchr; - } - - if (null === $encoding) { - return $result; - } - - return iconv('UTF-8', $encoding.'//IGNORE', $result); - } - - public static function mb_convert_case($s, $mode, $encoding = null) - { - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - if (\MB_CASE_TITLE == $mode) { - static $titleRegexp = null; - if (null === $titleRegexp) { - $titleRegexp = self::getData('titleCaseRegexp'); - } - $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s); - } else { - if (\MB_CASE_UPPER == $mode) { - static $upper = null; - if (null === $upper) { - $upper = self::getData('upperCase'); - } - $map = $upper; - } else { - if (self::MB_CASE_FOLD === $mode) { - static $caseFolding = null; - if (null === $caseFolding) { - $caseFolding = self::getData('caseFolding'); - } - $s = strtr($s, $caseFolding); - } - - static $lower = null; - if (null === $lower) { - $lower = self::getData('lowerCase'); - } - $map = $lower; - } - - static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; - - $i = 0; - $len = \strlen($s); - - while ($i < $len) { - $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; - $uchr = substr($s, $i, $ulen); - $i += $ulen; - - if (isset($map[$uchr])) { - $uchr = $map[$uchr]; - $nlen = \strlen($uchr); - - if ($nlen == $ulen) { - $nlen = $i; - do { - $s[--$nlen] = $uchr[--$ulen]; - } while ($ulen); - } else { - $s = substr_replace($s, $uchr, $i - $ulen, $ulen); - $len += $nlen - $ulen; - $i += $nlen - $ulen; - } - } - } - } - - if (null === $encoding) { - return $s; - } - - return iconv('UTF-8', $encoding.'//IGNORE', $s); - } - - public static function mb_internal_encoding($encoding = null) - { - if (null === $encoding) { - return self::$internalEncoding; - } - - $normalizedEncoding = self::getEncoding($encoding); - - if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) { - self::$internalEncoding = $normalizedEncoding; - - return true; - } - - if (80000 > \PHP_VERSION_ID) { - return false; - } - - throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); - } - - public static function mb_language($lang = null) - { - if (null === $lang) { - return self::$language; - } - - switch ($normalizedLang = strtolower($lang)) { - case 'uni': - case 'neutral': - self::$language = $normalizedLang; - - return true; - } - - if (80000 > \PHP_VERSION_ID) { - return false; - } - - throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); - } - - public static function mb_list_encodings() - { - return ['UTF-8']; - } - - public static function mb_encoding_aliases($encoding) - { - switch (strtoupper($encoding)) { - case 'UTF8': - case 'UTF-8': - return ['utf8']; - } - - return false; - } - - public static function mb_check_encoding($var = null, $encoding = null) - { - if (null === $encoding) { - if (null === $var) { - return false; - } - $encoding = self::$internalEncoding; - } - - if (!\is_array($var)) { - return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var); - } - - foreach ($var as $key => $value) { - if (!self::mb_check_encoding($key, $encoding)) { - return false; - } - if (!self::mb_check_encoding($value, $encoding)) { - return false; - } - } - - return true; - } - - public static function mb_detect_encoding($str, $encodingList = null, $strict = false) - { - if (null === $encodingList) { - $encodingList = self::$encodingList; - } else { - if (!\is_array($encodingList)) { - $encodingList = array_map('trim', explode(',', $encodingList)); - } - $encodingList = array_map('strtoupper', $encodingList); - } - - foreach ($encodingList as $enc) { - switch ($enc) { - case 'ASCII': - if (!preg_match('/[\x80-\xFF]/', $str)) { - return $enc; - } - break; - - case 'UTF8': - case 'UTF-8': - if (preg_match('//u', $str)) { - return 'UTF-8'; - } - break; - - default: - if (0 === strncmp($enc, 'ISO-8859-', 9)) { - return $enc; - } - } - } - - return false; - } - - public static function mb_detect_order($encodingList = null) - { - if (null === $encodingList) { - return self::$encodingList; - } - - if (!\is_array($encodingList)) { - $encodingList = array_map('trim', explode(',', $encodingList)); - } - $encodingList = array_map('strtoupper', $encodingList); - - foreach ($encodingList as $enc) { - switch ($enc) { - default: - if (strncmp($enc, 'ISO-8859-', 9)) { - return false; - } - // no break - case 'ASCII': - case 'UTF8': - case 'UTF-8': - } - } - - self::$encodingList = $encodingList; - - return true; - } - - public static function mb_strlen($s, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return \strlen($s); - } - - return @iconv_strlen($s, $encoding); - } - - public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return strpos($haystack, $needle, $offset); - } - - $needle = (string) $needle; - if ('' === $needle) { - if (80000 > \PHP_VERSION_ID) { - trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING); - - return false; - } - - return 0; - } - - return iconv_strpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return strrpos($haystack, $needle, $offset); - } - - if ($offset != (int) $offset) { - $offset = 0; - } elseif ($offset = (int) $offset) { - if ($offset < 0) { - if (0 > $offset += self::mb_strlen($needle)) { - $haystack = self::mb_substr($haystack, 0, $offset, $encoding); - } - $offset = 0; - } else { - $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); - } - } - - $pos = '' !== $needle || 80000 > \PHP_VERSION_ID - ? iconv_strrpos($haystack, $needle, $encoding) - : self::mb_strlen($haystack, $encoding); - - return false !== $pos ? $offset + $pos : false; - } - - public static function mb_str_split($string, $split_length = 1, $encoding = null) - { - if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { - trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING); - - return null; - } - - if (1 > $split_length = (int) $split_length) { - if (80000 > \PHP_VERSION_ID) { - trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); - - return false; - } - - throw new \ValueError('Argument #2 ($length) must be greater than 0'); - } - - if (null === $encoding) { - $encoding = mb_internal_encoding(); - } - - if ('UTF-8' === $encoding = self::getEncoding($encoding)) { - $rx = '/('; - while (65535 < $split_length) { - $rx .= '.{65535}'; - $split_length -= 65535; - } - $rx .= '.{'.$split_length.'})/us'; - - return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); - } - - $result = []; - $length = mb_strlen($string, $encoding); - - for ($i = 0; $i < $length; $i += $split_length) { - $result[] = mb_substr($string, $i, $split_length, $encoding); - } - - return $result; - } - - public static function mb_strtolower($s, $encoding = null) - { - return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); - } - - public static function mb_strtoupper($s, $encoding = null) - { - return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); - } - - public static function mb_substitute_character($c = null) - { - if (null === $c) { - return 'none'; - } - if (0 === strcasecmp($c, 'none')) { - return true; - } - if (80000 > \PHP_VERSION_ID) { - return false; - } - if (\is_int($c) || 'long' === $c || 'entity' === $c) { - return false; - } - - throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); - } - - public static function mb_substr($s, $start, $length = null, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return (string) substr($s, $start, null === $length ? 2147483647 : $length); - } - - if ($start < 0) { - $start = iconv_strlen($s, $encoding) + $start; - if ($start < 0) { - $start = 0; - } - } - - if (null === $length) { - $length = 2147483647; - } elseif ($length < 0) { - $length = iconv_strlen($s, $encoding) + $length - $start; - if ($length < 0) { - return ''; - } - } - - return (string) iconv_substr($s, $start, $length, $encoding); - } - - public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) - { - [$haystack, $needle] = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [ - self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding), - self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding), - ]); - - return self::mb_strpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) - { - $pos = self::mb_stripos($haystack, $needle, 0, $encoding); - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - $pos = strrpos($haystack, $needle); - } else { - $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = iconv_strrpos($haystack, $needle, $encoding); - } - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) - { - $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = self::mb_strripos($haystack, $needle, $encoding); - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) - { - $haystack = self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding); - $needle = self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding); - - $haystack = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack); - $needle = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle); - - return self::mb_strrpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) - { - $pos = strpos($haystack, $needle); - if (false === $pos) { - return false; - } - if ($part) { - return substr($haystack, 0, $pos); - } - - return substr($haystack, $pos); - } - - public static function mb_get_info($type = 'all') - { - $info = [ - 'internal_encoding' => self::$internalEncoding, - 'http_output' => 'pass', - 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', - 'func_overload' => 0, - 'func_overload_list' => 'no overload', - 'mail_charset' => 'UTF-8', - 'mail_header_encoding' => 'BASE64', - 'mail_body_encoding' => 'BASE64', - 'illegal_chars' => 0, - 'encoding_translation' => 'Off', - 'language' => self::$language, - 'detect_order' => self::$encodingList, - 'substitute_character' => 'none', - 'strict_detection' => 'Off', - ]; - - if ('all' === $type) { - return $info; - } - if (isset($info[$type])) { - return $info[$type]; - } - - return false; - } - - public static function mb_http_input($type = '') - { - return false; - } - - public static function mb_http_output($encoding = null) - { - return null !== $encoding ? 'pass' === $encoding : 'pass'; - } - - public static function mb_strwidth($s, $encoding = null) - { - $encoding = self::getEncoding($encoding); - - if ('UTF-8' !== $encoding) { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); - - return ($wide << 1) + iconv_strlen($s, 'UTF-8'); - } - - public static function mb_substr_count($haystack, $needle, $encoding = null) - { - return substr_count($haystack, $needle); - } - - public static function mb_output_handler($contents, $status) - { - return $contents; - } - - public static function mb_chr($code, $encoding = null) - { - if (0x80 > $code %= 0x200000) { - $s = \chr($code); - } elseif (0x800 > $code) { - $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); - } elseif (0x10000 > $code) { - $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } else { - $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } - - if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { - $s = mb_convert_encoding($s, $encoding, 'UTF-8'); - } - - return $s; - } - - public static function mb_ord($s, $encoding = null) - { - if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { - $s = mb_convert_encoding($s, 'UTF-8', $encoding); - } - - if (1 === \strlen($s)) { - return \ord($s); - } - - $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; - if (0xF0 <= $code) { - return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; - } - if (0xE0 <= $code) { - return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; - } - if (0xC0 <= $code) { - return (($code - 0xC0) << 6) + $s[2] - 0x80; - } - - return $code; - } - - public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null): string - { - if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) { - throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); - } - - if (null === $encoding) { - $encoding = self::mb_internal_encoding(); - } else { - self::assertEncoding($encoding, 'mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given'); - } - - if (self::mb_strlen($pad_string, $encoding) <= 0) { - throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); - } - - $paddingRequired = $length - self::mb_strlen($string, $encoding); - - if ($paddingRequired < 1) { - return $string; - } - - switch ($pad_type) { - case \STR_PAD_LEFT: - return self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string; - case \STR_PAD_RIGHT: - return $string.self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding); - default: - $leftPaddingLength = floor($paddingRequired / 2); - $rightPaddingLength = $paddingRequired - $leftPaddingLength; - - return self::mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.self::mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding); - } - } - - public static function mb_ucfirst(string $string, ?string $encoding = null): string - { - if (null === $encoding) { - $encoding = self::mb_internal_encoding(); - } else { - self::assertEncoding($encoding, 'mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given'); - } - - $firstChar = mb_substr($string, 0, 1, $encoding); - $firstChar = mb_convert_case($firstChar, \MB_CASE_TITLE, $encoding); - - return $firstChar.mb_substr($string, 1, null, $encoding); - } - - public static function mb_lcfirst(string $string, ?string $encoding = null): string - { - if (null === $encoding) { - $encoding = self::mb_internal_encoding(); - } else { - self::assertEncoding($encoding, 'mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given'); - } - - $firstChar = mb_substr($string, 0, 1, $encoding); - $firstChar = mb_convert_case($firstChar, \MB_CASE_LOWER, $encoding); - - return $firstChar.mb_substr($string, 1, null, $encoding); - } - - private static function getSubpart($pos, $part, $haystack, $encoding) - { - if (false === $pos) { - return false; - } - if ($part) { - return self::mb_substr($haystack, 0, $pos, $encoding); - } - - return self::mb_substr($haystack, $pos, null, $encoding); - } - - private static function html_encoding_callback(array $m) - { - $i = 1; - $entities = ''; - $m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); - - while (isset($m[$i])) { - if (0x80 > $m[$i]) { - $entities .= \chr($m[$i++]); - continue; - } - if (0xF0 <= $m[$i]) { - $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; - } elseif (0xE0 <= $m[$i]) { - $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; - } else { - $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; - } - - $entities .= '&#'.$c.';'; - } - - return $entities; - } - - private static function title_case(array $s) - { - return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); - } - - private static function getData($file) - { - if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { - return require $file; - } - - return false; - } - - private static function getEncoding($encoding) - { - if (null === $encoding) { - return self::$internalEncoding; - } - - if ('UTF-8' === $encoding) { - return 'UTF-8'; - } - - $encoding = strtoupper($encoding); - - if ('8BIT' === $encoding || 'BINARY' === $encoding) { - return 'CP850'; - } - - if ('UTF8' === $encoding) { - return 'UTF-8'; - } - - return $encoding; - } - - public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string - { - return self::mb_internal_trim('{^[%s]+|[%1$s]+$}Du', $string, $characters, $encoding, __FUNCTION__); - } - - public static function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string - { - return self::mb_internal_trim('{^[%s]+}Du', $string, $characters, $encoding, __FUNCTION__); - } - - public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string - { - return self::mb_internal_trim('{[%s]+$}D', $string, $characters, $encoding, __FUNCTION__); - } - - private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function): string - { - if (null === $encoding) { - $encoding = self::mb_internal_encoding(); - } else { - self::assertEncoding($encoding, $function.'(): Argument #3 ($encoding) must be a valid encoding, "%s" given'); - } - - if ('' === $characters) { - return null === $encoding ? $string : self::mb_convert_encoding($string, $encoding); - } - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $string)) { - $string = @iconv('UTF-8', 'UTF-8//IGNORE', $string); - } - if (null !== $characters && !preg_match('//u', $characters)) { - $characters = @iconv('UTF-8', 'UTF-8//IGNORE', $characters); - } - } else { - $string = iconv($encoding, 'UTF-8//IGNORE', $string); - - if (null !== $characters) { - $characters = iconv($encoding, 'UTF-8//IGNORE', $characters); - } - } - - if (null === $characters) { - $characters = "\\0 \f\n\r\t\v\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}"; - } else { - $characters = preg_quote($characters); - } - - $string = preg_replace(sprintf($regex, $characters), '', $string); - - if (null === $encoding) { - return $string; - } - - return iconv('UTF-8', $encoding.'//IGNORE', $string); - } - - private static function assertEncoding(string $encoding, string $errorFormat): void - { - try { - $validEncoding = @self::mb_check_encoding('', $encoding); - } catch (\ValueError $e) { - throw new \ValueError(sprintf($errorFormat, $encoding)); - } - - // BC for PHP 7.3 and lower - if (!$validEncoding) { - throw new \ValueError(sprintf($errorFormat, $encoding)); - } - } -} diff --git a/vendor/symfony/polyfill-mbstring/README.md b/vendor/symfony/polyfill-mbstring/README.md deleted file mode 100644 index 478b40d..0000000 --- a/vendor/symfony/polyfill-mbstring/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Symfony Polyfill / Mbstring -=========================== - -This component provides a partial, native PHP implementation for the -[Mbstring](https://php.net/mbstring) extension. - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php deleted file mode 100644 index 512bba0..0000000 --- a/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php +++ /dev/null @@ -1,119 +0,0 @@ - 'i̇', - 'µ' => 'μ', - 'ſ' => 's', - 'ͅ' => 'ι', - 'ς' => 'σ', - 'ϐ' => 'β', - 'ϑ' => 'θ', - 'ϕ' => 'φ', - 'ϖ' => 'π', - 'ϰ' => 'κ', - 'ϱ' => 'ρ', - 'ϵ' => 'ε', - 'ẛ' => 'ṡ', - 'ι' => 'ι', - 'ß' => 'ss', - 'ʼn' => 'ʼn', - 'ǰ' => 'ǰ', - 'ΐ' => 'ΐ', - 'ΰ' => 'ΰ', - 'և' => 'եւ', - 'ẖ' => 'ẖ', - 'ẗ' => 'ẗ', - 'ẘ' => 'ẘ', - 'ẙ' => 'ẙ', - 'ẚ' => 'aʾ', - 'ẞ' => 'ss', - 'ὐ' => 'ὐ', - 'ὒ' => 'ὒ', - 'ὔ' => 'ὔ', - 'ὖ' => 'ὖ', - 'ᾀ' => 'ἀι', - 'ᾁ' => 'ἁι', - 'ᾂ' => 'ἂι', - 'ᾃ' => 'ἃι', - 'ᾄ' => 'ἄι', - 'ᾅ' => 'ἅι', - 'ᾆ' => 'ἆι', - 'ᾇ' => 'ἇι', - 'ᾈ' => 'ἀι', - 'ᾉ' => 'ἁι', - 'ᾊ' => 'ἂι', - 'ᾋ' => 'ἃι', - 'ᾌ' => 'ἄι', - 'ᾍ' => 'ἅι', - 'ᾎ' => 'ἆι', - 'ᾏ' => 'ἇι', - 'ᾐ' => 'ἠι', - 'ᾑ' => 'ἡι', - 'ᾒ' => 'ἢι', - 'ᾓ' => 'ἣι', - 'ᾔ' => 'ἤι', - 'ᾕ' => 'ἥι', - 'ᾖ' => 'ἦι', - 'ᾗ' => 'ἧι', - 'ᾘ' => 'ἠι', - 'ᾙ' => 'ἡι', - 'ᾚ' => 'ἢι', - 'ᾛ' => 'ἣι', - 'ᾜ' => 'ἤι', - 'ᾝ' => 'ἥι', - 'ᾞ' => 'ἦι', - 'ᾟ' => 'ἧι', - 'ᾠ' => 'ὠι', - 'ᾡ' => 'ὡι', - 'ᾢ' => 'ὢι', - 'ᾣ' => 'ὣι', - 'ᾤ' => 'ὤι', - 'ᾥ' => 'ὥι', - 'ᾦ' => 'ὦι', - 'ᾧ' => 'ὧι', - 'ᾨ' => 'ὠι', - 'ᾩ' => 'ὡι', - 'ᾪ' => 'ὢι', - 'ᾫ' => 'ὣι', - 'ᾬ' => 'ὤι', - 'ᾭ' => 'ὥι', - 'ᾮ' => 'ὦι', - 'ᾯ' => 'ὧι', - 'ᾲ' => 'ὰι', - 'ᾳ' => 'αι', - 'ᾴ' => 'άι', - 'ᾶ' => 'ᾶ', - 'ᾷ' => 'ᾶι', - 'ᾼ' => 'αι', - 'ῂ' => 'ὴι', - 'ῃ' => 'ηι', - 'ῄ' => 'ήι', - 'ῆ' => 'ῆ', - 'ῇ' => 'ῆι', - 'ῌ' => 'ηι', - 'ῒ' => 'ῒ', - 'ῖ' => 'ῖ', - 'ῗ' => 'ῗ', - 'ῢ' => 'ῢ', - 'ῤ' => 'ῤ', - 'ῦ' => 'ῦ', - 'ῧ' => 'ῧ', - 'ῲ' => 'ὼι', - 'ῳ' => 'ωι', - 'ῴ' => 'ώι', - 'ῶ' => 'ῶ', - 'ῷ' => 'ῶι', - 'ῼ' => 'ωι', - 'ff' => 'ff', - 'fi' => 'fi', - 'fl' => 'fl', - 'ffi' => 'ffi', - 'ffl' => 'ffl', - 'ſt' => 'st', - 'st' => 'st', - 'ﬓ' => 'մն', - 'ﬔ' => 'մե', - 'ﬕ' => 'մի', - 'ﬖ' => 'վն', - 'ﬗ' => 'մխ', -]; diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php deleted file mode 100644 index fac60b0..0000000 --- a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +++ /dev/null @@ -1,1397 +0,0 @@ - 'a', - 'B' => 'b', - 'C' => 'c', - 'D' => 'd', - 'E' => 'e', - 'F' => 'f', - 'G' => 'g', - 'H' => 'h', - 'I' => 'i', - 'J' => 'j', - 'K' => 'k', - 'L' => 'l', - 'M' => 'm', - 'N' => 'n', - 'O' => 'o', - 'P' => 'p', - 'Q' => 'q', - 'R' => 'r', - 'S' => 's', - 'T' => 't', - 'U' => 'u', - 'V' => 'v', - 'W' => 'w', - 'X' => 'x', - 'Y' => 'y', - 'Z' => 'z', - 'À' => 'à', - 'Á' => 'á', - 'Â' => 'â', - 'Ã' => 'ã', - 'Ä' => 'ä', - 'Å' => 'å', - 'Æ' => 'æ', - 'Ç' => 'ç', - 'È' => 'è', - 'É' => 'é', - 'Ê' => 'ê', - 'Ë' => 'ë', - 'Ì' => 'ì', - 'Í' => 'í', - 'Î' => 'î', - 'Ï' => 'ï', - 'Ð' => 'ð', - 'Ñ' => 'ñ', - 'Ò' => 'ò', - 'Ó' => 'ó', - 'Ô' => 'ô', - 'Õ' => 'õ', - 'Ö' => 'ö', - 'Ø' => 'ø', - 'Ù' => 'ù', - 'Ú' => 'ú', - 'Û' => 'û', - 'Ü' => 'ü', - 'Ý' => 'ý', - 'Þ' => 'þ', - 'Ā' => 'ā', - 'Ă' => 'ă', - 'Ą' => 'ą', - 'Ć' => 'ć', - 'Ĉ' => 'ĉ', - 'Ċ' => 'ċ', - 'Č' => 'č', - 'Ď' => 'ď', - 'Đ' => 'đ', - 'Ē' => 'ē', - 'Ĕ' => 'ĕ', - 'Ė' => 'ė', - 'Ę' => 'ę', - 'Ě' => 'ě', - 'Ĝ' => 'ĝ', - 'Ğ' => 'ğ', - 'Ġ' => 'ġ', - 'Ģ' => 'ģ', - 'Ĥ' => 'ĥ', - 'Ħ' => 'ħ', - 'Ĩ' => 'ĩ', - 'Ī' => 'ī', - 'Ĭ' => 'ĭ', - 'Į' => 'į', - 'İ' => 'i̇', - 'IJ' => 'ij', - 'Ĵ' => 'ĵ', - 'Ķ' => 'ķ', - 'Ĺ' => 'ĺ', - 'Ļ' => 'ļ', - 'Ľ' => 'ľ', - 'Ŀ' => 'ŀ', - 'Ł' => 'ł', - 'Ń' => 'ń', - 'Ņ' => 'ņ', - 'Ň' => 'ň', - 'Ŋ' => 'ŋ', - 'Ō' => 'ō', - 'Ŏ' => 'ŏ', - 'Ő' => 'ő', - 'Œ' => 'œ', - 'Ŕ' => 'ŕ', - 'Ŗ' => 'ŗ', - 'Ř' => 'ř', - 'Ś' => 'ś', - 'Ŝ' => 'ŝ', - 'Ş' => 'ş', - 'Š' => 'š', - 'Ţ' => 'ţ', - 'Ť' => 'ť', - 'Ŧ' => 'ŧ', - 'Ũ' => 'ũ', - 'Ū' => 'ū', - 'Ŭ' => 'ŭ', - 'Ů' => 'ů', - 'Ű' => 'ű', - 'Ų' => 'ų', - 'Ŵ' => 'ŵ', - 'Ŷ' => 'ŷ', - 'Ÿ' => 'ÿ', - 'Ź' => 'ź', - 'Ż' => 'ż', - 'Ž' => 'ž', - 'Ɓ' => 'ɓ', - 'Ƃ' => 'ƃ', - 'Ƅ' => 'ƅ', - 'Ɔ' => 'ɔ', - 'Ƈ' => 'ƈ', - 'Ɖ' => 'ɖ', - 'Ɗ' => 'ɗ', - 'Ƌ' => 'ƌ', - 'Ǝ' => 'ǝ', - 'Ə' => 'ə', - 'Ɛ' => 'ɛ', - 'Ƒ' => 'ƒ', - 'Ɠ' => 'ɠ', - 'Ɣ' => 'ɣ', - 'Ɩ' => 'ɩ', - 'Ɨ' => 'ɨ', - 'Ƙ' => 'ƙ', - 'Ɯ' => 'ɯ', - 'Ɲ' => 'ɲ', - 'Ɵ' => 'ɵ', - 'Ơ' => 'ơ', - 'Ƣ' => 'ƣ', - 'Ƥ' => 'ƥ', - 'Ʀ' => 'ʀ', - 'Ƨ' => 'ƨ', - 'Ʃ' => 'ʃ', - 'Ƭ' => 'ƭ', - 'Ʈ' => 'ʈ', - 'Ư' => 'ư', - 'Ʊ' => 'ʊ', - 'Ʋ' => 'ʋ', - 'Ƴ' => 'ƴ', - 'Ƶ' => 'ƶ', - 'Ʒ' => 'ʒ', - 'Ƹ' => 'ƹ', - 'Ƽ' => 'ƽ', - 'DŽ' => 'dž', - 'Dž' => 'dž', - 'LJ' => 'lj', - 'Lj' => 'lj', - 'NJ' => 'nj', - 'Nj' => 'nj', - 'Ǎ' => 'ǎ', - 'Ǐ' => 'ǐ', - 'Ǒ' => 'ǒ', - 'Ǔ' => 'ǔ', - 'Ǖ' => 'ǖ', - 'Ǘ' => 'ǘ', - 'Ǚ' => 'ǚ', - 'Ǜ' => 'ǜ', - 'Ǟ' => 'ǟ', - 'Ǡ' => 'ǡ', - 'Ǣ' => 'ǣ', - 'Ǥ' => 'ǥ', - 'Ǧ' => 'ǧ', - 'Ǩ' => 'ǩ', - 'Ǫ' => 'ǫ', - 'Ǭ' => 'ǭ', - 'Ǯ' => 'ǯ', - 'DZ' => 'dz', - 'Dz' => 'dz', - 'Ǵ' => 'ǵ', - 'Ƕ' => 'ƕ', - 'Ƿ' => 'ƿ', - 'Ǹ' => 'ǹ', - 'Ǻ' => 'ǻ', - 'Ǽ' => 'ǽ', - 'Ǿ' => 'ǿ', - 'Ȁ' => 'ȁ', - 'Ȃ' => 'ȃ', - 'Ȅ' => 'ȅ', - 'Ȇ' => 'ȇ', - 'Ȉ' => 'ȉ', - 'Ȋ' => 'ȋ', - 'Ȍ' => 'ȍ', - 'Ȏ' => 'ȏ', - 'Ȑ' => 'ȑ', - 'Ȓ' => 'ȓ', - 'Ȕ' => 'ȕ', - 'Ȗ' => 'ȗ', - 'Ș' => 'ș', - 'Ț' => 'ț', - 'Ȝ' => 'ȝ', - 'Ȟ' => 'ȟ', - 'Ƞ' => 'ƞ', - 'Ȣ' => 'ȣ', - 'Ȥ' => 'ȥ', - 'Ȧ' => 'ȧ', - 'Ȩ' => 'ȩ', - 'Ȫ' => 'ȫ', - 'Ȭ' => 'ȭ', - 'Ȯ' => 'ȯ', - 'Ȱ' => 'ȱ', - 'Ȳ' => 'ȳ', - 'Ⱥ' => 'ⱥ', - 'Ȼ' => 'ȼ', - 'Ƚ' => 'ƚ', - 'Ⱦ' => 'ⱦ', - 'Ɂ' => 'ɂ', - 'Ƀ' => 'ƀ', - 'Ʉ' => 'ʉ', - 'Ʌ' => 'ʌ', - 'Ɇ' => 'ɇ', - 'Ɉ' => 'ɉ', - 'Ɋ' => 'ɋ', - 'Ɍ' => 'ɍ', - 'Ɏ' => 'ɏ', - 'Ͱ' => 'ͱ', - 'Ͳ' => 'ͳ', - 'Ͷ' => 'ͷ', - 'Ϳ' => 'ϳ', - 'Ά' => 'ά', - 'Έ' => 'έ', - 'Ή' => 'ή', - 'Ί' => 'ί', - 'Ό' => 'ό', - 'Ύ' => 'ύ', - 'Ώ' => 'ώ', - 'Α' => 'α', - 'Β' => 'β', - 'Γ' => 'γ', - 'Δ' => 'δ', - 'Ε' => 'ε', - 'Ζ' => 'ζ', - 'Η' => 'η', - 'Θ' => 'θ', - 'Ι' => 'ι', - 'Κ' => 'κ', - 'Λ' => 'λ', - 'Μ' => 'μ', - 'Ν' => 'ν', - 'Ξ' => 'ξ', - 'Ο' => 'ο', - 'Π' => 'π', - 'Ρ' => 'ρ', - 'Σ' => 'σ', - 'Τ' => 'τ', - 'Υ' => 'υ', - 'Φ' => 'φ', - 'Χ' => 'χ', - 'Ψ' => 'ψ', - 'Ω' => 'ω', - 'Ϊ' => 'ϊ', - 'Ϋ' => 'ϋ', - 'Ϗ' => 'ϗ', - 'Ϙ' => 'ϙ', - 'Ϛ' => 'ϛ', - 'Ϝ' => 'ϝ', - 'Ϟ' => 'ϟ', - 'Ϡ' => 'ϡ', - 'Ϣ' => 'ϣ', - 'Ϥ' => 'ϥ', - 'Ϧ' => 'ϧ', - 'Ϩ' => 'ϩ', - 'Ϫ' => 'ϫ', - 'Ϭ' => 'ϭ', - 'Ϯ' => 'ϯ', - 'ϴ' => 'θ', - 'Ϸ' => 'ϸ', - 'Ϲ' => 'ϲ', - 'Ϻ' => 'ϻ', - 'Ͻ' => 'ͻ', - 'Ͼ' => 'ͼ', - 'Ͽ' => 'ͽ', - 'Ѐ' => 'ѐ', - 'Ё' => 'ё', - 'Ђ' => 'ђ', - 'Ѓ' => 'ѓ', - 'Є' => 'є', - 'Ѕ' => 'ѕ', - 'І' => 'і', - 'Ї' => 'ї', - 'Ј' => 'ј', - 'Љ' => 'љ', - 'Њ' => 'њ', - 'Ћ' => 'ћ', - 'Ќ' => 'ќ', - 'Ѝ' => 'ѝ', - 'Ў' => 'ў', - 'Џ' => 'џ', - 'А' => 'а', - 'Б' => 'б', - 'В' => 'в', - 'Г' => 'г', - 'Д' => 'д', - 'Е' => 'е', - 'Ж' => 'ж', - 'З' => 'з', - 'И' => 'и', - 'Й' => 'й', - 'К' => 'к', - 'Л' => 'л', - 'М' => 'м', - 'Н' => 'н', - 'О' => 'о', - 'П' => 'п', - 'Р' => 'р', - 'С' => 'с', - 'Т' => 'т', - 'У' => 'у', - 'Ф' => 'ф', - 'Х' => 'х', - 'Ц' => 'ц', - 'Ч' => 'ч', - 'Ш' => 'ш', - 'Щ' => 'щ', - 'Ъ' => 'ъ', - 'Ы' => 'ы', - 'Ь' => 'ь', - 'Э' => 'э', - 'Ю' => 'ю', - 'Я' => 'я', - 'Ѡ' => 'ѡ', - 'Ѣ' => 'ѣ', - 'Ѥ' => 'ѥ', - 'Ѧ' => 'ѧ', - 'Ѩ' => 'ѩ', - 'Ѫ' => 'ѫ', - 'Ѭ' => 'ѭ', - 'Ѯ' => 'ѯ', - 'Ѱ' => 'ѱ', - 'Ѳ' => 'ѳ', - 'Ѵ' => 'ѵ', - 'Ѷ' => 'ѷ', - 'Ѹ' => 'ѹ', - 'Ѻ' => 'ѻ', - 'Ѽ' => 'ѽ', - 'Ѿ' => 'ѿ', - 'Ҁ' => 'ҁ', - 'Ҋ' => 'ҋ', - 'Ҍ' => 'ҍ', - 'Ҏ' => 'ҏ', - 'Ґ' => 'ґ', - 'Ғ' => 'ғ', - 'Ҕ' => 'ҕ', - 'Җ' => 'җ', - 'Ҙ' => 'ҙ', - 'Қ' => 'қ', - 'Ҝ' => 'ҝ', - 'Ҟ' => 'ҟ', - 'Ҡ' => 'ҡ', - 'Ң' => 'ң', - 'Ҥ' => 'ҥ', - 'Ҧ' => 'ҧ', - 'Ҩ' => 'ҩ', - 'Ҫ' => 'ҫ', - 'Ҭ' => 'ҭ', - 'Ү' => 'ү', - 'Ұ' => 'ұ', - 'Ҳ' => 'ҳ', - 'Ҵ' => 'ҵ', - 'Ҷ' => 'ҷ', - 'Ҹ' => 'ҹ', - 'Һ' => 'һ', - 'Ҽ' => 'ҽ', - 'Ҿ' => 'ҿ', - 'Ӏ' => 'ӏ', - 'Ӂ' => 'ӂ', - 'Ӄ' => 'ӄ', - 'Ӆ' => 'ӆ', - 'Ӈ' => 'ӈ', - 'Ӊ' => 'ӊ', - 'Ӌ' => 'ӌ', - 'Ӎ' => 'ӎ', - 'Ӑ' => 'ӑ', - 'Ӓ' => 'ӓ', - 'Ӕ' => 'ӕ', - 'Ӗ' => 'ӗ', - 'Ә' => 'ә', - 'Ӛ' => 'ӛ', - 'Ӝ' => 'ӝ', - 'Ӟ' => 'ӟ', - 'Ӡ' => 'ӡ', - 'Ӣ' => 'ӣ', - 'Ӥ' => 'ӥ', - 'Ӧ' => 'ӧ', - 'Ө' => 'ө', - 'Ӫ' => 'ӫ', - 'Ӭ' => 'ӭ', - 'Ӯ' => 'ӯ', - 'Ӱ' => 'ӱ', - 'Ӳ' => 'ӳ', - 'Ӵ' => 'ӵ', - 'Ӷ' => 'ӷ', - 'Ӹ' => 'ӹ', - 'Ӻ' => 'ӻ', - 'Ӽ' => 'ӽ', - 'Ӿ' => 'ӿ', - 'Ԁ' => 'ԁ', - 'Ԃ' => 'ԃ', - 'Ԅ' => 'ԅ', - 'Ԇ' => 'ԇ', - 'Ԉ' => 'ԉ', - 'Ԋ' => 'ԋ', - 'Ԍ' => 'ԍ', - 'Ԏ' => 'ԏ', - 'Ԑ' => 'ԑ', - 'Ԓ' => 'ԓ', - 'Ԕ' => 'ԕ', - 'Ԗ' => 'ԗ', - 'Ԙ' => 'ԙ', - 'Ԛ' => 'ԛ', - 'Ԝ' => 'ԝ', - 'Ԟ' => 'ԟ', - 'Ԡ' => 'ԡ', - 'Ԣ' => 'ԣ', - 'Ԥ' => 'ԥ', - 'Ԧ' => 'ԧ', - 'Ԩ' => 'ԩ', - 'Ԫ' => 'ԫ', - 'Ԭ' => 'ԭ', - 'Ԯ' => 'ԯ', - 'Ա' => 'ա', - 'Բ' => 'բ', - 'Գ' => 'գ', - 'Դ' => 'դ', - 'Ե' => 'ե', - 'Զ' => 'զ', - 'Է' => 'է', - 'Ը' => 'ը', - 'Թ' => 'թ', - 'Ժ' => 'ժ', - 'Ի' => 'ի', - 'Լ' => 'լ', - 'Խ' => 'խ', - 'Ծ' => 'ծ', - 'Կ' => 'կ', - 'Հ' => 'հ', - 'Ձ' => 'ձ', - 'Ղ' => 'ղ', - 'Ճ' => 'ճ', - 'Մ' => 'մ', - 'Յ' => 'յ', - 'Ն' => 'ն', - 'Շ' => 'շ', - 'Ո' => 'ո', - 'Չ' => 'չ', - 'Պ' => 'պ', - 'Ջ' => 'ջ', - 'Ռ' => 'ռ', - 'Ս' => 'ս', - 'Վ' => 'վ', - 'Տ' => 'տ', - 'Ր' => 'ր', - 'Ց' => 'ց', - 'Ւ' => 'ւ', - 'Փ' => 'փ', - 'Ք' => 'ք', - 'Օ' => 'օ', - 'Ֆ' => 'ֆ', - 'Ⴀ' => 'ⴀ', - 'Ⴁ' => 'ⴁ', - 'Ⴂ' => 'ⴂ', - 'Ⴃ' => 'ⴃ', - 'Ⴄ' => 'ⴄ', - 'Ⴅ' => 'ⴅ', - 'Ⴆ' => 'ⴆ', - 'Ⴇ' => 'ⴇ', - 'Ⴈ' => 'ⴈ', - 'Ⴉ' => 'ⴉ', - 'Ⴊ' => 'ⴊ', - 'Ⴋ' => 'ⴋ', - 'Ⴌ' => 'ⴌ', - 'Ⴍ' => 'ⴍ', - 'Ⴎ' => 'ⴎ', - 'Ⴏ' => 'ⴏ', - 'Ⴐ' => 'ⴐ', - 'Ⴑ' => 'ⴑ', - 'Ⴒ' => 'ⴒ', - 'Ⴓ' => 'ⴓ', - 'Ⴔ' => 'ⴔ', - 'Ⴕ' => 'ⴕ', - 'Ⴖ' => 'ⴖ', - 'Ⴗ' => 'ⴗ', - 'Ⴘ' => 'ⴘ', - 'Ⴙ' => 'ⴙ', - 'Ⴚ' => 'ⴚ', - 'Ⴛ' => 'ⴛ', - 'Ⴜ' => 'ⴜ', - 'Ⴝ' => 'ⴝ', - 'Ⴞ' => 'ⴞ', - 'Ⴟ' => 'ⴟ', - 'Ⴠ' => 'ⴠ', - 'Ⴡ' => 'ⴡ', - 'Ⴢ' => 'ⴢ', - 'Ⴣ' => 'ⴣ', - 'Ⴤ' => 'ⴤ', - 'Ⴥ' => 'ⴥ', - 'Ⴧ' => 'ⴧ', - 'Ⴭ' => 'ⴭ', - 'Ꭰ' => 'ꭰ', - 'Ꭱ' => 'ꭱ', - 'Ꭲ' => 'ꭲ', - 'Ꭳ' => 'ꭳ', - 'Ꭴ' => 'ꭴ', - 'Ꭵ' => 'ꭵ', - 'Ꭶ' => 'ꭶ', - 'Ꭷ' => 'ꭷ', - 'Ꭸ' => 'ꭸ', - 'Ꭹ' => 'ꭹ', - 'Ꭺ' => 'ꭺ', - 'Ꭻ' => 'ꭻ', - 'Ꭼ' => 'ꭼ', - 'Ꭽ' => 'ꭽ', - 'Ꭾ' => 'ꭾ', - 'Ꭿ' => 'ꭿ', - 'Ꮀ' => 'ꮀ', - 'Ꮁ' => 'ꮁ', - 'Ꮂ' => 'ꮂ', - 'Ꮃ' => 'ꮃ', - 'Ꮄ' => 'ꮄ', - 'Ꮅ' => 'ꮅ', - 'Ꮆ' => 'ꮆ', - 'Ꮇ' => 'ꮇ', - 'Ꮈ' => 'ꮈ', - 'Ꮉ' => 'ꮉ', - 'Ꮊ' => 'ꮊ', - 'Ꮋ' => 'ꮋ', - 'Ꮌ' => 'ꮌ', - 'Ꮍ' => 'ꮍ', - 'Ꮎ' => 'ꮎ', - 'Ꮏ' => 'ꮏ', - 'Ꮐ' => 'ꮐ', - 'Ꮑ' => 'ꮑ', - 'Ꮒ' => 'ꮒ', - 'Ꮓ' => 'ꮓ', - 'Ꮔ' => 'ꮔ', - 'Ꮕ' => 'ꮕ', - 'Ꮖ' => 'ꮖ', - 'Ꮗ' => 'ꮗ', - 'Ꮘ' => 'ꮘ', - 'Ꮙ' => 'ꮙ', - 'Ꮚ' => 'ꮚ', - 'Ꮛ' => 'ꮛ', - 'Ꮜ' => 'ꮜ', - 'Ꮝ' => 'ꮝ', - 'Ꮞ' => 'ꮞ', - 'Ꮟ' => 'ꮟ', - 'Ꮠ' => 'ꮠ', - 'Ꮡ' => 'ꮡ', - 'Ꮢ' => 'ꮢ', - 'Ꮣ' => 'ꮣ', - 'Ꮤ' => 'ꮤ', - 'Ꮥ' => 'ꮥ', - 'Ꮦ' => 'ꮦ', - 'Ꮧ' => 'ꮧ', - 'Ꮨ' => 'ꮨ', - 'Ꮩ' => 'ꮩ', - 'Ꮪ' => 'ꮪ', - 'Ꮫ' => 'ꮫ', - 'Ꮬ' => 'ꮬ', - 'Ꮭ' => 'ꮭ', - 'Ꮮ' => 'ꮮ', - 'Ꮯ' => 'ꮯ', - 'Ꮰ' => 'ꮰ', - 'Ꮱ' => 'ꮱ', - 'Ꮲ' => 'ꮲ', - 'Ꮳ' => 'ꮳ', - 'Ꮴ' => 'ꮴ', - 'Ꮵ' => 'ꮵ', - 'Ꮶ' => 'ꮶ', - 'Ꮷ' => 'ꮷ', - 'Ꮸ' => 'ꮸ', - 'Ꮹ' => 'ꮹ', - 'Ꮺ' => 'ꮺ', - 'Ꮻ' => 'ꮻ', - 'Ꮼ' => 'ꮼ', - 'Ꮽ' => 'ꮽ', - 'Ꮾ' => 'ꮾ', - 'Ꮿ' => 'ꮿ', - 'Ᏸ' => 'ᏸ', - 'Ᏹ' => 'ᏹ', - 'Ᏺ' => 'ᏺ', - 'Ᏻ' => 'ᏻ', - 'Ᏼ' => 'ᏼ', - 'Ᏽ' => 'ᏽ', - 'Ა' => 'ა', - 'Ბ' => 'ბ', - 'Გ' => 'გ', - 'Დ' => 'დ', - 'Ე' => 'ე', - 'Ვ' => 'ვ', - 'Ზ' => 'ზ', - 'Თ' => 'თ', - 'Ი' => 'ი', - 'Კ' => 'კ', - 'Ლ' => 'ლ', - 'Მ' => 'მ', - 'Ნ' => 'ნ', - 'Ო' => 'ო', - 'Პ' => 'პ', - 'Ჟ' => 'ჟ', - 'Რ' => 'რ', - 'Ს' => 'ს', - 'Ტ' => 'ტ', - 'Უ' => 'უ', - 'Ფ' => 'ფ', - 'Ქ' => 'ქ', - 'Ღ' => 'ღ', - 'Ყ' => 'ყ', - 'Შ' => 'შ', - 'Ჩ' => 'ჩ', - 'Ც' => 'ც', - 'Ძ' => 'ძ', - 'Წ' => 'წ', - 'Ჭ' => 'ჭ', - 'Ხ' => 'ხ', - 'Ჯ' => 'ჯ', - 'Ჰ' => 'ჰ', - 'Ჱ' => 'ჱ', - 'Ჲ' => 'ჲ', - 'Ჳ' => 'ჳ', - 'Ჴ' => 'ჴ', - 'Ჵ' => 'ჵ', - 'Ჶ' => 'ჶ', - 'Ჷ' => 'ჷ', - 'Ჸ' => 'ჸ', - 'Ჹ' => 'ჹ', - 'Ჺ' => 'ჺ', - 'Ჽ' => 'ჽ', - 'Ჾ' => 'ჾ', - 'Ჿ' => 'ჿ', - 'Ḁ' => 'ḁ', - 'Ḃ' => 'ḃ', - 'Ḅ' => 'ḅ', - 'Ḇ' => 'ḇ', - 'Ḉ' => 'ḉ', - 'Ḋ' => 'ḋ', - 'Ḍ' => 'ḍ', - 'Ḏ' => 'ḏ', - 'Ḑ' => 'ḑ', - 'Ḓ' => 'ḓ', - 'Ḕ' => 'ḕ', - 'Ḗ' => 'ḗ', - 'Ḙ' => 'ḙ', - 'Ḛ' => 'ḛ', - 'Ḝ' => 'ḝ', - 'Ḟ' => 'ḟ', - 'Ḡ' => 'ḡ', - 'Ḣ' => 'ḣ', - 'Ḥ' => 'ḥ', - 'Ḧ' => 'ḧ', - 'Ḩ' => 'ḩ', - 'Ḫ' => 'ḫ', - 'Ḭ' => 'ḭ', - 'Ḯ' => 'ḯ', - 'Ḱ' => 'ḱ', - 'Ḳ' => 'ḳ', - 'Ḵ' => 'ḵ', - 'Ḷ' => 'ḷ', - 'Ḹ' => 'ḹ', - 'Ḻ' => 'ḻ', - 'Ḽ' => 'ḽ', - 'Ḿ' => 'ḿ', - 'Ṁ' => 'ṁ', - 'Ṃ' => 'ṃ', - 'Ṅ' => 'ṅ', - 'Ṇ' => 'ṇ', - 'Ṉ' => 'ṉ', - 'Ṋ' => 'ṋ', - 'Ṍ' => 'ṍ', - 'Ṏ' => 'ṏ', - 'Ṑ' => 'ṑ', - 'Ṓ' => 'ṓ', - 'Ṕ' => 'ṕ', - 'Ṗ' => 'ṗ', - 'Ṙ' => 'ṙ', - 'Ṛ' => 'ṛ', - 'Ṝ' => 'ṝ', - 'Ṟ' => 'ṟ', - 'Ṡ' => 'ṡ', - 'Ṣ' => 'ṣ', - 'Ṥ' => 'ṥ', - 'Ṧ' => 'ṧ', - 'Ṩ' => 'ṩ', - 'Ṫ' => 'ṫ', - 'Ṭ' => 'ṭ', - 'Ṯ' => 'ṯ', - 'Ṱ' => 'ṱ', - 'Ṳ' => 'ṳ', - 'Ṵ' => 'ṵ', - 'Ṷ' => 'ṷ', - 'Ṹ' => 'ṹ', - 'Ṻ' => 'ṻ', - 'Ṽ' => 'ṽ', - 'Ṿ' => 'ṿ', - 'Ẁ' => 'ẁ', - 'Ẃ' => 'ẃ', - 'Ẅ' => 'ẅ', - 'Ẇ' => 'ẇ', - 'Ẉ' => 'ẉ', - 'Ẋ' => 'ẋ', - 'Ẍ' => 'ẍ', - 'Ẏ' => 'ẏ', - 'Ẑ' => 'ẑ', - 'Ẓ' => 'ẓ', - 'Ẕ' => 'ẕ', - 'ẞ' => 'ß', - 'Ạ' => 'ạ', - 'Ả' => 'ả', - 'Ấ' => 'ấ', - 'Ầ' => 'ầ', - 'Ẩ' => 'ẩ', - 'Ẫ' => 'ẫ', - 'Ậ' => 'ậ', - 'Ắ' => 'ắ', - 'Ằ' => 'ằ', - 'Ẳ' => 'ẳ', - 'Ẵ' => 'ẵ', - 'Ặ' => 'ặ', - 'Ẹ' => 'ẹ', - 'Ẻ' => 'ẻ', - 'Ẽ' => 'ẽ', - 'Ế' => 'ế', - 'Ề' => 'ề', - 'Ể' => 'ể', - 'Ễ' => 'ễ', - 'Ệ' => 'ệ', - 'Ỉ' => 'ỉ', - 'Ị' => 'ị', - 'Ọ' => 'ọ', - 'Ỏ' => 'ỏ', - 'Ố' => 'ố', - 'Ồ' => 'ồ', - 'Ổ' => 'ổ', - 'Ỗ' => 'ỗ', - 'Ộ' => 'ộ', - 'Ớ' => 'ớ', - 'Ờ' => 'ờ', - 'Ở' => 'ở', - 'Ỡ' => 'ỡ', - 'Ợ' => 'ợ', - 'Ụ' => 'ụ', - 'Ủ' => 'ủ', - 'Ứ' => 'ứ', - 'Ừ' => 'ừ', - 'Ử' => 'ử', - 'Ữ' => 'ữ', - 'Ự' => 'ự', - 'Ỳ' => 'ỳ', - 'Ỵ' => 'ỵ', - 'Ỷ' => 'ỷ', - 'Ỹ' => 'ỹ', - 'Ỻ' => 'ỻ', - 'Ỽ' => 'ỽ', - 'Ỿ' => 'ỿ', - 'Ἀ' => 'ἀ', - 'Ἁ' => 'ἁ', - 'Ἂ' => 'ἂ', - 'Ἃ' => 'ἃ', - 'Ἄ' => 'ἄ', - 'Ἅ' => 'ἅ', - 'Ἆ' => 'ἆ', - 'Ἇ' => 'ἇ', - 'Ἐ' => 'ἐ', - 'Ἑ' => 'ἑ', - 'Ἒ' => 'ἒ', - 'Ἓ' => 'ἓ', - 'Ἔ' => 'ἔ', - 'Ἕ' => 'ἕ', - 'Ἠ' => 'ἠ', - 'Ἡ' => 'ἡ', - 'Ἢ' => 'ἢ', - 'Ἣ' => 'ἣ', - 'Ἤ' => 'ἤ', - 'Ἥ' => 'ἥ', - 'Ἦ' => 'ἦ', - 'Ἧ' => 'ἧ', - 'Ἰ' => 'ἰ', - 'Ἱ' => 'ἱ', - 'Ἲ' => 'ἲ', - 'Ἳ' => 'ἳ', - 'Ἴ' => 'ἴ', - 'Ἵ' => 'ἵ', - 'Ἶ' => 'ἶ', - 'Ἷ' => 'ἷ', - 'Ὀ' => 'ὀ', - 'Ὁ' => 'ὁ', - 'Ὂ' => 'ὂ', - 'Ὃ' => 'ὃ', - 'Ὄ' => 'ὄ', - 'Ὅ' => 'ὅ', - 'Ὑ' => 'ὑ', - 'Ὓ' => 'ὓ', - 'Ὕ' => 'ὕ', - 'Ὗ' => 'ὗ', - 'Ὠ' => 'ὠ', - 'Ὡ' => 'ὡ', - 'Ὢ' => 'ὢ', - 'Ὣ' => 'ὣ', - 'Ὤ' => 'ὤ', - 'Ὥ' => 'ὥ', - 'Ὦ' => 'ὦ', - 'Ὧ' => 'ὧ', - 'ᾈ' => 'ᾀ', - 'ᾉ' => 'ᾁ', - 'ᾊ' => 'ᾂ', - 'ᾋ' => 'ᾃ', - 'ᾌ' => 'ᾄ', - 'ᾍ' => 'ᾅ', - 'ᾎ' => 'ᾆ', - 'ᾏ' => 'ᾇ', - 'ᾘ' => 'ᾐ', - 'ᾙ' => 'ᾑ', - 'ᾚ' => 'ᾒ', - 'ᾛ' => 'ᾓ', - 'ᾜ' => 'ᾔ', - 'ᾝ' => 'ᾕ', - 'ᾞ' => 'ᾖ', - 'ᾟ' => 'ᾗ', - 'ᾨ' => 'ᾠ', - 'ᾩ' => 'ᾡ', - 'ᾪ' => 'ᾢ', - 'ᾫ' => 'ᾣ', - 'ᾬ' => 'ᾤ', - 'ᾭ' => 'ᾥ', - 'ᾮ' => 'ᾦ', - 'ᾯ' => 'ᾧ', - 'Ᾰ' => 'ᾰ', - 'Ᾱ' => 'ᾱ', - 'Ὰ' => 'ὰ', - 'Ά' => 'ά', - 'ᾼ' => 'ᾳ', - 'Ὲ' => 'ὲ', - 'Έ' => 'έ', - 'Ὴ' => 'ὴ', - 'Ή' => 'ή', - 'ῌ' => 'ῃ', - 'Ῐ' => 'ῐ', - 'Ῑ' => 'ῑ', - 'Ὶ' => 'ὶ', - 'Ί' => 'ί', - 'Ῠ' => 'ῠ', - 'Ῡ' => 'ῡ', - 'Ὺ' => 'ὺ', - 'Ύ' => 'ύ', - 'Ῥ' => 'ῥ', - 'Ὸ' => 'ὸ', - 'Ό' => 'ό', - 'Ὼ' => 'ὼ', - 'Ώ' => 'ώ', - 'ῼ' => 'ῳ', - 'Ω' => 'ω', - 'K' => 'k', - 'Å' => 'å', - 'Ⅎ' => 'ⅎ', - 'Ⅰ' => 'ⅰ', - 'Ⅱ' => 'ⅱ', - 'Ⅲ' => 'ⅲ', - 'Ⅳ' => 'ⅳ', - 'Ⅴ' => 'ⅴ', - 'Ⅵ' => 'ⅵ', - 'Ⅶ' => 'ⅶ', - 'Ⅷ' => 'ⅷ', - 'Ⅸ' => 'ⅸ', - 'Ⅹ' => 'ⅹ', - 'Ⅺ' => 'ⅺ', - 'Ⅻ' => 'ⅻ', - 'Ⅼ' => 'ⅼ', - 'Ⅽ' => 'ⅽ', - 'Ⅾ' => 'ⅾ', - 'Ⅿ' => 'ⅿ', - 'Ↄ' => 'ↄ', - 'Ⓐ' => 'ⓐ', - 'Ⓑ' => 'ⓑ', - 'Ⓒ' => 'ⓒ', - 'Ⓓ' => 'ⓓ', - 'Ⓔ' => 'ⓔ', - 'Ⓕ' => 'ⓕ', - 'Ⓖ' => 'ⓖ', - 'Ⓗ' => 'ⓗ', - 'Ⓘ' => 'ⓘ', - 'Ⓙ' => 'ⓙ', - 'Ⓚ' => 'ⓚ', - 'Ⓛ' => 'ⓛ', - 'Ⓜ' => 'ⓜ', - 'Ⓝ' => 'ⓝ', - 'Ⓞ' => 'ⓞ', - 'Ⓟ' => 'ⓟ', - 'Ⓠ' => 'ⓠ', - 'Ⓡ' => 'ⓡ', - 'Ⓢ' => 'ⓢ', - 'Ⓣ' => 'ⓣ', - 'Ⓤ' => 'ⓤ', - 'Ⓥ' => 'ⓥ', - 'Ⓦ' => 'ⓦ', - 'Ⓧ' => 'ⓧ', - 'Ⓨ' => 'ⓨ', - 'Ⓩ' => 'ⓩ', - 'Ⰰ' => 'ⰰ', - 'Ⰱ' => 'ⰱ', - 'Ⰲ' => 'ⰲ', - 'Ⰳ' => 'ⰳ', - 'Ⰴ' => 'ⰴ', - 'Ⰵ' => 'ⰵ', - 'Ⰶ' => 'ⰶ', - 'Ⰷ' => 'ⰷ', - 'Ⰸ' => 'ⰸ', - 'Ⰹ' => 'ⰹ', - 'Ⰺ' => 'ⰺ', - 'Ⰻ' => 'ⰻ', - 'Ⰼ' => 'ⰼ', - 'Ⰽ' => 'ⰽ', - 'Ⰾ' => 'ⰾ', - 'Ⰿ' => 'ⰿ', - 'Ⱀ' => 'ⱀ', - 'Ⱁ' => 'ⱁ', - 'Ⱂ' => 'ⱂ', - 'Ⱃ' => 'ⱃ', - 'Ⱄ' => 'ⱄ', - 'Ⱅ' => 'ⱅ', - 'Ⱆ' => 'ⱆ', - 'Ⱇ' => 'ⱇ', - 'Ⱈ' => 'ⱈ', - 'Ⱉ' => 'ⱉ', - 'Ⱊ' => 'ⱊ', - 'Ⱋ' => 'ⱋ', - 'Ⱌ' => 'ⱌ', - 'Ⱍ' => 'ⱍ', - 'Ⱎ' => 'ⱎ', - 'Ⱏ' => 'ⱏ', - 'Ⱐ' => 'ⱐ', - 'Ⱑ' => 'ⱑ', - 'Ⱒ' => 'ⱒ', - 'Ⱓ' => 'ⱓ', - 'Ⱔ' => 'ⱔ', - 'Ⱕ' => 'ⱕ', - 'Ⱖ' => 'ⱖ', - 'Ⱗ' => 'ⱗ', - 'Ⱘ' => 'ⱘ', - 'Ⱙ' => 'ⱙ', - 'Ⱚ' => 'ⱚ', - 'Ⱛ' => 'ⱛ', - 'Ⱜ' => 'ⱜ', - 'Ⱝ' => 'ⱝ', - 'Ⱞ' => 'ⱞ', - 'Ⱡ' => 'ⱡ', - 'Ɫ' => 'ɫ', - 'Ᵽ' => 'ᵽ', - 'Ɽ' => 'ɽ', - 'Ⱨ' => 'ⱨ', - 'Ⱪ' => 'ⱪ', - 'Ⱬ' => 'ⱬ', - 'Ɑ' => 'ɑ', - 'Ɱ' => 'ɱ', - 'Ɐ' => 'ɐ', - 'Ɒ' => 'ɒ', - 'Ⱳ' => 'ⱳ', - 'Ⱶ' => 'ⱶ', - 'Ȿ' => 'ȿ', - 'Ɀ' => 'ɀ', - 'Ⲁ' => 'ⲁ', - 'Ⲃ' => 'ⲃ', - 'Ⲅ' => 'ⲅ', - 'Ⲇ' => 'ⲇ', - 'Ⲉ' => 'ⲉ', - 'Ⲋ' => 'ⲋ', - 'Ⲍ' => 'ⲍ', - 'Ⲏ' => 'ⲏ', - 'Ⲑ' => 'ⲑ', - 'Ⲓ' => 'ⲓ', - 'Ⲕ' => 'ⲕ', - 'Ⲗ' => 'ⲗ', - 'Ⲙ' => 'ⲙ', - 'Ⲛ' => 'ⲛ', - 'Ⲝ' => 'ⲝ', - 'Ⲟ' => 'ⲟ', - 'Ⲡ' => 'ⲡ', - 'Ⲣ' => 'ⲣ', - 'Ⲥ' => 'ⲥ', - 'Ⲧ' => 'ⲧ', - 'Ⲩ' => 'ⲩ', - 'Ⲫ' => 'ⲫ', - 'Ⲭ' => 'ⲭ', - 'Ⲯ' => 'ⲯ', - 'Ⲱ' => 'ⲱ', - 'Ⲳ' => 'ⲳ', - 'Ⲵ' => 'ⲵ', - 'Ⲷ' => 'ⲷ', - 'Ⲹ' => 'ⲹ', - 'Ⲻ' => 'ⲻ', - 'Ⲽ' => 'ⲽ', - 'Ⲿ' => 'ⲿ', - 'Ⳁ' => 'ⳁ', - 'Ⳃ' => 'ⳃ', - 'Ⳅ' => 'ⳅ', - 'Ⳇ' => 'ⳇ', - 'Ⳉ' => 'ⳉ', - 'Ⳋ' => 'ⳋ', - 'Ⳍ' => 'ⳍ', - 'Ⳏ' => 'ⳏ', - 'Ⳑ' => 'ⳑ', - 'Ⳓ' => 'ⳓ', - 'Ⳕ' => 'ⳕ', - 'Ⳗ' => 'ⳗ', - 'Ⳙ' => 'ⳙ', - 'Ⳛ' => 'ⳛ', - 'Ⳝ' => 'ⳝ', - 'Ⳟ' => 'ⳟ', - 'Ⳡ' => 'ⳡ', - 'Ⳣ' => 'ⳣ', - 'Ⳬ' => 'ⳬ', - 'Ⳮ' => 'ⳮ', - 'Ⳳ' => 'ⳳ', - 'Ꙁ' => 'ꙁ', - 'Ꙃ' => 'ꙃ', - 'Ꙅ' => 'ꙅ', - 'Ꙇ' => 'ꙇ', - 'Ꙉ' => 'ꙉ', - 'Ꙋ' => 'ꙋ', - 'Ꙍ' => 'ꙍ', - 'Ꙏ' => 'ꙏ', - 'Ꙑ' => 'ꙑ', - 'Ꙓ' => 'ꙓ', - 'Ꙕ' => 'ꙕ', - 'Ꙗ' => 'ꙗ', - 'Ꙙ' => 'ꙙ', - 'Ꙛ' => 'ꙛ', - 'Ꙝ' => 'ꙝ', - 'Ꙟ' => 'ꙟ', - 'Ꙡ' => 'ꙡ', - 'Ꙣ' => 'ꙣ', - 'Ꙥ' => 'ꙥ', - 'Ꙧ' => 'ꙧ', - 'Ꙩ' => 'ꙩ', - 'Ꙫ' => 'ꙫ', - 'Ꙭ' => 'ꙭ', - 'Ꚁ' => 'ꚁ', - 'Ꚃ' => 'ꚃ', - 'Ꚅ' => 'ꚅ', - 'Ꚇ' => 'ꚇ', - 'Ꚉ' => 'ꚉ', - 'Ꚋ' => 'ꚋ', - 'Ꚍ' => 'ꚍ', - 'Ꚏ' => 'ꚏ', - 'Ꚑ' => 'ꚑ', - 'Ꚓ' => 'ꚓ', - 'Ꚕ' => 'ꚕ', - 'Ꚗ' => 'ꚗ', - 'Ꚙ' => 'ꚙ', - 'Ꚛ' => 'ꚛ', - 'Ꜣ' => 'ꜣ', - 'Ꜥ' => 'ꜥ', - 'Ꜧ' => 'ꜧ', - 'Ꜩ' => 'ꜩ', - 'Ꜫ' => 'ꜫ', - 'Ꜭ' => 'ꜭ', - 'Ꜯ' => 'ꜯ', - 'Ꜳ' => 'ꜳ', - 'Ꜵ' => 'ꜵ', - 'Ꜷ' => 'ꜷ', - 'Ꜹ' => 'ꜹ', - 'Ꜻ' => 'ꜻ', - 'Ꜽ' => 'ꜽ', - 'Ꜿ' => 'ꜿ', - 'Ꝁ' => 'ꝁ', - 'Ꝃ' => 'ꝃ', - 'Ꝅ' => 'ꝅ', - 'Ꝇ' => 'ꝇ', - 'Ꝉ' => 'ꝉ', - 'Ꝋ' => 'ꝋ', - 'Ꝍ' => 'ꝍ', - 'Ꝏ' => 'ꝏ', - 'Ꝑ' => 'ꝑ', - 'Ꝓ' => 'ꝓ', - 'Ꝕ' => 'ꝕ', - 'Ꝗ' => 'ꝗ', - 'Ꝙ' => 'ꝙ', - 'Ꝛ' => 'ꝛ', - 'Ꝝ' => 'ꝝ', - 'Ꝟ' => 'ꝟ', - 'Ꝡ' => 'ꝡ', - 'Ꝣ' => 'ꝣ', - 'Ꝥ' => 'ꝥ', - 'Ꝧ' => 'ꝧ', - 'Ꝩ' => 'ꝩ', - 'Ꝫ' => 'ꝫ', - 'Ꝭ' => 'ꝭ', - 'Ꝯ' => 'ꝯ', - 'Ꝺ' => 'ꝺ', - 'Ꝼ' => 'ꝼ', - 'Ᵹ' => 'ᵹ', - 'Ꝿ' => 'ꝿ', - 'Ꞁ' => 'ꞁ', - 'Ꞃ' => 'ꞃ', - 'Ꞅ' => 'ꞅ', - 'Ꞇ' => 'ꞇ', - 'Ꞌ' => 'ꞌ', - 'Ɥ' => 'ɥ', - 'Ꞑ' => 'ꞑ', - 'Ꞓ' => 'ꞓ', - 'Ꞗ' => 'ꞗ', - 'Ꞙ' => 'ꞙ', - 'Ꞛ' => 'ꞛ', - 'Ꞝ' => 'ꞝ', - 'Ꞟ' => 'ꞟ', - 'Ꞡ' => 'ꞡ', - 'Ꞣ' => 'ꞣ', - 'Ꞥ' => 'ꞥ', - 'Ꞧ' => 'ꞧ', - 'Ꞩ' => 'ꞩ', - 'Ɦ' => 'ɦ', - 'Ɜ' => 'ɜ', - 'Ɡ' => 'ɡ', - 'Ɬ' => 'ɬ', - 'Ɪ' => 'ɪ', - 'Ʞ' => 'ʞ', - 'Ʇ' => 'ʇ', - 'Ʝ' => 'ʝ', - 'Ꭓ' => 'ꭓ', - 'Ꞵ' => 'ꞵ', - 'Ꞷ' => 'ꞷ', - 'Ꞹ' => 'ꞹ', - 'Ꞻ' => 'ꞻ', - 'Ꞽ' => 'ꞽ', - 'Ꞿ' => 'ꞿ', - 'Ꟃ' => 'ꟃ', - 'Ꞔ' => 'ꞔ', - 'Ʂ' => 'ʂ', - 'Ᶎ' => 'ᶎ', - 'Ꟈ' => 'ꟈ', - 'Ꟊ' => 'ꟊ', - 'Ꟶ' => 'ꟶ', - 'A' => 'a', - 'B' => 'b', - 'C' => 'c', - 'D' => 'd', - 'E' => 'e', - 'F' => 'f', - 'G' => 'g', - 'H' => 'h', - 'I' => 'i', - 'J' => 'j', - 'K' => 'k', - 'L' => 'l', - 'M' => 'm', - 'N' => 'n', - 'O' => 'o', - 'P' => 'p', - 'Q' => 'q', - 'R' => 'r', - 'S' => 's', - 'T' => 't', - 'U' => 'u', - 'V' => 'v', - 'W' => 'w', - 'X' => 'x', - 'Y' => 'y', - 'Z' => 'z', - '𐐀' => '𐐨', - '𐐁' => '𐐩', - '𐐂' => '𐐪', - '𐐃' => '𐐫', - '𐐄' => '𐐬', - '𐐅' => '𐐭', - '𐐆' => '𐐮', - '𐐇' => '𐐯', - '𐐈' => '𐐰', - '𐐉' => '𐐱', - '𐐊' => '𐐲', - '𐐋' => '𐐳', - '𐐌' => '𐐴', - '𐐍' => '𐐵', - '𐐎' => '𐐶', - '𐐏' => '𐐷', - '𐐐' => '𐐸', - '𐐑' => '𐐹', - '𐐒' => '𐐺', - '𐐓' => '𐐻', - '𐐔' => '𐐼', - '𐐕' => '𐐽', - '𐐖' => '𐐾', - '𐐗' => '𐐿', - '𐐘' => '𐑀', - '𐐙' => '𐑁', - '𐐚' => '𐑂', - '𐐛' => '𐑃', - '𐐜' => '𐑄', - '𐐝' => '𐑅', - '𐐞' => '𐑆', - '𐐟' => '𐑇', - '𐐠' => '𐑈', - '𐐡' => '𐑉', - '𐐢' => '𐑊', - '𐐣' => '𐑋', - '𐐤' => '𐑌', - '𐐥' => '𐑍', - '𐐦' => '𐑎', - '𐐧' => '𐑏', - '𐒰' => '𐓘', - '𐒱' => '𐓙', - '𐒲' => '𐓚', - '𐒳' => '𐓛', - '𐒴' => '𐓜', - '𐒵' => '𐓝', - '𐒶' => '𐓞', - '𐒷' => '𐓟', - '𐒸' => '𐓠', - '𐒹' => '𐓡', - '𐒺' => '𐓢', - '𐒻' => '𐓣', - '𐒼' => '𐓤', - '𐒽' => '𐓥', - '𐒾' => '𐓦', - '𐒿' => '𐓧', - '𐓀' => '𐓨', - '𐓁' => '𐓩', - '𐓂' => '𐓪', - '𐓃' => '𐓫', - '𐓄' => '𐓬', - '𐓅' => '𐓭', - '𐓆' => '𐓮', - '𐓇' => '𐓯', - '𐓈' => '𐓰', - '𐓉' => '𐓱', - '𐓊' => '𐓲', - '𐓋' => '𐓳', - '𐓌' => '𐓴', - '𐓍' => '𐓵', - '𐓎' => '𐓶', - '𐓏' => '𐓷', - '𐓐' => '𐓸', - '𐓑' => '𐓹', - '𐓒' => '𐓺', - '𐓓' => '𐓻', - '𐲀' => '𐳀', - '𐲁' => '𐳁', - '𐲂' => '𐳂', - '𐲃' => '𐳃', - '𐲄' => '𐳄', - '𐲅' => '𐳅', - '𐲆' => '𐳆', - '𐲇' => '𐳇', - '𐲈' => '𐳈', - '𐲉' => '𐳉', - '𐲊' => '𐳊', - '𐲋' => '𐳋', - '𐲌' => '𐳌', - '𐲍' => '𐳍', - '𐲎' => '𐳎', - '𐲏' => '𐳏', - '𐲐' => '𐳐', - '𐲑' => '𐳑', - '𐲒' => '𐳒', - '𐲓' => '𐳓', - '𐲔' => '𐳔', - '𐲕' => '𐳕', - '𐲖' => '𐳖', - '𐲗' => '𐳗', - '𐲘' => '𐳘', - '𐲙' => '𐳙', - '𐲚' => '𐳚', - '𐲛' => '𐳛', - '𐲜' => '𐳜', - '𐲝' => '𐳝', - '𐲞' => '𐳞', - '𐲟' => '𐳟', - '𐲠' => '𐳠', - '𐲡' => '𐳡', - '𐲢' => '𐳢', - '𐲣' => '𐳣', - '𐲤' => '𐳤', - '𐲥' => '𐳥', - '𐲦' => '𐳦', - '𐲧' => '𐳧', - '𐲨' => '𐳨', - '𐲩' => '𐳩', - '𐲪' => '𐳪', - '𐲫' => '𐳫', - '𐲬' => '𐳬', - '𐲭' => '𐳭', - '𐲮' => '𐳮', - '𐲯' => '𐳯', - '𐲰' => '𐳰', - '𐲱' => '𐳱', - '𐲲' => '𐳲', - '𑢠' => '𑣀', - '𑢡' => '𑣁', - '𑢢' => '𑣂', - '𑢣' => '𑣃', - '𑢤' => '𑣄', - '𑢥' => '𑣅', - '𑢦' => '𑣆', - '𑢧' => '𑣇', - '𑢨' => '𑣈', - '𑢩' => '𑣉', - '𑢪' => '𑣊', - '𑢫' => '𑣋', - '𑢬' => '𑣌', - '𑢭' => '𑣍', - '𑢮' => '𑣎', - '𑢯' => '𑣏', - '𑢰' => '𑣐', - '𑢱' => '𑣑', - '𑢲' => '𑣒', - '𑢳' => '𑣓', - '𑢴' => '𑣔', - '𑢵' => '𑣕', - '𑢶' => '𑣖', - '𑢷' => '𑣗', - '𑢸' => '𑣘', - '𑢹' => '𑣙', - '𑢺' => '𑣚', - '𑢻' => '𑣛', - '𑢼' => '𑣜', - '𑢽' => '𑣝', - '𑢾' => '𑣞', - '𑢿' => '𑣟', - '𖹀' => '𖹠', - '𖹁' => '𖹡', - '𖹂' => '𖹢', - '𖹃' => '𖹣', - '𖹄' => '𖹤', - '𖹅' => '𖹥', - '𖹆' => '𖹦', - '𖹇' => '𖹧', - '𖹈' => '𖹨', - '𖹉' => '𖹩', - '𖹊' => '𖹪', - '𖹋' => '𖹫', - '𖹌' => '𖹬', - '𖹍' => '𖹭', - '𖹎' => '𖹮', - '𖹏' => '𖹯', - '𖹐' => '𖹰', - '𖹑' => '𖹱', - '𖹒' => '𖹲', - '𖹓' => '𖹳', - '𖹔' => '𖹴', - '𖹕' => '𖹵', - '𖹖' => '𖹶', - '𖹗' => '𖹷', - '𖹘' => '𖹸', - '𖹙' => '𖹹', - '𖹚' => '𖹺', - '𖹛' => '𖹻', - '𖹜' => '𖹼', - '𖹝' => '𖹽', - '𖹞' => '𖹾', - '𖹟' => '𖹿', - '𞤀' => '𞤢', - '𞤁' => '𞤣', - '𞤂' => '𞤤', - '𞤃' => '𞤥', - '𞤄' => '𞤦', - '𞤅' => '𞤧', - '𞤆' => '𞤨', - '𞤇' => '𞤩', - '𞤈' => '𞤪', - '𞤉' => '𞤫', - '𞤊' => '𞤬', - '𞤋' => '𞤭', - '𞤌' => '𞤮', - '𞤍' => '𞤯', - '𞤎' => '𞤰', - '𞤏' => '𞤱', - '𞤐' => '𞤲', - '𞤑' => '𞤳', - '𞤒' => '𞤴', - '𞤓' => '𞤵', - '𞤔' => '𞤶', - '𞤕' => '𞤷', - '𞤖' => '𞤸', - '𞤗' => '𞤹', - '𞤘' => '𞤺', - '𞤙' => '𞤻', - '𞤚' => '𞤼', - '𞤛' => '𞤽', - '𞤜' => '𞤾', - '𞤝' => '𞤿', - '𞤞' => '𞥀', - '𞤟' => '𞥁', - '𞤠' => '𞥂', - '𞤡' => '𞥃', -); diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php deleted file mode 100644 index 2a8f6e7..0000000 --- a/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +++ /dev/null @@ -1,5 +0,0 @@ - 'A', - 'b' => 'B', - 'c' => 'C', - 'd' => 'D', - 'e' => 'E', - 'f' => 'F', - 'g' => 'G', - 'h' => 'H', - 'i' => 'I', - 'j' => 'J', - 'k' => 'K', - 'l' => 'L', - 'm' => 'M', - 'n' => 'N', - 'o' => 'O', - 'p' => 'P', - 'q' => 'Q', - 'r' => 'R', - 's' => 'S', - 't' => 'T', - 'u' => 'U', - 'v' => 'V', - 'w' => 'W', - 'x' => 'X', - 'y' => 'Y', - 'z' => 'Z', - 'µ' => 'Μ', - 'à' => 'À', - 'á' => 'Á', - 'â' => 'Â', - 'ã' => 'Ã', - 'ä' => 'Ä', - 'å' => 'Å', - 'æ' => 'Æ', - 'ç' => 'Ç', - 'è' => 'È', - 'é' => 'É', - 'ê' => 'Ê', - 'ë' => 'Ë', - 'ì' => 'Ì', - 'í' => 'Í', - 'î' => 'Î', - 'ï' => 'Ï', - 'ð' => 'Ð', - 'ñ' => 'Ñ', - 'ò' => 'Ò', - 'ó' => 'Ó', - 'ô' => 'Ô', - 'õ' => 'Õ', - 'ö' => 'Ö', - 'ø' => 'Ø', - 'ù' => 'Ù', - 'ú' => 'Ú', - 'û' => 'Û', - 'ü' => 'Ü', - 'ý' => 'Ý', - 'þ' => 'Þ', - 'ÿ' => 'Ÿ', - 'ā' => 'Ā', - 'ă' => 'Ă', - 'ą' => 'Ą', - 'ć' => 'Ć', - 'ĉ' => 'Ĉ', - 'ċ' => 'Ċ', - 'č' => 'Č', - 'ď' => 'Ď', - 'đ' => 'Đ', - 'ē' => 'Ē', - 'ĕ' => 'Ĕ', - 'ė' => 'Ė', - 'ę' => 'Ę', - 'ě' => 'Ě', - 'ĝ' => 'Ĝ', - 'ğ' => 'Ğ', - 'ġ' => 'Ġ', - 'ģ' => 'Ģ', - 'ĥ' => 'Ĥ', - 'ħ' => 'Ħ', - 'ĩ' => 'Ĩ', - 'ī' => 'Ī', - 'ĭ' => 'Ĭ', - 'į' => 'Į', - 'ı' => 'I', - 'ij' => 'IJ', - 'ĵ' => 'Ĵ', - 'ķ' => 'Ķ', - 'ĺ' => 'Ĺ', - 'ļ' => 'Ļ', - 'ľ' => 'Ľ', - 'ŀ' => 'Ŀ', - 'ł' => 'Ł', - 'ń' => 'Ń', - 'ņ' => 'Ņ', - 'ň' => 'Ň', - 'ŋ' => 'Ŋ', - 'ō' => 'Ō', - 'ŏ' => 'Ŏ', - 'ő' => 'Ő', - 'œ' => 'Œ', - 'ŕ' => 'Ŕ', - 'ŗ' => 'Ŗ', - 'ř' => 'Ř', - 'ś' => 'Ś', - 'ŝ' => 'Ŝ', - 'ş' => 'Ş', - 'š' => 'Š', - 'ţ' => 'Ţ', - 'ť' => 'Ť', - 'ŧ' => 'Ŧ', - 'ũ' => 'Ũ', - 'ū' => 'Ū', - 'ŭ' => 'Ŭ', - 'ů' => 'Ů', - 'ű' => 'Ű', - 'ų' => 'Ų', - 'ŵ' => 'Ŵ', - 'ŷ' => 'Ŷ', - 'ź' => 'Ź', - 'ż' => 'Ż', - 'ž' => 'Ž', - 'ſ' => 'S', - 'ƀ' => 'Ƀ', - 'ƃ' => 'Ƃ', - 'ƅ' => 'Ƅ', - 'ƈ' => 'Ƈ', - 'ƌ' => 'Ƌ', - 'ƒ' => 'Ƒ', - 'ƕ' => 'Ƕ', - 'ƙ' => 'Ƙ', - 'ƚ' => 'Ƚ', - 'ƞ' => 'Ƞ', - 'ơ' => 'Ơ', - 'ƣ' => 'Ƣ', - 'ƥ' => 'Ƥ', - 'ƨ' => 'Ƨ', - 'ƭ' => 'Ƭ', - 'ư' => 'Ư', - 'ƴ' => 'Ƴ', - 'ƶ' => 'Ƶ', - 'ƹ' => 'Ƹ', - 'ƽ' => 'Ƽ', - 'ƿ' => 'Ƿ', - 'Dž' => 'DŽ', - 'dž' => 'DŽ', - 'Lj' => 'LJ', - 'lj' => 'LJ', - 'Nj' => 'NJ', - 'nj' => 'NJ', - 'ǎ' => 'Ǎ', - 'ǐ' => 'Ǐ', - 'ǒ' => 'Ǒ', - 'ǔ' => 'Ǔ', - 'ǖ' => 'Ǖ', - 'ǘ' => 'Ǘ', - 'ǚ' => 'Ǚ', - 'ǜ' => 'Ǜ', - 'ǝ' => 'Ǝ', - 'ǟ' => 'Ǟ', - 'ǡ' => 'Ǡ', - 'ǣ' => 'Ǣ', - 'ǥ' => 'Ǥ', - 'ǧ' => 'Ǧ', - 'ǩ' => 'Ǩ', - 'ǫ' => 'Ǫ', - 'ǭ' => 'Ǭ', - 'ǯ' => 'Ǯ', - 'Dz' => 'DZ', - 'dz' => 'DZ', - 'ǵ' => 'Ǵ', - 'ǹ' => 'Ǹ', - 'ǻ' => 'Ǻ', - 'ǽ' => 'Ǽ', - 'ǿ' => 'Ǿ', - 'ȁ' => 'Ȁ', - 'ȃ' => 'Ȃ', - 'ȅ' => 'Ȅ', - 'ȇ' => 'Ȇ', - 'ȉ' => 'Ȉ', - 'ȋ' => 'Ȋ', - 'ȍ' => 'Ȍ', - 'ȏ' => 'Ȏ', - 'ȑ' => 'Ȑ', - 'ȓ' => 'Ȓ', - 'ȕ' => 'Ȕ', - 'ȗ' => 'Ȗ', - 'ș' => 'Ș', - 'ț' => 'Ț', - 'ȝ' => 'Ȝ', - 'ȟ' => 'Ȟ', - 'ȣ' => 'Ȣ', - 'ȥ' => 'Ȥ', - 'ȧ' => 'Ȧ', - 'ȩ' => 'Ȩ', - 'ȫ' => 'Ȫ', - 'ȭ' => 'Ȭ', - 'ȯ' => 'Ȯ', - 'ȱ' => 'Ȱ', - 'ȳ' => 'Ȳ', - 'ȼ' => 'Ȼ', - 'ȿ' => 'Ȿ', - 'ɀ' => 'Ɀ', - 'ɂ' => 'Ɂ', - 'ɇ' => 'Ɇ', - 'ɉ' => 'Ɉ', - 'ɋ' => 'Ɋ', - 'ɍ' => 'Ɍ', - 'ɏ' => 'Ɏ', - 'ɐ' => 'Ɐ', - 'ɑ' => 'Ɑ', - 'ɒ' => 'Ɒ', - 'ɓ' => 'Ɓ', - 'ɔ' => 'Ɔ', - 'ɖ' => 'Ɖ', - 'ɗ' => 'Ɗ', - 'ə' => 'Ə', - 'ɛ' => 'Ɛ', - 'ɜ' => 'Ɜ', - 'ɠ' => 'Ɠ', - 'ɡ' => 'Ɡ', - 'ɣ' => 'Ɣ', - 'ɥ' => 'Ɥ', - 'ɦ' => 'Ɦ', - 'ɨ' => 'Ɨ', - 'ɩ' => 'Ɩ', - 'ɪ' => 'Ɪ', - 'ɫ' => 'Ɫ', - 'ɬ' => 'Ɬ', - 'ɯ' => 'Ɯ', - 'ɱ' => 'Ɱ', - 'ɲ' => 'Ɲ', - 'ɵ' => 'Ɵ', - 'ɽ' => 'Ɽ', - 'ʀ' => 'Ʀ', - 'ʂ' => 'Ʂ', - 'ʃ' => 'Ʃ', - 'ʇ' => 'Ʇ', - 'ʈ' => 'Ʈ', - 'ʉ' => 'Ʉ', - 'ʊ' => 'Ʊ', - 'ʋ' => 'Ʋ', - 'ʌ' => 'Ʌ', - 'ʒ' => 'Ʒ', - 'ʝ' => 'Ʝ', - 'ʞ' => 'Ʞ', - 'ͅ' => 'Ι', - 'ͱ' => 'Ͱ', - 'ͳ' => 'Ͳ', - 'ͷ' => 'Ͷ', - 'ͻ' => 'Ͻ', - 'ͼ' => 'Ͼ', - 'ͽ' => 'Ͽ', - 'ά' => 'Ά', - 'έ' => 'Έ', - 'ή' => 'Ή', - 'ί' => 'Ί', - 'α' => 'Α', - 'β' => 'Β', - 'γ' => 'Γ', - 'δ' => 'Δ', - 'ε' => 'Ε', - 'ζ' => 'Ζ', - 'η' => 'Η', - 'θ' => 'Θ', - 'ι' => 'Ι', - 'κ' => 'Κ', - 'λ' => 'Λ', - 'μ' => 'Μ', - 'ν' => 'Ν', - 'ξ' => 'Ξ', - 'ο' => 'Ο', - 'π' => 'Π', - 'ρ' => 'Ρ', - 'ς' => 'Σ', - 'σ' => 'Σ', - 'τ' => 'Τ', - 'υ' => 'Υ', - 'φ' => 'Φ', - 'χ' => 'Χ', - 'ψ' => 'Ψ', - 'ω' => 'Ω', - 'ϊ' => 'Ϊ', - 'ϋ' => 'Ϋ', - 'ό' => 'Ό', - 'ύ' => 'Ύ', - 'ώ' => 'Ώ', - 'ϐ' => 'Β', - 'ϑ' => 'Θ', - 'ϕ' => 'Φ', - 'ϖ' => 'Π', - 'ϗ' => 'Ϗ', - 'ϙ' => 'Ϙ', - 'ϛ' => 'Ϛ', - 'ϝ' => 'Ϝ', - 'ϟ' => 'Ϟ', - 'ϡ' => 'Ϡ', - 'ϣ' => 'Ϣ', - 'ϥ' => 'Ϥ', - 'ϧ' => 'Ϧ', - 'ϩ' => 'Ϩ', - 'ϫ' => 'Ϫ', - 'ϭ' => 'Ϭ', - 'ϯ' => 'Ϯ', - 'ϰ' => 'Κ', - 'ϱ' => 'Ρ', - 'ϲ' => 'Ϲ', - 'ϳ' => 'Ϳ', - 'ϵ' => 'Ε', - 'ϸ' => 'Ϸ', - 'ϻ' => 'Ϻ', - 'а' => 'А', - 'б' => 'Б', - 'в' => 'В', - 'г' => 'Г', - 'д' => 'Д', - 'е' => 'Е', - 'ж' => 'Ж', - 'з' => 'З', - 'и' => 'И', - 'й' => 'Й', - 'к' => 'К', - 'л' => 'Л', - 'м' => 'М', - 'н' => 'Н', - 'о' => 'О', - 'п' => 'П', - 'р' => 'Р', - 'с' => 'С', - 'т' => 'Т', - 'у' => 'У', - 'ф' => 'Ф', - 'х' => 'Х', - 'ц' => 'Ц', - 'ч' => 'Ч', - 'ш' => 'Ш', - 'щ' => 'Щ', - 'ъ' => 'Ъ', - 'ы' => 'Ы', - 'ь' => 'Ь', - 'э' => 'Э', - 'ю' => 'Ю', - 'я' => 'Я', - 'ѐ' => 'Ѐ', - 'ё' => 'Ё', - 'ђ' => 'Ђ', - 'ѓ' => 'Ѓ', - 'є' => 'Є', - 'ѕ' => 'Ѕ', - 'і' => 'І', - 'ї' => 'Ї', - 'ј' => 'Ј', - 'љ' => 'Љ', - 'њ' => 'Њ', - 'ћ' => 'Ћ', - 'ќ' => 'Ќ', - 'ѝ' => 'Ѝ', - 'ў' => 'Ў', - 'џ' => 'Џ', - 'ѡ' => 'Ѡ', - 'ѣ' => 'Ѣ', - 'ѥ' => 'Ѥ', - 'ѧ' => 'Ѧ', - 'ѩ' => 'Ѩ', - 'ѫ' => 'Ѫ', - 'ѭ' => 'Ѭ', - 'ѯ' => 'Ѯ', - 'ѱ' => 'Ѱ', - 'ѳ' => 'Ѳ', - 'ѵ' => 'Ѵ', - 'ѷ' => 'Ѷ', - 'ѹ' => 'Ѹ', - 'ѻ' => 'Ѻ', - 'ѽ' => 'Ѽ', - 'ѿ' => 'Ѿ', - 'ҁ' => 'Ҁ', - 'ҋ' => 'Ҋ', - 'ҍ' => 'Ҍ', - 'ҏ' => 'Ҏ', - 'ґ' => 'Ґ', - 'ғ' => 'Ғ', - 'ҕ' => 'Ҕ', - 'җ' => 'Җ', - 'ҙ' => 'Ҙ', - 'қ' => 'Қ', - 'ҝ' => 'Ҝ', - 'ҟ' => 'Ҟ', - 'ҡ' => 'Ҡ', - 'ң' => 'Ң', - 'ҥ' => 'Ҥ', - 'ҧ' => 'Ҧ', - 'ҩ' => 'Ҩ', - 'ҫ' => 'Ҫ', - 'ҭ' => 'Ҭ', - 'ү' => 'Ү', - 'ұ' => 'Ұ', - 'ҳ' => 'Ҳ', - 'ҵ' => 'Ҵ', - 'ҷ' => 'Ҷ', - 'ҹ' => 'Ҹ', - 'һ' => 'Һ', - 'ҽ' => 'Ҽ', - 'ҿ' => 'Ҿ', - 'ӂ' => 'Ӂ', - 'ӄ' => 'Ӄ', - 'ӆ' => 'Ӆ', - 'ӈ' => 'Ӈ', - 'ӊ' => 'Ӊ', - 'ӌ' => 'Ӌ', - 'ӎ' => 'Ӎ', - 'ӏ' => 'Ӏ', - 'ӑ' => 'Ӑ', - 'ӓ' => 'Ӓ', - 'ӕ' => 'Ӕ', - 'ӗ' => 'Ӗ', - 'ә' => 'Ә', - 'ӛ' => 'Ӛ', - 'ӝ' => 'Ӝ', - 'ӟ' => 'Ӟ', - 'ӡ' => 'Ӡ', - 'ӣ' => 'Ӣ', - 'ӥ' => 'Ӥ', - 'ӧ' => 'Ӧ', - 'ө' => 'Ө', - 'ӫ' => 'Ӫ', - 'ӭ' => 'Ӭ', - 'ӯ' => 'Ӯ', - 'ӱ' => 'Ӱ', - 'ӳ' => 'Ӳ', - 'ӵ' => 'Ӵ', - 'ӷ' => 'Ӷ', - 'ӹ' => 'Ӹ', - 'ӻ' => 'Ӻ', - 'ӽ' => 'Ӽ', - 'ӿ' => 'Ӿ', - 'ԁ' => 'Ԁ', - 'ԃ' => 'Ԃ', - 'ԅ' => 'Ԅ', - 'ԇ' => 'Ԇ', - 'ԉ' => 'Ԉ', - 'ԋ' => 'Ԋ', - 'ԍ' => 'Ԍ', - 'ԏ' => 'Ԏ', - 'ԑ' => 'Ԑ', - 'ԓ' => 'Ԓ', - 'ԕ' => 'Ԕ', - 'ԗ' => 'Ԗ', - 'ԙ' => 'Ԙ', - 'ԛ' => 'Ԛ', - 'ԝ' => 'Ԝ', - 'ԟ' => 'Ԟ', - 'ԡ' => 'Ԡ', - 'ԣ' => 'Ԣ', - 'ԥ' => 'Ԥ', - 'ԧ' => 'Ԧ', - 'ԩ' => 'Ԩ', - 'ԫ' => 'Ԫ', - 'ԭ' => 'Ԭ', - 'ԯ' => 'Ԯ', - 'ա' => 'Ա', - 'բ' => 'Բ', - 'գ' => 'Գ', - 'դ' => 'Դ', - 'ե' => 'Ե', - 'զ' => 'Զ', - 'է' => 'Է', - 'ը' => 'Ը', - 'թ' => 'Թ', - 'ժ' => 'Ժ', - 'ի' => 'Ի', - 'լ' => 'Լ', - 'խ' => 'Խ', - 'ծ' => 'Ծ', - 'կ' => 'Կ', - 'հ' => 'Հ', - 'ձ' => 'Ձ', - 'ղ' => 'Ղ', - 'ճ' => 'Ճ', - 'մ' => 'Մ', - 'յ' => 'Յ', - 'ն' => 'Ն', - 'շ' => 'Շ', - 'ո' => 'Ո', - 'չ' => 'Չ', - 'պ' => 'Պ', - 'ջ' => 'Ջ', - 'ռ' => 'Ռ', - 'ս' => 'Ս', - 'վ' => 'Վ', - 'տ' => 'Տ', - 'ր' => 'Ր', - 'ց' => 'Ց', - 'ւ' => 'Ւ', - 'փ' => 'Փ', - 'ք' => 'Ք', - 'օ' => 'Օ', - 'ֆ' => 'Ֆ', - 'ა' => 'Ა', - 'ბ' => 'Ბ', - 'გ' => 'Გ', - 'დ' => 'Დ', - 'ე' => 'Ე', - 'ვ' => 'Ვ', - 'ზ' => 'Ზ', - 'თ' => 'Თ', - 'ი' => 'Ი', - 'კ' => 'Კ', - 'ლ' => 'Ლ', - 'მ' => 'Მ', - 'ნ' => 'Ნ', - 'ო' => 'Ო', - 'პ' => 'Პ', - 'ჟ' => 'Ჟ', - 'რ' => 'Რ', - 'ს' => 'Ს', - 'ტ' => 'Ტ', - 'უ' => 'Უ', - 'ფ' => 'Ფ', - 'ქ' => 'Ქ', - 'ღ' => 'Ღ', - 'ყ' => 'Ყ', - 'შ' => 'Შ', - 'ჩ' => 'Ჩ', - 'ც' => 'Ც', - 'ძ' => 'Ძ', - 'წ' => 'Წ', - 'ჭ' => 'Ჭ', - 'ხ' => 'Ხ', - 'ჯ' => 'Ჯ', - 'ჰ' => 'Ჰ', - 'ჱ' => 'Ჱ', - 'ჲ' => 'Ჲ', - 'ჳ' => 'Ჳ', - 'ჴ' => 'Ჴ', - 'ჵ' => 'Ჵ', - 'ჶ' => 'Ჶ', - 'ჷ' => 'Ჷ', - 'ჸ' => 'Ჸ', - 'ჹ' => 'Ჹ', - 'ჺ' => 'Ჺ', - 'ჽ' => 'Ჽ', - 'ჾ' => 'Ჾ', - 'ჿ' => 'Ჿ', - 'ᏸ' => 'Ᏸ', - 'ᏹ' => 'Ᏹ', - 'ᏺ' => 'Ᏺ', - 'ᏻ' => 'Ᏻ', - 'ᏼ' => 'Ᏼ', - 'ᏽ' => 'Ᏽ', - 'ᲀ' => 'В', - 'ᲁ' => 'Д', - 'ᲂ' => 'О', - 'ᲃ' => 'С', - 'ᲄ' => 'Т', - 'ᲅ' => 'Т', - 'ᲆ' => 'Ъ', - 'ᲇ' => 'Ѣ', - 'ᲈ' => 'Ꙋ', - 'ᵹ' => 'Ᵹ', - 'ᵽ' => 'Ᵽ', - 'ᶎ' => 'Ᶎ', - 'ḁ' => 'Ḁ', - 'ḃ' => 'Ḃ', - 'ḅ' => 'Ḅ', - 'ḇ' => 'Ḇ', - 'ḉ' => 'Ḉ', - 'ḋ' => 'Ḋ', - 'ḍ' => 'Ḍ', - 'ḏ' => 'Ḏ', - 'ḑ' => 'Ḑ', - 'ḓ' => 'Ḓ', - 'ḕ' => 'Ḕ', - 'ḗ' => 'Ḗ', - 'ḙ' => 'Ḙ', - 'ḛ' => 'Ḛ', - 'ḝ' => 'Ḝ', - 'ḟ' => 'Ḟ', - 'ḡ' => 'Ḡ', - 'ḣ' => 'Ḣ', - 'ḥ' => 'Ḥ', - 'ḧ' => 'Ḧ', - 'ḩ' => 'Ḩ', - 'ḫ' => 'Ḫ', - 'ḭ' => 'Ḭ', - 'ḯ' => 'Ḯ', - 'ḱ' => 'Ḱ', - 'ḳ' => 'Ḳ', - 'ḵ' => 'Ḵ', - 'ḷ' => 'Ḷ', - 'ḹ' => 'Ḹ', - 'ḻ' => 'Ḻ', - 'ḽ' => 'Ḽ', - 'ḿ' => 'Ḿ', - 'ṁ' => 'Ṁ', - 'ṃ' => 'Ṃ', - 'ṅ' => 'Ṅ', - 'ṇ' => 'Ṇ', - 'ṉ' => 'Ṉ', - 'ṋ' => 'Ṋ', - 'ṍ' => 'Ṍ', - 'ṏ' => 'Ṏ', - 'ṑ' => 'Ṑ', - 'ṓ' => 'Ṓ', - 'ṕ' => 'Ṕ', - 'ṗ' => 'Ṗ', - 'ṙ' => 'Ṙ', - 'ṛ' => 'Ṛ', - 'ṝ' => 'Ṝ', - 'ṟ' => 'Ṟ', - 'ṡ' => 'Ṡ', - 'ṣ' => 'Ṣ', - 'ṥ' => 'Ṥ', - 'ṧ' => 'Ṧ', - 'ṩ' => 'Ṩ', - 'ṫ' => 'Ṫ', - 'ṭ' => 'Ṭ', - 'ṯ' => 'Ṯ', - 'ṱ' => 'Ṱ', - 'ṳ' => 'Ṳ', - 'ṵ' => 'Ṵ', - 'ṷ' => 'Ṷ', - 'ṹ' => 'Ṹ', - 'ṻ' => 'Ṻ', - 'ṽ' => 'Ṽ', - 'ṿ' => 'Ṿ', - 'ẁ' => 'Ẁ', - 'ẃ' => 'Ẃ', - 'ẅ' => 'Ẅ', - 'ẇ' => 'Ẇ', - 'ẉ' => 'Ẉ', - 'ẋ' => 'Ẋ', - 'ẍ' => 'Ẍ', - 'ẏ' => 'Ẏ', - 'ẑ' => 'Ẑ', - 'ẓ' => 'Ẓ', - 'ẕ' => 'Ẕ', - 'ẛ' => 'Ṡ', - 'ạ' => 'Ạ', - 'ả' => 'Ả', - 'ấ' => 'Ấ', - 'ầ' => 'Ầ', - 'ẩ' => 'Ẩ', - 'ẫ' => 'Ẫ', - 'ậ' => 'Ậ', - 'ắ' => 'Ắ', - 'ằ' => 'Ằ', - 'ẳ' => 'Ẳ', - 'ẵ' => 'Ẵ', - 'ặ' => 'Ặ', - 'ẹ' => 'Ẹ', - 'ẻ' => 'Ẻ', - 'ẽ' => 'Ẽ', - 'ế' => 'Ế', - 'ề' => 'Ề', - 'ể' => 'Ể', - 'ễ' => 'Ễ', - 'ệ' => 'Ệ', - 'ỉ' => 'Ỉ', - 'ị' => 'Ị', - 'ọ' => 'Ọ', - 'ỏ' => 'Ỏ', - 'ố' => 'Ố', - 'ồ' => 'Ồ', - 'ổ' => 'Ổ', - 'ỗ' => 'Ỗ', - 'ộ' => 'Ộ', - 'ớ' => 'Ớ', - 'ờ' => 'Ờ', - 'ở' => 'Ở', - 'ỡ' => 'Ỡ', - 'ợ' => 'Ợ', - 'ụ' => 'Ụ', - 'ủ' => 'Ủ', - 'ứ' => 'Ứ', - 'ừ' => 'Ừ', - 'ử' => 'Ử', - 'ữ' => 'Ữ', - 'ự' => 'Ự', - 'ỳ' => 'Ỳ', - 'ỵ' => 'Ỵ', - 'ỷ' => 'Ỷ', - 'ỹ' => 'Ỹ', - 'ỻ' => 'Ỻ', - 'ỽ' => 'Ỽ', - 'ỿ' => 'Ỿ', - 'ἀ' => 'Ἀ', - 'ἁ' => 'Ἁ', - 'ἂ' => 'Ἂ', - 'ἃ' => 'Ἃ', - 'ἄ' => 'Ἄ', - 'ἅ' => 'Ἅ', - 'ἆ' => 'Ἆ', - 'ἇ' => 'Ἇ', - 'ἐ' => 'Ἐ', - 'ἑ' => 'Ἑ', - 'ἒ' => 'Ἒ', - 'ἓ' => 'Ἓ', - 'ἔ' => 'Ἔ', - 'ἕ' => 'Ἕ', - 'ἠ' => 'Ἠ', - 'ἡ' => 'Ἡ', - 'ἢ' => 'Ἢ', - 'ἣ' => 'Ἣ', - 'ἤ' => 'Ἤ', - 'ἥ' => 'Ἥ', - 'ἦ' => 'Ἦ', - 'ἧ' => 'Ἧ', - 'ἰ' => 'Ἰ', - 'ἱ' => 'Ἱ', - 'ἲ' => 'Ἲ', - 'ἳ' => 'Ἳ', - 'ἴ' => 'Ἴ', - 'ἵ' => 'Ἵ', - 'ἶ' => 'Ἶ', - 'ἷ' => 'Ἷ', - 'ὀ' => 'Ὀ', - 'ὁ' => 'Ὁ', - 'ὂ' => 'Ὂ', - 'ὃ' => 'Ὃ', - 'ὄ' => 'Ὄ', - 'ὅ' => 'Ὅ', - 'ὑ' => 'Ὑ', - 'ὓ' => 'Ὓ', - 'ὕ' => 'Ὕ', - 'ὗ' => 'Ὗ', - 'ὠ' => 'Ὠ', - 'ὡ' => 'Ὡ', - 'ὢ' => 'Ὢ', - 'ὣ' => 'Ὣ', - 'ὤ' => 'Ὤ', - 'ὥ' => 'Ὥ', - 'ὦ' => 'Ὦ', - 'ὧ' => 'Ὧ', - 'ὰ' => 'Ὰ', - 'ά' => 'Ά', - 'ὲ' => 'Ὲ', - 'έ' => 'Έ', - 'ὴ' => 'Ὴ', - 'ή' => 'Ή', - 'ὶ' => 'Ὶ', - 'ί' => 'Ί', - 'ὸ' => 'Ὸ', - 'ό' => 'Ό', - 'ὺ' => 'Ὺ', - 'ύ' => 'Ύ', - 'ὼ' => 'Ὼ', - 'ώ' => 'Ώ', - 'ᾀ' => 'ἈΙ', - 'ᾁ' => 'ἉΙ', - 'ᾂ' => 'ἊΙ', - 'ᾃ' => 'ἋΙ', - 'ᾄ' => 'ἌΙ', - 'ᾅ' => 'ἍΙ', - 'ᾆ' => 'ἎΙ', - 'ᾇ' => 'ἏΙ', - 'ᾐ' => 'ἨΙ', - 'ᾑ' => 'ἩΙ', - 'ᾒ' => 'ἪΙ', - 'ᾓ' => 'ἫΙ', - 'ᾔ' => 'ἬΙ', - 'ᾕ' => 'ἭΙ', - 'ᾖ' => 'ἮΙ', - 'ᾗ' => 'ἯΙ', - 'ᾠ' => 'ὨΙ', - 'ᾡ' => 'ὩΙ', - 'ᾢ' => 'ὪΙ', - 'ᾣ' => 'ὫΙ', - 'ᾤ' => 'ὬΙ', - 'ᾥ' => 'ὭΙ', - 'ᾦ' => 'ὮΙ', - 'ᾧ' => 'ὯΙ', - 'ᾰ' => 'Ᾰ', - 'ᾱ' => 'Ᾱ', - 'ᾳ' => 'ΑΙ', - 'ι' => 'Ι', - 'ῃ' => 'ΗΙ', - 'ῐ' => 'Ῐ', - 'ῑ' => 'Ῑ', - 'ῠ' => 'Ῠ', - 'ῡ' => 'Ῡ', - 'ῥ' => 'Ῥ', - 'ῳ' => 'ΩΙ', - 'ⅎ' => 'Ⅎ', - 'ⅰ' => 'Ⅰ', - 'ⅱ' => 'Ⅱ', - 'ⅲ' => 'Ⅲ', - 'ⅳ' => 'Ⅳ', - 'ⅴ' => 'Ⅴ', - 'ⅵ' => 'Ⅵ', - 'ⅶ' => 'Ⅶ', - 'ⅷ' => 'Ⅷ', - 'ⅸ' => 'Ⅸ', - 'ⅹ' => 'Ⅹ', - 'ⅺ' => 'Ⅺ', - 'ⅻ' => 'Ⅻ', - 'ⅼ' => 'Ⅼ', - 'ⅽ' => 'Ⅽ', - 'ⅾ' => 'Ⅾ', - 'ⅿ' => 'Ⅿ', - 'ↄ' => 'Ↄ', - 'ⓐ' => 'Ⓐ', - 'ⓑ' => 'Ⓑ', - 'ⓒ' => 'Ⓒ', - 'ⓓ' => 'Ⓓ', - 'ⓔ' => 'Ⓔ', - 'ⓕ' => 'Ⓕ', - 'ⓖ' => 'Ⓖ', - 'ⓗ' => 'Ⓗ', - 'ⓘ' => 'Ⓘ', - 'ⓙ' => 'Ⓙ', - 'ⓚ' => 'Ⓚ', - 'ⓛ' => 'Ⓛ', - 'ⓜ' => 'Ⓜ', - 'ⓝ' => 'Ⓝ', - 'ⓞ' => 'Ⓞ', - 'ⓟ' => 'Ⓟ', - 'ⓠ' => 'Ⓠ', - 'ⓡ' => 'Ⓡ', - 'ⓢ' => 'Ⓢ', - 'ⓣ' => 'Ⓣ', - 'ⓤ' => 'Ⓤ', - 'ⓥ' => 'Ⓥ', - 'ⓦ' => 'Ⓦ', - 'ⓧ' => 'Ⓧ', - 'ⓨ' => 'Ⓨ', - 'ⓩ' => 'Ⓩ', - 'ⰰ' => 'Ⰰ', - 'ⰱ' => 'Ⰱ', - 'ⰲ' => 'Ⰲ', - 'ⰳ' => 'Ⰳ', - 'ⰴ' => 'Ⰴ', - 'ⰵ' => 'Ⰵ', - 'ⰶ' => 'Ⰶ', - 'ⰷ' => 'Ⰷ', - 'ⰸ' => 'Ⰸ', - 'ⰹ' => 'Ⰹ', - 'ⰺ' => 'Ⰺ', - 'ⰻ' => 'Ⰻ', - 'ⰼ' => 'Ⰼ', - 'ⰽ' => 'Ⰽ', - 'ⰾ' => 'Ⰾ', - 'ⰿ' => 'Ⰿ', - 'ⱀ' => 'Ⱀ', - 'ⱁ' => 'Ⱁ', - 'ⱂ' => 'Ⱂ', - 'ⱃ' => 'Ⱃ', - 'ⱄ' => 'Ⱄ', - 'ⱅ' => 'Ⱅ', - 'ⱆ' => 'Ⱆ', - 'ⱇ' => 'Ⱇ', - 'ⱈ' => 'Ⱈ', - 'ⱉ' => 'Ⱉ', - 'ⱊ' => 'Ⱊ', - 'ⱋ' => 'Ⱋ', - 'ⱌ' => 'Ⱌ', - 'ⱍ' => 'Ⱍ', - 'ⱎ' => 'Ⱎ', - 'ⱏ' => 'Ⱏ', - 'ⱐ' => 'Ⱐ', - 'ⱑ' => 'Ⱑ', - 'ⱒ' => 'Ⱒ', - 'ⱓ' => 'Ⱓ', - 'ⱔ' => 'Ⱔ', - 'ⱕ' => 'Ⱕ', - 'ⱖ' => 'Ⱖ', - 'ⱗ' => 'Ⱗ', - 'ⱘ' => 'Ⱘ', - 'ⱙ' => 'Ⱙ', - 'ⱚ' => 'Ⱚ', - 'ⱛ' => 'Ⱛ', - 'ⱜ' => 'Ⱜ', - 'ⱝ' => 'Ⱝ', - 'ⱞ' => 'Ⱞ', - 'ⱡ' => 'Ⱡ', - 'ⱥ' => 'Ⱥ', - 'ⱦ' => 'Ⱦ', - 'ⱨ' => 'Ⱨ', - 'ⱪ' => 'Ⱪ', - 'ⱬ' => 'Ⱬ', - 'ⱳ' => 'Ⱳ', - 'ⱶ' => 'Ⱶ', - 'ⲁ' => 'Ⲁ', - 'ⲃ' => 'Ⲃ', - 'ⲅ' => 'Ⲅ', - 'ⲇ' => 'Ⲇ', - 'ⲉ' => 'Ⲉ', - 'ⲋ' => 'Ⲋ', - 'ⲍ' => 'Ⲍ', - 'ⲏ' => 'Ⲏ', - 'ⲑ' => 'Ⲑ', - 'ⲓ' => 'Ⲓ', - 'ⲕ' => 'Ⲕ', - 'ⲗ' => 'Ⲗ', - 'ⲙ' => 'Ⲙ', - 'ⲛ' => 'Ⲛ', - 'ⲝ' => 'Ⲝ', - 'ⲟ' => 'Ⲟ', - 'ⲡ' => 'Ⲡ', - 'ⲣ' => 'Ⲣ', - 'ⲥ' => 'Ⲥ', - 'ⲧ' => 'Ⲧ', - 'ⲩ' => 'Ⲩ', - 'ⲫ' => 'Ⲫ', - 'ⲭ' => 'Ⲭ', - 'ⲯ' => 'Ⲯ', - 'ⲱ' => 'Ⲱ', - 'ⲳ' => 'Ⲳ', - 'ⲵ' => 'Ⲵ', - 'ⲷ' => 'Ⲷ', - 'ⲹ' => 'Ⲹ', - 'ⲻ' => 'Ⲻ', - 'ⲽ' => 'Ⲽ', - 'ⲿ' => 'Ⲿ', - 'ⳁ' => 'Ⳁ', - 'ⳃ' => 'Ⳃ', - 'ⳅ' => 'Ⳅ', - 'ⳇ' => 'Ⳇ', - 'ⳉ' => 'Ⳉ', - 'ⳋ' => 'Ⳋ', - 'ⳍ' => 'Ⳍ', - 'ⳏ' => 'Ⳏ', - 'ⳑ' => 'Ⳑ', - 'ⳓ' => 'Ⳓ', - 'ⳕ' => 'Ⳕ', - 'ⳗ' => 'Ⳗ', - 'ⳙ' => 'Ⳙ', - 'ⳛ' => 'Ⳛ', - 'ⳝ' => 'Ⳝ', - 'ⳟ' => 'Ⳟ', - 'ⳡ' => 'Ⳡ', - 'ⳣ' => 'Ⳣ', - 'ⳬ' => 'Ⳬ', - 'ⳮ' => 'Ⳮ', - 'ⳳ' => 'Ⳳ', - 'ⴀ' => 'Ⴀ', - 'ⴁ' => 'Ⴁ', - 'ⴂ' => 'Ⴂ', - 'ⴃ' => 'Ⴃ', - 'ⴄ' => 'Ⴄ', - 'ⴅ' => 'Ⴅ', - 'ⴆ' => 'Ⴆ', - 'ⴇ' => 'Ⴇ', - 'ⴈ' => 'Ⴈ', - 'ⴉ' => 'Ⴉ', - 'ⴊ' => 'Ⴊ', - 'ⴋ' => 'Ⴋ', - 'ⴌ' => 'Ⴌ', - 'ⴍ' => 'Ⴍ', - 'ⴎ' => 'Ⴎ', - 'ⴏ' => 'Ⴏ', - 'ⴐ' => 'Ⴐ', - 'ⴑ' => 'Ⴑ', - 'ⴒ' => 'Ⴒ', - 'ⴓ' => 'Ⴓ', - 'ⴔ' => 'Ⴔ', - 'ⴕ' => 'Ⴕ', - 'ⴖ' => 'Ⴖ', - 'ⴗ' => 'Ⴗ', - 'ⴘ' => 'Ⴘ', - 'ⴙ' => 'Ⴙ', - 'ⴚ' => 'Ⴚ', - 'ⴛ' => 'Ⴛ', - 'ⴜ' => 'Ⴜ', - 'ⴝ' => 'Ⴝ', - 'ⴞ' => 'Ⴞ', - 'ⴟ' => 'Ⴟ', - 'ⴠ' => 'Ⴠ', - 'ⴡ' => 'Ⴡ', - 'ⴢ' => 'Ⴢ', - 'ⴣ' => 'Ⴣ', - 'ⴤ' => 'Ⴤ', - 'ⴥ' => 'Ⴥ', - 'ⴧ' => 'Ⴧ', - 'ⴭ' => 'Ⴭ', - 'ꙁ' => 'Ꙁ', - 'ꙃ' => 'Ꙃ', - 'ꙅ' => 'Ꙅ', - 'ꙇ' => 'Ꙇ', - 'ꙉ' => 'Ꙉ', - 'ꙋ' => 'Ꙋ', - 'ꙍ' => 'Ꙍ', - 'ꙏ' => 'Ꙏ', - 'ꙑ' => 'Ꙑ', - 'ꙓ' => 'Ꙓ', - 'ꙕ' => 'Ꙕ', - 'ꙗ' => 'Ꙗ', - 'ꙙ' => 'Ꙙ', - 'ꙛ' => 'Ꙛ', - 'ꙝ' => 'Ꙝ', - 'ꙟ' => 'Ꙟ', - 'ꙡ' => 'Ꙡ', - 'ꙣ' => 'Ꙣ', - 'ꙥ' => 'Ꙥ', - 'ꙧ' => 'Ꙧ', - 'ꙩ' => 'Ꙩ', - 'ꙫ' => 'Ꙫ', - 'ꙭ' => 'Ꙭ', - 'ꚁ' => 'Ꚁ', - 'ꚃ' => 'Ꚃ', - 'ꚅ' => 'Ꚅ', - 'ꚇ' => 'Ꚇ', - 'ꚉ' => 'Ꚉ', - 'ꚋ' => 'Ꚋ', - 'ꚍ' => 'Ꚍ', - 'ꚏ' => 'Ꚏ', - 'ꚑ' => 'Ꚑ', - 'ꚓ' => 'Ꚓ', - 'ꚕ' => 'Ꚕ', - 'ꚗ' => 'Ꚗ', - 'ꚙ' => 'Ꚙ', - 'ꚛ' => 'Ꚛ', - 'ꜣ' => 'Ꜣ', - 'ꜥ' => 'Ꜥ', - 'ꜧ' => 'Ꜧ', - 'ꜩ' => 'Ꜩ', - 'ꜫ' => 'Ꜫ', - 'ꜭ' => 'Ꜭ', - 'ꜯ' => 'Ꜯ', - 'ꜳ' => 'Ꜳ', - 'ꜵ' => 'Ꜵ', - 'ꜷ' => 'Ꜷ', - 'ꜹ' => 'Ꜹ', - 'ꜻ' => 'Ꜻ', - 'ꜽ' => 'Ꜽ', - 'ꜿ' => 'Ꜿ', - 'ꝁ' => 'Ꝁ', - 'ꝃ' => 'Ꝃ', - 'ꝅ' => 'Ꝅ', - 'ꝇ' => 'Ꝇ', - 'ꝉ' => 'Ꝉ', - 'ꝋ' => 'Ꝋ', - 'ꝍ' => 'Ꝍ', - 'ꝏ' => 'Ꝏ', - 'ꝑ' => 'Ꝑ', - 'ꝓ' => 'Ꝓ', - 'ꝕ' => 'Ꝕ', - 'ꝗ' => 'Ꝗ', - 'ꝙ' => 'Ꝙ', - 'ꝛ' => 'Ꝛ', - 'ꝝ' => 'Ꝝ', - 'ꝟ' => 'Ꝟ', - 'ꝡ' => 'Ꝡ', - 'ꝣ' => 'Ꝣ', - 'ꝥ' => 'Ꝥ', - 'ꝧ' => 'Ꝧ', - 'ꝩ' => 'Ꝩ', - 'ꝫ' => 'Ꝫ', - 'ꝭ' => 'Ꝭ', - 'ꝯ' => 'Ꝯ', - 'ꝺ' => 'Ꝺ', - 'ꝼ' => 'Ꝼ', - 'ꝿ' => 'Ꝿ', - 'ꞁ' => 'Ꞁ', - 'ꞃ' => 'Ꞃ', - 'ꞅ' => 'Ꞅ', - 'ꞇ' => 'Ꞇ', - 'ꞌ' => 'Ꞌ', - 'ꞑ' => 'Ꞑ', - 'ꞓ' => 'Ꞓ', - 'ꞔ' => 'Ꞔ', - 'ꞗ' => 'Ꞗ', - 'ꞙ' => 'Ꞙ', - 'ꞛ' => 'Ꞛ', - 'ꞝ' => 'Ꞝ', - 'ꞟ' => 'Ꞟ', - 'ꞡ' => 'Ꞡ', - 'ꞣ' => 'Ꞣ', - 'ꞥ' => 'Ꞥ', - 'ꞧ' => 'Ꞧ', - 'ꞩ' => 'Ꞩ', - 'ꞵ' => 'Ꞵ', - 'ꞷ' => 'Ꞷ', - 'ꞹ' => 'Ꞹ', - 'ꞻ' => 'Ꞻ', - 'ꞽ' => 'Ꞽ', - 'ꞿ' => 'Ꞿ', - 'ꟃ' => 'Ꟃ', - 'ꟈ' => 'Ꟈ', - 'ꟊ' => 'Ꟊ', - 'ꟶ' => 'Ꟶ', - 'ꭓ' => 'Ꭓ', - 'ꭰ' => 'Ꭰ', - 'ꭱ' => 'Ꭱ', - 'ꭲ' => 'Ꭲ', - 'ꭳ' => 'Ꭳ', - 'ꭴ' => 'Ꭴ', - 'ꭵ' => 'Ꭵ', - 'ꭶ' => 'Ꭶ', - 'ꭷ' => 'Ꭷ', - 'ꭸ' => 'Ꭸ', - 'ꭹ' => 'Ꭹ', - 'ꭺ' => 'Ꭺ', - 'ꭻ' => 'Ꭻ', - 'ꭼ' => 'Ꭼ', - 'ꭽ' => 'Ꭽ', - 'ꭾ' => 'Ꭾ', - 'ꭿ' => 'Ꭿ', - 'ꮀ' => 'Ꮀ', - 'ꮁ' => 'Ꮁ', - 'ꮂ' => 'Ꮂ', - 'ꮃ' => 'Ꮃ', - 'ꮄ' => 'Ꮄ', - 'ꮅ' => 'Ꮅ', - 'ꮆ' => 'Ꮆ', - 'ꮇ' => 'Ꮇ', - 'ꮈ' => 'Ꮈ', - 'ꮉ' => 'Ꮉ', - 'ꮊ' => 'Ꮊ', - 'ꮋ' => 'Ꮋ', - 'ꮌ' => 'Ꮌ', - 'ꮍ' => 'Ꮍ', - 'ꮎ' => 'Ꮎ', - 'ꮏ' => 'Ꮏ', - 'ꮐ' => 'Ꮐ', - 'ꮑ' => 'Ꮑ', - 'ꮒ' => 'Ꮒ', - 'ꮓ' => 'Ꮓ', - 'ꮔ' => 'Ꮔ', - 'ꮕ' => 'Ꮕ', - 'ꮖ' => 'Ꮖ', - 'ꮗ' => 'Ꮗ', - 'ꮘ' => 'Ꮘ', - 'ꮙ' => 'Ꮙ', - 'ꮚ' => 'Ꮚ', - 'ꮛ' => 'Ꮛ', - 'ꮜ' => 'Ꮜ', - 'ꮝ' => 'Ꮝ', - 'ꮞ' => 'Ꮞ', - 'ꮟ' => 'Ꮟ', - 'ꮠ' => 'Ꮠ', - 'ꮡ' => 'Ꮡ', - 'ꮢ' => 'Ꮢ', - 'ꮣ' => 'Ꮣ', - 'ꮤ' => 'Ꮤ', - 'ꮥ' => 'Ꮥ', - 'ꮦ' => 'Ꮦ', - 'ꮧ' => 'Ꮧ', - 'ꮨ' => 'Ꮨ', - 'ꮩ' => 'Ꮩ', - 'ꮪ' => 'Ꮪ', - 'ꮫ' => 'Ꮫ', - 'ꮬ' => 'Ꮬ', - 'ꮭ' => 'Ꮭ', - 'ꮮ' => 'Ꮮ', - 'ꮯ' => 'Ꮯ', - 'ꮰ' => 'Ꮰ', - 'ꮱ' => 'Ꮱ', - 'ꮲ' => 'Ꮲ', - 'ꮳ' => 'Ꮳ', - 'ꮴ' => 'Ꮴ', - 'ꮵ' => 'Ꮵ', - 'ꮶ' => 'Ꮶ', - 'ꮷ' => 'Ꮷ', - 'ꮸ' => 'Ꮸ', - 'ꮹ' => 'Ꮹ', - 'ꮺ' => 'Ꮺ', - 'ꮻ' => 'Ꮻ', - 'ꮼ' => 'Ꮼ', - 'ꮽ' => 'Ꮽ', - 'ꮾ' => 'Ꮾ', - 'ꮿ' => 'Ꮿ', - 'a' => 'A', - 'b' => 'B', - 'c' => 'C', - 'd' => 'D', - 'e' => 'E', - 'f' => 'F', - 'g' => 'G', - 'h' => 'H', - 'i' => 'I', - 'j' => 'J', - 'k' => 'K', - 'l' => 'L', - 'm' => 'M', - 'n' => 'N', - 'o' => 'O', - 'p' => 'P', - 'q' => 'Q', - 'r' => 'R', - 's' => 'S', - 't' => 'T', - 'u' => 'U', - 'v' => 'V', - 'w' => 'W', - 'x' => 'X', - 'y' => 'Y', - 'z' => 'Z', - '𐐨' => '𐐀', - '𐐩' => '𐐁', - '𐐪' => '𐐂', - '𐐫' => '𐐃', - '𐐬' => '𐐄', - '𐐭' => '𐐅', - '𐐮' => '𐐆', - '𐐯' => '𐐇', - '𐐰' => '𐐈', - '𐐱' => '𐐉', - '𐐲' => '𐐊', - '𐐳' => '𐐋', - '𐐴' => '𐐌', - '𐐵' => '𐐍', - '𐐶' => '𐐎', - '𐐷' => '𐐏', - '𐐸' => '𐐐', - '𐐹' => '𐐑', - '𐐺' => '𐐒', - '𐐻' => '𐐓', - '𐐼' => '𐐔', - '𐐽' => '𐐕', - '𐐾' => '𐐖', - '𐐿' => '𐐗', - '𐑀' => '𐐘', - '𐑁' => '𐐙', - '𐑂' => '𐐚', - '𐑃' => '𐐛', - '𐑄' => '𐐜', - '𐑅' => '𐐝', - '𐑆' => '𐐞', - '𐑇' => '𐐟', - '𐑈' => '𐐠', - '𐑉' => '𐐡', - '𐑊' => '𐐢', - '𐑋' => '𐐣', - '𐑌' => '𐐤', - '𐑍' => '𐐥', - '𐑎' => '𐐦', - '𐑏' => '𐐧', - '𐓘' => '𐒰', - '𐓙' => '𐒱', - '𐓚' => '𐒲', - '𐓛' => '𐒳', - '𐓜' => '𐒴', - '𐓝' => '𐒵', - '𐓞' => '𐒶', - '𐓟' => '𐒷', - '𐓠' => '𐒸', - '𐓡' => '𐒹', - '𐓢' => '𐒺', - '𐓣' => '𐒻', - '𐓤' => '𐒼', - '𐓥' => '𐒽', - '𐓦' => '𐒾', - '𐓧' => '𐒿', - '𐓨' => '𐓀', - '𐓩' => '𐓁', - '𐓪' => '𐓂', - '𐓫' => '𐓃', - '𐓬' => '𐓄', - '𐓭' => '𐓅', - '𐓮' => '𐓆', - '𐓯' => '𐓇', - '𐓰' => '𐓈', - '𐓱' => '𐓉', - '𐓲' => '𐓊', - '𐓳' => '𐓋', - '𐓴' => '𐓌', - '𐓵' => '𐓍', - '𐓶' => '𐓎', - '𐓷' => '𐓏', - '𐓸' => '𐓐', - '𐓹' => '𐓑', - '𐓺' => '𐓒', - '𐓻' => '𐓓', - '𐳀' => '𐲀', - '𐳁' => '𐲁', - '𐳂' => '𐲂', - '𐳃' => '𐲃', - '𐳄' => '𐲄', - '𐳅' => '𐲅', - '𐳆' => '𐲆', - '𐳇' => '𐲇', - '𐳈' => '𐲈', - '𐳉' => '𐲉', - '𐳊' => '𐲊', - '𐳋' => '𐲋', - '𐳌' => '𐲌', - '𐳍' => '𐲍', - '𐳎' => '𐲎', - '𐳏' => '𐲏', - '𐳐' => '𐲐', - '𐳑' => '𐲑', - '𐳒' => '𐲒', - '𐳓' => '𐲓', - '𐳔' => '𐲔', - '𐳕' => '𐲕', - '𐳖' => '𐲖', - '𐳗' => '𐲗', - '𐳘' => '𐲘', - '𐳙' => '𐲙', - '𐳚' => '𐲚', - '𐳛' => '𐲛', - '𐳜' => '𐲜', - '𐳝' => '𐲝', - '𐳞' => '𐲞', - '𐳟' => '𐲟', - '𐳠' => '𐲠', - '𐳡' => '𐲡', - '𐳢' => '𐲢', - '𐳣' => '𐲣', - '𐳤' => '𐲤', - '𐳥' => '𐲥', - '𐳦' => '𐲦', - '𐳧' => '𐲧', - '𐳨' => '𐲨', - '𐳩' => '𐲩', - '𐳪' => '𐲪', - '𐳫' => '𐲫', - '𐳬' => '𐲬', - '𐳭' => '𐲭', - '𐳮' => '𐲮', - '𐳯' => '𐲯', - '𐳰' => '𐲰', - '𐳱' => '𐲱', - '𐳲' => '𐲲', - '𑣀' => '𑢠', - '𑣁' => '𑢡', - '𑣂' => '𑢢', - '𑣃' => '𑢣', - '𑣄' => '𑢤', - '𑣅' => '𑢥', - '𑣆' => '𑢦', - '𑣇' => '𑢧', - '𑣈' => '𑢨', - '𑣉' => '𑢩', - '𑣊' => '𑢪', - '𑣋' => '𑢫', - '𑣌' => '𑢬', - '𑣍' => '𑢭', - '𑣎' => '𑢮', - '𑣏' => '𑢯', - '𑣐' => '𑢰', - '𑣑' => '𑢱', - '𑣒' => '𑢲', - '𑣓' => '𑢳', - '𑣔' => '𑢴', - '𑣕' => '𑢵', - '𑣖' => '𑢶', - '𑣗' => '𑢷', - '𑣘' => '𑢸', - '𑣙' => '𑢹', - '𑣚' => '𑢺', - '𑣛' => '𑢻', - '𑣜' => '𑢼', - '𑣝' => '𑢽', - '𑣞' => '𑢾', - '𑣟' => '𑢿', - '𖹠' => '𖹀', - '𖹡' => '𖹁', - '𖹢' => '𖹂', - '𖹣' => '𖹃', - '𖹤' => '𖹄', - '𖹥' => '𖹅', - '𖹦' => '𖹆', - '𖹧' => '𖹇', - '𖹨' => '𖹈', - '𖹩' => '𖹉', - '𖹪' => '𖹊', - '𖹫' => '𖹋', - '𖹬' => '𖹌', - '𖹭' => '𖹍', - '𖹮' => '𖹎', - '𖹯' => '𖹏', - '𖹰' => '𖹐', - '𖹱' => '𖹑', - '𖹲' => '𖹒', - '𖹳' => '𖹓', - '𖹴' => '𖹔', - '𖹵' => '𖹕', - '𖹶' => '𖹖', - '𖹷' => '𖹗', - '𖹸' => '𖹘', - '𖹹' => '𖹙', - '𖹺' => '𖹚', - '𖹻' => '𖹛', - '𖹼' => '𖹜', - '𖹽' => '𖹝', - '𖹾' => '𖹞', - '𖹿' => '𖹟', - '𞤢' => '𞤀', - '𞤣' => '𞤁', - '𞤤' => '𞤂', - '𞤥' => '𞤃', - '𞤦' => '𞤄', - '𞤧' => '𞤅', - '𞤨' => '𞤆', - '𞤩' => '𞤇', - '𞤪' => '𞤈', - '𞤫' => '𞤉', - '𞤬' => '𞤊', - '𞤭' => '𞤋', - '𞤮' => '𞤌', - '𞤯' => '𞤍', - '𞤰' => '𞤎', - '𞤱' => '𞤏', - '𞤲' => '𞤐', - '𞤳' => '𞤑', - '𞤴' => '𞤒', - '𞤵' => '𞤓', - '𞤶' => '𞤔', - '𞤷' => '𞤕', - '𞤸' => '𞤖', - '𞤹' => '𞤗', - '𞤺' => '𞤘', - '𞤻' => '𞤙', - '𞤼' => '𞤚', - '𞤽' => '𞤛', - '𞤾' => '𞤜', - '𞤿' => '𞤝', - '𞥀' => '𞤞', - '𞥁' => '𞤟', - '𞥂' => '𞤠', - '𞥃' => '𞤡', - 'ß' => 'SS', - 'ff' => 'FF', - 'fi' => 'FI', - 'fl' => 'FL', - 'ffi' => 'FFI', - 'ffl' => 'FFL', - 'ſt' => 'ST', - 'st' => 'ST', - 'և' => 'ԵՒ', - 'ﬓ' => 'ՄՆ', - 'ﬔ' => 'ՄԵ', - 'ﬕ' => 'ՄԻ', - 'ﬖ' => 'ՎՆ', - 'ﬗ' => 'ՄԽ', - 'ʼn' => 'ʼN', - 'ΐ' => 'Ϊ́', - 'ΰ' => 'Ϋ́', - 'ǰ' => 'J̌', - 'ẖ' => 'H̱', - 'ẗ' => 'T̈', - 'ẘ' => 'W̊', - 'ẙ' => 'Y̊', - 'ẚ' => 'Aʾ', - 'ὐ' => 'Υ̓', - 'ὒ' => 'Υ̓̀', - 'ὔ' => 'Υ̓́', - 'ὖ' => 'Υ̓͂', - 'ᾶ' => 'Α͂', - 'ῆ' => 'Η͂', - 'ῒ' => 'Ϊ̀', - 'ΐ' => 'Ϊ́', - 'ῖ' => 'Ι͂', - 'ῗ' => 'Ϊ͂', - 'ῢ' => 'Ϋ̀', - 'ΰ' => 'Ϋ́', - 'ῤ' => 'Ρ̓', - 'ῦ' => 'Υ͂', - 'ῧ' => 'Ϋ͂', - 'ῶ' => 'Ω͂', - 'ᾈ' => 'ἈΙ', - 'ᾉ' => 'ἉΙ', - 'ᾊ' => 'ἊΙ', - 'ᾋ' => 'ἋΙ', - 'ᾌ' => 'ἌΙ', - 'ᾍ' => 'ἍΙ', - 'ᾎ' => 'ἎΙ', - 'ᾏ' => 'ἏΙ', - 'ᾘ' => 'ἨΙ', - 'ᾙ' => 'ἩΙ', - 'ᾚ' => 'ἪΙ', - 'ᾛ' => 'ἫΙ', - 'ᾜ' => 'ἬΙ', - 'ᾝ' => 'ἭΙ', - 'ᾞ' => 'ἮΙ', - 'ᾟ' => 'ἯΙ', - 'ᾨ' => 'ὨΙ', - 'ᾩ' => 'ὩΙ', - 'ᾪ' => 'ὪΙ', - 'ᾫ' => 'ὫΙ', - 'ᾬ' => 'ὬΙ', - 'ᾭ' => 'ὭΙ', - 'ᾮ' => 'ὮΙ', - 'ᾯ' => 'ὯΙ', - 'ᾼ' => 'ΑΙ', - 'ῌ' => 'ΗΙ', - 'ῼ' => 'ΩΙ', - 'ᾲ' => 'ᾺΙ', - 'ᾴ' => 'ΆΙ', - 'ῂ' => 'ῊΙ', - 'ῄ' => 'ΉΙ', - 'ῲ' => 'ῺΙ', - 'ῴ' => 'ΏΙ', - 'ᾷ' => 'Α͂Ι', - 'ῇ' => 'Η͂Ι', - 'ῷ' => 'Ω͂Ι', -); diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php deleted file mode 100644 index ff51ae0..0000000 --- a/vendor/symfony/polyfill-mbstring/bootstrap.php +++ /dev/null @@ -1,172 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Mbstring as p; - -if (\PHP_VERSION_ID >= 80000) { - return require __DIR__.'/bootstrap80.php'; -} - -if (!function_exists('mb_convert_encoding')) { - function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } -} -if (!function_exists('mb_decode_mimeheader')) { - function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } -} -if (!function_exists('mb_encode_mimeheader')) { - function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } -} -if (!function_exists('mb_decode_numericentity')) { - function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } -} -if (!function_exists('mb_encode_numericentity')) { - function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } -} -if (!function_exists('mb_convert_case')) { - function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } -} -if (!function_exists('mb_internal_encoding')) { - function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } -} -if (!function_exists('mb_language')) { - function mb_language($language = null) { return p\Mbstring::mb_language($language); } -} -if (!function_exists('mb_list_encodings')) { - function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } -} -if (!function_exists('mb_encoding_aliases')) { - function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } -} -if (!function_exists('mb_check_encoding')) { - function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } -} -if (!function_exists('mb_detect_encoding')) { - function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } -} -if (!function_exists('mb_detect_order')) { - function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } -} -if (!function_exists('mb_parse_str')) { - function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; } -} -if (!function_exists('mb_strlen')) { - function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } -} -if (!function_exists('mb_strpos')) { - function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strtolower')) { - function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } -} -if (!function_exists('mb_strtoupper')) { - function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } -} -if (!function_exists('mb_substitute_character')) { - function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } -} -if (!function_exists('mb_substr')) { - function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } -} -if (!function_exists('mb_stripos')) { - function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_stristr')) { - function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strrchr')) { - function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strrichr')) { - function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strripos')) { - function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strrpos')) { - function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strstr')) { - function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_get_info')) { - function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } -} -if (!function_exists('mb_http_output')) { - function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } -} -if (!function_exists('mb_strwidth')) { - function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } -} -if (!function_exists('mb_substr_count')) { - function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } -} -if (!function_exists('mb_output_handler')) { - function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } -} -if (!function_exists('mb_http_input')) { - function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); } -} - -if (!function_exists('mb_convert_variables')) { - function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); } -} - -if (!function_exists('mb_ord')) { - function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } -} -if (!function_exists('mb_chr')) { - function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } -} -if (!function_exists('mb_scrub')) { - function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } -} -if (!function_exists('mb_str_split')) { - function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } -} - -if (!function_exists('mb_str_pad')) { - function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } -} - -if (!function_exists('mb_ucfirst')) { - function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } -} - -if (!function_exists('mb_lcfirst')) { - function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } -} - -if (!function_exists('mb_trim')) { - function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); } -} - -if (!function_exists('mb_ltrim')) { - function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); } -} - -if (!function_exists('mb_rtrim')) { - function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); } -} - - -if (extension_loaded('mbstring')) { - return; -} - -if (!defined('MB_CASE_UPPER')) { - define('MB_CASE_UPPER', 0); -} -if (!defined('MB_CASE_LOWER')) { - define('MB_CASE_LOWER', 1); -} -if (!defined('MB_CASE_TITLE')) { - define('MB_CASE_TITLE', 2); -} diff --git a/vendor/symfony/polyfill-mbstring/bootstrap80.php b/vendor/symfony/polyfill-mbstring/bootstrap80.php deleted file mode 100644 index 5be7d20..0000000 --- a/vendor/symfony/polyfill-mbstring/bootstrap80.php +++ /dev/null @@ -1,167 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Mbstring as p; - -if (!function_exists('mb_convert_encoding')) { - function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); } -} -if (!function_exists('mb_decode_mimeheader')) { - function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); } -} -if (!function_exists('mb_encode_mimeheader')) { - function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); } -} -if (!function_exists('mb_decode_numericentity')) { - function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); } -} -if (!function_exists('mb_encode_numericentity')) { - function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); } -} -if (!function_exists('mb_convert_case')) { - function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); } -} -if (!function_exists('mb_internal_encoding')) { - function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); } -} -if (!function_exists('mb_language')) { - function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); } -} -if (!function_exists('mb_list_encodings')) { - function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); } -} -if (!function_exists('mb_encoding_aliases')) { - function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); } -} -if (!function_exists('mb_check_encoding')) { - function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); } -} -if (!function_exists('mb_detect_encoding')) { - function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); } -} -if (!function_exists('mb_detect_order')) { - function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); } -} -if (!function_exists('mb_parse_str')) { - function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; } -} -if (!function_exists('mb_strlen')) { - function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); } -} -if (!function_exists('mb_strpos')) { - function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } -} -if (!function_exists('mb_strtolower')) { - function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); } -} -if (!function_exists('mb_strtoupper')) { - function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); } -} -if (!function_exists('mb_substitute_character')) { - function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); } -} -if (!function_exists('mb_substr')) { - function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); } -} -if (!function_exists('mb_stripos')) { - function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } -} -if (!function_exists('mb_stristr')) { - function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } -} -if (!function_exists('mb_strrchr')) { - function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } -} -if (!function_exists('mb_strrichr')) { - function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } -} -if (!function_exists('mb_strripos')) { - function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } -} -if (!function_exists('mb_strrpos')) { - function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } -} -if (!function_exists('mb_strstr')) { - function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } -} -if (!function_exists('mb_get_info')) { - function mb_get_info(?string $type = 'all'): array|string|int|false|null { return p\Mbstring::mb_get_info((string) $type); } -} -if (!function_exists('mb_http_output')) { - function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); } -} -if (!function_exists('mb_strwidth')) { - function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); } -} -if (!function_exists('mb_substr_count')) { - function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); } -} -if (!function_exists('mb_output_handler')) { - function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); } -} -if (!function_exists('mb_http_input')) { - function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); } -} - -if (!function_exists('mb_convert_variables')) { - function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); } -} - -if (!function_exists('mb_ord')) { - function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); } -} -if (!function_exists('mb_chr')) { - function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } -} -if (!function_exists('mb_scrub')) { - function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); } -} -if (!function_exists('mb_str_split')) { - function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } -} - -if (!function_exists('mb_str_pad')) { - function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } -} - -if (!function_exists('mb_ucfirst')) { - function mb_ucfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } -} - -if (!function_exists('mb_lcfirst')) { - function mb_lcfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } -} - -if (!function_exists('mb_trim')) { - function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); } -} - -if (!function_exists('mb_ltrim')) { - function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); } -} - -if (!function_exists('mb_rtrim')) { - function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); } -} - -if (extension_loaded('mbstring')) { - return; -} - -if (!defined('MB_CASE_UPPER')) { - define('MB_CASE_UPPER', 0); -} -if (!defined('MB_CASE_LOWER')) { - define('MB_CASE_LOWER', 1); -} -if (!defined('MB_CASE_TITLE')) { - define('MB_CASE_TITLE', 2); -} diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json deleted file mode 100644 index 4ed241a..0000000 --- a/vendor/symfony/polyfill-mbstring/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "symfony/polyfill-mbstring", - "type": "library", - "description": "Symfony polyfill for the Mbstring extension", - "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, - "files": [ "bootstrap.php" ] - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "minimum-stability": "dev", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/symfony/polyfill-php83/LICENSE b/vendor/symfony/polyfill-php83/LICENSE deleted file mode 100644 index 733c826..0000000 --- a/vendor/symfony/polyfill-php83/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2022-present Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/polyfill-php83/Php83.php b/vendor/symfony/polyfill-php83/Php83.php deleted file mode 100644 index 3d94b6c..0000000 --- a/vendor/symfony/polyfill-php83/Php83.php +++ /dev/null @@ -1,197 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Php83; - -/** - * @author Ion Bazan - * @author Pierre Ambroise - * - * @internal - */ -final class Php83 -{ - private const JSON_MAX_DEPTH = 0x7FFFFFFF; // see https://www.php.net/manual/en/function.json-decode.php - - public static function json_validate(string $json, int $depth = 512, int $flags = 0): bool - { - if (0 !== $flags && \defined('JSON_INVALID_UTF8_IGNORE') && \JSON_INVALID_UTF8_IGNORE !== $flags) { - throw new \ValueError('json_validate(): Argument #3 ($flags) must be a valid flag (allowed flags: JSON_INVALID_UTF8_IGNORE)'); - } - - if ($depth <= 0) { - throw new \ValueError('json_validate(): Argument #2 ($depth) must be greater than 0'); - } - - if ($depth > self::JSON_MAX_DEPTH) { - throw new \ValueError(sprintf('json_validate(): Argument #2 ($depth) must be less than %d', self::JSON_MAX_DEPTH)); - } - - json_decode($json, null, $depth, $flags); - - return \JSON_ERROR_NONE === json_last_error(); - } - - public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null): string - { - if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) { - throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); - } - - if (null === $encoding) { - $encoding = mb_internal_encoding(); - } - - try { - $validEncoding = @mb_check_encoding('', $encoding); - } catch (\ValueError $e) { - throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); - } - - // BC for PHP 7.3 and lower - if (!$validEncoding) { - throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); - } - - if (mb_strlen($pad_string, $encoding) <= 0) { - throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); - } - - $paddingRequired = $length - mb_strlen($string, $encoding); - - if ($paddingRequired < 1) { - return $string; - } - - switch ($pad_type) { - case \STR_PAD_LEFT: - return mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string; - case \STR_PAD_RIGHT: - return $string.mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding); - default: - $leftPaddingLength = floor($paddingRequired / 2); - $rightPaddingLength = $paddingRequired - $leftPaddingLength; - - return mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding); - } - } - - public static function str_increment(string $string): string - { - if ('' === $string) { - throw new \ValueError('str_increment(): Argument #1 ($string) cannot be empty'); - } - - if (!preg_match('/^[a-zA-Z0-9]+$/', $string)) { - throw new \ValueError('str_increment(): Argument #1 ($string) must be composed only of alphanumeric ASCII characters'); - } - - if (is_numeric($string)) { - $offset = stripos($string, 'e'); - if (false !== $offset) { - $char = $string[$offset]; - ++$char; - $string[$offset] = $char; - ++$string; - - switch ($string[$offset]) { - case 'f': - $string[$offset] = 'e'; - break; - case 'F': - $string[$offset] = 'E'; - break; - case 'g': - $string[$offset] = 'f'; - break; - case 'G': - $string[$offset] = 'F'; - break; - } - - return $string; - } - } - - return ++$string; - } - - public static function str_decrement(string $string): string - { - if ('' === $string) { - throw new \ValueError('str_decrement(): Argument #1 ($string) cannot be empty'); - } - - if (!preg_match('/^[a-zA-Z0-9]+$/', $string)) { - throw new \ValueError('str_decrement(): Argument #1 ($string) must be composed only of alphanumeric ASCII characters'); - } - - if (preg_match('/\A(?:0[aA0]?|[aA])\z/', $string)) { - throw new \ValueError(sprintf('str_decrement(): Argument #1 ($string) "%s" is out of decrement range', $string)); - } - - if (!\in_array(substr($string, -1), ['A', 'a', '0'], true)) { - return implode('', \array_slice(str_split($string), 0, -1)).\chr(\ord(substr($string, -1)) - 1); - } - - $carry = ''; - $decremented = ''; - - for ($i = \strlen($string) - 1; $i >= 0; --$i) { - $char = $string[$i]; - - switch ($char) { - case 'A': - if ('' !== $carry) { - $decremented = $carry.$decremented; - $carry = ''; - } - $carry = 'Z'; - - break; - case 'a': - if ('' !== $carry) { - $decremented = $carry.$decremented; - $carry = ''; - } - $carry = 'z'; - - break; - case '0': - if ('' !== $carry) { - $decremented = $carry.$decremented; - $carry = ''; - } - $carry = '9'; - - break; - case '1': - if ('' !== $carry) { - $decremented = $carry.$decremented; - $carry = ''; - } - - break; - default: - if ('' !== $carry) { - $decremented = $carry.$decremented; - $carry = ''; - } - - if (!\in_array($char, ['A', 'a', '0'], true)) { - $decremented = \chr(\ord($char) - 1).$decremented; - } - } - } - - return $decremented; - } -} diff --git a/vendor/symfony/polyfill-php83/README.md b/vendor/symfony/polyfill-php83/README.md deleted file mode 100644 index f298776..0000000 --- a/vendor/symfony/polyfill-php83/README.md +++ /dev/null @@ -1,22 +0,0 @@ -Symfony Polyfill / Php83 -======================== - -This component provides features added to PHP 8.3 core: - -- [`json_validate`](https://wiki.php.net/rfc/json_validate) -- [`Override`](https://wiki.php.net/rfc/marking_overriden_methods) -- [`mb_str_pad`](https://wiki.php.net/rfc/mb_str_pad) -- [`ldap_exop_sync`](https://wiki.php.net/rfc/deprecate_functions_with_overloaded_signatures) -- [`ldap_connect_wallet`](https://wiki.php.net/rfc/deprecate_functions_with_overloaded_signatures) -- [`stream_context_set_options`](https://wiki.php.net/rfc/deprecate_functions_with_overloaded_signatures) -- [`str_increment` and `str_decrement`](https://wiki.php.net/rfc/saner-inc-dec-operators) -- [`Date*Exception/Error classes`](https://wiki.php.net/rfc/datetime-exceptions) -- [`SQLite3Exception`](https://wiki.php.net/rfc/sqlite3_exceptions) - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php83/Resources/stubs/DateError.php b/vendor/symfony/polyfill-php83/Resources/stubs/DateError.php deleted file mode 100644 index 6e7ed8c..0000000 --- a/vendor/symfony/polyfill-php83/Resources/stubs/DateError.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID < 80300) { - class DateError extends Error - { - } -} diff --git a/vendor/symfony/polyfill-php83/Resources/stubs/DateException.php b/vendor/symfony/polyfill-php83/Resources/stubs/DateException.php deleted file mode 100644 index 041710a..0000000 --- a/vendor/symfony/polyfill-php83/Resources/stubs/DateException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID < 80300) { - class DateException extends Exception - { - } -} diff --git a/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php b/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php deleted file mode 100644 index e2e9dfc..0000000 --- a/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID < 80300) { - class DateInvalidOperationException extends DateException - { - } -} diff --git a/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php b/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php deleted file mode 100644 index 75bcd26..0000000 --- a/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID < 80300) { - class DateInvalidTimeZoneException extends DateException - { - } -} diff --git a/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php b/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php deleted file mode 100644 index af91b8e..0000000 --- a/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID < 80300) { - class DateMalformedIntervalStringException extends DateException - { - } -} diff --git a/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php b/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php deleted file mode 100644 index 9b6d276..0000000 --- a/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID < 80300) { - class DateMalformedPeriodStringException extends DateException - { - } -} diff --git a/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php b/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php deleted file mode 100644 index 7ad0484..0000000 --- a/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID < 80300) { - class DateMalformedStringException extends DateException - { - } -} diff --git a/vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php b/vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php deleted file mode 100644 index 11f0edc..0000000 --- a/vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID < 80300) { - class DateObjectError extends DateError - { - } -} diff --git a/vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php b/vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php deleted file mode 100644 index 98e6703..0000000 --- a/vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID < 80300) { - class DateRangeError extends DateError - { - } -} diff --git a/vendor/symfony/polyfill-php83/Resources/stubs/Override.php b/vendor/symfony/polyfill-php83/Resources/stubs/Override.php deleted file mode 100644 index d3e6b3e..0000000 --- a/vendor/symfony/polyfill-php83/Resources/stubs/Override.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID < 80300) { - #[Attribute(Attribute::TARGET_METHOD)] - final class Override - { - public function __construct() - { - } - } -} diff --git a/vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php b/vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php deleted file mode 100644 index ecb7c98..0000000 --- a/vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID < 80300) { - class SQLite3Exception extends Exception - { - } -} diff --git a/vendor/symfony/polyfill-php83/bootstrap.php b/vendor/symfony/polyfill-php83/bootstrap.php deleted file mode 100644 index a92799c..0000000 --- a/vendor/symfony/polyfill-php83/bootstrap.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php83 as p; - -if (\PHP_VERSION_ID >= 80300) { - return; -} - -if (!function_exists('json_validate')) { - function json_validate(string $json, int $depth = 512, int $flags = 0): bool { return p\Php83::json_validate($json, $depth, $flags); } -} - -if (extension_loaded('mbstring')) { - if (!function_exists('mb_str_pad')) { - function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Php83::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } - } -} - -if (!function_exists('stream_context_set_options')) { - function stream_context_set_options($context, array $options): bool { return stream_context_set_option($context, $options); } -} - -if (!function_exists('str_increment')) { - function str_increment(string $string): string { return p\Php83::str_increment($string); } -} - -if (!function_exists('str_decrement')) { - function str_decrement(string $string): string { return p\Php83::str_decrement($string); } -} - -if (\PHP_VERSION_ID >= 80100) { - return require __DIR__.'/bootstrap81.php'; -} - -if (!function_exists('ldap_exop_sync') && function_exists('ldap_exop')) { - function ldap_exop_sync($ldap, string $request_oid, ?string $request_data = null, ?array $controls = null, &$response_data = null, &$response_oid = null): bool { return ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid); } -} - -if (!function_exists('ldap_connect_wallet') && function_exists('ldap_connect')) { - function ldap_connect_wallet(?string $uri, string $wallet, string $password, int $auth_mode = \GSLC_SSL_NO_AUTH) { return ldap_connect($uri, $wallet, $password, $auth_mode); } -} diff --git a/vendor/symfony/polyfill-php83/bootstrap81.php b/vendor/symfony/polyfill-php83/bootstrap81.php deleted file mode 100644 index 68395b4..0000000 --- a/vendor/symfony/polyfill-php83/bootstrap81.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (\PHP_VERSION_ID >= 80300) { - return; -} - -if (!function_exists('ldap_exop_sync') && function_exists('ldap_exop')) { - function ldap_exop_sync(\LDAP\Connection $ldap, string $request_oid, ?string $request_data = null, ?array $controls = null, &$response_data = null, &$response_oid = null): bool { return ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid); } -} - -if (!function_exists('ldap_connect_wallet') && function_exists('ldap_connect')) { - function ldap_connect_wallet(?string $uri, string $wallet, #[\SensitiveParameter] string $password, int $auth_mode = \GSLC_SSL_NO_AUTH): \LDAP\Connection|false { return ldap_connect($uri, $wallet, $password, $auth_mode); } -} diff --git a/vendor/symfony/polyfill-php83/composer.json b/vendor/symfony/polyfill-php83/composer.json deleted file mode 100644 index a8b8ba7..0000000 --- a/vendor/symfony/polyfill-php83/composer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "symfony/polyfill-php83", - "type": "library", - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php83\\": "" }, - "files": [ "bootstrap.php" ], - "classmap": [ "Resources/stubs" ] - }, - "minimum-stability": "dev", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/symfony/translation-contracts/CHANGELOG.md b/vendor/symfony/translation-contracts/CHANGELOG.md deleted file mode 100644 index 7932e26..0000000 --- a/vendor/symfony/translation-contracts/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -CHANGELOG -========= - -The changelog is maintained for all Symfony contracts at the following URL: -https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/vendor/symfony/translation-contracts/LICENSE b/vendor/symfony/translation-contracts/LICENSE deleted file mode 100644 index 7536cae..0000000 --- a/vendor/symfony/translation-contracts/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2018-present Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/translation-contracts/LocaleAwareInterface.php b/vendor/symfony/translation-contracts/LocaleAwareInterface.php deleted file mode 100644 index db40ba1..0000000 --- a/vendor/symfony/translation-contracts/LocaleAwareInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Translation; - -interface LocaleAwareInterface -{ - /** - * Sets the current locale. - * - * @return void - * - * @throws \InvalidArgumentException If the locale contains invalid characters - */ - public function setLocale(string $locale); - - /** - * Returns the current locale. - */ - public function getLocale(): string; -} diff --git a/vendor/symfony/translation-contracts/README.md b/vendor/symfony/translation-contracts/README.md deleted file mode 100644 index b211d58..0000000 --- a/vendor/symfony/translation-contracts/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Symfony Translation Contracts -============================= - -A set of abstractions extracted out of the Symfony components. - -Can be used to build on semantics that the Symfony components proved useful and -that already have battle tested implementations. - -See https://github.com/symfony/contracts/blob/main/README.md for more information. diff --git a/vendor/symfony/translation-contracts/Test/TranslatorTest.php b/vendor/symfony/translation-contracts/Test/TranslatorTest.php deleted file mode 100644 index 756228a..0000000 --- a/vendor/symfony/translation-contracts/Test/TranslatorTest.php +++ /dev/null @@ -1,385 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Translation\Test; - -use PHPUnit\Framework\TestCase; -use Symfony\Contracts\Translation\TranslatorInterface; -use Symfony\Contracts\Translation\TranslatorTrait; - -/** - * Test should cover all languages mentioned on http://translate.sourceforge.net/wiki/l10n/pluralforms - * and Plural forms mentioned on http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms. - * - * See also https://developer.mozilla.org/en/Localization_and_Plurals which mentions 15 rules having a maximum of 6 forms. - * The mozilla code is also interesting to check for. - * - * As mentioned by chx http://drupal.org/node/1273968 we can cover all by testing number from 0 to 199 - * - * The goal to cover all languages is to far fetched so this test case is smaller. - * - * @author Clemens Tolboom clemens@build2be.nl - */ -class TranslatorTest extends TestCase -{ - private string $defaultLocale; - - protected function setUp(): void - { - $this->defaultLocale = \Locale::getDefault(); - \Locale::setDefault('en'); - } - - protected function tearDown(): void - { - \Locale::setDefault($this->defaultLocale); - } - - public function getTranslator(): TranslatorInterface - { - return new class() implements TranslatorInterface { - use TranslatorTrait; - }; - } - - /** - * @dataProvider getTransTests - */ - public function testTrans($expected, $id, $parameters) - { - $translator = $this->getTranslator(); - - $this->assertEquals($expected, $translator->trans($id, $parameters)); - } - - /** - * @dataProvider getTransChoiceTests - */ - public function testTransChoiceWithExplicitLocale($expected, $id, $number) - { - $translator = $this->getTranslator(); - - $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); - } - - /** - * @requires extension intl - * - * @dataProvider getTransChoiceTests - */ - public function testTransChoiceWithDefaultLocale($expected, $id, $number) - { - $translator = $this->getTranslator(); - - $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); - } - - /** - * @dataProvider getTransChoiceTests - */ - public function testTransChoiceWithEnUsPosix($expected, $id, $number) - { - $translator = $this->getTranslator(); - $translator->setLocale('en_US_POSIX'); - - $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); - } - - public function testGetSetLocale() - { - $translator = $this->getTranslator(); - - $this->assertEquals('en', $translator->getLocale()); - } - - /** - * @requires extension intl - */ - public function testGetLocaleReturnsDefaultLocaleIfNotSet() - { - $translator = $this->getTranslator(); - - \Locale::setDefault('pt_BR'); - $this->assertEquals('pt_BR', $translator->getLocale()); - - \Locale::setDefault('en'); - $this->assertEquals('en', $translator->getLocale()); - } - - public static function getTransTests() - { - return [ - ['Symfony is great!', 'Symfony is great!', []], - ['Symfony is awesome!', 'Symfony is %what%!', ['%what%' => 'awesome']], - ]; - } - - public static function getTransChoiceTests() - { - return [ - ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], - ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1], - ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], - ['There are 0 apples', 'There is 1 apple|There are %count% apples', 0], - ['There is 1 apple', 'There is 1 apple|There are %count% apples', 1], - ['There are 10 apples', 'There is 1 apple|There are %count% apples', 10], - // custom validation messages may be coded with a fixed value - ['There are 2 apples', 'There are 2 apples', 2], - ]; - } - - /** - * @dataProvider getInterval - */ - public function testInterval($expected, $number, $interval) - { - $translator = $this->getTranslator(); - - $this->assertEquals($expected, $translator->trans($interval.' foo|[1,Inf[ bar', ['%count%' => $number])); - } - - public static function getInterval() - { - return [ - ['foo', 3, '{1,2, 3 ,4}'], - ['bar', 10, '{1,2, 3 ,4}'], - ['bar', 3, '[1,2]'], - ['foo', 1, '[1,2]'], - ['foo', 2, '[1,2]'], - ['bar', 1, ']1,2['], - ['bar', 2, ']1,2['], - ['foo', log(0), '[-Inf,2['], - ['foo', -log(0), '[-2,+Inf]'], - ]; - } - - /** - * @dataProvider getChooseTests - */ - public function testChoose($expected, $id, $number, $locale = null) - { - $translator = $this->getTranslator(); - - $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number], null, $locale)); - } - - public function testReturnMessageIfExactlyOneStandardRuleIsGiven() - { - $translator = $this->getTranslator(); - - $this->assertEquals('There are two apples', $translator->trans('There are two apples', ['%count%' => 2])); - } - - /** - * @dataProvider getNonMatchingMessages - */ - public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number) - { - $translator = $this->getTranslator(); - - $this->expectException(\InvalidArgumentException::class); - - $translator->trans($id, ['%count%' => $number]); - } - - public static function getNonMatchingMessages() - { - return [ - ['{0} There are no apples|{1} There is one apple', 2], - ['{1} There is one apple|]1,Inf] There are %count% apples', 0], - ['{1} There is one apple|]2,Inf] There are %count% apples', 2], - ['{0} There are no apples|There is one apple', 2], - ]; - } - - public static function getChooseTests() - { - return [ - ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], - ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], - ['There are no apples', '{0}There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], - - ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1], - - ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], - ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf]There are %count% apples', 10], - ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], - - ['There are 0 apples', 'There is one apple|There are %count% apples', 0], - ['There is one apple', 'There is one apple|There are %count% apples', 1], - ['There are 10 apples', 'There is one apple|There are %count% apples', 10], - - ['There are 0 apples', 'one: There is one apple|more: There are %count% apples', 0], - ['There is one apple', 'one: There is one apple|more: There are %count% apples', 1], - ['There are 10 apples', 'one: There is one apple|more: There are %count% apples', 10], - - ['There are no apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 0], - ['There is one apple', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 1], - ['There are 10 apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 10], - - ['', '{0}|{1} There is one apple|]1,Inf] There are %count% apples', 0], - ['', '{0} There are no apples|{1}|]1,Inf] There are %count% apples', 1], - - // Indexed only tests which are Gettext PoFile* compatible strings. - ['There are 0 apples', 'There is one apple|There are %count% apples', 0], - ['There is one apple', 'There is one apple|There are %count% apples', 1], - ['There are 2 apples', 'There is one apple|There are %count% apples', 2], - - // Tests for float numbers - ['There is almost one apple', '{0} There are no apples|]0,1[ There is almost one apple|{1} There is one apple|[1,Inf] There is more than one apple', 0.7], - ['There is one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1], - ['There is more than one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1.7], - ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0], - ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0.0], - ['There are no apples', '{0.0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0], - - // Test texts with new-lines - // with double-quotes and \n in id & double-quotes and actual newlines in text - ["This is a text with a\n new-line in it. Selector = 0.", '{0}This is a text with a - new-line in it. Selector = 0.|{1}This is a text with a - new-line in it. Selector = 1.|[1,Inf]This is a text with a - new-line in it. Selector > 1.', 0], - // with double-quotes and \n in id and single-quotes and actual newlines in text - ["This is a text with a\n new-line in it. Selector = 1.", '{0}This is a text with a - new-line in it. Selector = 0.|{1}This is a text with a - new-line in it. Selector = 1.|[1,Inf]This is a text with a - new-line in it. Selector > 1.', 1], - ["This is a text with a\n new-line in it. Selector > 1.", '{0}This is a text with a - new-line in it. Selector = 0.|{1}This is a text with a - new-line in it. Selector = 1.|[1,Inf]This is a text with a - new-line in it. Selector > 1.', 5], - // with double-quotes and id split across lines - ['This is a text with a - new-line in it. Selector = 1.', '{0}This is a text with a - new-line in it. Selector = 0.|{1}This is a text with a - new-line in it. Selector = 1.|[1,Inf]This is a text with a - new-line in it. Selector > 1.', 1], - // with single-quotes and id split across lines - ['This is a text with a - new-line in it. Selector > 1.', '{0}This is a text with a - new-line in it. Selector = 0.|{1}This is a text with a - new-line in it. Selector = 1.|[1,Inf]This is a text with a - new-line in it. Selector > 1.', 5], - // with single-quotes and \n in text - ['This is a text with a\nnew-line in it. Selector = 0.', '{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.', 0], - // with double-quotes and id split across lines - ["This is a text with a\nnew-line in it. Selector = 1.", "{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.", 1], - // escape pipe - ['This is a text with | in it. Selector = 0.', '{0}This is a text with || in it. Selector = 0.|{1}This is a text with || in it. Selector = 1.', 0], - // Empty plural set (2 plural forms) from a .PO file - ['', '|', 1], - // Empty plural set (3 plural forms) from a .PO file - ['', '||', 1], - - // Floating values - ['1.5 liters', '%count% liter|%count% liters', 1.5], - ['1.5 litre', '%count% litre|%count% litres', 1.5, 'fr'], - - // Negative values - ['-1 degree', '%count% degree|%count% degrees', -1], - ['-1 degré', '%count% degré|%count% degrés', -1], - ['-1.5 degrees', '%count% degree|%count% degrees', -1.5], - ['-1.5 degré', '%count% degré|%count% degrés', -1.5, 'fr'], - ['-2 degrees', '%count% degree|%count% degrees', -2], - ['-2 degrés', '%count% degré|%count% degrés', -2], - ]; - } - - /** - * @dataProvider failingLangcodes - */ - public function testFailedLangcodes($nplural, $langCodes) - { - $matrix = $this->generateTestData($langCodes); - $this->validateMatrix($nplural, $matrix, false); - } - - /** - * @dataProvider successLangcodes - */ - public function testLangcodes($nplural, $langCodes) - { - $matrix = $this->generateTestData($langCodes); - $this->validateMatrix($nplural, $matrix); - } - - /** - * This array should contain all currently known langcodes. - * - * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete. - */ - public static function successLangcodes(): array - { - return [ - ['1', ['ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky']], - ['2', ['nl', 'fr', 'en', 'de', 'de_GE', 'hy', 'hy_AM', 'en_US_POSIX']], - ['3', ['be', 'bs', 'cs', 'hr']], - ['4', ['cy', 'mt', 'sl']], - ['6', ['ar']], - ]; - } - - /** - * This array should be at least empty within the near future. - * - * This both depends on a complete list trying to add above as understanding - * the plural rules of the current failing languages. - * - * @return array with nplural together with langcodes - */ - public static function failingLangcodes(): array - { - return [ - ['1', ['fa']], - ['2', ['jbo']], - ['3', ['cbs']], - ['4', ['gd', 'kw']], - ['5', ['ga']], - ]; - } - - /** - * We validate only on the plural coverage. Thus the real rules is not tested. - * - * @param string $nplural Plural expected - * @param array $matrix Containing langcodes and their plural index values - */ - protected function validateMatrix(string $nplural, array $matrix, bool $expectSuccess = true) - { - foreach ($matrix as $langCode => $data) { - $indexes = array_flip($data); - if ($expectSuccess) { - $this->assertCount($nplural, $indexes, "Langcode '$langCode' has '$nplural' plural forms."); - } else { - $this->assertNotEquals((int) $nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms."); - } - } - } - - protected function generateTestData($langCodes) - { - $translator = new class() { - use TranslatorTrait { - getPluralizationRule as public; - } - }; - - $matrix = []; - foreach ($langCodes as $langCode) { - for ($count = 0; $count < 200; ++$count) { - $plural = $translator->getPluralizationRule($count, $langCode); - $matrix[$langCode][$count] = $plural; - } - } - - return $matrix; - } -} diff --git a/vendor/symfony/translation-contracts/TranslatableInterface.php b/vendor/symfony/translation-contracts/TranslatableInterface.php deleted file mode 100644 index 8554697..0000000 --- a/vendor/symfony/translation-contracts/TranslatableInterface.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Translation; - -/** - * @author Nicolas Grekas - */ -interface TranslatableInterface -{ - public function trans(TranslatorInterface $translator, ?string $locale = null): string; -} diff --git a/vendor/symfony/translation-contracts/TranslatorInterface.php b/vendor/symfony/translation-contracts/TranslatorInterface.php deleted file mode 100644 index 7fa6987..0000000 --- a/vendor/symfony/translation-contracts/TranslatorInterface.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Translation; - -/** - * @author Fabien Potencier - */ -interface TranslatorInterface -{ - /** - * Translates the given message. - * - * When a number is provided as a parameter named "%count%", the message is parsed for plural - * forms and a translation is chosen according to this number using the following rules: - * - * Given a message with different plural translations separated by a - * pipe (|), this method returns the correct portion of the message based - * on the given number, locale and the pluralization rules in the message - * itself. - * - * The message supports two different types of pluralization rules: - * - * interval: {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples - * indexed: There is one apple|There are %count% apples - * - * The indexed solution can also contain labels (e.g. one: There is one apple). - * This is purely for making the translations more clear - it does not - * affect the functionality. - * - * The two methods can also be mixed: - * {0} There are no apples|one: There is one apple|more: There are %count% apples - * - * An interval can represent a finite set of numbers: - * {1,2,3,4} - * - * An interval can represent numbers between two numbers: - * [1, +Inf] - * ]-1,2[ - * - * The left delimiter can be [ (inclusive) or ] (exclusive). - * The right delimiter can be [ (exclusive) or ] (inclusive). - * Beside numbers, you can use -Inf and +Inf for the infinite. - * - * @see https://en.wikipedia.org/wiki/ISO_31-11 - * - * @param string $id The message id (may also be an object that can be cast to string) - * @param array $parameters An array of parameters for the message - * @param string|null $domain The domain for the message or null to use the default - * @param string|null $locale The locale or null to use the default - * - * @throws \InvalidArgumentException If the locale contains invalid characters - */ - public function trans(string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string; - - /** - * Returns the default locale. - */ - public function getLocale(): string; -} diff --git a/vendor/symfony/translation-contracts/TranslatorTrait.php b/vendor/symfony/translation-contracts/TranslatorTrait.php deleted file mode 100644 index 63f6fb3..0000000 --- a/vendor/symfony/translation-contracts/TranslatorTrait.php +++ /dev/null @@ -1,225 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Contracts\Translation; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; - -/** - * A trait to help implement TranslatorInterface and LocaleAwareInterface. - * - * @author Fabien Potencier - */ -trait TranslatorTrait -{ - private ?string $locale = null; - - /** - * @return void - */ - public function setLocale(string $locale) - { - $this->locale = $locale; - } - - public function getLocale(): string - { - return $this->locale ?: (class_exists(\Locale::class) ? \Locale::getDefault() : 'en'); - } - - public function trans(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string - { - if (null === $id || '' === $id) { - return ''; - } - - if (!isset($parameters['%count%']) || !is_numeric($parameters['%count%'])) { - return strtr($id, $parameters); - } - - $number = (float) $parameters['%count%']; - $locale = $locale ?: $this->getLocale(); - - $parts = []; - if (preg_match('/^\|++$/', $id)) { - $parts = explode('|', $id); - } elseif (preg_match_all('/(?:\|\||[^\|])++/', $id, $matches)) { - $parts = $matches[0]; - } - - $intervalRegexp = <<<'EOF' -/^(?P - ({\s* - (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*) - \s*}) - - | - - (?P[\[\]]) - \s* - (?P-Inf|\-?\d+(\.\d+)?) - \s*,\s* - (?P\+?Inf|\-?\d+(\.\d+)?) - \s* - (?P[\[\]]) -)\s*(?P.*?)$/xs -EOF; - - $standardRules = []; - foreach ($parts as $part) { - $part = trim(str_replace('||', '|', $part)); - - // try to match an explicit rule, then fallback to the standard ones - if (preg_match($intervalRegexp, $part, $matches)) { - if ($matches[2]) { - foreach (explode(',', $matches[3]) as $n) { - if ($number == $n) { - return strtr($matches['message'], $parameters); - } - } - } else { - $leftNumber = '-Inf' === $matches['left'] ? -\INF : (float) $matches['left']; - $rightNumber = is_numeric($matches['right']) ? (float) $matches['right'] : \INF; - - if (('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber) - && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber) - ) { - return strtr($matches['message'], $parameters); - } - } - } elseif (preg_match('/^\w+\:\s*(.*?)$/', $part, $matches)) { - $standardRules[] = $matches[1]; - } else { - $standardRules[] = $part; - } - } - - $position = $this->getPluralizationRule($number, $locale); - - if (!isset($standardRules[$position])) { - // when there's exactly one rule given, and that rule is a standard - // rule, use this rule - if (1 === \count($parts) && isset($standardRules[0])) { - return strtr($standardRules[0], $parameters); - } - - $message = sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number); - - if (class_exists(InvalidArgumentException::class)) { - throw new InvalidArgumentException($message); - } - - throw new \InvalidArgumentException($message); - } - - return strtr($standardRules[$position], $parameters); - } - - /** - * Returns the plural position to use for the given locale and number. - * - * The plural rules are derived from code of the Zend Framework (2010-09-25), - * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd). - * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) - */ - private function getPluralizationRule(float $number, string $locale): int - { - $number = abs($number); - - return match ('pt_BR' !== $locale && 'en_US_POSIX' !== $locale && \strlen($locale) > 3 ? substr($locale, 0, strrpos($locale, '_')) : $locale) { - 'af', - 'bn', - 'bg', - 'ca', - 'da', - 'de', - 'el', - 'en', - 'en_US_POSIX', - 'eo', - 'es', - 'et', - 'eu', - 'fa', - 'fi', - 'fo', - 'fur', - 'fy', - 'gl', - 'gu', - 'ha', - 'he', - 'hu', - 'is', - 'it', - 'ku', - 'lb', - 'ml', - 'mn', - 'mr', - 'nah', - 'nb', - 'ne', - 'nl', - 'nn', - 'no', - 'oc', - 'om', - 'or', - 'pa', - 'pap', - 'ps', - 'pt', - 'so', - 'sq', - 'sv', - 'sw', - 'ta', - 'te', - 'tk', - 'ur', - 'zu' => (1 == $number) ? 0 : 1, - 'am', - 'bh', - 'fil', - 'fr', - 'gun', - 'hi', - 'hy', - 'ln', - 'mg', - 'nso', - 'pt_BR', - 'ti', - 'wa' => ($number < 2) ? 0 : 1, - 'be', - 'bs', - 'hr', - 'ru', - 'sh', - 'sr', - 'uk' => ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2), - 'cs', - 'sk' => (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2), - 'ga' => (1 == $number) ? 0 : ((2 == $number) ? 1 : 2), - 'lt' => ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2), - 'sl' => (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3)), - 'mk' => (1 == $number % 10) ? 0 : 1, - 'mt' => (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3)), - 'lv' => (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2), - 'pl' => (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2), - 'cy' => (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3)), - 'ro' => (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2), - 'ar' => (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5)))), - default => 0, - }; - } -} diff --git a/vendor/symfony/translation-contracts/composer.json b/vendor/symfony/translation-contracts/composer.json deleted file mode 100644 index 181651e..0000000 --- a/vendor/symfony/translation-contracts/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "symfony/translation-contracts", - "type": "library", - "description": "Generic abstractions related to translation", - "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=8.1" - }, - "autoload": { - "psr-4": { "Symfony\\Contracts\\Translation\\": "" }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - } -} diff --git a/vendor/symfony/translation/CHANGELOG.md b/vendor/symfony/translation/CHANGELOG.md deleted file mode 100644 index 622c7f7..0000000 --- a/vendor/symfony/translation/CHANGELOG.md +++ /dev/null @@ -1,230 +0,0 @@ -CHANGELOG -========= - -7.2 ---- - - * Deprecate `ProviderFactoryTestCase`, extend `AbstractProviderFactoryTestCase` instead - - The `testIncompleteDsnException()` test is no longer provided by default. If you make use of it by implementing the `incompleteDsnProvider()` data providers, - you now need to use the `IncompleteDsnTestTrait`. - - * Make `ProviderFactoryTestCase` and `ProviderTestCase` compatible with PHPUnit 10+ - * Add `lint:translations` command - * Deprecate passing an escape character to `CsvFileLoader::setCsvControl()` - * Make Xliff 2.0 attributes in segment element available as `segment-attributes` - metadata returned by `XliffFileLoader` and make `XliffFileDumper` write them to the file - -7.1 ---- - - * Mark class `DataCollectorTranslator` as `final` - -7.0 ---- - - * Remove `PhpStringTokenParser` - * Remove `PhpExtractor` in favor of `PhpAstExtractor` - -6.4 ---- - - * Give current locale to `LocaleSwitcher::runWithLocale()`'s callback - * Add `--as-tree` option to `translation:pull` command to write YAML messages as a tree-like structure - * [BC BREAK] Add argument `$buildDir` to `DataCollectorTranslator::warmUp()` - * Add `DataCollectorTranslatorPass` and `LoggingTranslatorPass` (moved from `FrameworkBundle`) - * Add `PhraseTranslationProvider` - -6.2.7 ------ - - * [BC BREAK] The following data providers for `ProviderFactoryTestCase` are now static: - `supportsProvider()`, `createProvider()`, `unsupportedSchemeProvider()`and `incompleteDsnProvider()` - * [BC BREAK] `ProviderTestCase::toStringProvider()` is now static - -6.2 ---- - - * Deprecate `PhpStringTokenParser` - * Deprecate `PhpExtractor` in favor of `PhpAstExtractor` - * Add `PhpAstExtractor` (requires [nikic/php-parser](https://github.com/nikic/php-parser) to be installed) - -6.1 ---- - - * Parameters implementing `TranslatableInterface` are processed - * Add the file extension to the `XliffFileDumper` constructor - -5.4 ---- - - * Add `github` format & autodetection to render errors as annotations when - running the XLIFF linter command in a Github Actions environment. - * Translation providers are not experimental anymore - -5.3 ---- - - * Add `translation:pull` and `translation:push` commands to manage translations with third-party providers - * Add `TranslatorBagInterface::getCatalogues` method - * Add support to load XLIFF string in `XliffFileLoader` - -5.2.0 ------ - - * added support for calling `trans` with ICU formatted messages - * added `PseudoLocalizationTranslator` - * added `TranslatableMessage` objects that represent a message that can be translated - * added the `t()` function to easily create `TranslatableMessage` objects - * Added support for extracting messages from `TranslatableMessage` objects - -5.1.0 ------ - - * added support for `name` attribute on `unit` element from xliff2 to be used as a translation key instead of always the `source` element - -5.0.0 ------ - - * removed support for using `null` as the locale in `Translator` - * removed `TranslatorInterface` - * removed `MessageSelector` - * removed `ChoiceMessageFormatterInterface` - * removed `PluralizationRule` - * removed `Interval` - * removed `transChoice()` methods, use the trans() method instead with a %count% parameter - * removed `FileDumper::setBackup()` and `TranslationWriter::disableBackup()` - * removed `MessageFormatter::choiceFormat()` - * added argument `$filename` to `PhpExtractor::parseTokens()` - * removed support for implicit STDIN usage in the `lint:xliff` command, use `lint:xliff -` (append a dash) instead to make it explicit. - -4.4.0 ------ - - * deprecated support for using `null` as the locale in `Translator` - * deprecated accepting STDIN implicitly when using the `lint:xliff` command, use `lint:xliff -` (append a dash) instead to make it explicit. - * Marked the `TranslationDataCollector` class as `@final`. - -4.3.0 ------ - - * Improved Xliff 1.2 loader to load the original file's metadata - * Added `TranslatorPathsPass` - -4.2.0 ------ - - * Started using ICU parent locales as fallback locales. - * allow using the ICU message format using domains with the "+intl-icu" suffix - * deprecated `Translator::transChoice()` in favor of using `Translator::trans()` with a `%count%` parameter - * deprecated `TranslatorInterface` in favor of `Symfony\Contracts\Translation\TranslatorInterface` - * deprecated `MessageSelector`, `Interval` and `PluralizationRules`; use `IdentityTranslator` instead - * Added `IntlFormatter` and `IntlFormatterInterface` - * added support for multiple files and directories in `XliffLintCommand` - * Marked `Translator::getFallbackLocales()` and `TranslationDataCollector::getFallbackLocales()` as internal - -4.1.0 ------ - - * The `FileDumper::setBackup()` method is deprecated. - * The `TranslationWriter::disableBackup()` method is deprecated. - * The `XliffFileDumper` will write "name" on the "unit" node when dumping XLIFF 2.0. - -4.0.0 ------ - - * removed the backup feature of the `FileDumper` class - * removed `TranslationWriter::writeTranslations()` method - * removed support for passing `MessageSelector` instances to the constructor of the `Translator` class - -3.4.0 ------ - - * Added `TranslationDumperPass` - * Added `TranslationExtractorPass` - * Added `TranslatorPass` - * Added `TranslationReader` and `TranslationReaderInterface` - * Added `` section to the Xliff 2.0 dumper. - * Improved Xliff 2.0 loader to load `` section. - * Added `TranslationWriterInterface` - * Deprecated `TranslationWriter::writeTranslations` in favor of `TranslationWriter::write` - * added support for adding custom message formatter and decoupling the default one. - * Added `PhpExtractor` - * Added `PhpStringTokenParser` - -3.2.0 ------ - - * Added support for escaping `|` in plural translations with double pipe. - -3.1.0 ------ - - * Deprecated the backup feature of the file dumper classes. - -3.0.0 ------ - - * removed `FileDumper::format()` method. - * Changed the visibility of the locale property in `Translator` from protected to private. - -2.8.0 ------ - - * deprecated FileDumper::format(), overwrite FileDumper::formatCatalogue() instead. - * deprecated Translator::getMessages(), rely on TranslatorBagInterface::getCatalogue() instead. - * added `FileDumper::formatCatalogue` which allows format the catalogue without dumping it into file. - * added option `json_encoding` to JsonFileDumper - * added options `as_tree`, `inline` to YamlFileDumper - * added support for XLIFF 2.0. - * added support for XLIFF target and tool attributes. - * added message parameters to DataCollectorTranslator. - * [DEPRECATION] The `DiffOperation` class has been deprecated and - will be removed in Symfony 3.0, since its operation has nothing to do with 'diff', - so the class name is misleading. The `TargetOperation` class should be used for - this use-case instead. - -2.7.0 ------ - - * added DataCollectorTranslator for collecting the translated messages. - -2.6.0 ------ - - * added possibility to cache catalogues - * added TranslatorBagInterface - * added LoggingTranslator - * added Translator::getMessages() for retrieving the message catalogue as an array - -2.5.0 ------ - - * added relative file path template to the file dumpers - * added optional backup to the file dumpers - * changed IcuResFileDumper to extend FileDumper - -2.3.0 ------ - - * added classes to make operations on catalogues (like making a diff or a merge on 2 catalogues) - * added Translator::getFallbackLocales() - * deprecated Translator::setFallbackLocale() in favor of the new Translator::setFallbackLocales() method - -2.2.0 ------ - - * QtTranslationsLoader class renamed to QtFileLoader. QtTranslationsLoader is deprecated and will be removed in 2.3. - * [BC BREAK] uniformized the exception thrown by the load() method when an error occurs. The load() method now - throws Symfony\Component\Translation\Exception\NotFoundResourceException when a resource cannot be found - and Symfony\Component\Translation\Exception\InvalidResourceException when a resource is invalid. - * changed the exception class thrown by some load() methods from \RuntimeException to \InvalidArgumentException - (IcuDatFileLoader, IcuResFileLoader and QtFileLoader) - -2.1.0 ------ - - * added support for more than one fallback locale - * added support for extracting translation messages from templates (Twig and PHP) - * added dumpers for translation catalogs - * added support for QT, gettext, and ResourceBundles diff --git a/vendor/symfony/translation/Catalogue/AbstractOperation.php b/vendor/symfony/translation/Catalogue/AbstractOperation.php deleted file mode 100644 index 4e825a2..0000000 --- a/vendor/symfony/translation/Catalogue/AbstractOperation.php +++ /dev/null @@ -1,183 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Catalogue; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\LogicException; -use Symfony\Component\Translation\MessageCatalogue; -use Symfony\Component\Translation\MessageCatalogueInterface; - -/** - * Base catalogues binary operation class. - * - * A catalogue binary operation performs operation on - * source (the left argument) and target (the right argument) catalogues. - * - * @author Jean-François Simon - */ -abstract class AbstractOperation implements OperationInterface -{ - public const OBSOLETE_BATCH = 'obsolete'; - public const NEW_BATCH = 'new'; - public const ALL_BATCH = 'all'; - - protected MessageCatalogue $result; - - /** - * This array stores 'all', 'new' and 'obsolete' messages for all valid domains. - * - * The data structure of this array is as follows: - * - * [ - * 'domain 1' => [ - * 'all' => [...], - * 'new' => [...], - * 'obsolete' => [...] - * ], - * 'domain 2' => [ - * 'all' => [...], - * 'new' => [...], - * 'obsolete' => [...] - * ], - * ... - * ] - * - * @var array The array that stores 'all', 'new' and 'obsolete' messages - */ - protected array $messages; - - private array $domains; - - /** - * @throws LogicException - */ - public function __construct( - protected MessageCatalogueInterface $source, - protected MessageCatalogueInterface $target, - ) { - if ($source->getLocale() !== $target->getLocale()) { - throw new LogicException('Operated catalogues must belong to the same locale.'); - } - - $this->result = new MessageCatalogue($source->getLocale()); - $this->messages = []; - } - - public function getDomains(): array - { - if (!isset($this->domains)) { - $domains = []; - foreach ([$this->source, $this->target] as $catalogue) { - foreach ($catalogue->getDomains() as $domain) { - $domains[$domain] = $domain; - - if ($catalogue->all($domainIcu = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX)) { - $domains[$domainIcu] = $domainIcu; - } - } - } - - $this->domains = array_values($domains); - } - - return $this->domains; - } - - public function getMessages(string $domain): array - { - if (!\in_array($domain, $this->getDomains(), true)) { - throw new InvalidArgumentException(\sprintf('Invalid domain: "%s".', $domain)); - } - - if (!isset($this->messages[$domain][self::ALL_BATCH])) { - $this->processDomain($domain); - } - - return $this->messages[$domain][self::ALL_BATCH]; - } - - public function getNewMessages(string $domain): array - { - if (!\in_array($domain, $this->getDomains(), true)) { - throw new InvalidArgumentException(\sprintf('Invalid domain: "%s".', $domain)); - } - - if (!isset($this->messages[$domain][self::NEW_BATCH])) { - $this->processDomain($domain); - } - - return $this->messages[$domain][self::NEW_BATCH]; - } - - public function getObsoleteMessages(string $domain): array - { - if (!\in_array($domain, $this->getDomains(), true)) { - throw new InvalidArgumentException(\sprintf('Invalid domain: "%s".', $domain)); - } - - if (!isset($this->messages[$domain][self::OBSOLETE_BATCH])) { - $this->processDomain($domain); - } - - return $this->messages[$domain][self::OBSOLETE_BATCH]; - } - - public function getResult(): MessageCatalogueInterface - { - foreach ($this->getDomains() as $domain) { - if (!isset($this->messages[$domain])) { - $this->processDomain($domain); - } - } - - return $this->result; - } - - /** - * @param self::*_BATCH $batch - */ - public function moveMessagesToIntlDomainsIfPossible(string $batch = self::ALL_BATCH): void - { - // If MessageFormatter class does not exists, intl domains are not supported. - if (!class_exists(\MessageFormatter::class)) { - return; - } - - foreach ($this->getDomains() as $domain) { - $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; - $messages = match ($batch) { - self::OBSOLETE_BATCH => $this->getObsoleteMessages($domain), - self::NEW_BATCH => $this->getNewMessages($domain), - self::ALL_BATCH => $this->getMessages($domain), - default => throw new \InvalidArgumentException(\sprintf('$batch argument must be one of ["%s", "%s", "%s"].', self::ALL_BATCH, self::NEW_BATCH, self::OBSOLETE_BATCH)), - }; - - if (!$messages || (!$this->source->all($intlDomain) && $this->source->all($domain))) { - continue; - } - - $result = $this->getResult(); - $allIntlMessages = $result->all($intlDomain); - $currentMessages = array_diff_key($messages, $result->all($domain)); - $result->replace($currentMessages, $domain); - $result->replace($allIntlMessages + $messages, $intlDomain); - } - } - - /** - * Performs operation on source and target catalogues for the given domain and - * stores the results. - * - * @param string $domain The domain which the operation will be performed for - */ - abstract protected function processDomain(string $domain): void; -} diff --git a/vendor/symfony/translation/Catalogue/MergeOperation.php b/vendor/symfony/translation/Catalogue/MergeOperation.php deleted file mode 100644 index e242dbe..0000000 --- a/vendor/symfony/translation/Catalogue/MergeOperation.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Catalogue; - -use Symfony\Component\Translation\MessageCatalogueInterface; - -/** - * Merge operation between two catalogues as follows: - * all = source ∪ target = {x: x ∈ source ∨ x ∈ target} - * new = all ∖ source = {x: x ∈ target ∧ x ∉ source} - * obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ source ∧ x ∉ target} = ∅ - * Basically, the result contains messages from both catalogues. - * - * @author Jean-François Simon - */ -class MergeOperation extends AbstractOperation -{ - protected function processDomain(string $domain): void - { - $this->messages[$domain] = [ - 'all' => [], - 'new' => [], - 'obsolete' => [], - ]; - $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; - - foreach ($this->target->getCatalogueMetadata('', $domain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $domain)) { - $this->result->setCatalogueMetadata($key, $value, $domain); - } - } - - foreach ($this->target->getCatalogueMetadata('', $intlDomain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $intlDomain)) { - $this->result->setCatalogueMetadata($key, $value, $intlDomain); - } - } - - foreach ($this->source->all($domain) as $id => $message) { - $this->messages[$domain]['all'][$id] = $message; - $d = $this->source->defines($id, $intlDomain) ? $intlDomain : $domain; - $this->result->add([$id => $message], $d); - if (null !== $keyMetadata = $this->source->getMetadata($id, $d)) { - $this->result->setMetadata($id, $keyMetadata, $d); - } - } - - foreach ($this->target->all($domain) as $id => $message) { - if (!$this->source->has($id, $domain)) { - $this->messages[$domain]['all'][$id] = $message; - $this->messages[$domain]['new'][$id] = $message; - $d = $this->target->defines($id, $intlDomain) ? $intlDomain : $domain; - $this->result->add([$id => $message], $d); - if (null !== $keyMetadata = $this->target->getMetadata($id, $d)) { - $this->result->setMetadata($id, $keyMetadata, $d); - } - } - } - } -} diff --git a/vendor/symfony/translation/Catalogue/OperationInterface.php b/vendor/symfony/translation/Catalogue/OperationInterface.php deleted file mode 100644 index 1fe9534..0000000 --- a/vendor/symfony/translation/Catalogue/OperationInterface.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Catalogue; - -use Symfony\Component\Translation\MessageCatalogueInterface; - -/** - * Represents an operation on catalogue(s). - * - * An instance of this interface performs an operation on one or more catalogues and - * stores intermediate and final results of the operation. - * - * The first catalogue in its argument(s) is called the 'source catalogue' or 'source' and - * the following results are stored: - * - * Messages: also called 'all', are valid messages for the given domain after the operation is performed. - * - * New Messages: also called 'new' (new = all ∖ source = {x: x ∈ all ∧ x ∉ source}). - * - * Obsolete Messages: also called 'obsolete' (obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ all}). - * - * Result: also called 'result', is the resulting catalogue for the given domain that holds the same messages as 'all'. - * - * @author Jean-François Simon - */ -interface OperationInterface -{ - /** - * Returns domains affected by operation. - */ - public function getDomains(): array; - - /** - * Returns all valid messages ('all') after operation. - */ - public function getMessages(string $domain): array; - - /** - * Returns new messages ('new') after operation. - */ - public function getNewMessages(string $domain): array; - - /** - * Returns obsolete messages ('obsolete') after operation. - */ - public function getObsoleteMessages(string $domain): array; - - /** - * Returns resulting catalogue ('result'). - */ - public function getResult(): MessageCatalogueInterface; -} diff --git a/vendor/symfony/translation/Catalogue/TargetOperation.php b/vendor/symfony/translation/Catalogue/TargetOperation.php deleted file mode 100644 index e3e0878..0000000 --- a/vendor/symfony/translation/Catalogue/TargetOperation.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Catalogue; - -use Symfony\Component\Translation\MessageCatalogueInterface; - -/** - * Target operation between two catalogues: - * intersection = source ∩ target = {x: x ∈ source ∧ x ∈ target} - * all = intersection ∪ (target ∖ intersection) = target - * new = all ∖ source = {x: x ∈ target ∧ x ∉ source} - * obsolete = source ∖ all = source ∖ target = {x: x ∈ source ∧ x ∉ target} - * Basically, the result contains messages from the target catalogue. - * - * @author Michael Lee - */ -class TargetOperation extends AbstractOperation -{ - protected function processDomain(string $domain): void - { - $this->messages[$domain] = [ - 'all' => [], - 'new' => [], - 'obsolete' => [], - ]; - $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; - - foreach ($this->target->getCatalogueMetadata('', $domain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $domain)) { - $this->result->setCatalogueMetadata($key, $value, $domain); - } - } - - foreach ($this->target->getCatalogueMetadata('', $intlDomain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $intlDomain)) { - $this->result->setCatalogueMetadata($key, $value, $intlDomain); - } - } - - // For 'all' messages, the code can't be simplified as ``$this->messages[$domain]['all'] = $target->all($domain);``, - // because doing so will drop messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback} - // - // For 'new' messages, the code can't be simplified as ``array_diff_assoc($this->target->all($domain), $this->source->all($domain));`` - // because doing so will not exclude messages like {x: x ∈ target ∧ x ∉ source.all ∧ x ∈ source.fallback} - // - // For 'obsolete' messages, the code can't be simplified as ``array_diff_assoc($this->source->all($domain), $this->target->all($domain))`` - // because doing so will not exclude messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback} - - foreach ($this->source->all($domain) as $id => $message) { - if ($this->target->has($id, $domain)) { - $this->messages[$domain]['all'][$id] = $message; - $d = $this->source->defines($id, $intlDomain) ? $intlDomain : $domain; - $this->result->add([$id => $message], $d); - if (null !== $keyMetadata = $this->source->getMetadata($id, $d)) { - $this->result->setMetadata($id, $keyMetadata, $d); - } - } else { - $this->messages[$domain]['obsolete'][$id] = $message; - } - } - - foreach ($this->target->all($domain) as $id => $message) { - if (!$this->source->has($id, $domain)) { - $this->messages[$domain]['all'][$id] = $message; - $this->messages[$domain]['new'][$id] = $message; - $d = $this->target->defines($id, $intlDomain) ? $intlDomain : $domain; - $this->result->add([$id => $message], $d); - if (null !== $keyMetadata = $this->target->getMetadata($id, $d)) { - $this->result->setMetadata($id, $keyMetadata, $d); - } - } - } - } -} diff --git a/vendor/symfony/translation/CatalogueMetadataAwareInterface.php b/vendor/symfony/translation/CatalogueMetadataAwareInterface.php deleted file mode 100644 index 19965ea..0000000 --- a/vendor/symfony/translation/CatalogueMetadataAwareInterface.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -/** - * This interface is used to get, set, and delete metadata about the Catalogue. - * - * @author Hugo Alliaume - */ -interface CatalogueMetadataAwareInterface -{ - /** - * Gets catalogue metadata for the given domain and key. - * - * Passing an empty domain will return an array with all catalogue metadata indexed by - * domain and then by key. Passing an empty key will return an array with all - * catalogue metadata for the given domain. - * - * @return mixed The value that was set or an array with the domains/keys or null - */ - public function getCatalogueMetadata(string $key = '', string $domain = 'messages'): mixed; - - /** - * Adds catalogue metadata to a message domain. - */ - public function setCatalogueMetadata(string $key, mixed $value, string $domain = 'messages'): void; - - /** - * Deletes catalogue metadata for the given key and domain. - * - * Passing an empty domain will delete all catalogue metadata. Passing an empty key will - * delete all metadata for the given domain. - */ - public function deleteCatalogueMetadata(string $key = '', string $domain = 'messages'): void; -} diff --git a/vendor/symfony/translation/Command/TranslationLintCommand.php b/vendor/symfony/translation/Command/TranslationLintCommand.php deleted file mode 100644 index e525fc0..0000000 --- a/vendor/symfony/translation/Command/TranslationLintCommand.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Command; - -use Symfony\Component\Console\Attribute\AsCommand; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Translation\Exception\ExceptionInterface; -use Symfony\Component\Translation\TranslatorBagInterface; -use Symfony\Contracts\Translation\TranslatorInterface; - -/** - * Lint translations files syntax and outputs encountered errors. - * - * @author Hugo Alliaume - */ -#[AsCommand(name: 'lint:translations', description: 'Lint translations files syntax and outputs encountered errors')] -class TranslationLintCommand extends Command -{ - private SymfonyStyle $io; - - public function __construct( - private TranslatorInterface&TranslatorBagInterface $translator, - private array $enabledLocales = [], - ) { - parent::__construct(); - } - - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - if ($input->mustSuggestOptionValuesFor('locale')) { - $suggestions->suggestValues($this->enabledLocales); - } - } - - protected function configure(): void - { - $this - ->setDefinition([ - new InputOption('locale', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Specify the locales to lint.', $this->enabledLocales), - ]) - ->setHelp(<<<'EOF' -The %command.name% command lint translations. - - php %command.full_name% -EOF - ); - } - - protected function initialize(InputInterface $input, OutputInterface $output): void - { - $this->io = new SymfonyStyle($input, $output); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $locales = $input->getOption('locale'); - - /** @var array> $errors */ - $errors = []; - $domainsByLocales = []; - - foreach ($locales as $locale) { - $messageCatalogue = $this->translator->getCatalogue($locale); - - foreach ($domainsByLocales[$locale] = $messageCatalogue->getDomains() as $domain) { - foreach ($messageCatalogue->all($domain) as $id => $translation) { - try { - $this->translator->trans($id, [], $domain, $messageCatalogue->getLocale()); - } catch (ExceptionInterface $e) { - $errors[$locale][$domain][$id] = $e; - } - } - } - } - - if (!$domainsByLocales) { - $this->io->error('No translation files were found.'); - - return Command::SUCCESS; - } - - $this->io->table( - ['Locale', 'Domains', 'Valid?'], - array_map( - static fn (string $locale, array $domains) => [ - $locale, - implode(', ', $domains), - !\array_key_exists($locale, $errors) ? 'Yes' : 'No', - ], - array_keys($domainsByLocales), - $domainsByLocales - ), - ); - - if ($errors) { - foreach ($errors as $locale => $domains) { - foreach ($domains as $domain => $domainsErrors) { - $this->io->section(\sprintf('Errors for locale "%s" and domain "%s"', $locale, $domain)); - - foreach ($domainsErrors as $id => $error) { - $this->io->text(\sprintf('Translation key "%s" is invalid:', $id)); - $this->io->error($error->getMessage()); - } - } - } - - return Command::FAILURE; - } - - $this->io->success('All translations are valid.'); - - return Command::SUCCESS; - } -} diff --git a/vendor/symfony/translation/Command/TranslationPullCommand.php b/vendor/symfony/translation/Command/TranslationPullCommand.php deleted file mode 100644 index ad42716..0000000 --- a/vendor/symfony/translation/Command/TranslationPullCommand.php +++ /dev/null @@ -1,176 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Command; - -use Symfony\Component\Console\Attribute\AsCommand; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Translation\Catalogue\TargetOperation; -use Symfony\Component\Translation\MessageCatalogue; -use Symfony\Component\Translation\Provider\TranslationProviderCollection; -use Symfony\Component\Translation\Reader\TranslationReaderInterface; -use Symfony\Component\Translation\Writer\TranslationWriterInterface; - -/** - * @author Mathieu Santostefano - */ -#[AsCommand(name: 'translation:pull', description: 'Pull translations from a given provider.')] -final class TranslationPullCommand extends Command -{ - use TranslationTrait; - - public function __construct( - private TranslationProviderCollection $providerCollection, - private TranslationWriterInterface $writer, - private TranslationReaderInterface $reader, - private string $defaultLocale, - private array $transPaths = [], - private array $enabledLocales = [], - ) { - parent::__construct(); - } - - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - if ($input->mustSuggestArgumentValuesFor('provider')) { - $suggestions->suggestValues($this->providerCollection->keys()); - - return; - } - - if ($input->mustSuggestOptionValuesFor('domains')) { - $provider = $this->providerCollection->get($input->getArgument('provider')); - - if (method_exists($provider, 'getDomains')) { - $suggestions->suggestValues($provider->getDomains()); - } - - return; - } - - if ($input->mustSuggestOptionValuesFor('locales')) { - $suggestions->suggestValues($this->enabledLocales); - - return; - } - - if ($input->mustSuggestOptionValuesFor('format')) { - $suggestions->suggestValues(['php', 'xlf', 'xlf12', 'xlf20', 'po', 'mo', 'yml', 'yaml', 'ts', 'csv', 'json', 'ini', 'res']); - } - } - - protected function configure(): void - { - $keys = $this->providerCollection->keys(); - $defaultProvider = 1 === \count($keys) ? $keys[0] : null; - - $this - ->setDefinition([ - new InputArgument('provider', null !== $defaultProvider ? InputArgument::OPTIONAL : InputArgument::REQUIRED, 'The provider to pull translations from.', $defaultProvider), - new InputOption('force', null, InputOption::VALUE_NONE, 'Override existing translations with provider ones (it will delete not synchronized messages).'), - new InputOption('intl-icu', null, InputOption::VALUE_NONE, 'Associated to --force option, it will write messages in "%domain%+intl-icu.%locale%.xlf" files.'), - new InputOption('domains', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the domains to pull.'), - new InputOption('locales', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the locales to pull.'), - new InputOption('format', null, InputOption::VALUE_OPTIONAL, 'Override the default output format.', 'xlf12'), - new InputOption('as-tree', null, InputOption::VALUE_OPTIONAL, 'Write messages as a tree-like structure. Needs --format=yaml. The given value defines the level where to switch to inline YAML'), - ]) - ->setHelp(<<<'EOF' -The %command.name% command pulls translations from the given provider. Only -new translations are pulled, existing ones are not overwritten. - -You can overwrite existing translations (and remove the missing ones on local side) by using the --force flag: - - php %command.full_name% --force provider - -Full example: - - php %command.full_name% provider --force --domains=messages --domains=validators --locales=en - -This command pulls all translations associated with the messages and validators domains for the en locale. -Local translations for the specified domains and locale are deleted if they're not present on the provider and overwritten if it's the case. -Local translations for others domains and locales are ignored. -EOF - ) - ; - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $io = new SymfonyStyle($input, $output); - - $provider = $this->providerCollection->get($input->getArgument('provider')); - $force = $input->getOption('force'); - $intlIcu = $input->getOption('intl-icu'); - $locales = $input->getOption('locales') ?: $this->enabledLocales; - $domains = $input->getOption('domains'); - $format = $input->getOption('format'); - $asTree = (int) $input->getOption('as-tree'); - $xliffVersion = '1.2'; - - if ($intlIcu && !$force) { - $io->note('--intl-icu option only has an effect when used with --force. Here, it will be ignored.'); - } - - switch ($format) { - case 'xlf20': $xliffVersion = '2.0'; - // no break - case 'xlf12': $format = 'xlf'; - } - - $writeOptions = [ - 'path' => end($this->transPaths), - 'xliff_version' => $xliffVersion, - 'default_locale' => $this->defaultLocale, - 'as_tree' => (bool) $asTree, - 'inline' => $asTree, - ]; - - if (!$domains) { - $domains = $provider->getDomains(); - } - - $providerTranslations = $provider->read($domains, $locales); - - if ($force) { - foreach ($providerTranslations->getCatalogues() as $catalogue) { - $operation = new TargetOperation(new MessageCatalogue($catalogue->getLocale()), $catalogue); - if ($intlIcu) { - $operation->moveMessagesToIntlDomainsIfPossible(); - } - $this->writer->write($operation->getResult(), $format, $writeOptions); - } - - $io->success(\sprintf('Local translations has been updated from "%s" (for "%s" locale(s), and "%s" domain(s)).', parse_url($provider, \PHP_URL_SCHEME), implode(', ', $locales), implode(', ', $domains))); - - return 0; - } - - $localTranslations = $this->readLocalTranslations($locales, $domains, $this->transPaths); - - // Append pulled translations to local ones. - $localTranslations->addBag($providerTranslations->diff($localTranslations)); - - foreach ($localTranslations->getCatalogues() as $catalogue) { - $this->writer->write($catalogue, $format, $writeOptions); - } - - $io->success(\sprintf('New translations from "%s" has been written locally (for "%s" locale(s), and "%s" domain(s)).', parse_url($provider, \PHP_URL_SCHEME), implode(', ', $locales), implode(', ', $domains))); - - return 0; - } -} diff --git a/vendor/symfony/translation/Command/TranslationPushCommand.php b/vendor/symfony/translation/Command/TranslationPushCommand.php deleted file mode 100644 index b1cdc5f..0000000 --- a/vendor/symfony/translation/Command/TranslationPushCommand.php +++ /dev/null @@ -1,176 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Command; - -use Symfony\Component\Console\Attribute\AsCommand; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Translation\Provider\FilteringProvider; -use Symfony\Component\Translation\Provider\TranslationProviderCollection; -use Symfony\Component\Translation\Reader\TranslationReaderInterface; -use Symfony\Component\Translation\TranslatorBag; - -/** - * @author Mathieu Santostefano - */ -#[AsCommand(name: 'translation:push', description: 'Push translations to a given provider.')] -final class TranslationPushCommand extends Command -{ - use TranslationTrait; - - public function __construct( - private TranslationProviderCollection $providers, - private TranslationReaderInterface $reader, - private array $transPaths = [], - private array $enabledLocales = [], - ) { - parent::__construct(); - } - - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - if ($input->mustSuggestArgumentValuesFor('provider')) { - $suggestions->suggestValues($this->providers->keys()); - - return; - } - - if ($input->mustSuggestOptionValuesFor('domains')) { - $provider = $this->providers->get($input->getArgument('provider')); - - if (method_exists($provider, 'getDomains')) { - $domains = $provider->getDomains(); - $suggestions->suggestValues($domains); - } - - return; - } - - if ($input->mustSuggestOptionValuesFor('locales')) { - $suggestions->suggestValues($this->enabledLocales); - } - } - - protected function configure(): void - { - $keys = $this->providers->keys(); - $defaultProvider = 1 === \count($keys) ? $keys[0] : null; - - $this - ->setDefinition([ - new InputArgument('provider', null !== $defaultProvider ? InputArgument::OPTIONAL : InputArgument::REQUIRED, 'The provider to push translations to.', $defaultProvider), - new InputOption('force', null, InputOption::VALUE_NONE, 'Override existing translations with local ones (it will delete not synchronized messages).'), - new InputOption('delete-missing', null, InputOption::VALUE_NONE, 'Delete translations available on provider but not locally.'), - new InputOption('domains', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the domains to push.'), - new InputOption('locales', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the locales to push.', $this->enabledLocales), - ]) - ->setHelp(<<<'EOF' -The %command.name% command pushes translations to the given provider. Only new -translations are pushed, existing ones are not overwritten. - -You can overwrite existing translations by using the --force flag: - - php %command.full_name% --force provider - -You can delete provider translations which are not present locally by using the --delete-missing flag: - - php %command.full_name% --delete-missing provider - -Full example: - - php %command.full_name% provider --force --delete-missing --domains=messages --domains=validators --locales=en - -This command pushes all translations associated with the messages and validators domains for the en locale. -Provider translations for the specified domains and locale are deleted if they're not present locally and overwritten if it's the case. -Provider translations for others domains and locales are ignored. -EOF - ) - ; - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $provider = $this->providers->get($input->getArgument('provider')); - - if (!$this->enabledLocales) { - throw new InvalidArgumentException(\sprintf('You must define "framework.enabled_locales" or "framework.translator.providers.%s.locales" config key in order to work with translation providers.', parse_url($provider, \PHP_URL_SCHEME))); - } - - $io = new SymfonyStyle($input, $output); - $domains = $input->getOption('domains'); - $locales = $input->getOption('locales'); - $force = $input->getOption('force'); - $deleteMissing = $input->getOption('delete-missing'); - - if (!$domains && $provider instanceof FilteringProvider) { - $domains = $provider->getDomains(); - } - - // Reading local translations must be done after retrieving the domains from the provider - // in order to manage only translations from configured domains - $localTranslations = $this->readLocalTranslations($locales, $domains, $this->transPaths); - - if (!$domains) { - $domains = $this->getDomainsFromTranslatorBag($localTranslations); - } - - if (!$deleteMissing && $force) { - $provider->write($localTranslations); - - $io->success(\sprintf('All local translations has been sent to "%s" (for "%s" locale(s), and "%s" domain(s)).', parse_url($provider, \PHP_URL_SCHEME), implode(', ', $locales), implode(', ', $domains))); - - return 0; - } - - $providerTranslations = $provider->read($domains, $locales); - - if ($deleteMissing) { - $provider->delete($providerTranslations->diff($localTranslations)); - - $io->success(\sprintf('Missing translations on "%s" has been deleted (for "%s" locale(s), and "%s" domain(s)).', parse_url($provider, \PHP_URL_SCHEME), implode(', ', $locales), implode(', ', $domains))); - - // Read provider translations again, after missing translations deletion, - // to avoid push freshly deleted translations. - $providerTranslations = $provider->read($domains, $locales); - } - - $translationsToWrite = $localTranslations->diff($providerTranslations); - - if ($force) { - $translationsToWrite->addBag($localTranslations->intersect($providerTranslations)); - } - - $provider->write($translationsToWrite); - - $io->success(\sprintf('%s local translations has been sent to "%s" (for "%s" locale(s), and "%s" domain(s)).', $force ? 'All' : 'New', parse_url($provider, \PHP_URL_SCHEME), implode(', ', $locales), implode(', ', $domains))); - - return 0; - } - - private function getDomainsFromTranslatorBag(TranslatorBag $translatorBag): array - { - $domains = []; - - foreach ($translatorBag->getCatalogues() as $catalogue) { - $domains += $catalogue->getDomains(); - } - - return array_unique($domains); - } -} diff --git a/vendor/symfony/translation/Command/TranslationTrait.php b/vendor/symfony/translation/Command/TranslationTrait.php deleted file mode 100644 index eafaffd..0000000 --- a/vendor/symfony/translation/Command/TranslationTrait.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Command; - -use Symfony\Component\Translation\MessageCatalogue; -use Symfony\Component\Translation\MessageCatalogueInterface; -use Symfony\Component\Translation\TranslatorBag; - -/** - * @internal - */ -trait TranslationTrait -{ - private function readLocalTranslations(array $locales, array $domains, array $transPaths): TranslatorBag - { - $bag = new TranslatorBag(); - - foreach ($locales as $locale) { - $catalogue = new MessageCatalogue($locale); - foreach ($transPaths as $path) { - $this->reader->read($path, $catalogue); - } - - if ($domains) { - foreach ($domains as $domain) { - $bag->addCatalogue($this->filterCatalogue($catalogue, $domain)); - } - } else { - $bag->addCatalogue($catalogue); - } - } - - return $bag; - } - - private function filterCatalogue(MessageCatalogue $catalogue, string $domain): MessageCatalogue - { - $filteredCatalogue = new MessageCatalogue($catalogue->getLocale()); - - // extract intl-icu messages only - $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; - if ($intlMessages = $catalogue->all($intlDomain)) { - $filteredCatalogue->add($intlMessages, $intlDomain); - } - - // extract all messages and subtract intl-icu messages - if ($messages = array_diff($catalogue->all($domain), $intlMessages)) { - $filteredCatalogue->add($messages, $domain); - } - foreach ($catalogue->getResources() as $resource) { - $filteredCatalogue->addResource($resource); - } - - if ($metadata = $catalogue->getMetadata('', $intlDomain)) { - foreach ($metadata as $k => $v) { - $filteredCatalogue->setMetadata($k, $v, $intlDomain); - } - } - - if ($metadata = $catalogue->getMetadata('', $domain)) { - foreach ($metadata as $k => $v) { - $filteredCatalogue->setMetadata($k, $v, $domain); - } - } - - return $filteredCatalogue; - } -} diff --git a/vendor/symfony/translation/Command/XliffLintCommand.php b/vendor/symfony/translation/Command/XliffLintCommand.php deleted file mode 100644 index 82a9571..0000000 --- a/vendor/symfony/translation/Command/XliffLintCommand.php +++ /dev/null @@ -1,288 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Command; - -use Symfony\Component\Console\Attribute\AsCommand; -use Symfony\Component\Console\CI\GithubActionReporter; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Exception\RuntimeException; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Util\XliffUtils; - -/** - * Validates XLIFF files syntax and outputs encountered errors. - * - * @author Grégoire Pineau - * @author Robin Chalas - * @author Javier Eguiluz - */ -#[AsCommand(name: 'lint:xliff', description: 'Lint an XLIFF file and outputs encountered errors')] -class XliffLintCommand extends Command -{ - private string $format; - private bool $displayCorrectFiles; - private ?\Closure $directoryIteratorProvider; - private ?\Closure $isReadableProvider; - - public function __construct( - ?string $name = null, - ?callable $directoryIteratorProvider = null, - ?callable $isReadableProvider = null, - private bool $requireStrictFileNames = true, - ) { - parent::__construct($name); - - $this->directoryIteratorProvider = null === $directoryIteratorProvider ? null : $directoryIteratorProvider(...); - $this->isReadableProvider = null === $isReadableProvider ? null : $isReadableProvider(...); - } - - protected function configure(): void - { - $this - ->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN') - ->addOption('format', null, InputOption::VALUE_REQUIRED, \sprintf('The output format ("%s")', implode('", "', $this->getAvailableFormatOptions()))) - ->setHelp(<<%command.name% command lints an XLIFF file and outputs to STDOUT -the first encountered syntax error. - -You can validates XLIFF contents passed from STDIN: - - cat filename | php %command.full_name% - - -You can also validate the syntax of a file: - - php %command.full_name% filename - -Or of a whole directory: - - php %command.full_name% dirname - -The --format option specifies the format of the command output: - - php %command.full_name% dirname --format=json - -EOF - ) - ; - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $io = new SymfonyStyle($input, $output); - $filenames = (array) $input->getArgument('filename'); - $this->format = $input->getOption('format') ?? (GithubActionReporter::isGithubActionEnvironment() ? 'github' : 'txt'); - $this->displayCorrectFiles = $output->isVerbose(); - - if (['-'] === $filenames) { - return $this->display($io, [$this->validate(file_get_contents('php://stdin'))]); - } - - if (!$filenames) { - throw new RuntimeException('Please provide a filename or pipe file content to STDIN.'); - } - - $filesInfo = []; - foreach ($filenames as $filename) { - if (!$this->isReadable($filename)) { - throw new RuntimeException(\sprintf('File or directory "%s" is not readable.', $filename)); - } - - foreach ($this->getFiles($filename) as $file) { - $filesInfo[] = $this->validate(file_get_contents($file), $file); - } - } - - return $this->display($io, $filesInfo); - } - - private function validate(string $content, ?string $file = null): array - { - $errors = []; - - // Avoid: Warning DOMDocument::loadXML(): Empty string supplied as input - if ('' === trim($content)) { - return ['file' => $file, 'valid' => true]; - } - - $internal = libxml_use_internal_errors(true); - - $document = new \DOMDocument(); - $document->loadXML($content); - - if (null !== $targetLanguage = $this->getTargetLanguageFromFile($document)) { - $normalizedLocalePattern = \sprintf('(%s|%s)', preg_quote($targetLanguage, '/'), preg_quote(str_replace('-', '_', $targetLanguage), '/')); - // strict file names require translation files to be named '____.locale.xlf' - // otherwise, both '____.locale.xlf' and 'locale.____.xlf' are allowed - // also, the regexp matching must be case-insensitive, as defined for 'target-language' values - // http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html#target-language - $expectedFilenamePattern = $this->requireStrictFileNames ? \sprintf('/^.*\.(?i:%s)\.(?:xlf|xliff)/', $normalizedLocalePattern) : \sprintf('/^(?:.*\.(?i:%s)|(?i:%s)\..*)\.(?:xlf|xliff)/', $normalizedLocalePattern, $normalizedLocalePattern); - - if (0 === preg_match($expectedFilenamePattern, basename($file))) { - $errors[] = [ - 'line' => -1, - 'column' => -1, - 'message' => \sprintf('There is a mismatch between the language included in the file name ("%s") and the "%s" value used in the "target-language" attribute of the file.', basename($file), $targetLanguage), - ]; - } - } - - foreach (XliffUtils::validateSchema($document) as $xmlError) { - $errors[] = [ - 'line' => $xmlError['line'], - 'column' => $xmlError['column'], - 'message' => $xmlError['message'], - ]; - } - - libxml_clear_errors(); - libxml_use_internal_errors($internal); - - return ['file' => $file, 'valid' => 0 === \count($errors), 'messages' => $errors]; - } - - private function display(SymfonyStyle $io, array $files): int - { - return match ($this->format) { - 'txt' => $this->displayTxt($io, $files), - 'json' => $this->displayJson($io, $files), - 'github' => $this->displayTxt($io, $files, true), - default => throw new InvalidArgumentException(\sprintf('Supported formats are "%s".', implode('", "', $this->getAvailableFormatOptions()))), - }; - } - - private function displayTxt(SymfonyStyle $io, array $filesInfo, bool $errorAsGithubAnnotations = false): int - { - $countFiles = \count($filesInfo); - $erroredFiles = 0; - $githubReporter = $errorAsGithubAnnotations ? new GithubActionReporter($io) : null; - - foreach ($filesInfo as $info) { - if ($info['valid'] && $this->displayCorrectFiles) { - $io->comment('OK'.($info['file'] ? \sprintf(' in %s', $info['file']) : '')); - } elseif (!$info['valid']) { - ++$erroredFiles; - $io->text(' ERROR '.($info['file'] ? \sprintf(' in %s', $info['file']) : '')); - $io->listing(array_map(function ($error) use ($info, $githubReporter) { - // general document errors have a '-1' line number - $line = -1 === $error['line'] ? null : $error['line']; - - $githubReporter?->error($error['message'], $info['file'], $line, null !== $line ? $error['column'] : null); - - return null === $line ? $error['message'] : \sprintf('Line %d, Column %d: %s', $line, $error['column'], $error['message']); - }, $info['messages'])); - } - } - - if (0 === $erroredFiles) { - $io->success(\sprintf('All %d XLIFF files contain valid syntax.', $countFiles)); - } else { - $io->warning(\sprintf('%d XLIFF files have valid syntax and %d contain errors.', $countFiles - $erroredFiles, $erroredFiles)); - } - - return min($erroredFiles, 1); - } - - private function displayJson(SymfonyStyle $io, array $filesInfo): int - { - $errors = 0; - - array_walk($filesInfo, function (&$v) use (&$errors) { - $v['file'] = (string) $v['file']; - if (!$v['valid']) { - ++$errors; - } - }); - - $io->writeln(json_encode($filesInfo, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES)); - - return min($errors, 1); - } - - /** - * @return iterable<\SplFileInfo> - */ - private function getFiles(string $fileOrDirectory): iterable - { - if (is_file($fileOrDirectory)) { - yield new \SplFileInfo($fileOrDirectory); - - return; - } - - foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) { - if (!\in_array($file->getExtension(), ['xlf', 'xliff'])) { - continue; - } - - yield $file; - } - } - - /** - * @return iterable<\SplFileInfo> - */ - private function getDirectoryIterator(string $directory): iterable - { - $default = fn ($directory) => new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), - \RecursiveIteratorIterator::LEAVES_ONLY - ); - - if (null !== $this->directoryIteratorProvider) { - return ($this->directoryIteratorProvider)($directory, $default); - } - - return $default($directory); - } - - private function isReadable(string $fileOrDirectory): bool - { - $default = fn ($fileOrDirectory) => is_readable($fileOrDirectory); - - if (null !== $this->isReadableProvider) { - return ($this->isReadableProvider)($fileOrDirectory, $default); - } - - return $default($fileOrDirectory); - } - - private function getTargetLanguageFromFile(\DOMDocument $xliffContents): ?string - { - foreach ($xliffContents->getElementsByTagName('file')[0]->attributes ?? [] as $attribute) { - if ('target-language' === $attribute->nodeName) { - return $attribute->nodeValue; - } - } - - return null; - } - - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - if ($input->mustSuggestOptionValuesFor('format')) { - $suggestions->suggestValues($this->getAvailableFormatOptions()); - } - } - - /** @return string[] */ - private function getAvailableFormatOptions(): array - { - return ['txt', 'json', 'github']; - } -} diff --git a/vendor/symfony/translation/DataCollector/TranslationDataCollector.php b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php deleted file mode 100644 index e6bd619..0000000 --- a/vendor/symfony/translation/DataCollector/TranslationDataCollector.php +++ /dev/null @@ -1,146 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\DataCollector; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpKernel\DataCollector\DataCollector; -use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface; -use Symfony\Component\Translation\DataCollectorTranslator; -use Symfony\Component\VarDumper\Cloner\Data; - -/** - * @author Abdellatif Ait boudad - * - * @final - */ -class TranslationDataCollector extends DataCollector implements LateDataCollectorInterface -{ - public function __construct( - private DataCollectorTranslator $translator, - ) { - } - - public function lateCollect(): void - { - $messages = $this->sanitizeCollectedMessages($this->translator->getCollectedMessages()); - - $this->data += $this->computeCount($messages); - $this->data['messages'] = $messages; - - $this->data = $this->cloneVar($this->data); - } - - public function collect(Request $request, Response $response, ?\Throwable $exception = null): void - { - $this->data['locale'] = $this->translator->getLocale(); - $this->data['fallback_locales'] = $this->translator->getFallbackLocales(); - } - - public function reset(): void - { - $this->data = []; - } - - public function getMessages(): array|Data - { - return $this->data['messages'] ?? []; - } - - public function getCountMissings(): int - { - return $this->data[DataCollectorTranslator::MESSAGE_MISSING] ?? 0; - } - - public function getCountFallbacks(): int - { - return $this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK] ?? 0; - } - - public function getCountDefines(): int - { - return $this->data[DataCollectorTranslator::MESSAGE_DEFINED] ?? 0; - } - - public function getLocale(): ?string - { - return !empty($this->data['locale']) ? $this->data['locale'] : null; - } - - /** - * @internal - */ - public function getFallbackLocales(): Data|array - { - return (isset($this->data['fallback_locales']) && \count($this->data['fallback_locales']) > 0) ? $this->data['fallback_locales'] : []; - } - - public function getName(): string - { - return 'translation'; - } - - private function sanitizeCollectedMessages(array $messages): array - { - $result = []; - foreach ($messages as $key => $message) { - $messageId = $message['locale'].$message['domain'].$message['id']; - - if (!isset($result[$messageId])) { - $message['count'] = 1; - $message['parameters'] = !empty($message['parameters']) ? [$message['parameters']] : []; - $messages[$key]['translation'] = $this->sanitizeString($message['translation']); - $result[$messageId] = $message; - } else { - if (!empty($message['parameters'])) { - $result[$messageId]['parameters'][] = $message['parameters']; - } - - ++$result[$messageId]['count']; - } - - unset($messages[$key]); - } - - return $result; - } - - private function computeCount(array $messages): array - { - $count = [ - DataCollectorTranslator::MESSAGE_DEFINED => 0, - DataCollectorTranslator::MESSAGE_MISSING => 0, - DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK => 0, - ]; - - foreach ($messages as $message) { - ++$count[$message['state']]; - } - - return $count; - } - - private function sanitizeString(string $string, int $length = 80): string - { - $string = trim(preg_replace('/\s+/', ' ', $string)); - - if (false !== $encoding = mb_detect_encoding($string, null, true)) { - if (mb_strlen($string, $encoding) > $length) { - return mb_substr($string, 0, $length - 3, $encoding).'...'; - } - } elseif (\strlen($string) > $length) { - return substr($string, 0, $length - 3).'...'; - } - - return $string; - } -} diff --git a/vendor/symfony/translation/DataCollectorTranslator.php b/vendor/symfony/translation/DataCollectorTranslator.php deleted file mode 100644 index dcabede..0000000 --- a/vendor/symfony/translation/DataCollectorTranslator.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface; -use Symfony\Contracts\Translation\LocaleAwareInterface; -use Symfony\Contracts\Translation\TranslatorInterface; - -/** - * @author Abdellatif Ait boudad - * - * @final since Symfony 7.1 - */ -class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface, WarmableInterface -{ - public const MESSAGE_DEFINED = 0; - public const MESSAGE_MISSING = 1; - public const MESSAGE_EQUALS_FALLBACK = 2; - - private array $messages = []; - - public function __construct( - private TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator, - ) { - } - - public function trans(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string - { - $trans = $this->translator->trans($id = (string) $id, $parameters, $domain, $locale); - $this->collectMessage($locale, $domain, $id, $trans, $parameters); - - return $trans; - } - - public function setLocale(string $locale): void - { - $this->translator->setLocale($locale); - } - - public function getLocale(): string - { - return $this->translator->getLocale(); - } - - public function getCatalogue(?string $locale = null): MessageCatalogueInterface - { - return $this->translator->getCatalogue($locale); - } - - public function getCatalogues(): array - { - return $this->translator->getCatalogues(); - } - - public function warmUp(string $cacheDir, ?string $buildDir = null): array - { - if ($this->translator instanceof WarmableInterface) { - return $this->translator->warmUp($cacheDir, $buildDir); - } - - return []; - } - - /** - * Gets the fallback locales. - */ - public function getFallbackLocales(): array - { - if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { - return $this->translator->getFallbackLocales(); - } - - return []; - } - - public function __call(string $method, array $args): mixed - { - return $this->translator->{$method}(...$args); - } - - public function getCollectedMessages(): array - { - return $this->messages; - } - - private function collectMessage(?string $locale, ?string $domain, string $id, string $translation, ?array $parameters = []): void - { - $domain ??= 'messages'; - - $catalogue = $this->translator->getCatalogue($locale); - $locale = $catalogue->getLocale(); - $fallbackLocale = null; - if ($catalogue->defines($id, $domain)) { - $state = self::MESSAGE_DEFINED; - } elseif ($catalogue->has($id, $domain)) { - $state = self::MESSAGE_EQUALS_FALLBACK; - - $fallbackCatalogue = $catalogue->getFallbackCatalogue(); - while ($fallbackCatalogue) { - if ($fallbackCatalogue->defines($id, $domain)) { - $fallbackLocale = $fallbackCatalogue->getLocale(); - break; - } - $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); - } - } else { - $state = self::MESSAGE_MISSING; - } - - $this->messages[] = [ - 'locale' => $locale, - 'fallbackLocale' => $fallbackLocale, - 'domain' => $domain, - 'id' => $id, - 'translation' => $translation, - 'parameters' => $parameters, - 'state' => $state, - 'transChoiceNumber' => isset($parameters['%count%']) && is_numeric($parameters['%count%']) ? $parameters['%count%'] : null, - ]; - } -} diff --git a/vendor/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php b/vendor/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php deleted file mode 100644 index cdf63be..0000000 --- a/vendor/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\DependencyInjection; - -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\Translation\TranslatorBagInterface; - -/** - * @author Christian Flothmann - */ -class DataCollectorTranslatorPass implements CompilerPassInterface -{ - public function process(ContainerBuilder $container): void - { - if (!$container->has('translator')) { - return; - } - - $translatorClass = $container->getParameterBag()->resolveValue($container->findDefinition('translator')->getClass()); - - if (!is_subclass_of($translatorClass, TranslatorBagInterface::class)) { - $container->removeDefinition('translator.data_collector'); - $container->removeDefinition('data_collector.translation'); - } - } -} diff --git a/vendor/symfony/translation/DependencyInjection/LoggingTranslatorPass.php b/vendor/symfony/translation/DependencyInjection/LoggingTranslatorPass.php deleted file mode 100644 index fba8698..0000000 --- a/vendor/symfony/translation/DependencyInjection/LoggingTranslatorPass.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\DependencyInjection; - -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\Translation\TranslatorBagInterface; -use Symfony\Contracts\Translation\TranslatorInterface; - -/** - * @author Abdellatif Ait boudad - */ -class LoggingTranslatorPass implements CompilerPassInterface -{ - public function process(ContainerBuilder $container): void - { - if (!$container->hasAlias('logger') || !$container->hasAlias('translator')) { - return; - } - - if (!$container->hasParameter('translator.logging') || !$container->getParameter('translator.logging')) { - return; - } - - $translatorAlias = $container->getAlias('translator'); - $definition = $container->getDefinition((string) $translatorAlias); - $class = $container->getParameterBag()->resolveValue($definition->getClass()); - - if (!$r = $container->getReflectionClass($class)) { - throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $translatorAlias)); - } - - if (!$r->isSubclassOf(TranslatorInterface::class) || !$r->isSubclassOf(TranslatorBagInterface::class)) { - return; - } - - $container->getDefinition('translator.logging')->setDecoratedService('translator'); - $warmer = $container->getDefinition('translation.warmer'); - $subscriberAttributes = $warmer->getTag('container.service_subscriber'); - $warmer->clearTag('container.service_subscriber'); - - foreach ($subscriberAttributes as $k => $v) { - if ((!isset($v['id']) || 'translator' !== $v['id']) && (!isset($v['key']) || 'translator' !== $v['key'])) { - $warmer->addTag('container.service_subscriber', $v); - } - } - $warmer->addTag('container.service_subscriber', ['key' => 'translator', 'id' => 'translator.logging.inner']); - } -} diff --git a/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php b/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php deleted file mode 100644 index 0331ef5..0000000 --- a/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\DependencyInjection; - -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Adds tagged translation.formatter services to translation writer. - */ -class TranslationDumperPass implements CompilerPassInterface -{ - public function process(ContainerBuilder $container): void - { - if (!$container->hasDefinition('translation.writer')) { - return; - } - - $definition = $container->getDefinition('translation.writer'); - - foreach ($container->findTaggedServiceIds('translation.dumper', true) as $id => $attributes) { - $definition->addMethodCall('addDumper', [$attributes[0]['alias'], new Reference($id)]); - } - } -} diff --git a/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php b/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php deleted file mode 100644 index 864a121..0000000 --- a/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\DependencyInjection; - -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * Adds tagged translation.extractor services to translation extractor. - */ -class TranslationExtractorPass implements CompilerPassInterface -{ - public function process(ContainerBuilder $container): void - { - if (!$container->hasDefinition('translation.extractor')) { - return; - } - - $definition = $container->getDefinition('translation.extractor'); - - foreach ($container->findTaggedServiceIds('translation.extractor', true) as $id => $attributes) { - if (!isset($attributes[0]['alias'])) { - throw new RuntimeException(\sprintf('The alias for the tag "translation.extractor" of service "%s" must be set.', $id)); - } - - $definition->addMethodCall('addExtractor', [$attributes[0]['alias'], new Reference($id)]); - } - } -} diff --git a/vendor/symfony/translation/DependencyInjection/TranslatorPass.php b/vendor/symfony/translation/DependencyInjection/TranslatorPass.php deleted file mode 100644 index 948f378..0000000 --- a/vendor/symfony/translation/DependencyInjection/TranslatorPass.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\DependencyInjection; - -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Reference; - -class TranslatorPass implements CompilerPassInterface -{ - public function process(ContainerBuilder $container): void - { - if (!$container->hasDefinition('translator.default')) { - return; - } - - $loaders = []; - $loaderRefs = []; - foreach ($container->findTaggedServiceIds('translation.loader', true) as $id => $attributes) { - $loaderRefs[$id] = new Reference($id); - $loaders[$id][] = $attributes[0]['alias']; - if (isset($attributes[0]['legacy-alias'])) { - $loaders[$id][] = $attributes[0]['legacy-alias']; - } - } - - if ($container->hasDefinition('translation.reader')) { - $definition = $container->getDefinition('translation.reader'); - foreach ($loaders as $id => $formats) { - foreach ($formats as $format) { - $definition->addMethodCall('addLoader', [$format, $loaderRefs[$id]]); - } - } - } - - $container - ->findDefinition('translator.default') - ->replaceArgument(0, ServiceLocatorTagPass::register($container, $loaderRefs)) - ->replaceArgument(3, $loaders) - ; - - if ($container->hasDefinition('validator') && $container->hasDefinition('translation.extractor.visitor.constraint')) { - $constraintVisitorDefinition = $container->getDefinition('translation.extractor.visitor.constraint'); - $constraintClassNames = []; - - foreach ($container->getDefinitions() as $definition) { - if (!$definition->hasTag('validator.constraint_validator')) { - continue; - } - // Resolve constraint validator FQCN even if defined as %foo.validator.class% parameter - $className = $container->getParameterBag()->resolveValue($definition->getClass()); - // Extraction of the constraint class name from the Constraint Validator FQCN - $constraintClassNames[] = str_replace('Validator', '', substr(strrchr($className, '\\'), 1)); - } - - $constraintVisitorDefinition->setArgument(0, $constraintClassNames); - } - - if (!$container->hasParameter('twig.default_path')) { - return; - } - - $paths = array_keys($container->getDefinition('twig.template_iterator')->getArgument(1)); - if ($container->hasDefinition('console.command.translation_debug')) { - $definition = $container->getDefinition('console.command.translation_debug'); - $definition->replaceArgument(4, $container->getParameter('twig.default_path')); - - if (\count($definition->getArguments()) > 6) { - $definition->replaceArgument(6, $paths); - } - } - if ($container->hasDefinition('console.command.translation_extract')) { - $definition = $container->getDefinition('console.command.translation_extract'); - $definition->replaceArgument(5, $container->getParameter('twig.default_path')); - - if (\count($definition->getArguments()) > 7) { - $definition->replaceArgument(7, $paths); - } - } - } -} diff --git a/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php b/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php deleted file mode 100644 index 4f5fc2d..0000000 --- a/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php +++ /dev/null @@ -1,142 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\DependencyInjection; - -use Symfony\Component\DependencyInjection\Compiler\AbstractRecursivePass; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\DependencyInjection\ServiceLocator; -use Symfony\Component\HttpKernel\Controller\ArgumentResolver\TraceableValueResolver; - -/** - * @author Yonel Ceruto - */ -class TranslatorPathsPass extends AbstractRecursivePass -{ - protected bool $skipScalars = true; - - private int $level = 0; - - /** - * @var array - */ - private array $paths = []; - - /** - * @var array - */ - private array $definitions = []; - - /** - * @var array> - */ - private array $controllers = []; - - public function process(ContainerBuilder $container): void - { - if (!$container->hasDefinition('translator')) { - return; - } - - foreach ($this->findControllerArguments($container) as $controller => $argument) { - $id = substr($controller, 0, strpos($controller, ':') ?: \strlen($controller)); - if ($container->hasDefinition($id)) { - [$locatorRef] = $argument->getValues(); - $this->controllers[(string) $locatorRef][$container->getDefinition($id)->getClass()] = true; - } - } - - try { - parent::process($container); - - $paths = []; - foreach ($this->paths as $class => $_) { - if (($r = $container->getReflectionClass($class)) && !$r->isInterface()) { - $paths[] = $r->getFileName(); - foreach ($r->getTraits() as $trait) { - $paths[] = $trait->getFileName(); - } - } - } - if ($paths) { - if ($container->hasDefinition('console.command.translation_debug')) { - $definition = $container->getDefinition('console.command.translation_debug'); - $definition->replaceArgument(6, array_merge($definition->getArgument(6), $paths)); - } - if ($container->hasDefinition('console.command.translation_extract')) { - $definition = $container->getDefinition('console.command.translation_extract'); - $definition->replaceArgument(7, array_merge($definition->getArgument(7), $paths)); - } - } - } finally { - $this->level = 0; - $this->paths = []; - $this->definitions = []; - } - } - - protected function processValue(mixed $value, bool $isRoot = false): mixed - { - if ($value instanceof Reference) { - if ('translator' === (string) $value) { - for ($i = $this->level - 1; $i >= 0; --$i) { - $class = $this->definitions[$i]->getClass(); - - if (ServiceLocator::class === $class) { - if (!isset($this->controllers[$this->currentId])) { - continue; - } - foreach ($this->controllers[$this->currentId] as $class => $_) { - $this->paths[$class] = true; - } - } else { - $this->paths[$class] = true; - } - - break; - } - } - - return $value; - } - - if ($value instanceof Definition) { - $this->definitions[$this->level++] = $value; - $value = parent::processValue($value, $isRoot); - unset($this->definitions[--$this->level]); - - return $value; - } - - return parent::processValue($value, $isRoot); - } - - private function findControllerArguments(ContainerBuilder $container): array - { - if (!$container->has('argument_resolver.service')) { - return []; - } - $resolverDef = $container->findDefinition('argument_resolver.service'); - - if (TraceableValueResolver::class === $resolverDef->getClass()) { - $resolverDef = $container->getDefinition($resolverDef->getArgument(0)); - } - - $argument = $resolverDef->getArgument(0); - if ($argument instanceof Reference) { - $argument = $container->getDefinition($argument); - } - - return $argument->getArgument(0); - } -} diff --git a/vendor/symfony/translation/Dumper/CsvFileDumper.php b/vendor/symfony/translation/Dumper/CsvFileDumper.php deleted file mode 100644 index 7dfbba4..0000000 --- a/vendor/symfony/translation/Dumper/CsvFileDumper.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * CsvFileDumper generates a csv formatted string representation of a message catalogue. - * - * @author Stealth35 - */ -class CsvFileDumper extends FileDumper -{ - private string $delimiter = ';'; - private string $enclosure = '"'; - - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string - { - $handle = fopen('php://memory', 'r+'); - - foreach ($messages->all($domain) as $source => $target) { - fputcsv($handle, [$source, $target], $this->delimiter, $this->enclosure, '\\'); - } - - rewind($handle); - $output = stream_get_contents($handle); - fclose($handle); - - return $output; - } - - /** - * Sets the delimiter and escape character for CSV. - */ - public function setCsvControl(string $delimiter = ';', string $enclosure = '"'): void - { - $this->delimiter = $delimiter; - $this->enclosure = $enclosure; - } - - protected function getExtension(): string - { - return 'csv'; - } -} diff --git a/vendor/symfony/translation/Dumper/DumperInterface.php b/vendor/symfony/translation/Dumper/DumperInterface.php deleted file mode 100644 index c151de0..0000000 --- a/vendor/symfony/translation/Dumper/DumperInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * DumperInterface is the interface implemented by all translation dumpers. - * There is no common option. - * - * @author Michel Salib - */ -interface DumperInterface -{ - /** - * Dumps the message catalogue. - * - * @param array $options Options that are used by the dumper - */ - public function dump(MessageCatalogue $messages, array $options = []): void; -} diff --git a/vendor/symfony/translation/Dumper/FileDumper.php b/vendor/symfony/translation/Dumper/FileDumper.php deleted file mode 100644 index 2e1880f..0000000 --- a/vendor/symfony/translation/Dumper/FileDumper.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\RuntimeException; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * FileDumper is an implementation of DumperInterface that dump a message catalogue to file(s). - * - * Options: - * - path (mandatory): the directory where the files should be saved - * - * @author Michel Salib - */ -abstract class FileDumper implements DumperInterface -{ - /** - * A template for the relative paths to files. - */ - protected string $relativePathTemplate = '%domain%.%locale%.%extension%'; - - /** - * Sets the template for the relative paths to files. - */ - public function setRelativePathTemplate(string $relativePathTemplate): void - { - $this->relativePathTemplate = $relativePathTemplate; - } - - public function dump(MessageCatalogue $messages, array $options = []): void - { - if (!\array_key_exists('path', $options)) { - throw new InvalidArgumentException('The file dumper needs a path option.'); - } - - // save a file for each domain - foreach ($messages->getDomains() as $domain) { - $fullpath = $options['path'].'/'.$this->getRelativePath($domain, $messages->getLocale()); - if (!file_exists($fullpath)) { - $directory = \dirname($fullpath); - if (!file_exists($directory) && !@mkdir($directory, 0777, true)) { - throw new RuntimeException(\sprintf('Unable to create directory "%s".', $directory)); - } - } - - $intlDomain = $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX; - $intlMessages = $messages->all($intlDomain); - - if ($intlMessages) { - $intlPath = $options['path'].'/'.$this->getRelativePath($intlDomain, $messages->getLocale()); - file_put_contents($intlPath, $this->formatCatalogue($messages, $intlDomain, $options)); - - $messages->replace([], $intlDomain); - - try { - if ($messages->all($domain)) { - file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options)); - } - continue; - } finally { - $messages->replace($intlMessages, $intlDomain); - } - } - - file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options)); - } - } - - /** - * Transforms a domain of a message catalogue to its string representation. - */ - abstract public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string; - - /** - * Gets the file extension of the dumper. - */ - abstract protected function getExtension(): string; - - /** - * Gets the relative file path using the template. - */ - private function getRelativePath(string $domain, string $locale): string - { - return strtr($this->relativePathTemplate, [ - '%domain%' => $domain, - '%locale%' => $locale, - '%extension%' => $this->getExtension(), - ]); - } -} diff --git a/vendor/symfony/translation/Dumper/IcuResFileDumper.php b/vendor/symfony/translation/Dumper/IcuResFileDumper.php deleted file mode 100644 index e603ee8..0000000 --- a/vendor/symfony/translation/Dumper/IcuResFileDumper.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * IcuResDumper generates an ICU ResourceBundle formatted string representation of a message catalogue. - * - * @author Stealth35 - */ -class IcuResFileDumper extends FileDumper -{ - protected string $relativePathTemplate = '%domain%/%locale%.%extension%'; - - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string - { - $data = $indexes = $resources = ''; - - foreach ($messages->all($domain) as $source => $target) { - $indexes .= pack('v', \strlen($data) + 28); - $data .= $source."\0"; - } - - $data .= $this->writePadding($data); - - $keyTop = $this->getPosition($data); - - foreach ($messages->all($domain) as $source => $target) { - $resources .= pack('V', $this->getPosition($data)); - - $data .= pack('V', \strlen($target)) - .mb_convert_encoding($target."\0", 'UTF-16LE', 'UTF-8') - .$this->writePadding($data) - ; - } - - $resOffset = $this->getPosition($data); - - $data .= pack('v', \count($messages->all($domain))) - .$indexes - .$this->writePadding($data) - .$resources - ; - - $bundleTop = $this->getPosition($data); - - $root = pack('V7', - $resOffset + (2 << 28), // Resource Offset + Resource Type - 6, // Index length - $keyTop, // Index keys top - $bundleTop, // Index resources top - $bundleTop, // Index bundle top - \count($messages->all($domain)), // Index max table length - 0 // Index attributes - ); - - $header = pack('vC2v4C12@32', - 32, // Header size - 0xDA, 0x27, // Magic number 1 and 2 - 20, 0, 0, 2, // Rest of the header, ..., Size of a char - 0x52, 0x65, 0x73, 0x42, // Data format identifier - 1, 2, 0, 0, // Data version - 1, 4, 0, 0 // Unicode version - ); - - return $header.$root.$data; - } - - private function writePadding(string $data): ?string - { - $padding = \strlen($data) % 4; - - return $padding ? str_repeat("\xAA", 4 - $padding) : null; - } - - private function getPosition(string $data): float|int - { - return (\strlen($data) + 28) / 4; - } - - protected function getExtension(): string - { - return 'res'; - } -} diff --git a/vendor/symfony/translation/Dumper/IniFileDumper.php b/vendor/symfony/translation/Dumper/IniFileDumper.php deleted file mode 100644 index 6cbdef6..0000000 --- a/vendor/symfony/translation/Dumper/IniFileDumper.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * IniFileDumper generates an ini formatted string representation of a message catalogue. - * - * @author Stealth35 - */ -class IniFileDumper extends FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string - { - $output = ''; - - foreach ($messages->all($domain) as $source => $target) { - $escapeTarget = str_replace('"', '\"', $target); - $output .= $source.'="'.$escapeTarget."\"\n"; - } - - return $output; - } - - protected function getExtension(): string - { - return 'ini'; - } -} diff --git a/vendor/symfony/translation/Dumper/JsonFileDumper.php b/vendor/symfony/translation/Dumper/JsonFileDumper.php deleted file mode 100644 index e503539..0000000 --- a/vendor/symfony/translation/Dumper/JsonFileDumper.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * JsonFileDumper generates an json formatted string representation of a message catalogue. - * - * @author singles - */ -class JsonFileDumper extends FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string - { - $flags = $options['json_encoding'] ?? \JSON_PRETTY_PRINT; - - return json_encode($messages->all($domain), $flags); - } - - protected function getExtension(): string - { - return 'json'; - } -} diff --git a/vendor/symfony/translation/Dumper/MoFileDumper.php b/vendor/symfony/translation/Dumper/MoFileDumper.php deleted file mode 100644 index a7b4b33..0000000 --- a/vendor/symfony/translation/Dumper/MoFileDumper.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\Loader\MoFileLoader; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * MoFileDumper generates a gettext formatted string representation of a message catalogue. - * - * @author Stealth35 - */ -class MoFileDumper extends FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string - { - $sources = $targets = $sourceOffsets = $targetOffsets = ''; - $offsets = []; - $size = 0; - - foreach ($messages->all($domain) as $source => $target) { - $offsets[] = array_map('strlen', [$sources, $source, $targets, $target]); - $sources .= "\0".$source; - $targets .= "\0".$target; - ++$size; - } - - $header = [ - 'magicNumber' => MoFileLoader::MO_LITTLE_ENDIAN_MAGIC, - 'formatRevision' => 0, - 'count' => $size, - 'offsetId' => MoFileLoader::MO_HEADER_SIZE, - 'offsetTranslated' => MoFileLoader::MO_HEADER_SIZE + (8 * $size), - 'sizeHashes' => 0, - 'offsetHashes' => MoFileLoader::MO_HEADER_SIZE + (16 * $size), - ]; - - $sourcesSize = \strlen($sources); - $sourcesStart = $header['offsetHashes'] + 1; - - foreach ($offsets as $offset) { - $sourceOffsets .= $this->writeLong($offset[1]) - .$this->writeLong($offset[0] + $sourcesStart); - $targetOffsets .= $this->writeLong($offset[3]) - .$this->writeLong($offset[2] + $sourcesStart + $sourcesSize); - } - - return implode('', array_map($this->writeLong(...), $header)) - .$sourceOffsets - .$targetOffsets - .$sources - .$targets; - } - - protected function getExtension(): string - { - return 'mo'; - } - - private function writeLong(mixed $str): string - { - return pack('V*', $str); - } -} diff --git a/vendor/symfony/translation/Dumper/PhpFileDumper.php b/vendor/symfony/translation/Dumper/PhpFileDumper.php deleted file mode 100644 index 51e9066..0000000 --- a/vendor/symfony/translation/Dumper/PhpFileDumper.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * PhpFileDumper generates PHP files from a message catalogue. - * - * @author Michel Salib - */ -class PhpFileDumper extends FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string - { - return "all($domain), true).";\n"; - } - - protected function getExtension(): string - { - return 'php'; - } -} diff --git a/vendor/symfony/translation/Dumper/PoFileDumper.php b/vendor/symfony/translation/Dumper/PoFileDumper.php deleted file mode 100644 index 8f55b8a..0000000 --- a/vendor/symfony/translation/Dumper/PoFileDumper.php +++ /dev/null @@ -1,131 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * PoFileDumper generates a gettext formatted string representation of a message catalogue. - * - * @author Stealth35 - */ -class PoFileDumper extends FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string - { - $output = 'msgid ""'."\n"; - $output .= 'msgstr ""'."\n"; - $output .= '"Content-Type: text/plain; charset=UTF-8\n"'."\n"; - $output .= '"Content-Transfer-Encoding: 8bit\n"'."\n"; - $output .= '"Language: '.$messages->getLocale().'\n"'."\n"; - $output .= "\n"; - - $newLine = false; - foreach ($messages->all($domain) as $source => $target) { - if ($newLine) { - $output .= "\n"; - } else { - $newLine = true; - } - $metadata = $messages->getMetadata($source, $domain); - - if (isset($metadata['comments'])) { - $output .= $this->formatComments($metadata['comments']); - } - if (isset($metadata['flags'])) { - $output .= $this->formatComments(implode(',', (array) $metadata['flags']), ','); - } - if (isset($metadata['sources'])) { - $output .= $this->formatComments(implode(' ', (array) $metadata['sources']), ':'); - } - - $sourceRules = $this->getStandardRules($source); - $targetRules = $this->getStandardRules($target); - if (2 == \count($sourceRules) && [] !== $targetRules) { - $output .= \sprintf('msgid "%s"'."\n", $this->escape($sourceRules[0])); - $output .= \sprintf('msgid_plural "%s"'."\n", $this->escape($sourceRules[1])); - foreach ($targetRules as $i => $targetRule) { - $output .= \sprintf('msgstr[%d] "%s"'."\n", $i, $this->escape($targetRule)); - } - } else { - $output .= \sprintf('msgid "%s"'."\n", $this->escape($source)); - $output .= \sprintf('msgstr "%s"'."\n", $this->escape($target)); - } - } - - return $output; - } - - private function getStandardRules(string $id): array - { - // Partly copied from TranslatorTrait::trans. - $parts = []; - if (preg_match('/^\|++$/', $id)) { - $parts = explode('|', $id); - } elseif (preg_match_all('/(?:\|\||[^\|])++/', $id, $matches)) { - $parts = $matches[0]; - } - - $intervalRegexp = <<<'EOF' -/^(?P - ({\s* - (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*) - \s*}) - - | - - (?P[\[\]]) - \s* - (?P-Inf|\-?\d+(\.\d+)?) - \s*,\s* - (?P\+?Inf|\-?\d+(\.\d+)?) - \s* - (?P[\[\]]) -)\s*(?P.*?)$/xs -EOF; - - $standardRules = []; - foreach ($parts as $part) { - $part = trim(str_replace('||', '|', $part)); - - if (preg_match($intervalRegexp, $part)) { - // Explicit rule is not a standard rule. - return []; - } - - $standardRules[] = $part; - } - - return $standardRules; - } - - protected function getExtension(): string - { - return 'po'; - } - - private function escape(string $str): string - { - return addcslashes($str, "\0..\37\42\134"); - } - - private function formatComments(string|array $comments, string $prefix = ''): ?string - { - $output = null; - - foreach ((array) $comments as $comment) { - $output .= \sprintf('#%s %s'."\n", $prefix, $comment); - } - - return $output; - } -} diff --git a/vendor/symfony/translation/Dumper/QtFileDumper.php b/vendor/symfony/translation/Dumper/QtFileDumper.php deleted file mode 100644 index 0373e9c..0000000 --- a/vendor/symfony/translation/Dumper/QtFileDumper.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * QtFileDumper generates ts files from a message catalogue. - * - * @author Benjamin Eberlei - */ -class QtFileDumper extends FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string - { - $dom = new \DOMDocument('1.0', 'utf-8'); - $dom->formatOutput = true; - $ts = $dom->appendChild($dom->createElement('TS')); - $context = $ts->appendChild($dom->createElement('context')); - $context->appendChild($dom->createElement('name', $domain)); - - foreach ($messages->all($domain) as $source => $target) { - $message = $context->appendChild($dom->createElement('message')); - $metadata = $messages->getMetadata($source, $domain); - if (isset($metadata['sources'])) { - foreach ((array) $metadata['sources'] as $location) { - $loc = explode(':', $location, 2); - $location = $message->appendChild($dom->createElement('location')); - $location->setAttribute('filename', $loc[0]); - if (isset($loc[1])) { - $location->setAttribute('line', $loc[1]); - } - } - } - $message->appendChild($dom->createElement('source', $source)); - $message->appendChild($dom->createElement('translation', $target)); - } - - return $dom->saveXML(); - } - - protected function getExtension(): string - { - return 'ts'; - } -} diff --git a/vendor/symfony/translation/Dumper/XliffFileDumper.php b/vendor/symfony/translation/Dumper/XliffFileDumper.php deleted file mode 100644 index 98444bc..0000000 --- a/vendor/symfony/translation/Dumper/XliffFileDumper.php +++ /dev/null @@ -1,227 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * XliffFileDumper generates xliff files from a message catalogue. - * - * @author Michel Salib - */ -class XliffFileDumper extends FileDumper -{ - public function __construct( - private string $extension = 'xlf', - ) { - } - - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string - { - $xliffVersion = '1.2'; - if (\array_key_exists('xliff_version', $options)) { - $xliffVersion = $options['xliff_version']; - } - - if (\array_key_exists('default_locale', $options)) { - $defaultLocale = $options['default_locale']; - } else { - $defaultLocale = \Locale::getDefault(); - } - - if ('1.2' === $xliffVersion) { - return $this->dumpXliff1($defaultLocale, $messages, $domain, $options); - } - if ('2.0' === $xliffVersion) { - return $this->dumpXliff2($defaultLocale, $messages, $domain); - } - - throw new InvalidArgumentException(\sprintf('No support implemented for dumping XLIFF version "%s".', $xliffVersion)); - } - - protected function getExtension(): string - { - return $this->extension; - } - - private function dumpXliff1(string $defaultLocale, MessageCatalogue $messages, ?string $domain, array $options = []): string - { - $toolInfo = ['tool-id' => 'symfony', 'tool-name' => 'Symfony']; - if (\array_key_exists('tool_info', $options)) { - $toolInfo = array_merge($toolInfo, $options['tool_info']); - } - - $dom = new \DOMDocument('1.0', 'utf-8'); - $dom->formatOutput = true; - - $xliff = $dom->appendChild($dom->createElement('xliff')); - $xliff->setAttribute('version', '1.2'); - $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2'); - - $xliffFile = $xliff->appendChild($dom->createElement('file')); - $xliffFile->setAttribute('source-language', str_replace('_', '-', $defaultLocale)); - $xliffFile->setAttribute('target-language', str_replace('_', '-', $messages->getLocale())); - $xliffFile->setAttribute('datatype', 'plaintext'); - $xliffFile->setAttribute('original', 'file.ext'); - - $xliffHead = $xliffFile->appendChild($dom->createElement('header')); - $xliffTool = $xliffHead->appendChild($dom->createElement('tool')); - foreach ($toolInfo as $id => $value) { - $xliffTool->setAttribute($id, $value); - } - - if ($catalogueMetadata = $messages->getCatalogueMetadata('', $domain) ?? []) { - $xliffPropGroup = $xliffHead->appendChild($dom->createElement('prop-group')); - foreach ($catalogueMetadata as $key => $value) { - $xliffProp = $xliffPropGroup->appendChild($dom->createElement('prop')); - $xliffProp->setAttribute('prop-type', $key); - $xliffProp->appendChild($dom->createTextNode($value)); - } - } - - $xliffBody = $xliffFile->appendChild($dom->createElement('body')); - foreach ($messages->all($domain) as $source => $target) { - $translation = $dom->createElement('trans-unit'); - - $translation->setAttribute('id', strtr(substr(base64_encode(hash('xxh128', $source, true)), 0, 7), '/+', '._')); - $translation->setAttribute('resname', $source); - - $s = $translation->appendChild($dom->createElement('source')); - $s->appendChild($dom->createTextNode($source)); - - // Does the target contain characters requiring a CDATA section? - $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target); - - $targetElement = $dom->createElement('target'); - $metadata = $messages->getMetadata($source, $domain); - if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) { - foreach ($metadata['target-attributes'] as $name => $value) { - $targetElement->setAttribute($name, $value); - } - } - $t = $translation->appendChild($targetElement); - $t->appendChild($text); - - if ($this->hasMetadataArrayInfo('notes', $metadata)) { - foreach ($metadata['notes'] as $note) { - if (!isset($note['content'])) { - continue; - } - - $n = $translation->appendChild($dom->createElement('note')); - $n->appendChild($dom->createTextNode($note['content'])); - - if (isset($note['priority'])) { - $n->setAttribute('priority', $note['priority']); - } - - if (isset($note['from'])) { - $n->setAttribute('from', $note['from']); - } - } - } - - $xliffBody->appendChild($translation); - } - - return $dom->saveXML(); - } - - private function dumpXliff2(string $defaultLocale, MessageCatalogue $messages, ?string $domain): string - { - $dom = new \DOMDocument('1.0', 'utf-8'); - $dom->formatOutput = true; - - $xliff = $dom->appendChild($dom->createElement('xliff')); - $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:2.0'); - $xliff->setAttribute('version', '2.0'); - $xliff->setAttribute('srcLang', str_replace('_', '-', $defaultLocale)); - $xliff->setAttribute('trgLang', str_replace('_', '-', $messages->getLocale())); - - $xliffFile = $xliff->appendChild($dom->createElement('file')); - if (str_ends_with($domain, MessageCatalogue::INTL_DOMAIN_SUFFIX)) { - $xliffFile->setAttribute('id', substr($domain, 0, -\strlen(MessageCatalogue::INTL_DOMAIN_SUFFIX)).'.'.$messages->getLocale()); - } else { - $xliffFile->setAttribute('id', $domain.'.'.$messages->getLocale()); - } - - if ($catalogueMetadata = $messages->getCatalogueMetadata('', $domain) ?? []) { - $xliff->setAttribute('xmlns:m', 'urn:oasis:names:tc:xliff:metadata:2.0'); - $xliffMetadata = $xliffFile->appendChild($dom->createElement('m:metadata')); - foreach ($catalogueMetadata as $key => $value) { - $xliffMeta = $xliffMetadata->appendChild($dom->createElement('prop')); - $xliffMeta->setAttribute('type', $key); - $xliffMeta->appendChild($dom->createTextNode($value)); - } - } - - foreach ($messages->all($domain) as $source => $target) { - $translation = $dom->createElement('unit'); - $translation->setAttribute('id', strtr(substr(base64_encode(hash('xxh128', $source, true)), 0, 7), '/+', '._')); - - if (\strlen($source) <= 80) { - $translation->setAttribute('name', $source); - } - - $metadata = $messages->getMetadata($source, $domain); - - // Add notes section - if ($this->hasMetadataArrayInfo('notes', $metadata) && $metadata['notes']) { - $notesElement = $dom->createElement('notes'); - foreach ($metadata['notes'] as $note) { - $n = $dom->createElement('note'); - $n->appendChild($dom->createTextNode($note['content'] ?? '')); - unset($note['content']); - - foreach ($note as $name => $value) { - $n->setAttribute($name, $value); - } - $notesElement->appendChild($n); - } - $translation->appendChild($notesElement); - } - - $segment = $translation->appendChild($dom->createElement('segment')); - - if ($this->hasMetadataArrayInfo('segment-attributes', $metadata)) { - foreach ($metadata['segment-attributes'] as $name => $value) { - $segment->setAttribute($name, $value); - } - } - - $s = $segment->appendChild($dom->createElement('source')); - $s->appendChild($dom->createTextNode($source)); - - // Does the target contain characters requiring a CDATA section? - $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target); - - $targetElement = $dom->createElement('target'); - if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) { - foreach ($metadata['target-attributes'] as $name => $value) { - $targetElement->setAttribute($name, $value); - } - } - $t = $segment->appendChild($targetElement); - $t->appendChild($text); - - $xliffFile->appendChild($translation); - } - - return $dom->saveXML(); - } - - private function hasMetadataArrayInfo(string $key, ?array $metadata = null): bool - { - return is_iterable($metadata[$key] ?? null); - } -} diff --git a/vendor/symfony/translation/Dumper/YamlFileDumper.php b/vendor/symfony/translation/Dumper/YamlFileDumper.php deleted file mode 100644 index a30eaa3..0000000 --- a/vendor/symfony/translation/Dumper/YamlFileDumper.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\Exception\LogicException; -use Symfony\Component\Translation\MessageCatalogue; -use Symfony\Component\Translation\Util\ArrayConverter; -use Symfony\Component\Yaml\Yaml; - -/** - * YamlFileDumper generates yaml files from a message catalogue. - * - * @author Michel Salib - */ -class YamlFileDumper extends FileDumper -{ - public function __construct( - private string $extension = 'yml', - ) { - } - - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string - { - if (!class_exists(Yaml::class)) { - throw new LogicException('Dumping translations in the YAML format requires the Symfony Yaml component.'); - } - - $data = $messages->all($domain); - - if (isset($options['as_tree']) && $options['as_tree']) { - $data = ArrayConverter::expandToTree($data); - } - - if (isset($options['inline']) && ($inline = (int) $options['inline']) > 0) { - return Yaml::dump($data, $inline); - } - - return Yaml::dump($data); - } - - protected function getExtension(): string - { - return $this->extension; - } -} diff --git a/vendor/symfony/translation/Exception/ExceptionInterface.php b/vendor/symfony/translation/Exception/ExceptionInterface.php deleted file mode 100644 index 8f9c54e..0000000 --- a/vendor/symfony/translation/Exception/ExceptionInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Exception; - -/** - * Exception interface for all exceptions thrown by the component. - * - * @author Fabien Potencier - */ -interface ExceptionInterface extends \Throwable -{ -} diff --git a/vendor/symfony/translation/Exception/IncompleteDsnException.php b/vendor/symfony/translation/Exception/IncompleteDsnException.php deleted file mode 100644 index 6c9247f..0000000 --- a/vendor/symfony/translation/Exception/IncompleteDsnException.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Exception; - -class IncompleteDsnException extends InvalidArgumentException -{ - public function __construct(string $message, ?string $dsn = null, ?\Throwable $previous = null) - { - if ($dsn) { - $message = \sprintf('Invalid "%s" provider DSN: ', $dsn).$message; - } - - parent::__construct($message, 0, $previous); - } -} diff --git a/vendor/symfony/translation/Exception/InvalidArgumentException.php b/vendor/symfony/translation/Exception/InvalidArgumentException.php deleted file mode 100644 index 90d0669..0000000 --- a/vendor/symfony/translation/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Exception; - -/** - * Base InvalidArgumentException for the Translation component. - * - * @author Abdellatif Ait boudad - */ -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/translation/Exception/InvalidResourceException.php b/vendor/symfony/translation/Exception/InvalidResourceException.php deleted file mode 100644 index cf07943..0000000 --- a/vendor/symfony/translation/Exception/InvalidResourceException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Exception; - -/** - * Thrown when a resource cannot be loaded. - * - * @author Fabien Potencier - */ -class InvalidResourceException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/translation/Exception/LogicException.php b/vendor/symfony/translation/Exception/LogicException.php deleted file mode 100644 index 9019c7e..0000000 --- a/vendor/symfony/translation/Exception/LogicException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Exception; - -/** - * Base LogicException for Translation component. - * - * @author Abdellatif Ait boudad - */ -class LogicException extends \LogicException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/translation/Exception/MissingRequiredOptionException.php b/vendor/symfony/translation/Exception/MissingRequiredOptionException.php deleted file mode 100644 index 8cef03a..0000000 --- a/vendor/symfony/translation/Exception/MissingRequiredOptionException.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Exception; - -/** - * @author Oskar Stark - */ -class MissingRequiredOptionException extends IncompleteDsnException -{ - public function __construct(string $option, ?string $dsn = null, ?\Throwable $previous = null) - { - $message = \sprintf('The option "%s" is required but missing.', $option); - - parent::__construct($message, $dsn, $previous); - } -} diff --git a/vendor/symfony/translation/Exception/NotFoundResourceException.php b/vendor/symfony/translation/Exception/NotFoundResourceException.php deleted file mode 100644 index cff73ae..0000000 --- a/vendor/symfony/translation/Exception/NotFoundResourceException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Exception; - -/** - * Thrown when a resource does not exist. - * - * @author Fabien Potencier - */ -class NotFoundResourceException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/translation/Exception/ProviderException.php b/vendor/symfony/translation/Exception/ProviderException.php deleted file mode 100644 index 70e93fc..0000000 --- a/vendor/symfony/translation/Exception/ProviderException.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Exception; - -use Symfony\Contracts\HttpClient\ResponseInterface; - -/** - * @author Fabien Potencier - */ -class ProviderException extends RuntimeException implements ProviderExceptionInterface -{ - private string $debug; - - public function __construct( - string $message, - private ResponseInterface $response, - int $code = 0, - ?\Exception $previous = null, - ) { - $this->debug = $response->getInfo('debug') ?? ''; - - parent::__construct($message, $code, $previous); - } - - public function getResponse(): ResponseInterface - { - return $this->response; - } - - public function getDebug(): string - { - return $this->debug; - } -} diff --git a/vendor/symfony/translation/Exception/ProviderExceptionInterface.php b/vendor/symfony/translation/Exception/ProviderExceptionInterface.php deleted file mode 100644 index 922e827..0000000 --- a/vendor/symfony/translation/Exception/ProviderExceptionInterface.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Exception; - -/** - * @author Fabien Potencier - */ -interface ProviderExceptionInterface extends ExceptionInterface -{ - /* - * Returns debug info coming from the Symfony\Contracts\HttpClient\ResponseInterface - */ - public function getDebug(): string; -} diff --git a/vendor/symfony/translation/Exception/RuntimeException.php b/vendor/symfony/translation/Exception/RuntimeException.php deleted file mode 100644 index dcd7940..0000000 --- a/vendor/symfony/translation/Exception/RuntimeException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Exception; - -/** - * Base RuntimeException for the Translation component. - * - * @author Abdellatif Ait boudad - */ -class RuntimeException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/translation/Exception/UnsupportedSchemeException.php b/vendor/symfony/translation/Exception/UnsupportedSchemeException.php deleted file mode 100644 index ca18444..0000000 --- a/vendor/symfony/translation/Exception/UnsupportedSchemeException.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Exception; - -use Symfony\Component\Translation\Bridge; -use Symfony\Component\Translation\Provider\Dsn; - -class UnsupportedSchemeException extends LogicException -{ - private const SCHEME_TO_PACKAGE_MAP = [ - 'crowdin' => [ - 'class' => Bridge\Crowdin\CrowdinProviderFactory::class, - 'package' => 'symfony/crowdin-translation-provider', - ], - 'loco' => [ - 'class' => Bridge\Loco\LocoProviderFactory::class, - 'package' => 'symfony/loco-translation-provider', - ], - 'lokalise' => [ - 'class' => Bridge\Lokalise\LokaliseProviderFactory::class, - 'package' => 'symfony/lokalise-translation-provider', - ], - 'phrase' => [ - 'class' => Bridge\Phrase\PhraseProviderFactory::class, - 'package' => 'symfony/phrase-translation-provider', - ], - ]; - - public function __construct(Dsn $dsn, ?string $name = null, array $supported = []) - { - $provider = $dsn->getScheme(); - if (false !== $pos = strpos($provider, '+')) { - $provider = substr($provider, 0, $pos); - } - $package = self::SCHEME_TO_PACKAGE_MAP[$provider] ?? null; - if ($package && !class_exists($package['class'])) { - parent::__construct(\sprintf('Unable to synchronize translations via "%s" as the provider is not installed. Try running "composer require %s".', $provider, $package['package'])); - - return; - } - - $message = \sprintf('The "%s" scheme is not supported', $dsn->getScheme()); - if ($name && $supported) { - $message .= \sprintf('; supported schemes for translation provider "%s" are: "%s"', $name, implode('", "', $supported)); - } - - parent::__construct($message.'.'); - } -} diff --git a/vendor/symfony/translation/Extractor/AbstractFileExtractor.php b/vendor/symfony/translation/Extractor/AbstractFileExtractor.php deleted file mode 100644 index da4a929..0000000 --- a/vendor/symfony/translation/Extractor/AbstractFileExtractor.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Extractor; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; - -/** - * Base class used by classes that extract translation messages from files. - * - * @author Marcos D. Sánchez - */ -abstract class AbstractFileExtractor -{ - protected function extractFiles(string|iterable $resource): iterable - { - if (is_iterable($resource)) { - $files = []; - foreach ($resource as $file) { - if ($this->canBeExtracted($file)) { - $files[] = $this->toSplFileInfo($file); - } - } - } elseif (is_file($resource)) { - $files = $this->canBeExtracted($resource) ? [$this->toSplFileInfo($resource)] : []; - } else { - $files = $this->extractFromDirectory($resource); - } - - return $files; - } - - private function toSplFileInfo(string $file): \SplFileInfo - { - return new \SplFileInfo($file); - } - - /** - * @throws InvalidArgumentException - */ - protected function isFile(string $file): bool - { - if (!is_file($file)) { - throw new InvalidArgumentException(\sprintf('The "%s" file does not exist.', $file)); - } - - return true; - } - - abstract protected function canBeExtracted(string $file): bool; - - abstract protected function extractFromDirectory(string|array $resource): iterable; -} diff --git a/vendor/symfony/translation/Extractor/ChainExtractor.php b/vendor/symfony/translation/Extractor/ChainExtractor.php deleted file mode 100644 index ec9982d..0000000 --- a/vendor/symfony/translation/Extractor/ChainExtractor.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Extractor; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * ChainExtractor extracts translation messages from template files. - * - * @author Michel Salib - */ -class ChainExtractor implements ExtractorInterface -{ - /** - * The extractors. - * - * @var ExtractorInterface[] - */ - private array $extractors = []; - - /** - * Adds a loader to the translation extractor. - */ - public function addExtractor(string $format, ExtractorInterface $extractor): void - { - $this->extractors[$format] = $extractor; - } - - public function setPrefix(string $prefix): void - { - foreach ($this->extractors as $extractor) { - $extractor->setPrefix($prefix); - } - } - - public function extract(string|iterable $directory, MessageCatalogue $catalogue): void - { - foreach ($this->extractors as $extractor) { - $extractor->extract($directory, $catalogue); - } - } -} diff --git a/vendor/symfony/translation/Extractor/ExtractorInterface.php b/vendor/symfony/translation/Extractor/ExtractorInterface.php deleted file mode 100644 index 642130a..0000000 --- a/vendor/symfony/translation/Extractor/ExtractorInterface.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Extractor; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * Extracts translation messages from a directory or files to the catalogue. - * New found messages are injected to the catalogue using the prefix. - * - * @author Michel Salib - */ -interface ExtractorInterface -{ - /** - * Extracts translation messages from files, a file or a directory to the catalogue. - * - * @param string|iterable $resource Files, a file or a directory - * - * @return void - */ - public function extract(string|iterable $resource, MessageCatalogue $catalogue); - - /** - * Sets the prefix that should be used for new found messages. - * - * @return void - */ - public function setPrefix(string $prefix); -} diff --git a/vendor/symfony/translation/Extractor/PhpAstExtractor.php b/vendor/symfony/translation/Extractor/PhpAstExtractor.php deleted file mode 100644 index a5375f4..0000000 --- a/vendor/symfony/translation/Extractor/PhpAstExtractor.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Extractor; - -use PhpParser\NodeTraverser; -use PhpParser\NodeVisitor; -use PhpParser\Parser; -use PhpParser\ParserFactory; -use Symfony\Component\Finder\Finder; -use Symfony\Component\Translation\Extractor\Visitor\AbstractVisitor; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * PhpAstExtractor extracts translation messages from a PHP AST. - * - * @author Mathieu Santostefano - */ -final class PhpAstExtractor extends AbstractFileExtractor implements ExtractorInterface -{ - private Parser $parser; - - public function __construct( - /** - * @param iterable $visitors - */ - private readonly iterable $visitors, - private string $prefix = '', - ) { - if (!class_exists(ParserFactory::class)) { - throw new \LogicException(\sprintf('You cannot use "%s" as the "nikic/php-parser" package is not installed. Try running "composer require nikic/php-parser".', static::class)); - } - - $this->parser = (new ParserFactory())->createForHostVersion(); - } - - public function extract(iterable|string $resource, MessageCatalogue $catalogue): void - { - foreach ($this->extractFiles($resource) as $file) { - $traverser = new NodeTraverser(); - - // This is needed to resolve namespaces in class methods/constants. - $nameResolver = new NodeVisitor\NameResolver(); - $traverser->addVisitor($nameResolver); - - /** @var AbstractVisitor&NodeVisitor $visitor */ - foreach ($this->visitors as $visitor) { - $visitor->initialize($catalogue, $file, $this->prefix); - $traverser->addVisitor($visitor); - } - - $nodes = $this->parser->parse(file_get_contents($file)); - $traverser->traverse($nodes); - } - } - - public function setPrefix(string $prefix): void - { - $this->prefix = $prefix; - } - - protected function canBeExtracted(string $file): bool - { - return 'php' === pathinfo($file, \PATHINFO_EXTENSION) - && $this->isFile($file) - && preg_match('/\bt\(|->trans\(|TranslatableMessage|Symfony\\\\Component\\\\Validator\\\\Constraints/i', file_get_contents($file)); - } - - protected function extractFromDirectory(array|string $resource): iterable|Finder - { - if (!class_exists(Finder::class)) { - throw new \LogicException(\sprintf('You cannot use "%s" as the "symfony/finder" package is not installed. Try running "composer require symfony/finder".', static::class)); - } - - return (new Finder())->files()->name('*.php')->in($resource); - } -} diff --git a/vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php b/vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php deleted file mode 100644 index c336896..0000000 --- a/vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php +++ /dev/null @@ -1,135 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Extractor\Visitor; - -use PhpParser\Node; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * @author Mathieu Santostefano - */ -abstract class AbstractVisitor -{ - private MessageCatalogue $catalogue; - private \SplFileInfo $file; - private string $messagePrefix; - - public function initialize(MessageCatalogue $catalogue, \SplFileInfo $file, string $messagePrefix): void - { - $this->catalogue = $catalogue; - $this->file = $file; - $this->messagePrefix = $messagePrefix; - } - - protected function addMessageToCatalogue(string $message, ?string $domain, int $line): void - { - $domain ??= 'messages'; - $this->catalogue->set($message, $this->messagePrefix.$message, $domain); - $metadata = $this->catalogue->getMetadata($message, $domain) ?? []; - $normalizedFilename = preg_replace('{[\\\\/]+}', '/', $this->file); - $metadata['sources'][] = $normalizedFilename.':'.$line; - $this->catalogue->setMetadata($message, $metadata, $domain); - } - - protected function getStringArguments(Node\Expr\CallLike|Node\Attribute|Node\Expr\New_ $node, int|string $index, bool $indexIsRegex = false): array - { - if (\is_string($index)) { - return $this->getStringNamedArguments($node, $index, $indexIsRegex); - } - - $args = $node instanceof Node\Expr\CallLike ? $node->getRawArgs() : $node->args; - - if (!($arg = $args[$index] ?? null) instanceof Node\Arg) { - return []; - } - - return (array) $this->getStringValue($arg->value); - } - - protected function hasNodeNamedArguments(Node\Expr\CallLike|Node\Attribute|Node\Expr\New_ $node): bool - { - $args = $node instanceof Node\Expr\CallLike ? $node->getRawArgs() : $node->args; - - foreach ($args as $arg) { - if ($arg instanceof Node\Arg && null !== $arg->name) { - return true; - } - } - - return false; - } - - protected function nodeFirstNamedArgumentIndex(Node\Expr\CallLike|Node\Attribute|Node\Expr\New_ $node): int - { - $args = $node instanceof Node\Expr\CallLike ? $node->getRawArgs() : $node->args; - - foreach ($args as $i => $arg) { - if ($arg instanceof Node\Arg && null !== $arg->name) { - return $i; - } - } - - return \PHP_INT_MAX; - } - - private function getStringNamedArguments(Node\Expr\CallLike|Node\Attribute $node, ?string $argumentName = null, bool $isArgumentNamePattern = false): array - { - $args = $node instanceof Node\Expr\CallLike ? $node->getArgs() : $node->args; - $argumentValues = []; - - foreach ($args as $arg) { - if (!$isArgumentNamePattern && $arg->name?->toString() === $argumentName) { - $argumentValues[] = $this->getStringValue($arg->value); - } elseif ($isArgumentNamePattern && preg_match($argumentName, $arg->name?->toString() ?? '') > 0) { - $argumentValues[] = $this->getStringValue($arg->value); - } - } - - return array_filter($argumentValues); - } - - private function getStringValue(Node $node): ?string - { - if ($node instanceof Node\Scalar\String_) { - return $node->value; - } - - if ($node instanceof Node\Expr\BinaryOp\Concat) { - if (null === $left = $this->getStringValue($node->left)) { - return null; - } - - if (null === $right = $this->getStringValue($node->right)) { - return null; - } - - return $left.$right; - } - - if ($node instanceof Node\Expr\Assign && $node->expr instanceof Node\Scalar\String_) { - return $node->expr->value; - } - - if ($node instanceof Node\Expr\ClassConstFetch) { - try { - $reflection = new \ReflectionClass($node->class->toString()); - $constant = $reflection->getReflectionConstant($node->name->toString()); - if (false !== $constant && \is_string($constant->getValue())) { - return $constant->getValue(); - } - } catch (\ReflectionException) { - } - } - - return null; - } -} diff --git a/vendor/symfony/translation/Extractor/Visitor/ConstraintVisitor.php b/vendor/symfony/translation/Extractor/Visitor/ConstraintVisitor.php deleted file mode 100644 index 45cae35..0000000 --- a/vendor/symfony/translation/Extractor/Visitor/ConstraintVisitor.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Extractor\Visitor; - -use PhpParser\Node; -use PhpParser\NodeVisitor; - -/** - * @author Mathieu Santostefano - * - * Code mostly comes from https://github.com/php-translation/extractor/blob/master/src/Visitor/Php/Symfony/Constraint.php - */ -final class ConstraintVisitor extends AbstractVisitor implements NodeVisitor -{ - public function __construct( - private readonly array $constraintClassNames = [], - ) { - } - - public function beforeTraverse(array $nodes): ?Node - { - return null; - } - - public function enterNode(Node $node): ?Node - { - return null; - } - - public function leaveNode(Node $node): ?Node - { - if (!$node instanceof Node\Expr\New_ && !$node instanceof Node\Attribute) { - return null; - } - - $className = $node instanceof Node\Attribute ? $node->name : $node->class; - if (!$className instanceof Node\Name) { - return null; - } - - $parts = $className->getParts(); - $isConstraintClass = false; - - foreach ($parts as $part) { - if (\in_array($part, $this->constraintClassNames, true)) { - $isConstraintClass = true; - - break; - } - } - - if (!$isConstraintClass) { - return null; - } - - $arg = $node->args[0] ?? null; - if (!$arg instanceof Node\Arg) { - return null; - } - - if ($this->hasNodeNamedArguments($node)) { - $messages = $this->getStringArguments($node, '/message/i', true); - } else { - if (!$arg->value instanceof Node\Expr\Array_) { - // There is no way to guess which argument is a message to be translated. - return null; - } - - $messages = []; - $options = $arg->value; - - /** @var Node\Expr\ArrayItem $item */ - foreach ($options->items as $item) { - if (!$item->key instanceof Node\Scalar\String_) { - continue; - } - - if (false === stripos($item->key->value ?? '', 'message')) { - continue; - } - - if (!$item->value instanceof Node\Scalar\String_) { - continue; - } - - $messages[] = $item->value->value; - - break; - } - } - - foreach ($messages as $message) { - $this->addMessageToCatalogue($message, 'validators', $node->getStartLine()); - } - - return null; - } - - public function afterTraverse(array $nodes): ?Node - { - return null; - } -} diff --git a/vendor/symfony/translation/Extractor/Visitor/TransMethodVisitor.php b/vendor/symfony/translation/Extractor/Visitor/TransMethodVisitor.php deleted file mode 100644 index a3dcd6d..0000000 --- a/vendor/symfony/translation/Extractor/Visitor/TransMethodVisitor.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Extractor\Visitor; - -use PhpParser\Node; -use PhpParser\NodeVisitor; - -/** - * @author Mathieu Santostefano - */ -final class TransMethodVisitor extends AbstractVisitor implements NodeVisitor -{ - public function beforeTraverse(array $nodes): ?Node - { - return null; - } - - public function enterNode(Node $node): ?Node - { - return null; - } - - public function leaveNode(Node $node): ?Node - { - if (!$node instanceof Node\Expr\MethodCall && !$node instanceof Node\Expr\FuncCall) { - return null; - } - - if (!\is_string($node->name) && !$node->name instanceof Node\Identifier && !$node->name instanceof Node\Name) { - return null; - } - - $name = $node->name instanceof Node\Name ? $node->name->getLast() : (string) $node->name; - - if ('trans' === $name || 't' === $name) { - $firstNamedArgumentIndex = $this->nodeFirstNamedArgumentIndex($node); - - if (!$messages = $this->getStringArguments($node, 0 < $firstNamedArgumentIndex ? 0 : 'id')) { - return null; - } - - $domain = $this->getStringArguments($node, 2 < $firstNamedArgumentIndex ? 2 : 'domain')[0] ?? null; - - foreach ($messages as $message) { - $this->addMessageToCatalogue($message, $domain, $node->getStartLine()); - } - } - - return null; - } - - public function afterTraverse(array $nodes): ?Node - { - return null; - } -} diff --git a/vendor/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php b/vendor/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php deleted file mode 100644 index 6bd8bb0..0000000 --- a/vendor/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Extractor\Visitor; - -use PhpParser\Node; -use PhpParser\NodeVisitor; - -/** - * @author Mathieu Santostefano - */ -final class TranslatableMessageVisitor extends AbstractVisitor implements NodeVisitor -{ - public function beforeTraverse(array $nodes): ?Node - { - return null; - } - - public function enterNode(Node $node): ?Node - { - return null; - } - - public function leaveNode(Node $node): ?Node - { - if (!$node instanceof Node\Expr\New_) { - return null; - } - - if (!($className = $node->class) instanceof Node\Name) { - return null; - } - - if (!\in_array('TranslatableMessage', $className->getParts(), true)) { - return null; - } - - $firstNamedArgumentIndex = $this->nodeFirstNamedArgumentIndex($node); - - if (!$messages = $this->getStringArguments($node, 0 < $firstNamedArgumentIndex ? 0 : 'message')) { - return null; - } - - $domain = $this->getStringArguments($node, 2 < $firstNamedArgumentIndex ? 2 : 'domain')[0] ?? null; - - foreach ($messages as $message) { - $this->addMessageToCatalogue($message, $domain, $node->getStartLine()); - } - - return null; - } - - public function afterTraverse(array $nodes): ?Node - { - return null; - } -} diff --git a/vendor/symfony/translation/Formatter/IntlFormatter.php b/vendor/symfony/translation/Formatter/IntlFormatter.php deleted file mode 100644 index 87cb007..0000000 --- a/vendor/symfony/translation/Formatter/IntlFormatter.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Formatter; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\LogicException; - -/** - * @author Guilherme Blanco - * @author Abdellatif Ait boudad - */ -class IntlFormatter implements IntlFormatterInterface -{ - private bool $hasMessageFormatter; - private array $cache = []; - - public function formatIntl(string $message, string $locale, array $parameters = []): string - { - // MessageFormatter constructor throws an exception if the message is empty - if ('' === $message) { - return ''; - } - - if (!$formatter = $this->cache[$locale][$message] ?? null) { - if (!$this->hasMessageFormatter ??= class_exists(\MessageFormatter::class)) { - throw new LogicException('Cannot parse message translation: please install the "intl" PHP extension or the "symfony/polyfill-intl-messageformatter" package.'); - } - try { - $this->cache[$locale][$message] = $formatter = new \MessageFormatter($locale, $message); - } catch (\IntlException $e) { - throw new InvalidArgumentException(\sprintf('Invalid message format (error #%d): ', intl_get_error_code()).intl_get_error_message(), 0, $e); - } - } - - foreach ($parameters as $key => $value) { - if (\in_array($key[0] ?? null, ['%', '{'], true)) { - unset($parameters[$key]); - $parameters[trim($key, '%{ }')] = $value; - } - } - - if (false === $message = $formatter->format($parameters)) { - throw new InvalidArgumentException(\sprintf('Unable to format message (error #%s): ', $formatter->getErrorCode()).$formatter->getErrorMessage()); - } - - return $message; - } -} diff --git a/vendor/symfony/translation/Formatter/IntlFormatterInterface.php b/vendor/symfony/translation/Formatter/IntlFormatterInterface.php deleted file mode 100644 index 02fc6ac..0000000 --- a/vendor/symfony/translation/Formatter/IntlFormatterInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Formatter; - -/** - * Formats ICU message patterns. - * - * @author Nicolas Grekas - */ -interface IntlFormatterInterface -{ - /** - * Formats a localized message using rules defined by ICU MessageFormat. - * - * @see http://icu-project.org/apiref/icu4c/classMessageFormat.html#details - */ - public function formatIntl(string $message, string $locale, array $parameters = []): string; -} diff --git a/vendor/symfony/translation/Formatter/MessageFormatter.php b/vendor/symfony/translation/Formatter/MessageFormatter.php deleted file mode 100644 index d5255bd..0000000 --- a/vendor/symfony/translation/Formatter/MessageFormatter.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Formatter; - -use Symfony\Component\Translation\IdentityTranslator; -use Symfony\Contracts\Translation\TranslatorInterface; - -// Help opcache.preload discover always-needed symbols -class_exists(IntlFormatter::class); - -/** - * @author Abdellatif Ait boudad - */ -class MessageFormatter implements MessageFormatterInterface, IntlFormatterInterface -{ - private TranslatorInterface $translator; - private IntlFormatterInterface $intlFormatter; - - /** - * @param TranslatorInterface|null $translator An identity translator to use as selector for pluralization - */ - public function __construct(?TranslatorInterface $translator = null, ?IntlFormatterInterface $intlFormatter = null) - { - $this->translator = $translator ?? new IdentityTranslator(); - $this->intlFormatter = $intlFormatter ?? new IntlFormatter(); - } - - public function format(string $message, string $locale, array $parameters = []): string - { - return $this->translator->trans($message, $parameters, null, $locale); - } - - public function formatIntl(string $message, string $locale, array $parameters = []): string - { - return $this->intlFormatter->formatIntl($message, $locale, $parameters); - } -} diff --git a/vendor/symfony/translation/Formatter/MessageFormatterInterface.php b/vendor/symfony/translation/Formatter/MessageFormatterInterface.php deleted file mode 100644 index d5c41c1..0000000 --- a/vendor/symfony/translation/Formatter/MessageFormatterInterface.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Formatter; - -/** - * @author Guilherme Blanco - * @author Abdellatif Ait boudad - */ -interface MessageFormatterInterface -{ - /** - * Formats a localized message pattern with given arguments. - * - * @param string $message The message (may also be an object that can be cast to string) - * @param string $locale The message locale - * @param array $parameters An array of parameters for the message - */ - public function format(string $message, string $locale, array $parameters = []): string; -} diff --git a/vendor/symfony/translation/IdentityTranslator.php b/vendor/symfony/translation/IdentityTranslator.php deleted file mode 100644 index 46875ed..0000000 --- a/vendor/symfony/translation/IdentityTranslator.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Symfony\Contracts\Translation\LocaleAwareInterface; -use Symfony\Contracts\Translation\TranslatorInterface; -use Symfony\Contracts\Translation\TranslatorTrait; - -/** - * IdentityTranslator does not translate anything. - * - * @author Fabien Potencier - */ -class IdentityTranslator implements TranslatorInterface, LocaleAwareInterface -{ - use TranslatorTrait; -} diff --git a/vendor/symfony/translation/LICENSE b/vendor/symfony/translation/LICENSE deleted file mode 100644 index 0138f8f..0000000 --- a/vendor/symfony/translation/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-present Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/symfony/translation/Loader/ArrayLoader.php b/vendor/symfony/translation/Loader/ArrayLoader.php deleted file mode 100644 index e63a7d0..0000000 --- a/vendor/symfony/translation/Loader/ArrayLoader.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * ArrayLoader loads translations from a PHP array. - * - * @author Fabien Potencier - */ -class ArrayLoader implements LoaderInterface -{ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue - { - $resource = $this->flatten($resource); - $catalogue = new MessageCatalogue($locale); - $catalogue->add($resource, $domain); - - return $catalogue; - } - - /** - * Flattens an nested array of translations. - * - * The scheme used is: - * 'key' => ['key2' => ['key3' => 'value']] - * Becomes: - * 'key.key2.key3' => 'value' - */ - private function flatten(array $messages): array - { - $result = []; - foreach ($messages as $key => $value) { - if (\is_array($value)) { - foreach ($this->flatten($value) as $k => $v) { - if (null !== $v) { - $result[$key.'.'.$k] = $v; - } - } - } elseif (null !== $value) { - $result[$key] = $value; - } - } - - return $result; - } -} diff --git a/vendor/symfony/translation/Loader/CsvFileLoader.php b/vendor/symfony/translation/Loader/CsvFileLoader.php deleted file mode 100644 index 9b610f6..0000000 --- a/vendor/symfony/translation/Loader/CsvFileLoader.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\Exception\NotFoundResourceException; - -/** - * CsvFileLoader loads translations from CSV files. - * - * @author Saša Stamenković - */ -class CsvFileLoader extends FileLoader -{ - private string $delimiter = ';'; - private string $enclosure = '"'; - /** - * @deprecated since Symfony 7.2, to be removed in 8.0 - */ - private string $escape = ''; - - protected function loadResource(string $resource): array - { - $messages = []; - - try { - $file = new \SplFileObject($resource, 'rb'); - } catch (\RuntimeException $e) { - throw new NotFoundResourceException(\sprintf('Error opening file "%s".', $resource), 0, $e); - } - - $file->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY); - $file->setCsvControl($this->delimiter, $this->enclosure, $this->escape); - - foreach ($file as $data) { - if (false === $data) { - continue; - } - - if (!str_starts_with($data[0], '#') && isset($data[1]) && 2 === \count($data)) { - $messages[$data[0]] = $data[1]; - } - } - - return $messages; - } - - /** - * Sets the delimiter, enclosure, and escape character for CSV. - */ - public function setCsvControl(string $delimiter = ';', string $enclosure = '"', string $escape = ''): void - { - $this->delimiter = $delimiter; - $this->enclosure = $enclosure; - if ('' !== $escape) { - trigger_deprecation('symfony/translation', '7.2', 'The "escape" parameter of the "%s" method is deprecated. It will be removed in 8.0.', __METHOD__); - } - - $this->escape = $escape; - } -} diff --git a/vendor/symfony/translation/Loader/FileLoader.php b/vendor/symfony/translation/Loader/FileLoader.php deleted file mode 100644 index 94f6e20..0000000 --- a/vendor/symfony/translation/Loader/FileLoader.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * @author Abdellatif Ait boudad - */ -abstract class FileLoader extends ArrayLoader -{ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue - { - if (!stream_is_local($resource)) { - throw new InvalidResourceException(\sprintf('This is not a local file "%s".', $resource)); - } - - if (!file_exists($resource)) { - throw new NotFoundResourceException(\sprintf('File "%s" not found.', $resource)); - } - - $messages = $this->loadResource($resource); - - // empty resource - $messages ??= []; - - // not an array - if (!\is_array($messages)) { - throw new InvalidResourceException(\sprintf('Unable to load file "%s".', $resource)); - } - - $catalogue = parent::load($messages, $locale, $domain); - - if (class_exists(FileResource::class)) { - $catalogue->addResource(new FileResource($resource)); - } - - return $catalogue; - } - - /** - * @throws InvalidResourceException if stream content has an invalid format - */ - abstract protected function loadResource(string $resource): array; -} diff --git a/vendor/symfony/translation/Loader/IcuDatFileLoader.php b/vendor/symfony/translation/Loader/IcuDatFileLoader.php deleted file mode 100644 index 1af8643..0000000 --- a/vendor/symfony/translation/Loader/IcuDatFileLoader.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * IcuResFileLoader loads translations from a resource bundle. - * - * @author stealth35 - */ -class IcuDatFileLoader extends IcuResFileLoader -{ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue - { - if (!stream_is_local($resource.'.dat')) { - throw new InvalidResourceException(\sprintf('This is not a local file "%s".', $resource)); - } - - if (!file_exists($resource.'.dat')) { - throw new NotFoundResourceException(\sprintf('File "%s" not found.', $resource)); - } - - try { - $rb = new \ResourceBundle($locale, $resource); - } catch (\Exception) { - $rb = null; - } - - if (!$rb) { - throw new InvalidResourceException(\sprintf('Cannot load resource "%s".', $resource)); - } elseif (intl_is_failure($rb->getErrorCode())) { - throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode()); - } - - $messages = $this->flatten($rb); - $catalogue = new MessageCatalogue($locale); - $catalogue->add($messages, $domain); - - if (class_exists(FileResource::class)) { - $catalogue->addResource(new FileResource($resource.'.dat')); - } - - return $catalogue; - } -} diff --git a/vendor/symfony/translation/Loader/IcuResFileLoader.php b/vendor/symfony/translation/Loader/IcuResFileLoader.php deleted file mode 100644 index 8ada43d..0000000 --- a/vendor/symfony/translation/Loader/IcuResFileLoader.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Config\Resource\DirectoryResource; -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * IcuResFileLoader loads translations from a resource bundle. - * - * @author stealth35 - */ -class IcuResFileLoader implements LoaderInterface -{ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue - { - if (!stream_is_local($resource)) { - throw new InvalidResourceException(\sprintf('This is not a local file "%s".', $resource)); - } - - if (!is_dir($resource)) { - throw new NotFoundResourceException(\sprintf('File "%s" not found.', $resource)); - } - - try { - $rb = new \ResourceBundle($locale, $resource); - } catch (\Exception) { - $rb = null; - } - - if (!$rb) { - throw new InvalidResourceException(\sprintf('Cannot load resource "%s".', $resource)); - } elseif (intl_is_failure($rb->getErrorCode())) { - throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode()); - } - - $messages = $this->flatten($rb); - $catalogue = new MessageCatalogue($locale); - $catalogue->add($messages, $domain); - - if (class_exists(DirectoryResource::class)) { - $catalogue->addResource(new DirectoryResource($resource)); - } - - return $catalogue; - } - - /** - * Flattens an ResourceBundle. - * - * The scheme used is: - * key { key2 { key3 { "value" } } } - * Becomes: - * 'key.key2.key3' => 'value' - * - * This function takes an array by reference and will modify it - * - * @param \ResourceBundle $rb The ResourceBundle that will be flattened - * @param array $messages Used internally for recursive calls - * @param string|null $path Current path being parsed, used internally for recursive calls - */ - protected function flatten(\ResourceBundle $rb, array &$messages = [], ?string $path = null): array - { - foreach ($rb as $key => $value) { - $nodePath = $path ? $path.'.'.$key : $key; - if ($value instanceof \ResourceBundle) { - $this->flatten($value, $messages, $nodePath); - } else { - $messages[$nodePath] = $value; - } - } - - return $messages; - } -} diff --git a/vendor/symfony/translation/Loader/IniFileLoader.php b/vendor/symfony/translation/Loader/IniFileLoader.php deleted file mode 100644 index 3126896..0000000 --- a/vendor/symfony/translation/Loader/IniFileLoader.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -/** - * IniFileLoader loads translations from an ini file. - * - * @author stealth35 - */ -class IniFileLoader extends FileLoader -{ - protected function loadResource(string $resource): array - { - return parse_ini_file($resource, true); - } -} diff --git a/vendor/symfony/translation/Loader/JsonFileLoader.php b/vendor/symfony/translation/Loader/JsonFileLoader.php deleted file mode 100644 index 385553e..0000000 --- a/vendor/symfony/translation/Loader/JsonFileLoader.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\Exception\InvalidResourceException; - -/** - * JsonFileLoader loads translations from an json file. - * - * @author singles - */ -class JsonFileLoader extends FileLoader -{ - protected function loadResource(string $resource): array - { - $messages = []; - if ($data = file_get_contents($resource)) { - $messages = json_decode($data, true); - - if (0 < $errorCode = json_last_error()) { - throw new InvalidResourceException('Error parsing JSON: '.$this->getJSONErrorMessage($errorCode)); - } - } - - return $messages; - } - - /** - * Translates JSON_ERROR_* constant into meaningful message. - */ - private function getJSONErrorMessage(int $errorCode): string - { - return match ($errorCode) { - \JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', - \JSON_ERROR_STATE_MISMATCH => 'Underflow or the modes mismatch', - \JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', - \JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON', - \JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded', - default => 'Unknown error', - }; - } -} diff --git a/vendor/symfony/translation/Loader/LoaderInterface.php b/vendor/symfony/translation/Loader/LoaderInterface.php deleted file mode 100644 index 29d5560..0000000 --- a/vendor/symfony/translation/Loader/LoaderInterface.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * LoaderInterface is the interface implemented by all translation loaders. - * - * @author Fabien Potencier - */ -interface LoaderInterface -{ - /** - * Loads a locale. - * - * @throws NotFoundResourceException when the resource cannot be found - * @throws InvalidResourceException when the resource cannot be loaded - */ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue; -} diff --git a/vendor/symfony/translation/Loader/MoFileLoader.php b/vendor/symfony/translation/Loader/MoFileLoader.php deleted file mode 100644 index 8427c39..0000000 --- a/vendor/symfony/translation/Loader/MoFileLoader.php +++ /dev/null @@ -1,138 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\Exception\InvalidResourceException; - -/** - * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/) - */ -class MoFileLoader extends FileLoader -{ - /** - * Magic used for validating the format of an MO file as well as - * detecting if the machine used to create that file was little endian. - */ - public const MO_LITTLE_ENDIAN_MAGIC = 0x950412DE; - - /** - * Magic used for validating the format of an MO file as well as - * detecting if the machine used to create that file was big endian. - */ - public const MO_BIG_ENDIAN_MAGIC = 0xDE120495; - - /** - * The size of the header of an MO file in bytes. - */ - public const MO_HEADER_SIZE = 28; - - /** - * Parses machine object (MO) format, independent of the machine's endian it - * was created on. Both 32bit and 64bit systems are supported. - */ - protected function loadResource(string $resource): array - { - $stream = fopen($resource, 'r'); - - $stat = fstat($stream); - - if ($stat['size'] < self::MO_HEADER_SIZE) { - throw new InvalidResourceException('MO stream content has an invalid format.'); - } - $magic = unpack('V1', fread($stream, 4)); - $magic = hexdec(substr(dechex(current($magic)), -8)); - - if (self::MO_LITTLE_ENDIAN_MAGIC == $magic) { - $isBigEndian = false; - } elseif (self::MO_BIG_ENDIAN_MAGIC == $magic) { - $isBigEndian = true; - } else { - throw new InvalidResourceException('MO stream content has an invalid format.'); - } - - // formatRevision - $this->readLong($stream, $isBigEndian); - $count = $this->readLong($stream, $isBigEndian); - $offsetId = $this->readLong($stream, $isBigEndian); - $offsetTranslated = $this->readLong($stream, $isBigEndian); - // sizeHashes - $this->readLong($stream, $isBigEndian); - // offsetHashes - $this->readLong($stream, $isBigEndian); - - $messages = []; - - for ($i = 0; $i < $count; ++$i) { - $pluralId = null; - $translated = null; - - fseek($stream, $offsetId + $i * 8); - - $length = $this->readLong($stream, $isBigEndian); - $offset = $this->readLong($stream, $isBigEndian); - - if ($length < 1) { - continue; - } - - fseek($stream, $offset); - $singularId = fread($stream, $length); - - if (str_contains($singularId, "\000")) { - [$singularId, $pluralId] = explode("\000", $singularId); - } - - fseek($stream, $offsetTranslated + $i * 8); - $length = $this->readLong($stream, $isBigEndian); - $offset = $this->readLong($stream, $isBigEndian); - - if ($length < 1) { - continue; - } - - fseek($stream, $offset); - $translated = fread($stream, $length); - - if (str_contains($translated, "\000")) { - $translated = explode("\000", $translated); - } - - $ids = ['singular' => $singularId, 'plural' => $pluralId]; - $item = compact('ids', 'translated'); - - if (!empty($item['ids']['singular'])) { - $id = $item['ids']['singular']; - if (isset($item['ids']['plural'])) { - $id .= '|'.$item['ids']['plural']; - } - $messages[$id] = stripcslashes(implode('|', (array) $item['translated'])); - } - } - - fclose($stream); - - return array_filter($messages); - } - - /** - * Reads an unsigned long from stream respecting endianness. - * - * @param resource $stream - */ - private function readLong($stream, bool $isBigEndian): int - { - $result = unpack($isBigEndian ? 'N1' : 'V1', fread($stream, 4)); - $result = current($result); - - return (int) substr($result, -8); - } -} diff --git a/vendor/symfony/translation/Loader/PhpFileLoader.php b/vendor/symfony/translation/Loader/PhpFileLoader.php deleted file mode 100644 index 541b6c8..0000000 --- a/vendor/symfony/translation/Loader/PhpFileLoader.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -/** - * PhpFileLoader loads translations from PHP files returning an array of translations. - * - * @author Fabien Potencier - */ -class PhpFileLoader extends FileLoader -{ - private static ?array $cache = []; - - protected function loadResource(string $resource): array - { - if ([] === self::$cache && \function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOL) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) || filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOL))) { - self::$cache = null; - } - - if (null === self::$cache) { - return require $resource; - } - - return self::$cache[$resource] ??= require $resource; - } -} diff --git a/vendor/symfony/translation/Loader/PoFileLoader.php b/vendor/symfony/translation/Loader/PoFileLoader.php deleted file mode 100644 index 4f8aeb2..0000000 --- a/vendor/symfony/translation/Loader/PoFileLoader.php +++ /dev/null @@ -1,147 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -/** - * @copyright Copyright (c) 2010, Union of RAD https://github.com/UnionOfRAD/lithium - * @copyright Copyright (c) 2012, Clemens Tolboom - */ -class PoFileLoader extends FileLoader -{ - /** - * Parses portable object (PO) format. - * - * From https://www.gnu.org/software/gettext/manual/gettext.html#PO-Files - * we should be able to parse files having: - * - * white-space - * # translator-comments - * #. extracted-comments - * #: reference... - * #, flag... - * #| msgid previous-untranslated-string - * msgid untranslated-string - * msgstr translated-string - * - * extra or different lines are: - * - * #| msgctxt previous-context - * #| msgid previous-untranslated-string - * msgctxt context - * - * #| msgid previous-untranslated-string-singular - * #| msgid_plural previous-untranslated-string-plural - * msgid untranslated-string-singular - * msgid_plural untranslated-string-plural - * msgstr[0] translated-string-case-0 - * ... - * msgstr[N] translated-string-case-n - * - * The definition states: - * - white-space and comments are optional. - * - msgid "" that an empty singleline defines a header. - * - * This parser sacrifices some features of the reference implementation the - * differences to that implementation are as follows. - * - No support for comments spanning multiple lines. - * - Translator and extracted comments are treated as being the same type. - * - Message IDs are allowed to have other encodings as just US-ASCII. - * - * Items with an empty id are ignored. - */ - protected function loadResource(string $resource): array - { - $stream = fopen($resource, 'r'); - - $defaults = [ - 'ids' => [], - 'translated' => null, - ]; - - $messages = []; - $item = $defaults; - $flags = []; - - while ($line = fgets($stream)) { - $line = trim($line); - - if ('' === $line) { - // Whitespace indicated current item is done - if (!\in_array('fuzzy', $flags, true)) { - $this->addMessage($messages, $item); - } - $item = $defaults; - $flags = []; - } elseif (str_starts_with($line, '#,')) { - $flags = array_map('trim', explode(',', substr($line, 2))); - } elseif (str_starts_with($line, 'msgid "')) { - // We start a new msg so save previous - // TODO: this fails when comments or contexts are added - $this->addMessage($messages, $item); - $item = $defaults; - $item['ids']['singular'] = substr($line, 7, -1); - } elseif (str_starts_with($line, 'msgstr "')) { - $item['translated'] = substr($line, 8, -1); - } elseif ('"' === $line[0]) { - $continues = isset($item['translated']) ? 'translated' : 'ids'; - - if (\is_array($item[$continues])) { - end($item[$continues]); - $item[$continues][key($item[$continues])] .= substr($line, 1, -1); - } else { - $item[$continues] .= substr($line, 1, -1); - } - } elseif (str_starts_with($line, 'msgid_plural "')) { - $item['ids']['plural'] = substr($line, 14, -1); - } elseif (str_starts_with($line, 'msgstr[')) { - $size = strpos($line, ']'); - $item['translated'][(int) substr($line, 7, 1)] = substr($line, $size + 3, -1); - } - } - // save last item - if (!\in_array('fuzzy', $flags, true)) { - $this->addMessage($messages, $item); - } - fclose($stream); - - return $messages; - } - - /** - * Save a translation item to the messages. - * - * A .po file could contain by error missing plural indexes. We need to - * fix these before saving them. - */ - private function addMessage(array &$messages, array $item): void - { - if (!empty($item['ids']['singular'])) { - $id = stripcslashes($item['ids']['singular']); - if (isset($item['ids']['plural'])) { - $id .= '|'.stripcslashes($item['ids']['plural']); - } - - $translated = (array) $item['translated']; - // PO are by definition indexed so sort by index. - ksort($translated); - // Make sure every index is filled. - end($translated); - $count = key($translated); - // Fill missing spots with '-'. - $empties = array_fill(0, $count + 1, '-'); - $translated += $empties; - ksort($translated); - - $messages[$id] = stripcslashes(implode('|', $translated)); - } - } -} diff --git a/vendor/symfony/translation/Loader/QtFileLoader.php b/vendor/symfony/translation/Loader/QtFileLoader.php deleted file mode 100644 index c9554bf..0000000 --- a/vendor/symfony/translation/Loader/QtFileLoader.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Config\Util\XmlUtils; -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\Exception\RuntimeException; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * QtFileLoader loads translations from QT Translations XML files. - * - * @author Benjamin Eberlei - */ -class QtFileLoader implements LoaderInterface -{ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue - { - if (!class_exists(XmlUtils::class)) { - throw new RuntimeException('Loading translations from the QT format requires the Symfony Config component.'); - } - - if (!stream_is_local($resource)) { - throw new InvalidResourceException(\sprintf('This is not a local file "%s".', $resource)); - } - - if (!file_exists($resource)) { - throw new NotFoundResourceException(\sprintf('File "%s" not found.', $resource)); - } - - try { - $dom = XmlUtils::loadFile($resource); - } catch (\InvalidArgumentException $e) { - throw new InvalidResourceException(\sprintf('Unable to load "%s".', $resource), $e->getCode(), $e); - } - - $internalErrors = libxml_use_internal_errors(true); - libxml_clear_errors(); - - $xpath = new \DOMXPath($dom); - $nodes = $xpath->evaluate('//TS/context/name[text()="'.$domain.'"]'); - - $catalogue = new MessageCatalogue($locale); - if (1 == $nodes->length) { - $translations = $nodes->item(0)->nextSibling->parentNode->parentNode->getElementsByTagName('message'); - foreach ($translations as $translation) { - $translationValue = (string) $translation->getElementsByTagName('translation')->item(0)->nodeValue; - - if ($translationValue) { - $catalogue->set( - (string) $translation->getElementsByTagName('source')->item(0)->nodeValue, - $translationValue, - $domain - ); - } - } - - if (class_exists(FileResource::class)) { - $catalogue->addResource(new FileResource($resource)); - } - } - - libxml_use_internal_errors($internalErrors); - - return $catalogue; - } -} diff --git a/vendor/symfony/translation/Loader/XliffFileLoader.php b/vendor/symfony/translation/Loader/XliffFileLoader.php deleted file mode 100644 index e76245d..0000000 --- a/vendor/symfony/translation/Loader/XliffFileLoader.php +++ /dev/null @@ -1,248 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Config\Util\Exception\InvalidXmlException; -use Symfony\Component\Config\Util\Exception\XmlParsingException; -use Symfony\Component\Config\Util\XmlUtils; -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\Exception\RuntimeException; -use Symfony\Component\Translation\MessageCatalogue; -use Symfony\Component\Translation\Util\XliffUtils; - -/** - * XliffFileLoader loads translations from XLIFF files. - * - * @author Fabien Potencier - */ -class XliffFileLoader implements LoaderInterface -{ - public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue - { - if (!class_exists(XmlUtils::class)) { - throw new RuntimeException('Loading translations from the Xliff format requires the Symfony Config component.'); - } - - if (!$this->isXmlString($resource)) { - if (!stream_is_local($resource)) { - throw new InvalidResourceException(\sprintf('This is not a local file "%s".', $resource)); - } - - if (!file_exists($resource)) { - throw new NotFoundResourceException(\sprintf('File "%s" not found.', $resource)); - } - - if (!is_file($resource)) { - throw new InvalidResourceException(\sprintf('This is neither a file nor an XLIFF string "%s".', $resource)); - } - } - - try { - if ($this->isXmlString($resource)) { - $dom = XmlUtils::parse($resource); - } else { - $dom = XmlUtils::loadFile($resource); - } - } catch (\InvalidArgumentException|XmlParsingException|InvalidXmlException $e) { - throw new InvalidResourceException(\sprintf('Unable to load "%s": ', $resource).$e->getMessage(), $e->getCode(), $e); - } - - if ($errors = XliffUtils::validateSchema($dom)) { - throw new InvalidResourceException(\sprintf('Invalid resource provided: "%s"; Errors: ', $resource).XliffUtils::getErrorsAsString($errors)); - } - - $catalogue = new MessageCatalogue($locale); - $this->extract($dom, $catalogue, $domain); - - if (is_file($resource) && class_exists(FileResource::class)) { - $catalogue->addResource(new FileResource($resource)); - } - - return $catalogue; - } - - private function extract(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain): void - { - $xliffVersion = XliffUtils::getVersionNumber($dom); - - if ('1.2' === $xliffVersion) { - $this->extractXliff1($dom, $catalogue, $domain); - } - - if ('2.0' === $xliffVersion) { - $this->extractXliff2($dom, $catalogue, $domain); - } - } - - /** - * Extract messages and metadata from DOMDocument into a MessageCatalogue. - */ - private function extractXliff1(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain): void - { - $xml = simplexml_import_dom($dom); - $encoding = $dom->encoding ? strtoupper($dom->encoding) : null; - - $namespace = 'urn:oasis:names:tc:xliff:document:1.2'; - $xml->registerXPathNamespace('xliff', $namespace); - - foreach ($xml->xpath('//xliff:file') as $file) { - $fileAttributes = $file->attributes(); - - $file->registerXPathNamespace('xliff', $namespace); - - foreach ($file->xpath('.//xliff:prop') as $prop) { - $catalogue->setCatalogueMetadata($prop->attributes()['prop-type'], (string) $prop, $domain); - } - - foreach ($file->xpath('.//xliff:trans-unit') as $translation) { - $attributes = $translation->attributes(); - - if (!(isset($attributes['resname']) || isset($translation->source))) { - continue; - } - - $source = (string) (isset($attributes['resname']) && $attributes['resname'] ? $attributes['resname'] : $translation->source); - - if (isset($translation->target) - && 'needs-translation' === (string) $translation->target->attributes()['state'] - && \in_array((string) $translation->target, [$source, (string) $translation->source], true) - ) { - continue; - } - - // If the xlf file has another encoding specified, try to convert it because - // simple_xml will always return utf-8 encoded values - $target = $this->utf8ToCharset((string) ($translation->target ?? $translation->source), $encoding); - - $catalogue->set($source, $target, $domain); - - $metadata = [ - 'source' => (string) $translation->source, - 'file' => [ - 'original' => (string) $fileAttributes['original'], - ], - ]; - if ($notes = $this->parseNotesMetadata($translation->note, $encoding)) { - $metadata['notes'] = $notes; - } - - if (isset($translation->target) && $translation->target->attributes()) { - $metadata['target-attributes'] = []; - foreach ($translation->target->attributes() as $key => $value) { - $metadata['target-attributes'][$key] = (string) $value; - } - } - - if (isset($attributes['id'])) { - $metadata['id'] = (string) $attributes['id']; - } - - $catalogue->setMetadata($source, $metadata, $domain); - } - } - } - - private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain): void - { - $xml = simplexml_import_dom($dom); - $encoding = $dom->encoding ? strtoupper($dom->encoding) : null; - - $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0'); - - foreach ($xml->xpath('//xliff:unit') as $unit) { - foreach ($unit->segment as $segment) { - $attributes = $unit->attributes(); - $source = $attributes['name'] ?? $segment->source; - - // If the xlf file has another encoding specified, try to convert it because - // simple_xml will always return utf-8 encoded values - $target = $this->utf8ToCharset((string) ($segment->target ?? $segment->source), $encoding); - - $catalogue->set((string) $source, $target, $domain); - - $metadata = []; - if ($segment->attributes()) { - $metadata['segment-attributes'] = []; - foreach ($segment->attributes() as $key => $value) { - $metadata['segment-attributes'][$key] = (string) $value; - } - } - - if (isset($segment->target) && $segment->target->attributes()) { - $metadata['target-attributes'] = []; - foreach ($segment->target->attributes() as $key => $value) { - $metadata['target-attributes'][$key] = (string) $value; - } - } - - if (isset($unit->notes)) { - $metadata['notes'] = []; - foreach ($unit->notes->note as $noteNode) { - $note = []; - foreach ($noteNode->attributes() as $key => $value) { - $note[$key] = (string) $value; - } - $note['content'] = (string) $noteNode; - $metadata['notes'][] = $note; - } - } - - $catalogue->setMetadata((string) $source, $metadata, $domain); - } - } - } - - /** - * Convert a UTF8 string to the specified encoding. - */ - private function utf8ToCharset(string $content, ?string $encoding = null): string - { - if ('UTF-8' !== $encoding && $encoding) { - return mb_convert_encoding($content, $encoding, 'UTF-8'); - } - - return $content; - } - - private function parseNotesMetadata(?\SimpleXMLElement $noteElement = null, ?string $encoding = null): array - { - $notes = []; - - if (null === $noteElement) { - return $notes; - } - - /** @var \SimpleXMLElement $xmlNote */ - foreach ($noteElement as $xmlNote) { - $noteAttributes = $xmlNote->attributes(); - $note = ['content' => $this->utf8ToCharset((string) $xmlNote, $encoding)]; - if (isset($noteAttributes['priority'])) { - $note['priority'] = (int) $noteAttributes['priority']; - } - - if (isset($noteAttributes['from'])) { - $note['from'] = (string) $noteAttributes['from']; - } - - $notes[] = $note; - } - - return $notes; - } - - private function isXmlString(string $resource): bool - { - return str_starts_with($resource, ' - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\LogicException; -use Symfony\Component\Yaml\Exception\ParseException; -use Symfony\Component\Yaml\Parser as YamlParser; -use Symfony\Component\Yaml\Yaml; - -/** - * YamlFileLoader loads translations from Yaml files. - * - * @author Fabien Potencier - */ -class YamlFileLoader extends FileLoader -{ - private YamlParser $yamlParser; - - protected function loadResource(string $resource): array - { - if (!isset($this->yamlParser)) { - if (!class_exists(YamlParser::class)) { - throw new LogicException('Loading translations from the YAML format requires the Symfony Yaml component.'); - } - - $this->yamlParser = new YamlParser(); - } - - try { - $messages = $this->yamlParser->parseFile($resource, Yaml::PARSE_CONSTANT); - } catch (ParseException $e) { - throw new InvalidResourceException(\sprintf('The file "%s" does not contain valid YAML: ', $resource).$e->getMessage(), 0, $e); - } - - if (null !== $messages && !\is_array($messages)) { - throw new InvalidResourceException(\sprintf('Unable to load file "%s".', $resource)); - } - - return $messages ?: []; - } -} diff --git a/vendor/symfony/translation/LocaleSwitcher.php b/vendor/symfony/translation/LocaleSwitcher.php deleted file mode 100644 index 4950a56..0000000 --- a/vendor/symfony/translation/LocaleSwitcher.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Symfony\Component\Routing\RequestContext; -use Symfony\Contracts\Translation\LocaleAwareInterface; - -/** - * @author Kevin Bond - */ -class LocaleSwitcher implements LocaleAwareInterface -{ - private string $defaultLocale; - - /** - * @param LocaleAwareInterface[] $localeAwareServices - */ - public function __construct( - private string $locale, - private iterable $localeAwareServices, - private ?RequestContext $requestContext = null, - ) { - $this->defaultLocale = $locale; - } - - public function setLocale(string $locale): void - { - // Silently ignore if the intl extension is not loaded - try { - if (class_exists(\Locale::class, false)) { - \Locale::setDefault($locale); - } - } catch (\Exception) { - } - - $this->locale = $locale; - $this->requestContext?->setParameter('_locale', $locale); - - foreach ($this->localeAwareServices as $service) { - $service->setLocale($locale); - } - } - - public function getLocale(): string - { - return $this->locale; - } - - /** - * Switch to a new locale, execute a callback, then switch back to the original. - * - * @template T - * - * @param callable(string $locale):T $callback - * - * @return T - */ - public function runWithLocale(string $locale, callable $callback): mixed - { - $original = $this->getLocale(); - $this->setLocale($locale); - - try { - return $callback($locale); - } finally { - $this->setLocale($original); - } - } - - public function reset(): void - { - $this->setLocale($this->defaultLocale); - } -} diff --git a/vendor/symfony/translation/LoggingTranslator.php b/vendor/symfony/translation/LoggingTranslator.php deleted file mode 100644 index 84020d8..0000000 --- a/vendor/symfony/translation/LoggingTranslator.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Psr\Log\LoggerInterface; -use Symfony\Contracts\Translation\LocaleAwareInterface; -use Symfony\Contracts\Translation\TranslatorInterface; - -/** - * @author Abdellatif Ait boudad - */ -class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface -{ - public function __construct( - private TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator, - private LoggerInterface $logger, - ) { - } - - public function trans(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string - { - $trans = $this->translator->trans($id = (string) $id, $parameters, $domain, $locale); - $this->log($id, $domain, $locale); - - return $trans; - } - - public function setLocale(string $locale): void - { - $prev = $this->translator->getLocale(); - $this->translator->setLocale($locale); - if ($prev === $locale) { - return; - } - - $this->logger->debug(\sprintf('The locale of the translator has changed from "%s" to "%s".', $prev, $locale)); - } - - public function getLocale(): string - { - return $this->translator->getLocale(); - } - - public function getCatalogue(?string $locale = null): MessageCatalogueInterface - { - return $this->translator->getCatalogue($locale); - } - - public function getCatalogues(): array - { - return $this->translator->getCatalogues(); - } - - /** - * Gets the fallback locales. - */ - public function getFallbackLocales(): array - { - if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { - return $this->translator->getFallbackLocales(); - } - - return []; - } - - public function __call(string $method, array $args): mixed - { - return $this->translator->{$method}(...$args); - } - - /** - * Logs for missing translations. - */ - private function log(string $id, ?string $domain, ?string $locale): void - { - $domain ??= 'messages'; - - $catalogue = $this->translator->getCatalogue($locale); - if ($catalogue->defines($id, $domain)) { - return; - } - - if ($catalogue->has($id, $domain)) { - $this->logger->debug('Translation use fallback catalogue.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]); - } else { - $this->logger->warning('Translation not found.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]); - } - } -} diff --git a/vendor/symfony/translation/MessageCatalogue.php b/vendor/symfony/translation/MessageCatalogue.php deleted file mode 100644 index 2d229f2..0000000 --- a/vendor/symfony/translation/MessageCatalogue.php +++ /dev/null @@ -1,306 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Symfony\Component\Config\Resource\ResourceInterface; -use Symfony\Component\Translation\Exception\LogicException; - -/** - * @author Fabien Potencier - */ -class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterface, CatalogueMetadataAwareInterface -{ - private array $metadata = []; - private array $catalogueMetadata = []; - private array $resources = []; - private ?MessageCatalogueInterface $fallbackCatalogue = null; - private ?self $parent = null; - - /** - * @param array $messages An array of messages classified by domain - */ - public function __construct( - private string $locale, - private array $messages = [], - ) { - } - - public function getLocale(): string - { - return $this->locale; - } - - public function getDomains(): array - { - $domains = []; - - foreach ($this->messages as $domain => $messages) { - if (str_ends_with($domain, self::INTL_DOMAIN_SUFFIX)) { - $domain = substr($domain, 0, -\strlen(self::INTL_DOMAIN_SUFFIX)); - } - $domains[$domain] = $domain; - } - - return array_values($domains); - } - - public function all(?string $domain = null): array - { - if (null !== $domain) { - // skip messages merge if intl-icu requested explicitly - if (str_ends_with($domain, self::INTL_DOMAIN_SUFFIX)) { - return $this->messages[$domain] ?? []; - } - - return ($this->messages[$domain.self::INTL_DOMAIN_SUFFIX] ?? []) + ($this->messages[$domain] ?? []); - } - - $allMessages = []; - - foreach ($this->messages as $domain => $messages) { - if (str_ends_with($domain, self::INTL_DOMAIN_SUFFIX)) { - $domain = substr($domain, 0, -\strlen(self::INTL_DOMAIN_SUFFIX)); - $allMessages[$domain] = $messages + ($allMessages[$domain] ?? []); - } else { - $allMessages[$domain] = ($allMessages[$domain] ?? []) + $messages; - } - } - - return $allMessages; - } - - public function set(string $id, string $translation, string $domain = 'messages'): void - { - $this->add([$id => $translation], $domain); - } - - public function has(string $id, string $domain = 'messages'): bool - { - if (isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) { - return true; - } - - if (null !== $this->fallbackCatalogue) { - return $this->fallbackCatalogue->has($id, $domain); - } - - return false; - } - - public function defines(string $id, string $domain = 'messages'): bool - { - return isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id]); - } - - public function get(string $id, string $domain = 'messages'): string - { - if (isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) { - return $this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id]; - } - - if (isset($this->messages[$domain][$id])) { - return $this->messages[$domain][$id]; - } - - if (null !== $this->fallbackCatalogue) { - return $this->fallbackCatalogue->get($id, $domain); - } - - return $id; - } - - public function replace(array $messages, string $domain = 'messages'): void - { - unset($this->messages[$domain], $this->messages[$domain.self::INTL_DOMAIN_SUFFIX]); - - $this->add($messages, $domain); - } - - public function add(array $messages, string $domain = 'messages'): void - { - $altDomain = str_ends_with($domain, self::INTL_DOMAIN_SUFFIX) ? substr($domain, 0, -\strlen(self::INTL_DOMAIN_SUFFIX)) : $domain.self::INTL_DOMAIN_SUFFIX; - foreach ($messages as $id => $message) { - unset($this->messages[$altDomain][$id]); - $this->messages[$domain][$id] = $message; - } - - if ([] === ($this->messages[$altDomain] ?? null)) { - unset($this->messages[$altDomain]); - } - } - - public function addCatalogue(MessageCatalogueInterface $catalogue): void - { - if ($catalogue->getLocale() !== $this->locale) { - throw new LogicException(\sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s".', $catalogue->getLocale(), $this->locale)); - } - - foreach ($catalogue->all() as $domain => $messages) { - if ($intlMessages = $catalogue->all($domain.self::INTL_DOMAIN_SUFFIX)) { - $this->add($intlMessages, $domain.self::INTL_DOMAIN_SUFFIX); - $messages = array_diff_key($messages, $intlMessages); - } - $this->add($messages, $domain); - } - - foreach ($catalogue->getResources() as $resource) { - $this->addResource($resource); - } - - if ($catalogue instanceof MetadataAwareInterface) { - $metadata = $catalogue->getMetadata('', ''); - $this->addMetadata($metadata); - } - - if ($catalogue instanceof CatalogueMetadataAwareInterface) { - $catalogueMetadata = $catalogue->getCatalogueMetadata('', ''); - $this->addCatalogueMetadata($catalogueMetadata); - } - } - - public function addFallbackCatalogue(MessageCatalogueInterface $catalogue): void - { - // detect circular references - $c = $catalogue; - while ($c = $c->getFallbackCatalogue()) { - if ($c->getLocale() === $this->getLocale()) { - throw new LogicException(\sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale())); - } - } - - $c = $this; - do { - if ($c->getLocale() === $catalogue->getLocale()) { - throw new LogicException(\sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale())); - } - - foreach ($catalogue->getResources() as $resource) { - $c->addResource($resource); - } - } while ($c = $c->parent); - - $catalogue->parent = $this; - $this->fallbackCatalogue = $catalogue; - - foreach ($catalogue->getResources() as $resource) { - $this->addResource($resource); - } - } - - public function getFallbackCatalogue(): ?MessageCatalogueInterface - { - return $this->fallbackCatalogue; - } - - public function getResources(): array - { - return array_values($this->resources); - } - - public function addResource(ResourceInterface $resource): void - { - $this->resources[$resource->__toString()] = $resource; - } - - public function getMetadata(string $key = '', string $domain = 'messages'): mixed - { - if ('' == $domain) { - return $this->metadata; - } - - if (isset($this->metadata[$domain])) { - if ('' == $key) { - return $this->metadata[$domain]; - } - - if (isset($this->metadata[$domain][$key])) { - return $this->metadata[$domain][$key]; - } - } - - return null; - } - - public function setMetadata(string $key, mixed $value, string $domain = 'messages'): void - { - $this->metadata[$domain][$key] = $value; - } - - public function deleteMetadata(string $key = '', string $domain = 'messages'): void - { - if ('' == $domain) { - $this->metadata = []; - } elseif ('' == $key) { - unset($this->metadata[$domain]); - } else { - unset($this->metadata[$domain][$key]); - } - } - - public function getCatalogueMetadata(string $key = '', string $domain = 'messages'): mixed - { - if (!$domain) { - return $this->catalogueMetadata; - } - - if (isset($this->catalogueMetadata[$domain])) { - if (!$key) { - return $this->catalogueMetadata[$domain]; - } - - if (isset($this->catalogueMetadata[$domain][$key])) { - return $this->catalogueMetadata[$domain][$key]; - } - } - - return null; - } - - public function setCatalogueMetadata(string $key, mixed $value, string $domain = 'messages'): void - { - $this->catalogueMetadata[$domain][$key] = $value; - } - - public function deleteCatalogueMetadata(string $key = '', string $domain = 'messages'): void - { - if (!$domain) { - $this->catalogueMetadata = []; - } elseif (!$key) { - unset($this->catalogueMetadata[$domain]); - } else { - unset($this->catalogueMetadata[$domain][$key]); - } - } - - /** - * Adds current values with the new values. - * - * @param array $values Values to add - */ - private function addMetadata(array $values): void - { - foreach ($values as $domain => $keys) { - foreach ($keys as $key => $value) { - $this->setMetadata($key, $value, $domain); - } - } - } - - private function addCatalogueMetadata(array $values): void - { - foreach ($values as $domain => $keys) { - foreach ($keys as $key => $value) { - $this->setCatalogueMetadata($key, $value, $domain); - } - } - } -} diff --git a/vendor/symfony/translation/MessageCatalogueInterface.php b/vendor/symfony/translation/MessageCatalogueInterface.php deleted file mode 100644 index 5d63560..0000000 --- a/vendor/symfony/translation/MessageCatalogueInterface.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Symfony\Component\Config\Resource\ResourceInterface; - -/** - * MessageCatalogueInterface. - * - * @author Fabien Potencier - */ -interface MessageCatalogueInterface -{ - public const INTL_DOMAIN_SUFFIX = '+intl-icu'; - - /** - * Gets the catalogue locale. - */ - public function getLocale(): string; - - /** - * Gets the domains. - */ - public function getDomains(): array; - - /** - * Gets the messages within a given domain. - * - * If $domain is null, it returns all messages. - */ - public function all(?string $domain = null): array; - - /** - * Sets a message translation. - * - * @param string $id The message id - * @param string $translation The messages translation - * @param string $domain The domain name - */ - public function set(string $id, string $translation, string $domain = 'messages'): void; - - /** - * Checks if a message has a translation. - * - * @param string $id The message id - * @param string $domain The domain name - */ - public function has(string $id, string $domain = 'messages'): bool; - - /** - * Checks if a message has a translation (it does not take into account the fallback mechanism). - * - * @param string $id The message id - * @param string $domain The domain name - */ - public function defines(string $id, string $domain = 'messages'): bool; - - /** - * Gets a message translation. - * - * @param string $id The message id - * @param string $domain The domain name - */ - public function get(string $id, string $domain = 'messages'): string; - - /** - * Sets translations for a given domain. - * - * @param array $messages An array of translations - * @param string $domain The domain name - */ - public function replace(array $messages, string $domain = 'messages'): void; - - /** - * Adds translations for a given domain. - * - * @param array $messages An array of translations - * @param string $domain The domain name - */ - public function add(array $messages, string $domain = 'messages'): void; - - /** - * Merges translations from the given Catalogue into the current one. - * - * The two catalogues must have the same locale. - */ - public function addCatalogue(self $catalogue): void; - - /** - * Merges translations from the given Catalogue into the current one - * only when the translation does not exist. - * - * This is used to provide default translations when they do not exist for the current locale. - */ - public function addFallbackCatalogue(self $catalogue): void; - - /** - * Gets the fallback catalogue. - */ - public function getFallbackCatalogue(): ?self; - - /** - * Returns an array of resources loaded to build this collection. - * - * @return ResourceInterface[] - */ - public function getResources(): array; - - /** - * Adds a resource for this collection. - */ - public function addResource(ResourceInterface $resource): void; -} diff --git a/vendor/symfony/translation/MetadataAwareInterface.php b/vendor/symfony/translation/MetadataAwareInterface.php deleted file mode 100644 index 12e4f33..0000000 --- a/vendor/symfony/translation/MetadataAwareInterface.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -/** - * This interface is used to get, set, and delete metadata about the translation messages. - * - * @author Fabien Potencier - */ -interface MetadataAwareInterface -{ - /** - * Gets metadata for the given domain and key. - * - * Passing an empty domain will return an array with all metadata indexed by - * domain and then by key. Passing an empty key will return an array with all - * metadata for the given domain. - * - * @return mixed The value that was set or an array with the domains/keys or null - */ - public function getMetadata(string $key = '', string $domain = 'messages'): mixed; - - /** - * Adds metadata to a message domain. - */ - public function setMetadata(string $key, mixed $value, string $domain = 'messages'): void; - - /** - * Deletes metadata for the given key and domain. - * - * Passing an empty domain will delete all metadata. Passing an empty key will - * delete all metadata for the given domain. - */ - public function deleteMetadata(string $key = '', string $domain = 'messages'): void; -} diff --git a/vendor/symfony/translation/Provider/AbstractProviderFactory.php b/vendor/symfony/translation/Provider/AbstractProviderFactory.php deleted file mode 100644 index f0c11d8..0000000 --- a/vendor/symfony/translation/Provider/AbstractProviderFactory.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\IncompleteDsnException; - -abstract class AbstractProviderFactory implements ProviderFactoryInterface -{ - public function supports(Dsn $dsn): bool - { - return \in_array($dsn->getScheme(), $this->getSupportedSchemes(), true); - } - - /** - * @return string[] - */ - abstract protected function getSupportedSchemes(): array; - - protected function getUser(Dsn $dsn): string - { - return $dsn->getUser() ?? throw new IncompleteDsnException('User is not set.', $dsn->getScheme().'://'.$dsn->getHost()); - } - - protected function getPassword(Dsn $dsn): string - { - return $dsn->getPassword() ?? throw new IncompleteDsnException('Password is not set.', $dsn->getOriginalDsn()); - } -} diff --git a/vendor/symfony/translation/Provider/Dsn.php b/vendor/symfony/translation/Provider/Dsn.php deleted file mode 100644 index 1d90e27..0000000 --- a/vendor/symfony/translation/Provider/Dsn.php +++ /dev/null @@ -1,110 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\MissingRequiredOptionException; - -/** - * @author Fabien Potencier - * @author Oskar Stark - */ -final class Dsn -{ - private ?string $scheme; - private ?string $host; - private ?string $user; - private ?string $password; - private ?int $port; - private ?string $path; - private array $options = []; - private string $originalDsn; - - public function __construct(#[\SensitiveParameter] string $dsn) - { - $this->originalDsn = $dsn; - - if (false === $params = parse_url($dsn)) { - throw new InvalidArgumentException('The translation provider DSN is invalid.'); - } - - if (!isset($params['scheme'])) { - throw new InvalidArgumentException('The translation provider DSN must contain a scheme.'); - } - $this->scheme = $params['scheme']; - - if (!isset($params['host'])) { - throw new InvalidArgumentException('The translation provider DSN must contain a host (use "default" by default).'); - } - $this->host = $params['host']; - - $this->user = '' !== ($params['user'] ?? '') ? rawurldecode($params['user']) : null; - $this->password = '' !== ($params['pass'] ?? '') ? rawurldecode($params['pass']) : null; - $this->port = $params['port'] ?? null; - $this->path = $params['path'] ?? null; - parse_str($params['query'] ?? '', $this->options); - } - - public function getScheme(): string - { - return $this->scheme; - } - - public function getHost(): string - { - return $this->host; - } - - public function getUser(): ?string - { - return $this->user; - } - - public function getPassword(): ?string - { - return $this->password; - } - - public function getPort(?int $default = null): ?int - { - return $this->port ?? $default; - } - - public function getOption(string $key, mixed $default = null): mixed - { - return $this->options[$key] ?? $default; - } - - public function getRequiredOption(string $key): mixed - { - if (!\array_key_exists($key, $this->options) || '' === trim($this->options[$key])) { - throw new MissingRequiredOptionException($key); - } - - return $this->options[$key]; - } - - public function getOptions(): array - { - return $this->options; - } - - public function getPath(): ?string - { - return $this->path; - } - - public function getOriginalDsn(): string - { - return $this->originalDsn; - } -} diff --git a/vendor/symfony/translation/Provider/FilteringProvider.php b/vendor/symfony/translation/Provider/FilteringProvider.php deleted file mode 100644 index cc11dc3..0000000 --- a/vendor/symfony/translation/Provider/FilteringProvider.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\TranslatorBag; -use Symfony\Component\Translation\TranslatorBagInterface; - -/** - * Filters domains and locales between the Translator config values and those specific to each provider. - * - * @author Mathieu Santostefano - */ -class FilteringProvider implements ProviderInterface -{ - public function __construct( - private ProviderInterface $provider, - private array $locales, - private array $domains = [], - ) { - } - - public function __toString(): string - { - return (string) $this->provider; - } - - public function write(TranslatorBagInterface $translatorBag): void - { - $this->provider->write($translatorBag); - } - - public function read(array $domains, array $locales): TranslatorBag - { - $domains = !$this->domains ? $domains : array_intersect($this->domains, $domains); - $locales = array_intersect($this->locales, $locales); - - return $this->provider->read($domains, $locales); - } - - public function delete(TranslatorBagInterface $translatorBag): void - { - $this->provider->delete($translatorBag); - } - - public function getDomains(): array - { - return $this->domains; - } -} diff --git a/vendor/symfony/translation/Provider/NullProvider.php b/vendor/symfony/translation/Provider/NullProvider.php deleted file mode 100644 index f00392e..0000000 --- a/vendor/symfony/translation/Provider/NullProvider.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\TranslatorBag; -use Symfony\Component\Translation\TranslatorBagInterface; - -/** - * @author Mathieu Santostefano - */ -class NullProvider implements ProviderInterface -{ - public function __toString(): string - { - return 'null'; - } - - public function write(TranslatorBagInterface $translatorBag, bool $override = false): void - { - } - - public function read(array $domains, array $locales): TranslatorBag - { - return new TranslatorBag(); - } - - public function delete(TranslatorBagInterface $translatorBag): void - { - } -} diff --git a/vendor/symfony/translation/Provider/NullProviderFactory.php b/vendor/symfony/translation/Provider/NullProviderFactory.php deleted file mode 100644 index f350f16..0000000 --- a/vendor/symfony/translation/Provider/NullProviderFactory.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\UnsupportedSchemeException; - -/** - * @author Mathieu Santostefano - */ -final class NullProviderFactory extends AbstractProviderFactory -{ - public function create(Dsn $dsn): ProviderInterface - { - if ('null' === $dsn->getScheme()) { - return new NullProvider(); - } - - throw new UnsupportedSchemeException($dsn, 'null', $this->getSupportedSchemes()); - } - - protected function getSupportedSchemes(): array - { - return ['null']; - } -} diff --git a/vendor/symfony/translation/Provider/ProviderFactoryInterface.php b/vendor/symfony/translation/Provider/ProviderFactoryInterface.php deleted file mode 100644 index 3fd4494..0000000 --- a/vendor/symfony/translation/Provider/ProviderFactoryInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\IncompleteDsnException; -use Symfony\Component\Translation\Exception\UnsupportedSchemeException; - -interface ProviderFactoryInterface -{ - /** - * @throws UnsupportedSchemeException - * @throws IncompleteDsnException - */ - public function create(Dsn $dsn): ProviderInterface; - - public function supports(Dsn $dsn): bool; -} diff --git a/vendor/symfony/translation/Provider/ProviderInterface.php b/vendor/symfony/translation/Provider/ProviderInterface.php deleted file mode 100644 index 0e47083..0000000 --- a/vendor/symfony/translation/Provider/ProviderInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\TranslatorBag; -use Symfony\Component\Translation\TranslatorBagInterface; - -interface ProviderInterface extends \Stringable -{ - /** - * Translations available in the TranslatorBag only must be created. - * Translations available in both the TranslatorBag and on the provider - * must be overwritten. - * Translations available on the provider only must be kept. - */ - public function write(TranslatorBagInterface $translatorBag): void; - - public function read(array $domains, array $locales): TranslatorBag; - - public function delete(TranslatorBagInterface $translatorBag): void; -} diff --git a/vendor/symfony/translation/Provider/TranslationProviderCollection.php b/vendor/symfony/translation/Provider/TranslationProviderCollection.php deleted file mode 100644 index 878998f..0000000 --- a/vendor/symfony/translation/Provider/TranslationProviderCollection.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; - -/** - * @author Mathieu Santostefano - */ -final class TranslationProviderCollection -{ - /** - * @var array - */ - private array $providers; - - /** - * @param array $providers - */ - public function __construct(iterable $providers) - { - $this->providers = \is_array($providers) ? $providers : iterator_to_array($providers); - } - - public function __toString(): string - { - return '['.implode(',', array_keys($this->providers)).']'; - } - - public function has(string $name): bool - { - return isset($this->providers[$name]); - } - - public function get(string $name): ProviderInterface - { - if (!$this->has($name)) { - throw new InvalidArgumentException(\sprintf('Provider "%s" not found. Available: "%s".', $name, (string) $this)); - } - - return $this->providers[$name]; - } - - public function keys(): array - { - return array_keys($this->providers); - } -} diff --git a/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php b/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php deleted file mode 100644 index 2c8c551..0000000 --- a/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\UnsupportedSchemeException; - -/** - * @author Mathieu Santostefano - */ -class TranslationProviderCollectionFactory -{ - /** - * @param iterable $factories - */ - public function __construct( - private iterable $factories, - private array $enabledLocales, - ) { - } - - public function fromConfig(array $config): TranslationProviderCollection - { - $providers = []; - foreach ($config as $name => $currentConfig) { - $providers[$name] = $this->fromDsnObject( - new Dsn($currentConfig['dsn']), - !$currentConfig['locales'] ? $this->enabledLocales : $currentConfig['locales'], - !$currentConfig['domains'] ? [] : $currentConfig['domains'] - ); - } - - return new TranslationProviderCollection($providers); - } - - public function fromDsnObject(Dsn $dsn, array $locales, array $domains = []): ProviderInterface - { - foreach ($this->factories as $factory) { - if ($factory->supports($dsn)) { - return new FilteringProvider($factory->create($dsn), $locales, $domains); - } - } - - throw new UnsupportedSchemeException($dsn); - } -} diff --git a/vendor/symfony/translation/PseudoLocalizationTranslator.php b/vendor/symfony/translation/PseudoLocalizationTranslator.php deleted file mode 100644 index fe5b0ad..0000000 --- a/vendor/symfony/translation/PseudoLocalizationTranslator.php +++ /dev/null @@ -1,385 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Symfony\Component\Translation\Exception\LogicException; -use Symfony\Contracts\Translation\TranslatorInterface; - -/** - * This translator should only be used in a development environment. - */ -final class PseudoLocalizationTranslator implements TranslatorInterface, TranslatorBagInterface -{ - private const EXPANSION_CHARACTER = '~'; - - private bool $accents; - private float $expansionFactor; - private bool $brackets; - private bool $parseHTML; - - /** - * @var string[] - */ - private array $localizableHTMLAttributes; - - /** - * Available options: - * * accents: - * type: boolean - * default: true - * description: replace ASCII characters of the translated string with accented versions or similar characters - * example: if true, "foo" => "ƒöö". - * - * * expansion_factor: - * type: float - * default: 1 - * validation: it must be greater than or equal to 1 - * description: expand the translated string by the given factor with spaces and tildes - * example: if 2, "foo" => "~foo ~" - * - * * brackets: - * type: boolean - * default: true - * description: wrap the translated string with brackets - * example: if true, "foo" => "[foo]" - * - * * parse_html: - * type: boolean - * default: false - * description: parse the translated string as HTML - looking for HTML tags has a performance impact but allows to preserve them from alterations - it also allows to compute the visible translated string length which is useful to correctly expand ot when it contains HTML - * warning: unclosed tags are unsupported, they will be fixed (closed) by the parser - eg, "foo
bar" => "foo
bar
" - * - * * localizable_html_attributes: - * type: string[] - * default: [] - * description: the list of HTML attributes whose values can be altered - it is only useful when the "parse_html" option is set to true - * example: if ["title"], and with the "accents" option set to true, "Profile" => "Þŕöƒîļé" - if "title" was not in the "localizable_html_attributes" list, the title attribute data would be left unchanged. - */ - public function __construct( - private TranslatorInterface $translator, - array $options = [], - ) { - $this->translator = $translator; - $this->accents = $options['accents'] ?? true; - - if (1.0 > ($this->expansionFactor = $options['expansion_factor'] ?? 1.0)) { - throw new \InvalidArgumentException('The expansion factor must be greater than or equal to 1.'); - } - - $this->brackets = $options['brackets'] ?? true; - - $this->parseHTML = $options['parse_html'] ?? false; - if ($this->parseHTML && !$this->accents && 1.0 === $this->expansionFactor) { - $this->parseHTML = false; - } - - $this->localizableHTMLAttributes = $options['localizable_html_attributes'] ?? []; - } - - public function trans(string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string - { - $trans = ''; - $visibleText = ''; - - foreach ($this->getParts($this->translator->trans($id, $parameters, $domain, $locale)) as [$visible, $localizable, $text]) { - if ($visible) { - $visibleText .= $text; - } - - if (!$localizable) { - $trans .= $text; - - continue; - } - - $this->addAccents($trans, $text); - } - - $this->expand($trans, $visibleText); - - $this->addBrackets($trans); - - return $trans; - } - - public function getLocale(): string - { - return $this->translator->getLocale(); - } - - public function getCatalogue(?string $locale = null): MessageCatalogueInterface - { - if (!$this->translator instanceof TranslatorBagInterface) { - throw new LogicException(\sprintf('The "%s()" method cannot be called as the wrapped translator class "%s" does not implement the "%s".', __METHOD__, $this->translator::class, TranslatorBagInterface::class)); - } - - return $this->translator->getCatalogue($locale); - } - - public function getCatalogues(): array - { - if (!$this->translator instanceof TranslatorBagInterface) { - throw new LogicException(\sprintf('The "%s()" method cannot be called as the wrapped translator class "%s" does not implement the "%s".', __METHOD__, $this->translator::class, TranslatorBagInterface::class)); - } - - return $this->translator->getCatalogues(); - } - - private function getParts(string $originalTrans): array - { - if (!$this->parseHTML) { - return [[true, true, $originalTrans]]; - } - - $html = mb_encode_numericentity($originalTrans, [0x80, 0x10FFFF, 0, 0x1FFFFF], mb_detect_encoding($originalTrans, null, true) ?: 'UTF-8'); - - $useInternalErrors = libxml_use_internal_errors(true); - - $dom = new \DOMDocument(); - $dom->loadHTML(''.$html.''); - - libxml_clear_errors(); - libxml_use_internal_errors($useInternalErrors); - - return $this->parseNode($dom->childNodes->item(1)->childNodes->item(0)->childNodes->item(0)); - } - - private function parseNode(\DOMNode $node): array - { - $parts = []; - - foreach ($node->childNodes as $childNode) { - if (!$childNode instanceof \DOMElement) { - $parts[] = [true, true, $childNode->nodeValue]; - - continue; - } - - $parts[] = [false, false, '<'.$childNode->tagName]; - - /** @var \DOMAttr $attribute */ - foreach ($childNode->attributes as $attribute) { - $parts[] = [false, false, ' '.$attribute->nodeName.'="']; - - $localizableAttribute = \in_array($attribute->nodeName, $this->localizableHTMLAttributes, true); - foreach (preg_split('/(&(?:amp|quot|#039|lt|gt);+)/', htmlspecialchars($attribute->nodeValue, \ENT_QUOTES, 'UTF-8'), -1, \PREG_SPLIT_DELIM_CAPTURE) as $i => $match) { - if ('' === $match) { - continue; - } - - $parts[] = [false, $localizableAttribute && 0 === $i % 2, $match]; - } - - $parts[] = [false, false, '"']; - } - - $parts[] = [false, false, '>']; - - $parts = array_merge($parts, $this->parseNode($childNode, $parts)); - - $parts[] = [false, false, 'tagName.'>']; - } - - return $parts; - } - - private function addAccents(string &$trans, string $text): void - { - $trans .= $this->accents ? strtr($text, [ - ' ' => ' ', - '!' => '¡', - '"' => '″', - '#' => '♯', - '$' => '€', - '%' => '‰', - '&' => '⅋', - '\'' => '´', - '(' => '{', - ')' => '}', - '*' => '⁎', - '+' => '⁺', - ',' => '،', - '-' => '‐', - '.' => '·', - '/' => '⁄', - '0' => '⓪', - '1' => '①', - '2' => '②', - '3' => '③', - '4' => '④', - '5' => '⑤', - '6' => '⑥', - '7' => '⑦', - '8' => '⑧', - '9' => '⑨', - ':' => '∶', - ';' => '⁏', - '<' => '≤', - '=' => '≂', - '>' => '≥', - '?' => '¿', - '@' => '՞', - 'A' => 'Å', - 'B' => 'Ɓ', - 'C' => 'Ç', - 'D' => 'Ð', - 'E' => 'É', - 'F' => 'Ƒ', - 'G' => 'Ĝ', - 'H' => 'Ĥ', - 'I' => 'Î', - 'J' => 'Ĵ', - 'K' => 'Ķ', - 'L' => 'Ļ', - 'M' => 'Ṁ', - 'N' => 'Ñ', - 'O' => 'Ö', - 'P' => 'Þ', - 'Q' => 'Ǫ', - 'R' => 'Ŕ', - 'S' => 'Š', - 'T' => 'Ţ', - 'U' => 'Û', - 'V' => 'Ṽ', - 'W' => 'Ŵ', - 'X' => 'Ẋ', - 'Y' => 'Ý', - 'Z' => 'Ž', - '[' => '⁅', - '\\' => '∖', - ']' => '⁆', - '^' => '˄', - '_' => '‿', - '`' => '‵', - 'a' => 'å', - 'b' => 'ƀ', - 'c' => 'ç', - 'd' => 'ð', - 'e' => 'é', - 'f' => 'ƒ', - 'g' => 'ĝ', - 'h' => 'ĥ', - 'i' => 'î', - 'j' => 'ĵ', - 'k' => 'ķ', - 'l' => 'ļ', - 'm' => 'ɱ', - 'n' => 'ñ', - 'o' => 'ö', - 'p' => 'þ', - 'q' => 'ǫ', - 'r' => 'ŕ', - 's' => 'š', - 't' => 'ţ', - 'u' => 'û', - 'v' => 'ṽ', - 'w' => 'ŵ', - 'x' => 'ẋ', - 'y' => 'ý', - 'z' => 'ž', - '{' => '(', - '|' => '¦', - '}' => ')', - '~' => '˞', - ]) : $text; - } - - private function expand(string &$trans, string $visibleText): void - { - if (1.0 >= $this->expansionFactor) { - return; - } - - $visibleLength = $this->strlen($visibleText); - $missingLength = (int) ceil($visibleLength * $this->expansionFactor) - $visibleLength; - if ($this->brackets) { - $missingLength -= 2; - } - - if (0 >= $missingLength) { - return; - } - - $words = []; - $wordsCount = 0; - foreach (preg_split('/ +/', $visibleText, -1, \PREG_SPLIT_NO_EMPTY) as $word) { - $wordLength = $this->strlen($word); - - if ($wordLength >= $missingLength) { - continue; - } - - if (!isset($words[$wordLength])) { - $words[$wordLength] = 0; - } - - ++$words[$wordLength]; - ++$wordsCount; - } - - if (!$words) { - $trans .= 1 === $missingLength ? self::EXPANSION_CHARACTER : ' '.str_repeat(self::EXPANSION_CHARACTER, $missingLength - 1); - - return; - } - - arsort($words, \SORT_NUMERIC); - - $longestWordLength = max(array_keys($words)); - - while (true) { - $r = mt_rand(1, $wordsCount); - - foreach ($words as $length => $count) { - $r -= $count; - if ($r <= 0) { - break; - } - } - - $trans .= ' '.str_repeat(self::EXPANSION_CHARACTER, $length); - - $missingLength -= $length + 1; - - if (0 === $missingLength) { - return; - } - - while ($longestWordLength >= $missingLength) { - $wordsCount -= $words[$longestWordLength]; - unset($words[$longestWordLength]); - - if (!$words) { - $trans .= 1 === $missingLength ? self::EXPANSION_CHARACTER : ' '.str_repeat(self::EXPANSION_CHARACTER, $missingLength - 1); - - return; - } - - $longestWordLength = max(array_keys($words)); - } - } - } - - private function addBrackets(string &$trans): void - { - if (!$this->brackets) { - return; - } - - $trans = '['.$trans.']'; - } - - private function strlen(string $s): int - { - return false === ($encoding = mb_detect_encoding($s, null, true)) ? \strlen($s) : mb_strlen($s, $encoding); - } -} diff --git a/vendor/symfony/translation/README.md b/vendor/symfony/translation/README.md deleted file mode 100644 index e9174ec..0000000 --- a/vendor/symfony/translation/README.md +++ /dev/null @@ -1,46 +0,0 @@ -Translation Component -===================== - -The Translation component provides tools to internationalize your application. - -Getting Started ---------------- - -```bash -composer require symfony/translation -``` - -```php -use Symfony\Component\Translation\Translator; -use Symfony\Component\Translation\Loader\ArrayLoader; - -$translator = new Translator('fr_FR'); -$translator->addLoader('array', new ArrayLoader()); -$translator->addResource('array', [ - 'Hello World!' => 'Bonjour !', -], 'fr_FR'); - -echo $translator->trans('Hello World!'); // outputs « Bonjour ! » -``` - -Sponsor -------- - -The Translation component for Symfony 7.1 is [backed][1] by: - - * [Crowdin][2], a cloud-based localization management software helping teams to go global and stay agile. - -Help Symfony by [sponsoring][3] its development! - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/translation.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) - -[1]: https://symfony.com/backers -[2]: https://crowdin.com -[3]: https://symfony.com/sponsor diff --git a/vendor/symfony/translation/Reader/TranslationReader.php b/vendor/symfony/translation/Reader/TranslationReader.php deleted file mode 100644 index 928e2c5..0000000 --- a/vendor/symfony/translation/Reader/TranslationReader.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Reader; - -use Symfony\Component\Finder\Finder; -use Symfony\Component\Translation\Loader\LoaderInterface; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * TranslationReader reads translation messages from translation files. - * - * @author Michel Salib - */ -class TranslationReader implements TranslationReaderInterface -{ - /** - * Loaders used for import. - * - * @var array - */ - private array $loaders = []; - - /** - * Adds a loader to the translation extractor. - * - * @param string $format The format of the loader - */ - public function addLoader(string $format, LoaderInterface $loader): void - { - $this->loaders[$format] = $loader; - } - - public function read(string $directory, MessageCatalogue $catalogue): void - { - if (!is_dir($directory)) { - return; - } - - foreach ($this->loaders as $format => $loader) { - // load any existing translation files - $finder = new Finder(); - $extension = $catalogue->getLocale().'.'.$format; - $files = $finder->files()->name('*.'.$extension)->in($directory); - foreach ($files as $file) { - $domain = substr($file->getFilename(), 0, -1 * \strlen($extension) - 1); - $catalogue->addCatalogue($loader->load($file->getPathname(), $catalogue->getLocale(), $domain)); - } - } - } -} diff --git a/vendor/symfony/translation/Reader/TranslationReaderInterface.php b/vendor/symfony/translation/Reader/TranslationReaderInterface.php deleted file mode 100644 index bab6e59..0000000 --- a/vendor/symfony/translation/Reader/TranslationReaderInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Reader; - -use Symfony\Component\Translation\MessageCatalogue; - -/** - * TranslationReader reads translation messages from translation files. - * - * @author Tobias Nyholm - */ -interface TranslationReaderInterface -{ - /** - * Reads translation messages from a directory to the catalogue. - */ - public function read(string $directory, MessageCatalogue $catalogue): void; -} diff --git a/vendor/symfony/translation/Resources/bin/translation-status.php b/vendor/symfony/translation/Resources/bin/translation-status.php deleted file mode 100644 index 42fa1c6..0000000 --- a/vendor/symfony/translation/Resources/bin/translation-status.php +++ /dev/null @@ -1,274 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if ('cli' !== \PHP_SAPI) { - throw new Exception('This script must be run from the command line.'); -} - -$usageInstructions = << false, - // NULL = analyze all locales - 'locale_to_analyze' => null, - // append --incomplete to only show incomplete languages - 'include_completed_languages' => true, - // the reference files all the other translations are compared to - 'original_files' => [ - 'src/Symfony/Component/Form/Resources/translations/validators.en.xlf', - 'src/Symfony/Component/Security/Core/Resources/translations/security.en.xlf', - 'src/Symfony/Component/Validator/Resources/translations/validators.en.xlf', - ], -]; - -$argc = $_SERVER['argc']; -$argv = $_SERVER['argv']; - -if ($argc > 4) { - echo str_replace('translation-status.php', $argv[0], $usageInstructions); - exit(1); -} - -foreach (array_slice($argv, 1) as $argumentOrOption) { - if ('--incomplete' === $argumentOrOption) { - $config['include_completed_languages'] = false; - continue; - } - - if (str_starts_with($argumentOrOption, '-')) { - $config['verbose_output'] = true; - } else { - $config['locale_to_analyze'] = $argumentOrOption; - } -} - -foreach ($config['original_files'] as $originalFilePath) { - if (!file_exists($originalFilePath)) { - echo sprintf('The following file does not exist. Make sure that you execute this command at the root dir of the Symfony code repository.%s %s', \PHP_EOL, $originalFilePath); - exit(1); - } -} - -$totalMissingTranslations = 0; -$totalTranslationMismatches = 0; - -foreach ($config['original_files'] as $originalFilePath) { - $translationFilePaths = findTranslationFiles($originalFilePath, $config['locale_to_analyze']); - $translationStatus = calculateTranslationStatus($originalFilePath, $translationFilePaths); - - $totalMissingTranslations += array_sum(array_map(fn ($translation) => count($translation['missingKeys']), array_values($translationStatus))); - $totalTranslationMismatches += array_sum(array_map(fn ($translation) => count($translation['mismatches']), array_values($translationStatus))); - - printTranslationStatus($originalFilePath, $translationStatus, $config['verbose_output'], $config['include_completed_languages']); -} - -exit($totalTranslationMismatches > 0 ? 1 : 0); - -function findTranslationFiles($originalFilePath, $localeToAnalyze): array -{ - $translations = []; - - $translationsDir = dirname($originalFilePath); - $originalFileName = basename($originalFilePath); - $translationFileNamePattern = str_replace('.en.', '.*.', $originalFileName); - - $translationFiles = glob($translationsDir.'/'.$translationFileNamePattern, \GLOB_NOSORT); - sort($translationFiles); - foreach ($translationFiles as $filePath) { - $locale = extractLocaleFromFilePath($filePath); - - if (null !== $localeToAnalyze && $locale !== $localeToAnalyze) { - continue; - } - - $translations[$locale] = $filePath; - } - - return $translations; -} - -function calculateTranslationStatus($originalFilePath, $translationFilePaths): array -{ - $translationStatus = []; - $allTranslationKeys = extractTranslationKeys($originalFilePath); - - foreach ($translationFilePaths as $locale => $translationPath) { - $translatedKeys = extractTranslationKeys($translationPath); - $missingKeys = array_diff_key($allTranslationKeys, $translatedKeys); - $mismatches = findTransUnitMismatches($allTranslationKeys, $translatedKeys); - - $translationStatus[$locale] = [ - 'total' => count($allTranslationKeys), - 'translated' => count($translatedKeys), - 'missingKeys' => $missingKeys, - 'mismatches' => $mismatches, - ]; - $translationStatus[$locale]['is_completed'] = isTranslationCompleted($translationStatus[$locale]); - } - - return $translationStatus; -} - -function isTranslationCompleted(array $translationStatus): bool -{ - return $translationStatus['total'] === $translationStatus['translated'] && 0 === count($translationStatus['mismatches']); -} - -function printTranslationStatus($originalFilePath, $translationStatus, $verboseOutput, $includeCompletedLanguages) -{ - printTitle($originalFilePath); - printTable($translationStatus, $verboseOutput, $includeCompletedLanguages); - echo \PHP_EOL.\PHP_EOL; -} - -function extractLocaleFromFilePath($filePath) -{ - $parts = explode('.', $filePath); - - return $parts[count($parts) - 2]; -} - -function extractTranslationKeys($filePath): array -{ - $translationKeys = []; - $contents = new SimpleXMLElement(file_get_contents($filePath)); - - foreach ($contents->file->body->{'trans-unit'} as $translationKey) { - $translationId = (string) $translationKey['id']; - $translationKey = (string) ($translationKey['resname'] ?? $translationKey->source); - - $translationKeys[$translationId] = $translationKey; - } - - return $translationKeys; -} - -/** - * Check whether the trans-unit id and source match with the base translation. - */ -function findTransUnitMismatches(array $baseTranslationKeys, array $translatedKeys): array -{ - $mismatches = []; - - foreach ($baseTranslationKeys as $translationId => $translationKey) { - if (!isset($translatedKeys[$translationId])) { - continue; - } - if ($translatedKeys[$translationId] !== $translationKey) { - $mismatches[$translationId] = [ - 'found' => $translatedKeys[$translationId], - 'expected' => $translationKey, - ]; - } - } - - return $mismatches; -} - -function printTitle($title) -{ - echo $title.\PHP_EOL; - echo str_repeat('=', strlen($title)).\PHP_EOL.\PHP_EOL; -} - -function printTable($translations, $verboseOutput, bool $includeCompletedLanguages) -{ - if (0 === count($translations)) { - echo 'No translations found'; - - return; - } - $longestLocaleNameLength = max(array_map('strlen', array_keys($translations))); - - foreach ($translations as $locale => $translation) { - if (!$includeCompletedLanguages && $translation['is_completed']) { - continue; - } - - if ($translation['translated'] > $translation['total']) { - textColorRed(); - } elseif (count($translation['mismatches']) > 0) { - textColorRed(); - } elseif ($translation['is_completed']) { - textColorGreen(); - } - - echo sprintf( - '| Locale: %-'.$longestLocaleNameLength.'s | Translated: %2d/%2d | Mismatches: %d |', - $locale, - $translation['translated'], - $translation['total'], - count($translation['mismatches']) - ).\PHP_EOL; - - textColorNormal(); - - $shouldBeClosed = false; - if (true === $verboseOutput && count($translation['missingKeys']) > 0) { - echo '| Missing Translations:'.\PHP_EOL; - - foreach ($translation['missingKeys'] as $id => $content) { - echo sprintf('| (id=%s) %s', $id, $content).\PHP_EOL; - } - $shouldBeClosed = true; - } - if (true === $verboseOutput && count($translation['mismatches']) > 0) { - echo '| Mismatches between trans-unit id and source:'.\PHP_EOL; - - foreach ($translation['mismatches'] as $id => $content) { - echo sprintf('| (id=%s) Expected: %s', $id, $content['expected']).\PHP_EOL; - echo sprintf('| Found: %s', $content['found']).\PHP_EOL; - } - $shouldBeClosed = true; - } - if ($shouldBeClosed) { - echo str_repeat('-', 80).\PHP_EOL; - } - } -} - -function textColorGreen() -{ - echo "\033[32m"; -} - -function textColorRed() -{ - echo "\033[31m"; -} - -function textColorNormal() -{ - echo "\033[0m"; -} diff --git a/vendor/symfony/translation/Resources/data/parents.json b/vendor/symfony/translation/Resources/data/parents.json deleted file mode 100644 index 24d4d11..0000000 --- a/vendor/symfony/translation/Resources/data/parents.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "az_Cyrl": "root", - "bs_Cyrl": "root", - "en_150": "en_001", - "en_AG": "en_001", - "en_AI": "en_001", - "en_AT": "en_150", - "en_AU": "en_001", - "en_BB": "en_001", - "en_BE": "en_150", - "en_BM": "en_001", - "en_BS": "en_001", - "en_BW": "en_001", - "en_BZ": "en_001", - "en_CC": "en_001", - "en_CH": "en_150", - "en_CK": "en_001", - "en_CM": "en_001", - "en_CX": "en_001", - "en_CY": "en_001", - "en_DE": "en_150", - "en_DG": "en_001", - "en_DK": "en_150", - "en_DM": "en_001", - "en_ER": "en_001", - "en_FI": "en_150", - "en_FJ": "en_001", - "en_FK": "en_001", - "en_FM": "en_001", - "en_GB": "en_001", - "en_GD": "en_001", - "en_GG": "en_001", - "en_GH": "en_001", - "en_GI": "en_001", - "en_GM": "en_001", - "en_GY": "en_001", - "en_HK": "en_001", - "en_ID": "en_001", - "en_IE": "en_001", - "en_IL": "en_001", - "en_IM": "en_001", - "en_IN": "en_001", - "en_IO": "en_001", - "en_JE": "en_001", - "en_JM": "en_001", - "en_KE": "en_001", - "en_KI": "en_001", - "en_KN": "en_001", - "en_KY": "en_001", - "en_LC": "en_001", - "en_LR": "en_001", - "en_LS": "en_001", - "en_MG": "en_001", - "en_MO": "en_001", - "en_MS": "en_001", - "en_MT": "en_001", - "en_MU": "en_001", - "en_MV": "en_001", - "en_MW": "en_001", - "en_MY": "en_001", - "en_NA": "en_001", - "en_NF": "en_001", - "en_NG": "en_001", - "en_NL": "en_150", - "en_NR": "en_001", - "en_NU": "en_001", - "en_NZ": "en_001", - "en_PG": "en_001", - "en_PK": "en_001", - "en_PN": "en_001", - "en_PW": "en_001", - "en_RW": "en_001", - "en_SB": "en_001", - "en_SC": "en_001", - "en_SD": "en_001", - "en_SE": "en_150", - "en_SG": "en_001", - "en_SH": "en_001", - "en_SI": "en_150", - "en_SL": "en_001", - "en_SS": "en_001", - "en_SX": "en_001", - "en_SZ": "en_001", - "en_TC": "en_001", - "en_TK": "en_001", - "en_TO": "en_001", - "en_TT": "en_001", - "en_TV": "en_001", - "en_TZ": "en_001", - "en_UG": "en_001", - "en_VC": "en_001", - "en_VG": "en_001", - "en_VU": "en_001", - "en_WS": "en_001", - "en_ZA": "en_001", - "en_ZM": "en_001", - "en_ZW": "en_001", - "es_AR": "es_419", - "es_BO": "es_419", - "es_BR": "es_419", - "es_BZ": "es_419", - "es_CL": "es_419", - "es_CO": "es_419", - "es_CR": "es_419", - "es_CU": "es_419", - "es_DO": "es_419", - "es_EC": "es_419", - "es_GT": "es_419", - "es_HN": "es_419", - "es_MX": "es_419", - "es_NI": "es_419", - "es_PA": "es_419", - "es_PE": "es_419", - "es_PR": "es_419", - "es_PY": "es_419", - "es_SV": "es_419", - "es_US": "es_419", - "es_UY": "es_419", - "es_VE": "es_419", - "ff_Adlm": "root", - "hi_Latn": "en_IN", - "ks_Deva": "root", - "nb": "no", - "nn": "no", - "pa_Arab": "root", - "pt_AO": "pt_PT", - "pt_CH": "pt_PT", - "pt_CV": "pt_PT", - "pt_GQ": "pt_PT", - "pt_GW": "pt_PT", - "pt_LU": "pt_PT", - "pt_MO": "pt_PT", - "pt_MZ": "pt_PT", - "pt_ST": "pt_PT", - "pt_TL": "pt_PT", - "sd_Deva": "root", - "sr_Latn": "root", - "uz_Arab": "root", - "uz_Cyrl": "root", - "zh_Hant": "root", - "zh_Hant_MO": "zh_Hant_HK" -} diff --git a/vendor/symfony/translation/Resources/functions.php b/vendor/symfony/translation/Resources/functions.php deleted file mode 100644 index 0d2a037..0000000 --- a/vendor/symfony/translation/Resources/functions.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -if (!\function_exists(t::class)) { - /** - * @author Nate Wiebe - */ - function t(string $message, array $parameters = [], ?string $domain = null): TranslatableMessage - { - return new TranslatableMessage($message, $parameters, $domain); - } -} diff --git a/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd b/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd deleted file mode 100644 index 1f38de7..0000000 --- a/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd +++ /dev/null @@ -1,2261 +0,0 @@ - - - - - - - - - - - - - - Values for the attribute 'context-type'. - - - - - Indicates a database content. - - - - - Indicates the content of an element within an XML document. - - - - - Indicates the name of an element within an XML document. - - - - - Indicates the line number from the sourcefile (see context-type="sourcefile") where the <source> is found. - - - - - Indicates a the number of parameters contained within the <source>. - - - - - Indicates notes pertaining to the parameters in the <source>. - - - - - Indicates the content of a record within a database. - - - - - Indicates the name of a record within a database. - - - - - Indicates the original source file in the case that multiple files are merged to form the original file from which the XLIFF file is created. This differs from the original <file> attribute in that this sourcefile is one of many that make up that file. - - - - - - - Values for the attribute 'count-type'. - - - - - Indicates the count units are items that are used X times in a certain context; example: this is a reusable text unit which is used 42 times in other texts. - - - - - Indicates the count units are translation units existing already in the same document. - - - - - Indicates a total count. - - - - - - - Values for the attribute 'ctype' when used other elements than <ph> or <x>. - - - - - Indicates a run of bolded text. - - - - - Indicates a run of text in italics. - - - - - Indicates a run of underlined text. - - - - - Indicates a run of hyper-text. - - - - - - - Values for the attribute 'ctype' when used with <ph> or <x>. - - - - - Indicates a inline image. - - - - - Indicates a page break. - - - - - Indicates a line break. - - - - - - - - - - - - Values for the attribute 'datatype'. - - - - - Indicates Active Server Page data. - - - - - Indicates C source file data. - - - - - Indicates Channel Definition Format (CDF) data. - - - - - Indicates ColdFusion data. - - - - - Indicates C++ source file data. - - - - - Indicates C-Sharp data. - - - - - Indicates strings from C, ASM, and driver files data. - - - - - Indicates comma-separated values data. - - - - - Indicates database data. - - - - - Indicates portions of document that follows data and contains metadata. - - - - - Indicates portions of document that precedes data and contains metadata. - - - - - Indicates data from standard UI file operations dialogs (e.g., Open, Save, Save As, Export, Import). - - - - - Indicates standard user input screen data. - - - - - Indicates HyperText Markup Language (HTML) data - document instance. - - - - - Indicates content within an HTML document’s <body> element. - - - - - Indicates Windows INI file data. - - - - - Indicates Interleaf data. - - - - - Indicates Java source file data (extension '.java'). - - - - - Indicates Java property resource bundle data. - - - - - Indicates Java list resource bundle data. - - - - - Indicates JavaScript source file data. - - - - - Indicates JScript source file data. - - - - - Indicates information relating to formatting. - - - - - Indicates LISP source file data. - - - - - Indicates information relating to margin formats. - - - - - Indicates a file containing menu. - - - - - Indicates numerically identified string table. - - - - - Indicates Maker Interchange Format (MIF) data. - - - - - Indicates that the datatype attribute value is a MIME Type value and is defined in the mime-type attribute. - - - - - Indicates GNU Machine Object data. - - - - - Indicates Message Librarian strings created by Novell's Message Librarian Tool. - - - - - Indicates information to be displayed at the bottom of each page of a document. - - - - - Indicates information to be displayed at the top of each page of a document. - - - - - Indicates a list of property values (e.g., settings within INI files or preferences dialog). - - - - - Indicates Pascal source file data. - - - - - Indicates Hypertext Preprocessor data. - - - - - Indicates plain text file (no formatting other than, possibly, wrapping). - - - - - Indicates GNU Portable Object file. - - - - - Indicates dynamically generated user defined document. e.g. Oracle Report, Crystal Report, etc. - - - - - Indicates Windows .NET binary resources. - - - - - Indicates Windows .NET Resources. - - - - - Indicates Rich Text Format (RTF) data. - - - - - Indicates Standard Generalized Markup Language (SGML) data - document instance. - - - - - Indicates Standard Generalized Markup Language (SGML) data - Document Type Definition (DTD). - - - - - Indicates Scalable Vector Graphic (SVG) data. - - - - - Indicates VisualBasic Script source file. - - - - - Indicates warning message. - - - - - Indicates Windows (Win32) resources (i.e. resources extracted from an RC script, a message file, or a compiled file). - - - - - Indicates Extensible HyperText Markup Language (XHTML) data - document instance. - - - - - Indicates Extensible Markup Language (XML) data - document instance. - - - - - Indicates Extensible Markup Language (XML) data - Document Type Definition (DTD). - - - - - Indicates Extensible Stylesheet Language (XSL) data. - - - - - Indicates XUL elements. - - - - - - - Values for the attribute 'mtype'. - - - - - Indicates the marked text is an abbreviation. - - - - - ISO-12620 2.1.8: A term resulting from the omission of any part of the full term while designating the same concept. - - - - - ISO-12620 2.1.8.1: An abbreviated form of a simple term resulting from the omission of some of its letters (e.g. 'adj.' for 'adjective'). - - - - - ISO-12620 2.1.8.4: An abbreviated form of a term made up of letters from the full form of a multiword term strung together into a sequence pronounced only syllabically (e.g. 'radar' for 'radio detecting and ranging'). - - - - - ISO-12620: A proper-name term, such as the name of an agency or other proper entity. - - - - - ISO-12620 2.1.18.1: A recurrent word combination characterized by cohesion in that the components of the collocation must co-occur within an utterance or series of utterances, even though they do not necessarily have to maintain immediate proximity to one another. - - - - - ISO-12620 2.1.5: A synonym for an international scientific term that is used in general discourse in a given language. - - - - - Indicates the marked text is a date and/or time. - - - - - ISO-12620 2.1.15: An expression used to represent a concept based on a statement that two mathematical expressions are, for instance, equal as identified by the equal sign (=), or assigned to one another by a similar sign. - - - - - ISO-12620 2.1.7: The complete representation of a term for which there is an abbreviated form. - - - - - ISO-12620 2.1.14: Figures, symbols or the like used to express a concept briefly, such as a mathematical or chemical formula. - - - - - ISO-12620 2.1.1: The concept designation that has been chosen to head a terminological record. - - - - - ISO-12620 2.1.8.3: An abbreviated form of a term consisting of some of the initial letters of the words making up a multiword term or the term elements making up a compound term when these letters are pronounced individually (e.g. 'BSE' for 'bovine spongiform encephalopathy'). - - - - - ISO-12620 2.1.4: A term that is part of an international scientific nomenclature as adopted by an appropriate scientific body. - - - - - ISO-12620 2.1.6: A term that has the same or nearly identical orthographic or phonemic form in many languages. - - - - - ISO-12620 2.1.16: An expression used to represent a concept based on mathematical or logical relations, such as statements of inequality, set relationships, Boolean operations, and the like. - - - - - ISO-12620 2.1.17: A unit to track object. - - - - - Indicates the marked text is a name. - - - - - ISO-12620 2.1.3: A term that represents the same or a very similar concept as another term in the same language, but for which interchangeability is limited to some contexts and inapplicable in others. - - - - - ISO-12620 2.1.17.2: A unique alphanumeric designation assigned to an object in a manufacturing system. - - - - - Indicates the marked text is a phrase. - - - - - ISO-12620 2.1.18: Any group of two or more words that form a unit, the meaning of which frequently cannot be deduced based on the combined sense of the words making up the phrase. - - - - - Indicates the marked text should not be translated. - - - - - ISO-12620 2.1.12: A form of a term resulting from an operation whereby non-Latin writing systems are converted to the Latin alphabet. - - - - - Indicates that the marked text represents a segment. - - - - - ISO-12620 2.1.18.2: A fixed, lexicalized phrase. - - - - - ISO-12620 2.1.8.2: A variant of a multiword term that includes fewer words than the full form of the term (e.g. 'Group of Twenty-four' for 'Intergovernmental Group of Twenty-four on International Monetary Affairs'). - - - - - ISO-12620 2.1.17.1: Stock keeping unit, an inventory item identified by a unique alphanumeric designation assigned to an object in an inventory control system. - - - - - ISO-12620 2.1.19: A fixed chunk of recurring text. - - - - - ISO-12620 2.1.13: A designation of a concept by letters, numerals, pictograms or any combination thereof. - - - - - ISO-12620 2.1.2: Any term that represents the same or a very similar concept as the main entry term in a term entry. - - - - - ISO-12620 2.1.18.3: Phraseological unit in a language that expresses the same semantic content as another phrase in that same language. - - - - - Indicates the marked text is a term. - - - - - ISO-12620 2.1.11: A form of a term resulting from an operation whereby the characters of one writing system are represented by characters from another writing system, taking into account the pronunciation of the characters converted. - - - - - ISO-12620 2.1.10: A form of a term resulting from an operation whereby the characters of an alphabetic writing system are represented by characters from another alphabetic writing system. - - - - - ISO-12620 2.1.8.5: An abbreviated form of a term resulting from the omission of one or more term elements or syllables (e.g. 'flu' for 'influenza'). - - - - - ISO-12620 2.1.9: One of the alternate forms of a term. - - - - - - - Values for the attribute 'restype'. - - - - - Indicates a Windows RC AUTO3STATE control. - - - - - Indicates a Windows RC AUTOCHECKBOX control. - - - - - Indicates a Windows RC AUTORADIOBUTTON control. - - - - - Indicates a Windows RC BEDIT control. - - - - - Indicates a bitmap, for example a BITMAP resource in Windows. - - - - - Indicates a button object, for example a BUTTON control Windows. - - - - - Indicates a caption, such as the caption of a dialog box. - - - - - Indicates the cell in a table, for example the content of the <td> element in HTML. - - - - - Indicates check box object, for example a CHECKBOX control in Windows. - - - - - Indicates a menu item with an associated checkbox. - - - - - Indicates a list box, but with a check-box for each item. - - - - - Indicates a color selection dialog. - - - - - Indicates a combination of edit box and listbox object, for example a COMBOBOX control in Windows. - - - - - Indicates an initialization entry of an extended combobox DLGINIT resource block. (code 0x1234). - - - - - Indicates an initialization entry of a combobox DLGINIT resource block (code 0x0403). - - - - - Indicates a UI base class element that cannot be represented by any other element. - - - - - Indicates a context menu. - - - - - Indicates a Windows RC CTEXT control. - - - - - Indicates a cursor, for example a CURSOR resource in Windows. - - - - - Indicates a date/time picker. - - - - - Indicates a Windows RC DEFPUSHBUTTON control. - - - - - Indicates a dialog box. - - - - - Indicates a Windows RC DLGINIT resource block. - - - - - Indicates an edit box object, for example an EDIT control in Windows. - - - - - Indicates a filename. - - - - - Indicates a file dialog. - - - - - Indicates a footnote. - - - - - Indicates a font name. - - - - - Indicates a footer. - - - - - Indicates a frame object. - - - - - Indicates a XUL grid element. - - - - - Indicates a groupbox object, for example a GROUPBOX control in Windows. - - - - - Indicates a header item. - - - - - Indicates a heading, such has the content of <h1>, <h2>, etc. in HTML. - - - - - Indicates a Windows RC HEDIT control. - - - - - Indicates a horizontal scrollbar. - - - - - Indicates an icon, for example an ICON resource in Windows. - - - - - Indicates a Windows RC IEDIT control. - - - - - Indicates keyword list, such as the content of the Keywords meta-data in HTML, or a K footnote in WinHelp RTF. - - - - - Indicates a label object. - - - - - Indicates a label that is also a HTML link (not necessarily a URL). - - - - - Indicates a list (a group of list-items, for example an <ol> or <ul> element in HTML). - - - - - Indicates a listbox object, for example an LISTBOX control in Windows. - - - - - Indicates an list item (an entry in a list). - - - - - Indicates a Windows RC LTEXT control. - - - - - Indicates a menu (a group of menu-items). - - - - - Indicates a toolbar containing one or more tope level menus. - - - - - Indicates a menu item (an entry in a menu). - - - - - Indicates a XUL menuseparator element. - - - - - Indicates a message, for example an entry in a MESSAGETABLE resource in Windows. - - - - - Indicates a calendar control. - - - - - Indicates an edit box beside a spin control. - - - - - Indicates a catch all for rectangular areas. - - - - - Indicates a standalone menu not necessarily associated with a menubar. - - - - - Indicates a pushbox object, for example a PUSHBOX control in Windows. - - - - - Indicates a Windows RC PUSHBUTTON control. - - - - - Indicates a radio button object. - - - - - Indicates a menuitem with associated radio button. - - - - - Indicates raw data resources for an application. - - - - - Indicates a row in a table. - - - - - Indicates a Windows RC RTEXT control. - - - - - Indicates a user navigable container used to show a portion of a document. - - - - - Indicates a generic divider object (e.g. menu group separator). - - - - - Windows accelerators, shortcuts in resource or property files. - - - - - Indicates a UI control to indicate process activity but not progress. - - - - - Indicates a splitter bar. - - - - - Indicates a Windows RC STATE3 control. - - - - - Indicates a window for providing feedback to the users, like 'read-only', etc. - - - - - Indicates a string, for example an entry in a STRINGTABLE resource in Windows. - - - - - Indicates a layers of controls with a tab to select layers. - - - - - Indicates a display and edits regular two-dimensional tables of cells. - - - - - Indicates a XUL textbox element. - - - - - Indicates a UI button that can be toggled to on or off state. - - - - - Indicates an array of controls, usually buttons. - - - - - Indicates a pop up tool tip text. - - - - - Indicates a bar with a pointer indicating a position within a certain range. - - - - - Indicates a control that displays a set of hierarchical data. - - - - - Indicates a URI (URN or URL). - - - - - Indicates a Windows RC USERBUTTON control. - - - - - Indicates a user-defined control like CONTROL control in Windows. - - - - - Indicates the text of a variable. - - - - - Indicates version information about a resource like VERSIONINFO in Windows. - - - - - Indicates a vertical scrollbar. - - - - - Indicates a graphical window. - - - - - - - Values for the attribute 'size-unit'. - - - - - Indicates a size in 8-bit bytes. - - - - - Indicates a size in Unicode characters. - - - - - Indicates a size in columns. Used for HTML text area. - - - - - Indicates a size in centimeters. - - - - - Indicates a size in dialog units, as defined in Windows resources. - - - - - Indicates a size in 'font-size' units (as defined in CSS). - - - - - Indicates a size in 'x-height' units (as defined in CSS). - - - - - Indicates a size in glyphs. A glyph is considered to be one or more combined Unicode characters that represent a single displayable text character. Sometimes referred to as a 'grapheme cluster' - - - - - Indicates a size in inches. - - - - - Indicates a size in millimeters. - - - - - Indicates a size in percentage. - - - - - Indicates a size in pixels. - - - - - Indicates a size in point. - - - - - Indicates a size in rows. Used for HTML text area. - - - - - - - Values for the attribute 'state'. - - - - - Indicates the terminating state. - - - - - Indicates only non-textual information needs adaptation. - - - - - Indicates both text and non-textual information needs adaptation. - - - - - Indicates only non-textual information needs review. - - - - - Indicates both text and non-textual information needs review. - - - - - Indicates that only the text of the item needs to be reviewed. - - - - - Indicates that the item needs to be translated. - - - - - Indicates that the item is new. For example, translation units that were not in a previous version of the document. - - - - - Indicates that changes are reviewed and approved. - - - - - Indicates that the item has been translated. - - - - - - - Values for the attribute 'state-qualifier'. - - - - - Indicates an exact match. An exact match occurs when a source text of a segment is exactly the same as the source text of a segment that was translated previously. - - - - - Indicates a fuzzy match. A fuzzy match occurs when a source text of a segment is very similar to the source text of a segment that was translated previously (e.g. when the difference is casing, a few changed words, white-space discripancy, etc.). - - - - - Indicates a match based on matching IDs (in addition to matching text). - - - - - Indicates a translation derived from a glossary. - - - - - Indicates a translation derived from existing translation. - - - - - Indicates a translation derived from machine translation. - - - - - Indicates a translation derived from a translation repository. - - - - - Indicates a translation derived from a translation memory. - - - - - Indicates the translation is suggested by machine translation. - - - - - Indicates that the item has been rejected because of incorrect grammar. - - - - - Indicates that the item has been rejected because it is incorrect. - - - - - Indicates that the item has been rejected because it is too long or too short. - - - - - Indicates that the item has been rejected because of incorrect spelling. - - - - - Indicates the translation is suggested by translation memory. - - - - - - - Values for the attribute 'unit'. - - - - - Refers to words. - - - - - Refers to pages. - - - - - Refers to <trans-unit> elements. - - - - - Refers to <bin-unit> elements. - - - - - Refers to glyphs. - - - - - Refers to <trans-unit> and/or <bin-unit> elements. - - - - - Refers to the occurrences of instances defined by the count-type value. - - - - - Refers to characters. - - - - - Refers to lines. - - - - - Refers to sentences. - - - - - Refers to paragraphs. - - - - - Refers to segments. - - - - - Refers to placeables (inline elements). - - - - - - - Values for the attribute 'priority'. - - - - - Highest priority. - - - - - High priority. - - - - - High priority, but not as important as 2. - - - - - High priority, but not as important as 3. - - - - - Medium priority, but more important than 6. - - - - - Medium priority, but less important than 5. - - - - - Low priority, but more important than 8. - - - - - Low priority, but more important than 9. - - - - - Low priority. - - - - - Lowest priority. - - - - - - - - - This value indicates that all properties can be reformatted. This value must be used alone. - - - - - This value indicates that no properties should be reformatted. This value must be used alone. - - - - - - - - - - - - - This value indicates that all information in the coord attribute can be modified. - - - - - This value indicates that the x information in the coord attribute can be modified. - - - - - This value indicates that the y information in the coord attribute can be modified. - - - - - This value indicates that the cx information in the coord attribute can be modified. - - - - - This value indicates that the cy information in the coord attribute can be modified. - - - - - This value indicates that all the information in the font attribute can be modified. - - - - - This value indicates that the name information in the font attribute can be modified. - - - - - This value indicates that the size information in the font attribute can be modified. - - - - - This value indicates that the weight information in the font attribute can be modified. - - - - - This value indicates that the information in the css-style attribute can be modified. - - - - - This value indicates that the information in the style attribute can be modified. - - - - - This value indicates that the information in the exstyle attribute can be modified. - - - - - - - - - - - - - Indicates that the context is informational in nature, specifying for example, how a term should be translated. Thus, should be displayed to anyone editing the XLIFF document. - - - - - Indicates that the context-group is used to specify where the term was found in the translatable source. Thus, it is not displayed. - - - - - Indicates that the context information should be used during translation memory lookups. Thus, it is not displayed. - - - - - - - - - Represents a translation proposal from a translation memory or other resource. - - - - - Represents a previous version of the target element. - - - - - Represents a rejected version of the target element. - - - - - Represents a translation to be used for reference purposes only, for example from a related product or a different language. - - - - - Represents a proposed translation that was used for the translation of the trans-unit, possibly modified. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Values for the attribute 'coord'. - - - - - - - - Version values: 1.0 and 1.1 are allowed for backward compatibility. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd b/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd deleted file mode 100644 index 963232f..0000000 --- a/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/symfony/translation/Resources/schemas/xml.xsd b/vendor/symfony/translation/Resources/schemas/xml.xsd deleted file mode 100644 index a46162a..0000000 --- a/vendor/symfony/translation/Resources/schemas/xml.xsd +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - -
-

About the XML namespace

- -
-

- - This schema document describes the XML namespace, in a form - suitable for import by other schema documents. -

-

- See - http://www.w3.org/XML/1998/namespace.html and - - http://www.w3.org/TR/REC-xml for information - about this namespace. -

- -

- Note that local names in this namespace are intended to be - defined only by the World Wide Web Consortium or its subgroups. - The names currently defined in this namespace are listed below. - They should not be used with conflicting semantics by any Working - Group, specification, or document instance. -

-

- See further below in this document for more information about how to refer to this schema document from your own - XSD schema documents and about the - namespace-versioning policy governing this schema document. -

-
-
- -
-
- - - - -
- -

lang (as an attribute name)

-

- - denotes an attribute whose value - is a language code for the natural language of the content of - any element; its value is inherited. This name is reserved - by virtue of its definition in the XML specification.

- -
-
-

Notes

-

- Attempting to install the relevant ISO 2- and 3-letter - codes as the enumerated possible values is probably never - going to be a realistic possibility. -

-

- - See BCP 47 at - http://www.rfc-editor.org/rfc/bcp/bcp47.txt - and the IANA language subtag registry at - - http://www.iana.org/assignments/language-subtag-registry - for further information. -

-

- - The union allows for the 'un-declaration' of xml:lang with - the empty string. -

-
-
-
- - - - - - - - - - -
- - - - - -
- -

space (as an attribute name)

-

- denotes an attribute whose - value is a keyword indicating what whitespace processing - discipline is intended for the content of the element; its - value is inherited. This name is reserved by virtue of its - definition in the XML specification.

- -
-
-
- - - - - - - -
- - - - -
- -

base (as an attribute name)

-

- denotes an attribute whose value - provides a URI to be used as the base for interpreting any - relative URIs in the scope of the element on which it - appears; its value is inherited. This name is reserved - by virtue of its definition in the XML Base specification.

- -

- See http://www.w3.org/TR/xmlbase/ - for information about this attribute. -

- -
-
-
-
- - - - -
- -

id (as an attribute name)

-

- - denotes an attribute whose value - should be interpreted as if declared to be of type ID. - This name is reserved by virtue of its definition in the - xml:id specification.

- -

- See http://www.w3.org/TR/xml-id/ - for information about this attribute. -

-
-
-
- -
- - - - - - - - - - - -
- -

Father (in any context at all)

- -
-

- denotes Jon Bosak, the chair of - the original XML Working Group. This name is reserved by - the following decision of the W3C XML Plenary and - XML Coordination groups: -

-
-

- - In appreciation for his vision, leadership and - dedication the W3C XML Plenary on this 10th day of - February, 2000, reserves for Jon Bosak in perpetuity - the XML name "xml:Father". -

-
-
-
-
-
- - - - -
-

About this schema document

- -
-

- This schema defines attributes and an attribute group suitable - for use by schemas wishing to allow xml:base, - xml:lang, xml:space or - xml:id attributes on elements they define. -

- -

- To enable this, such a schema must import this schema for - the XML namespace, e.g. as follows: -

-
-          <schema.. .>
-          .. .
-           <import namespace="http://www.w3.org/XML/1998/namespace"
-                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
-     
-

- or -

-
-
-           <import namespace="http://www.w3.org/XML/1998/namespace"
-                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
-     
-

- Subsequently, qualified reference to any of the attributes or the - group defined below will have the desired effect, e.g. -

-
-          <type.. .>
-          .. .
-           <attributeGroup ref="xml:specialAttrs"/>
-     
-

- will define a type which will schema-validate an instance element - with any of those attributes. -

- -
-
-
-
- - - -
-

Versioning policy for this schema document

- -
-

- In keeping with the XML Schema WG's standard versioning - policy, this schema document will persist at - - http://www.w3.org/2009/01/xml.xsd. -

-

- At the date of issue it can also be found at - - http://www.w3.org/2001/xml.xsd. -

- -

- The schema document at that URI may however change in the future, - in order to remain compatible with the latest version of XML - Schema itself, or with the XML namespace itself. In other words, - if the XML Schema or XML namespaces change, the version of this - document at - http://www.w3.org/2001/xml.xsd - - will change accordingly; the version at - - http://www.w3.org/2009/01/xml.xsd - - will not change. -

-

- - Previous dated (and unchanging) versions of this schema - document are at: -

- -
-
-
-
- -
diff --git a/vendor/symfony/translation/Test/AbstractProviderFactoryTestCase.php b/vendor/symfony/translation/Test/AbstractProviderFactoryTestCase.php deleted file mode 100644 index 75e7dd2..0000000 --- a/vendor/symfony/translation/Test/AbstractProviderFactoryTestCase.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Test; - -use PHPUnit\Framework\Attributes\DataProvider; -use PHPUnit\Framework\TestCase; -use Symfony\Component\Translation\Exception\UnsupportedSchemeException; -use Symfony\Component\Translation\Provider\Dsn; -use Symfony\Component\Translation\Provider\ProviderFactoryInterface; - -abstract class AbstractProviderFactoryTestCase extends TestCase -{ - abstract public function createFactory(): ProviderFactoryInterface; - - /** - * @return iterable - */ - abstract public static function supportsProvider(): iterable; - - /** - * @return iterable - */ - abstract public static function createProvider(): iterable; - - /** - * @return iterable - */ - abstract public static function unsupportedSchemeProvider(): iterable; - - /** - * @dataProvider supportsProvider - */ - #[DataProvider('supportsProvider')] - public function testSupports(bool $expected, string $dsn) - { - $factory = $this->createFactory(); - - $this->assertSame($expected, $factory->supports(new Dsn($dsn))); - } - - /** - * @dataProvider createProvider - */ - #[DataProvider('createProvider')] - public function testCreate(string $expected, string $dsn) - { - $factory = $this->createFactory(); - $provider = $factory->create(new Dsn($dsn)); - - $this->assertSame($expected, (string) $provider); - } - - /** - * @dataProvider unsupportedSchemeProvider - */ - #[DataProvider('unsupportedSchemeProvider')] - public function testUnsupportedSchemeException(string $dsn, ?string $message = null) - { - $factory = $this->createFactory(); - - $dsn = new Dsn($dsn); - - $this->expectException(UnsupportedSchemeException::class); - if (null !== $message) { - $this->expectExceptionMessage($message); - } - - $factory->create($dsn); - } -} diff --git a/vendor/symfony/translation/Test/IncompleteDsnTestTrait.php b/vendor/symfony/translation/Test/IncompleteDsnTestTrait.php deleted file mode 100644 index 892f6bf..0000000 --- a/vendor/symfony/translation/Test/IncompleteDsnTestTrait.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Test; - -use PHPUnit\Framework\Attributes\DataProvider; -use Symfony\Component\Translation\Exception\IncompleteDsnException; -use Symfony\Component\Translation\Provider\Dsn; - -trait IncompleteDsnTestTrait -{ - /** - * @return iterable - */ - abstract public static function incompleteDsnProvider(): iterable; - - /** - * @dataProvider incompleteDsnProvider - */ - #[DataProvider('incompleteDsnProvider')] - public function testIncompleteDsnException(string $dsn, ?string $message = null) - { - $factory = $this->createFactory(); - - $dsn = new Dsn($dsn); - - $this->expectException(IncompleteDsnException::class); - if (null !== $message) { - $this->expectExceptionMessage($message); - } - - $factory->create($dsn); - } -} diff --git a/vendor/symfony/translation/Test/ProviderFactoryTestCase.php b/vendor/symfony/translation/Test/ProviderFactoryTestCase.php deleted file mode 100644 index e82f329..0000000 --- a/vendor/symfony/translation/Test/ProviderFactoryTestCase.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Test; - -use PHPUnit\Framework\MockObject\MockObject; -use Psr\Log\LoggerInterface; -use Symfony\Component\HttpClient\MockHttpClient; -use Symfony\Component\Translation\Dumper\XliffFileDumper; -use Symfony\Component\Translation\Loader\LoaderInterface; -use Symfony\Component\Translation\TranslatorBagInterface; -use Symfony\Contracts\HttpClient\HttpClientInterface; - -/** - * A test case to ease testing a translation provider factory. - * - * @author Mathieu Santostefano - * - * @deprecated since Symfony 7.2, use AbstractProviderFactoryTestCase instead - */ -abstract class ProviderFactoryTestCase extends AbstractProviderFactoryTestCase -{ - use IncompleteDsnTestTrait; - - protected HttpClientInterface $client; - protected LoggerInterface|MockObject $logger; - protected string $defaultLocale; - protected LoaderInterface|MockObject $loader; - protected XliffFileDumper|MockObject $xliffFileDumper; - protected TranslatorBagInterface|MockObject $translatorBag; - - /** - * @return iterable - */ - public static function unsupportedSchemeProvider(): iterable - { - return []; - } - - /** - * @return iterable - */ - public static function incompleteDsnProvider(): iterable - { - return []; - } - - protected function getClient(): HttpClientInterface - { - return $this->client ??= new MockHttpClient(); - } - - protected function getLogger(): LoggerInterface - { - return $this->logger ??= $this->createMock(LoggerInterface::class); - } - - protected function getDefaultLocale(): string - { - return $this->defaultLocale ??= 'en'; - } - - protected function getLoader(): LoaderInterface - { - return $this->loader ??= $this->createMock(LoaderInterface::class); - } - - protected function getXliffFileDumper(): XliffFileDumper - { - return $this->xliffFileDumper ??= $this->createMock(XliffFileDumper::class); - } - - protected function getTranslatorBag(): TranslatorBagInterface - { - return $this->translatorBag ??= $this->createMock(TranslatorBagInterface::class); - } -} diff --git a/vendor/symfony/translation/Test/ProviderTestCase.php b/vendor/symfony/translation/Test/ProviderTestCase.php deleted file mode 100644 index 7907986..0000000 --- a/vendor/symfony/translation/Test/ProviderTestCase.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Test; - -use PHPUnit\Framework\Attributes\DataProvider; -use PHPUnit\Framework\MockObject\MockObject; -use PHPUnit\Framework\TestCase; -use Psr\Log\LoggerInterface; -use Symfony\Component\HttpClient\MockHttpClient; -use Symfony\Component\Translation\Dumper\XliffFileDumper; -use Symfony\Component\Translation\Loader\LoaderInterface; -use Symfony\Component\Translation\Provider\ProviderInterface; -use Symfony\Component\Translation\TranslatorBagInterface; -use Symfony\Contracts\HttpClient\HttpClientInterface; - -/** - * A test case to ease testing a translation provider. - * - * @author Mathieu Santostefano - */ -abstract class ProviderTestCase extends TestCase -{ - protected HttpClientInterface $client; - protected LoggerInterface|MockObject $logger; - protected string $defaultLocale; - protected LoaderInterface|MockObject $loader; - protected XliffFileDumper|MockObject $xliffFileDumper; - protected TranslatorBagInterface|MockObject $translatorBag; - - abstract public static function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint): ProviderInterface; - - /** - * @return iterable - */ - abstract public static function toStringProvider(): iterable; - - /** - * @dataProvider toStringProvider - */ - #[DataProvider('toStringProvider')] - public function testToString(ProviderInterface $provider, string $expected) - { - $this->assertSame($expected, (string) $provider); - } - - protected function getClient(): MockHttpClient - { - return $this->client ??= new MockHttpClient(); - } - - protected function getLoader(): LoaderInterface - { - return $this->loader ??= $this->createMock(LoaderInterface::class); - } - - protected function getLogger(): LoggerInterface - { - return $this->logger ??= $this->createMock(LoggerInterface::class); - } - - protected function getDefaultLocale(): string - { - return $this->defaultLocale ??= 'en'; - } - - protected function getXliffFileDumper(): XliffFileDumper - { - return $this->xliffFileDumper ??= $this->createMock(XliffFileDumper::class); - } - - protected function getTranslatorBag(): TranslatorBagInterface - { - return $this->translatorBag ??= $this->createMock(TranslatorBagInterface::class); - } -} diff --git a/vendor/symfony/translation/TranslatableMessage.php b/vendor/symfony/translation/TranslatableMessage.php deleted file mode 100644 index 74b77f6..0000000 --- a/vendor/symfony/translation/TranslatableMessage.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Symfony\Contracts\Translation\TranslatableInterface; -use Symfony\Contracts\Translation\TranslatorInterface; - -/** - * @author Nate Wiebe - */ -class TranslatableMessage implements TranslatableInterface -{ - public function __construct( - private string $message, - private array $parameters = [], - private ?string $domain = null, - ) { - } - - public function __toString(): string - { - return $this->getMessage(); - } - - public function getMessage(): string - { - return $this->message; - } - - public function getParameters(): array - { - return $this->parameters; - } - - public function getDomain(): ?string - { - return $this->domain; - } - - public function trans(TranslatorInterface $translator, ?string $locale = null): string - { - return $translator->trans($this->getMessage(), array_map( - static fn ($parameter) => $parameter instanceof TranslatableInterface ? $parameter->trans($translator, $locale) : $parameter, - $this->getParameters() - ), $this->getDomain(), $locale); - } -} diff --git a/vendor/symfony/translation/Translator.php b/vendor/symfony/translation/Translator.php deleted file mode 100644 index 7c0a458..0000000 --- a/vendor/symfony/translation/Translator.php +++ /dev/null @@ -1,445 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Symfony\Component\Config\ConfigCacheFactory; -use Symfony\Component\Config\ConfigCacheFactoryInterface; -use Symfony\Component\Config\ConfigCacheInterface; -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\Exception\RuntimeException; -use Symfony\Component\Translation\Formatter\IntlFormatterInterface; -use Symfony\Component\Translation\Formatter\MessageFormatter; -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; -use Symfony\Component\Translation\Loader\LoaderInterface; -use Symfony\Contracts\Translation\LocaleAwareInterface; -use Symfony\Contracts\Translation\TranslatableInterface; -use Symfony\Contracts\Translation\TranslatorInterface; - -// Help opcache.preload discover always-needed symbols -class_exists(MessageCatalogue::class); - -/** - * @author Fabien Potencier - */ -class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface -{ - /** - * @var MessageCatalogueInterface[] - */ - protected array $catalogues = []; - - private string $locale; - - /** - * @var string[] - */ - private array $fallbackLocales = []; - - /** - * @var LoaderInterface[] - */ - private array $loaders = []; - - private array $resources = []; - - private MessageFormatterInterface $formatter; - - private ?ConfigCacheFactoryInterface $configCacheFactory; - - private array $parentLocales; - - private bool $hasIntlFormatter; - - /** - * @throws InvalidArgumentException If a locale contains invalid characters - */ - public function __construct( - string $locale, - ?MessageFormatterInterface $formatter = null, - private ?string $cacheDir = null, - private bool $debug = false, - private array $cacheVary = [], - ) { - $this->setLocale($locale); - - $this->formatter = $formatter ??= new MessageFormatter(); - $this->hasIntlFormatter = $formatter instanceof IntlFormatterInterface; - } - - public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory): void - { - $this->configCacheFactory = $configCacheFactory; - } - - /** - * Adds a Loader. - * - * @param string $format The name of the loader (@see addResource()) - */ - public function addLoader(string $format, LoaderInterface $loader): void - { - $this->loaders[$format] = $loader; - } - - /** - * Adds a Resource. - * - * @param string $format The name of the loader (@see addLoader()) - * @param mixed $resource The resource name - * - * @throws InvalidArgumentException If the locale contains invalid characters - */ - public function addResource(string $format, mixed $resource, string $locale, ?string $domain = null): void - { - $domain ??= 'messages'; - - $this->assertValidLocale($locale); - $locale ?: $locale = class_exists(\Locale::class) ? \Locale::getDefault() : 'en'; - - $this->resources[$locale][] = [$format, $resource, $domain]; - - if (\in_array($locale, $this->fallbackLocales, true)) { - $this->catalogues = []; - } else { - unset($this->catalogues[$locale]); - } - } - - public function setLocale(string $locale): void - { - $this->assertValidLocale($locale); - $this->locale = $locale; - } - - public function getLocale(): string - { - return $this->locale ?: (class_exists(\Locale::class) ? \Locale::getDefault() : 'en'); - } - - /** - * Sets the fallback locales. - * - * @param string[] $locales - * - * @throws InvalidArgumentException If a locale contains invalid characters - */ - public function setFallbackLocales(array $locales): void - { - // needed as the fallback locales are linked to the already loaded catalogues - $this->catalogues = []; - - foreach ($locales as $locale) { - $this->assertValidLocale($locale); - } - - $this->fallbackLocales = $this->cacheVary['fallback_locales'] = $locales; - } - - /** - * Gets the fallback locales. - * - * @internal - */ - public function getFallbackLocales(): array - { - return $this->fallbackLocales; - } - - public function trans(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string - { - if (null === $id || '' === $id) { - return ''; - } - - $domain ??= 'messages'; - - $catalogue = $this->getCatalogue($locale); - $locale = $catalogue->getLocale(); - while (!$catalogue->defines($id, $domain)) { - if ($cat = $catalogue->getFallbackCatalogue()) { - $catalogue = $cat; - $locale = $catalogue->getLocale(); - } else { - break; - } - } - - $parameters = array_map(fn ($parameter) => $parameter instanceof TranslatableInterface ? $parameter->trans($this, $locale) : $parameter, $parameters); - - $len = \strlen(MessageCatalogue::INTL_DOMAIN_SUFFIX); - if ($this->hasIntlFormatter - && ($catalogue->defines($id, $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX) - || (\strlen($domain) > $len && 0 === substr_compare($domain, MessageCatalogue::INTL_DOMAIN_SUFFIX, -$len, $len))) - ) { - return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, $parameters); - } - - return $this->formatter->format($catalogue->get($id, $domain), $locale, $parameters); - } - - public function getCatalogue(?string $locale = null): MessageCatalogueInterface - { - if (!$locale) { - $locale = $this->getLocale(); - } else { - $this->assertValidLocale($locale); - } - - if (!isset($this->catalogues[$locale])) { - $this->loadCatalogue($locale); - } - - return $this->catalogues[$locale]; - } - - public function getCatalogues(): array - { - return array_values($this->catalogues); - } - - /** - * Gets the loaders. - * - * @return LoaderInterface[] - */ - protected function getLoaders(): array - { - return $this->loaders; - } - - protected function loadCatalogue(string $locale): void - { - if (null === $this->cacheDir) { - $this->initializeCatalogue($locale); - } else { - $this->initializeCacheCatalogue($locale); - } - } - - protected function initializeCatalogue(string $locale): void - { - $this->assertValidLocale($locale); - - try { - $this->doLoadCatalogue($locale); - } catch (NotFoundResourceException $e) { - if (!$this->computeFallbackLocales($locale)) { - throw $e; - } - } - $this->loadFallbackCatalogues($locale); - } - - private function initializeCacheCatalogue(string $locale): void - { - if (isset($this->catalogues[$locale])) { - /* Catalogue already initialized. */ - return; - } - - $this->assertValidLocale($locale); - $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale), - function (ConfigCacheInterface $cache) use ($locale) { - $this->dumpCatalogue($locale, $cache); - } - ); - - if (isset($this->catalogues[$locale])) { - /* Catalogue has been initialized as it was written out to cache. */ - return; - } - - /* Read catalogue from cache. */ - $this->catalogues[$locale] = include $cache->getPath(); - } - - private function dumpCatalogue(string $locale, ConfigCacheInterface $cache): void - { - $this->initializeCatalogue($locale); - $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]); - - $content = \sprintf(<<getAllMessages($this->catalogues[$locale]), true), - $fallbackContent - ); - - $cache->write($content, $this->catalogues[$locale]->getResources()); - } - - private function getFallbackContent(MessageCatalogue $catalogue): string - { - $fallbackContent = ''; - $current = ''; - $replacementPattern = '/[^a-z0-9_]/i'; - $fallbackCatalogue = $catalogue->getFallbackCatalogue(); - while ($fallbackCatalogue) { - $fallback = $fallbackCatalogue->getLocale(); - $fallbackSuffix = ucfirst(preg_replace($replacementPattern, '_', $fallback)); - $currentSuffix = ucfirst(preg_replace($replacementPattern, '_', $current)); - - $fallbackContent .= \sprintf(<<<'EOF' -$catalogue%s = new MessageCatalogue('%s', %s); -$catalogue%s->addFallbackCatalogue($catalogue%s); - -EOF - , - $fallbackSuffix, - $fallback, - var_export($this->getAllMessages($fallbackCatalogue), true), - $currentSuffix, - $fallbackSuffix - ); - $current = $fallbackCatalogue->getLocale(); - $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); - } - - return $fallbackContent; - } - - private function getCatalogueCachePath(string $locale): string - { - return $this->cacheDir.'/catalogue.'.$locale.'.'.strtr(substr(base64_encode(hash('xxh128', serialize($this->cacheVary), true)), 0, 7), '/', '_').'.php'; - } - - /** - * @internal - */ - protected function doLoadCatalogue(string $locale): void - { - $this->catalogues[$locale] = new MessageCatalogue($locale); - - if (isset($this->resources[$locale])) { - foreach ($this->resources[$locale] as $resource) { - if (!isset($this->loaders[$resource[0]])) { - if (\is_string($resource[1])) { - throw new RuntimeException(\sprintf('No loader is registered for the "%s" format when loading the "%s" resource.', $resource[0], $resource[1])); - } - - throw new RuntimeException(\sprintf('No loader is registered for the "%s" format.', $resource[0])); - } - $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2])); - } - } - } - - private function loadFallbackCatalogues(string $locale): void - { - $current = $this->catalogues[$locale]; - - foreach ($this->computeFallbackLocales($locale) as $fallback) { - if (!isset($this->catalogues[$fallback])) { - $this->initializeCatalogue($fallback); - } - - $fallbackCatalogue = new MessageCatalogue($fallback, $this->getAllMessages($this->catalogues[$fallback])); - foreach ($this->catalogues[$fallback]->getResources() as $resource) { - $fallbackCatalogue->addResource($resource); - } - $current->addFallbackCatalogue($fallbackCatalogue); - $current = $fallbackCatalogue; - } - } - - protected function computeFallbackLocales(string $locale): array - { - $this->parentLocales ??= json_decode(file_get_contents(__DIR__.'/Resources/data/parents.json'), true); - - $originLocale = $locale; - $locales = []; - - while ($locale) { - $parent = $this->parentLocales[$locale] ?? null; - - if ($parent) { - $locale = 'root' !== $parent ? $parent : null; - } elseif (\function_exists('locale_parse')) { - $localeSubTags = locale_parse($locale); - $locale = null; - if (1 < \count($localeSubTags)) { - array_pop($localeSubTags); - $locale = locale_compose($localeSubTags) ?: null; - } - } elseif ($i = strrpos($locale, '_') ?: strrpos($locale, '-')) { - $locale = substr($locale, 0, $i); - } else { - $locale = null; - } - - if (null !== $locale) { - $locales[] = $locale; - } - } - - foreach ($this->fallbackLocales as $fallback) { - if ($fallback === $originLocale) { - continue; - } - - $locales[] = $fallback; - } - - return array_unique($locales); - } - - /** - * Asserts that the locale is valid, throws an Exception if not. - * - * @throws InvalidArgumentException If the locale contains invalid characters - */ - protected function assertValidLocale(string $locale): void - { - if (!preg_match('/^[a-z0-9@_\\.\\-]*$/i', $locale)) { - throw new InvalidArgumentException(\sprintf('Invalid "%s" locale.', $locale)); - } - } - - /** - * Provides the ConfigCache factory implementation, falling back to a - * default implementation if necessary. - */ - private function getConfigCacheFactory(): ConfigCacheFactoryInterface - { - $this->configCacheFactory ??= new ConfigCacheFactory($this->debug); - - return $this->configCacheFactory; - } - - private function getAllMessages(MessageCatalogueInterface $catalogue): array - { - $allMessages = []; - - foreach ($catalogue->all() as $domain => $messages) { - if ($intlMessages = $catalogue->all($domain.MessageCatalogue::INTL_DOMAIN_SUFFIX)) { - $allMessages[$domain.MessageCatalogue::INTL_DOMAIN_SUFFIX] = $intlMessages; - $messages = array_diff_key($messages, $intlMessages); - } - if ($messages) { - $allMessages[$domain] = $messages; - } - } - - return $allMessages; - } -} diff --git a/vendor/symfony/translation/TranslatorBag.php b/vendor/symfony/translation/TranslatorBag.php deleted file mode 100644 index 3b47aec..0000000 --- a/vendor/symfony/translation/TranslatorBag.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Symfony\Component\Translation\Catalogue\AbstractOperation; -use Symfony\Component\Translation\Catalogue\TargetOperation; - -final class TranslatorBag implements TranslatorBagInterface -{ - /** @var MessageCatalogue[] */ - private array $catalogues = []; - - public function addCatalogue(MessageCatalogue $catalogue): void - { - if (null !== $existingCatalogue = $this->getCatalogue($catalogue->getLocale())) { - $catalogue->addCatalogue($existingCatalogue); - } - - $this->catalogues[$catalogue->getLocale()] = $catalogue; - } - - public function addBag(TranslatorBagInterface $bag): void - { - foreach ($bag->getCatalogues() as $catalogue) { - $this->addCatalogue($catalogue); - } - } - - public function getCatalogue(?string $locale = null): MessageCatalogueInterface - { - if (null === $locale || !isset($this->catalogues[$locale])) { - $this->catalogues[$locale] = new MessageCatalogue($locale); - } - - return $this->catalogues[$locale]; - } - - public function getCatalogues(): array - { - return array_values($this->catalogues); - } - - public function diff(TranslatorBagInterface $diffBag): self - { - $diff = new self(); - - foreach ($this->catalogues as $locale => $catalogue) { - if (null === $diffCatalogue = $diffBag->getCatalogue($locale)) { - $diff->addCatalogue($catalogue); - - continue; - } - - $operation = new TargetOperation($diffCatalogue, $catalogue); - $operation->moveMessagesToIntlDomainsIfPossible(AbstractOperation::NEW_BATCH); - $newCatalogue = new MessageCatalogue($locale); - - foreach ($catalogue->getDomains() as $domain) { - $newCatalogue->add($operation->getNewMessages($domain), $domain); - } - - $diff->addCatalogue($newCatalogue); - } - - return $diff; - } - - public function intersect(TranslatorBagInterface $intersectBag): self - { - $diff = new self(); - - foreach ($this->catalogues as $locale => $catalogue) { - if (null === $intersectCatalogue = $intersectBag->getCatalogue($locale)) { - continue; - } - - $operation = new TargetOperation($catalogue, $intersectCatalogue); - $operation->moveMessagesToIntlDomainsIfPossible(AbstractOperation::OBSOLETE_BATCH); - $obsoleteCatalogue = new MessageCatalogue($locale); - - foreach ($operation->getDomains() as $domain) { - $obsoleteCatalogue->add( - array_diff($operation->getMessages($domain), $operation->getNewMessages($domain)), - $domain - ); - } - - $diff->addCatalogue($obsoleteCatalogue); - } - - return $diff; - } -} diff --git a/vendor/symfony/translation/TranslatorBagInterface.php b/vendor/symfony/translation/TranslatorBagInterface.php deleted file mode 100644 index 365d1f1..0000000 --- a/vendor/symfony/translation/TranslatorBagInterface.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; - -/** - * @author Abdellatif Ait boudad - */ -interface TranslatorBagInterface -{ - /** - * Gets the catalogue by locale. - * - * @param string|null $locale The locale or null to use the default - * - * @throws InvalidArgumentException If the locale contains invalid characters - */ - public function getCatalogue(?string $locale = null): MessageCatalogueInterface; - - /** - * Returns all catalogues of the instance. - * - * @return MessageCatalogueInterface[] - */ - public function getCatalogues(): array; -} diff --git a/vendor/symfony/translation/Util/ArrayConverter.php b/vendor/symfony/translation/Util/ArrayConverter.php deleted file mode 100644 index 2fc666d..0000000 --- a/vendor/symfony/translation/Util/ArrayConverter.php +++ /dev/null @@ -1,142 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Util; - -/** - * ArrayConverter generates tree like structure from a message catalogue. - * e.g. this - * 'foo.bar1' => 'test1', - * 'foo.bar2' => 'test2' - * converts to follows: - * foo: - * bar1: test1 - * bar2: test2. - * - * @author Gennady Telegin - */ -class ArrayConverter -{ - /** - * Converts linear messages array to tree-like array. - * For example: ['foo.bar' => 'value'] will be converted to ['foo' => ['bar' => 'value']]. - * - * @param array $messages Linear messages array - */ - public static function expandToTree(array $messages): array - { - $tree = []; - - foreach ($messages as $id => $value) { - $referenceToElement = &self::getElementByPath($tree, self::getKeyParts($id)); - - $referenceToElement = $value; - - unset($referenceToElement); - } - - return $tree; - } - - private static function &getElementByPath(array &$tree, array $parts): mixed - { - $elem = &$tree; - $parentOfElem = null; - - foreach ($parts as $i => $part) { - if (isset($elem[$part]) && \is_string($elem[$part])) { - /* Process next case: - * 'foo': 'test1', - * 'foo.bar': 'test2' - * - * $tree['foo'] was string before we found array {bar: test2}. - * Treat new element as string too, e.g. add $tree['foo.bar'] = 'test2'; - */ - $elem = &$elem[implode('.', \array_slice($parts, $i))]; - break; - } - - $parentOfElem = &$elem; - $elem = &$elem[$part]; - } - - if ($elem && \is_array($elem) && $parentOfElem) { - /* Process next case: - * 'foo.bar': 'test1' - * 'foo': 'test2' - * - * $tree['foo'] was array = {bar: 'test1'} before we found string constant `foo`. - * Cancel treating $tree['foo'] as array and cancel back it expansion, - * e.g. make it $tree['foo.bar'] = 'test1' again. - */ - self::cancelExpand($parentOfElem, $part, $elem); - } - - return $elem; - } - - private static function cancelExpand(array &$tree, string $prefix, array $node): void - { - $prefix .= '.'; - - foreach ($node as $id => $value) { - if (\is_string($value)) { - $tree[$prefix.$id] = $value; - } else { - self::cancelExpand($tree, $prefix.$id, $value); - } - } - } - - /** - * @return string[] - */ - private static function getKeyParts(string $key): array - { - $parts = explode('.', $key); - $partsCount = \count($parts); - - $result = []; - $buffer = ''; - - foreach ($parts as $index => $part) { - if (0 === $index && '' === $part) { - $buffer = '.'; - - continue; - } - - if ($index === $partsCount - 1 && '' === $part) { - $buffer .= '.'; - $result[] = $buffer; - - continue; - } - - if (isset($parts[$index + 1]) && '' === $parts[$index + 1]) { - $buffer .= $part; - - continue; - } - - if ($buffer) { - $result[] = $buffer.$part; - $buffer = ''; - - continue; - } - - $result[] = $part; - } - - return $result; - } -} diff --git a/vendor/symfony/translation/Util/XliffUtils.php b/vendor/symfony/translation/Util/XliffUtils.php deleted file mode 100644 index e76e122..0000000 --- a/vendor/symfony/translation/Util/XliffUtils.php +++ /dev/null @@ -1,191 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Util; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\InvalidResourceException; - -/** - * Provides some utility methods for XLIFF translation files, such as validating - * their contents according to the XSD schema. - * - * @author Fabien Potencier - */ -class XliffUtils -{ - /** - * Gets xliff file version based on the root "version" attribute. - * - * Defaults to 1.2 for backwards compatibility. - * - * @throws InvalidArgumentException - */ - public static function getVersionNumber(\DOMDocument $dom): string - { - /** @var \DOMNode $xliff */ - foreach ($dom->getElementsByTagName('xliff') as $xliff) { - $version = $xliff->attributes->getNamedItem('version'); - if ($version) { - return $version->nodeValue; - } - - $namespace = $xliff->attributes->getNamedItem('xmlns'); - if ($namespace) { - if (0 !== substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34)) { - throw new InvalidArgumentException(\sprintf('Not a valid XLIFF namespace "%s".', $namespace)); - } - - return substr($namespace, 34); - } - } - - // Falls back to v1.2 - return '1.2'; - } - - /** - * Validates and parses the given file into a DOMDocument. - * - * @throws InvalidResourceException - */ - public static function validateSchema(\DOMDocument $dom): array - { - $xliffVersion = static::getVersionNumber($dom); - $internalErrors = libxml_use_internal_errors(true); - if ($shouldEnable = self::shouldEnableEntityLoader()) { - $disableEntities = libxml_disable_entity_loader(false); - } - try { - $isValid = @$dom->schemaValidateSource(self::getSchema($xliffVersion)); - if (!$isValid) { - return self::getXmlErrors($internalErrors); - } - } finally { - if ($shouldEnable) { - libxml_disable_entity_loader($disableEntities); - } - } - - $dom->normalizeDocument(); - - libxml_clear_errors(); - libxml_use_internal_errors($internalErrors); - - return []; - } - - private static function shouldEnableEntityLoader(): bool - { - static $dom, $schema; - if (null === $dom) { - $dom = new \DOMDocument(); - $dom->loadXML(''); - - $tmpfile = tempnam(sys_get_temp_dir(), 'symfony'); - register_shutdown_function(static function () use ($tmpfile) { - @unlink($tmpfile); - }); - $schema = ' - - -'; - file_put_contents($tmpfile, ' - - - -'); - } - - return !@$dom->schemaValidateSource($schema); - } - - public static function getErrorsAsString(array $xmlErrors): string - { - $errorsAsString = ''; - - foreach ($xmlErrors as $error) { - $errorsAsString .= \sprintf("[%s %s] %s (in %s - line %d, column %d)\n", - \LIBXML_ERR_WARNING === $error['level'] ? 'WARNING' : 'ERROR', - $error['code'], - $error['message'], - $error['file'], - $error['line'], - $error['column'] - ); - } - - return $errorsAsString; - } - - private static function getSchema(string $xliffVersion): string - { - if ('1.2' === $xliffVersion) { - $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-1.2-transitional.xsd'); - $xmlUri = 'http://www.w3.org/2001/xml.xsd'; - } elseif ('2.0' === $xliffVersion) { - $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-2.0.xsd'); - $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd'; - } else { - throw new InvalidArgumentException(\sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion)); - } - - return self::fixXmlLocation($schemaSource, $xmlUri); - } - - /** - * Internally changes the URI of a dependent xsd to be loaded locally. - */ - private static function fixXmlLocation(string $schemaSource, string $xmlUri): string - { - $newPath = str_replace('\\', '/', __DIR__).'/../Resources/schemas/xml.xsd'; - $parts = explode('/', $newPath); - $locationstart = 'file:///'; - if (0 === stripos($newPath, 'phar://')) { - $tmpfile = tempnam(sys_get_temp_dir(), 'symfony'); - if ($tmpfile) { - copy($newPath, $tmpfile); - $parts = explode('/', str_replace('\\', '/', $tmpfile)); - } else { - array_shift($parts); - $locationstart = 'phar:///'; - } - } - - $drive = '\\' === \DIRECTORY_SEPARATOR ? array_shift($parts).'/' : ''; - $newPath = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts)); - - return str_replace($xmlUri, $newPath, $schemaSource); - } - - /** - * Returns the XML errors of the internal XML parser. - */ - private static function getXmlErrors(bool $internalErrors): array - { - $errors = []; - foreach (libxml_get_errors() as $error) { - $errors[] = [ - 'level' => \LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR', - 'code' => $error->code, - 'message' => trim($error->message), - 'file' => $error->file ?: 'n/a', - 'line' => $error->line, - 'column' => $error->column, - ]; - } - - libxml_clear_errors(); - libxml_use_internal_errors($internalErrors); - - return $errors; - } -} diff --git a/vendor/symfony/translation/Writer/TranslationWriter.php b/vendor/symfony/translation/Writer/TranslationWriter.php deleted file mode 100644 index be3f6bf..0000000 --- a/vendor/symfony/translation/Writer/TranslationWriter.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Writer; - -use Symfony\Component\Translation\Dumper\DumperInterface; -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\RuntimeException; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * TranslationWriter writes translation messages. - * - * @author Michel Salib - */ -class TranslationWriter implements TranslationWriterInterface -{ - /** - * @var array - */ - private array $dumpers = []; - - /** - * Adds a dumper to the writer. - */ - public function addDumper(string $format, DumperInterface $dumper): void - { - $this->dumpers[$format] = $dumper; - } - - /** - * Obtains the list of supported formats. - */ - public function getFormats(): array - { - return array_keys($this->dumpers); - } - - /** - * Writes translation from the catalogue according to the selected format. - * - * @param string $format The format to use to dump the messages - * @param array $options Options that are passed to the dumper - * - * @throws InvalidArgumentException - */ - public function write(MessageCatalogue $catalogue, string $format, array $options = []): void - { - if (!isset($this->dumpers[$format])) { - throw new InvalidArgumentException(\sprintf('There is no dumper associated with format "%s".', $format)); - } - - // get the right dumper - $dumper = $this->dumpers[$format]; - - if (isset($options['path']) && !is_dir($options['path']) && !@mkdir($options['path'], 0777, true) && !is_dir($options['path'])) { - throw new RuntimeException(\sprintf('Translation Writer was not able to create directory "%s".', $options['path'])); - } - - // save - $dumper->dump($catalogue, $options); - } -} diff --git a/vendor/symfony/translation/Writer/TranslationWriterInterface.php b/vendor/symfony/translation/Writer/TranslationWriterInterface.php deleted file mode 100644 index b306282..0000000 --- a/vendor/symfony/translation/Writer/TranslationWriterInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Writer; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\MessageCatalogue; - -/** - * TranslationWriter writes translation messages. - * - * @author Michel Salib - */ -interface TranslationWriterInterface -{ - /** - * Writes translation from the catalogue according to the selected format. - * - * @param string $format The format to use to dump the messages - * @param array $options Options that are passed to the dumper - * - * @throws InvalidArgumentException - */ - public function write(MessageCatalogue $catalogue, string $format, array $options = []): void; -} diff --git a/vendor/symfony/translation/composer.json b/vendor/symfony/translation/composer.json deleted file mode 100644 index 1db1621..0000000 --- a/vendor/symfony/translation/composer.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "symfony/translation", - "type": "library", - "description": "Provides tools to internationalize your application", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "require-dev": { - "nikic/php-parser": "^4.18|^5.0", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "psr/log": "^1|^2|^3" - }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<6.4", - "symfony/yaml": "<6.4", - "symfony/console": "<6.4" - }, - "provide": { - "symfony/translation-implementation": "2.3|3.0" - }, - "autoload": { - "files": [ "Resources/functions.php" ], - "psr-4": { "Symfony\\Component\\Translation\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/vendor/voku/portable-ascii/.deepsource.toml b/vendor/voku/portable-ascii/.deepsource.toml deleted file mode 100644 index 3f8f43c..0000000 --- a/vendor/voku/portable-ascii/.deepsource.toml +++ /dev/null @@ -1,4 +0,0 @@ -version = 1 - -[[analyzers]] -name = "php" \ No newline at end of file diff --git a/vendor/voku/portable-ascii/CHANGELOG.md b/vendor/voku/portable-ascii/CHANGELOG.md deleted file mode 100644 index 52f4912..0000000 --- a/vendor/voku/portable-ascii/CHANGELOG.md +++ /dev/null @@ -1,210 +0,0 @@ -# Changelog - -### 2.0.3 (2024-11-21) - -- use modern phpdocs e.g. list or conditional-return annotations - -### 2.0.2 (2024-11-21) - -- small fix for PHP 8.4 (thanks to @gilbertoalbino) - -### 2.0.1 (2022-03-08) - -- "To people of Russia": There is a war in Ukraine right now. The forces of the Russian Federation are attacking civilians. -- optimize some phpdocs - -### 2.0.0 (2022-01-24) - -- prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" -- fix "Ukrainian" char-mapping (thanks to @Andr1yk0) -- fix "Persian" char-mapping (thanks to @frost-cyber) - -### 1.6.1 (2022-01-24) - -- revert: prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" -- revert: fix "Ukrainian" char-mapping (thanks to @Andr1yk0) -- revert: fix "Persian" char-mapping (thanks to @frost-cyber) - -### 1.6.0 (2022-01-24) - -- prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" -- fix "Ukrainian" char-mapping (thanks to @Andr1yk0) -- fix "Persian" char-mapping (thanks to @frost-cyber) -- fix "ASCII::normalize_whitespace()" -> "CARRIAGE RETURN" is more like "
" and no "\n" -- add "ASCII::to_ascii_remap()" -> this method will return broken characters and is only for special cases - -### 1.5.6 (2020-11-12) - -- "ASCII::normalize_whitespace()" -> can now also remove "control characters" if needed v2 - -### 1.5.5 (2020-11-12) - -- fix "Greeklish" char-mapping (thanks @sebdesign) -- "ASCII::normalize_whitespace()" -> can now also remove "control characters" if needed - -### 1.5.4 (2020-11-08) - -- add some missing replacements in U+23xx page (thanks @marcoffee) -- fix "Russian" char-mapping (thanks @ilyahoilik) -- running test with PHP 8.0 rc3 - -### 1.5.3 (2020-07-23) - -- fix "Georgian" char-mapping (thanks @waska14) - -### 1.5.2 (2020-06-16) - -- add "Bengali" (bn) language support (thanks @eliyas5044) -- fix "Portuguese" char-mapping -- reduce the file size (removed extra comments from "avian2/unidecode") - -### 1.5.1 (2020-05-26) - -- fix merge ASCII transliterations from "avian2/unidecode" (python) - -> https://github.com/avian2/unidecode/ - -### 1.5.0 (2020-05-24) - -- merge ASCII transliterations from "avian2/unidecode" (python) - -> https://github.com/avian2/unidecode/ - -### 1.4.11 (2020-05-23) - -- "composer.json" -> remove "autoload-dev" stuff from "autoload" -- "voku/php-readme-helper" -> auto-generate the API documentation in the README - -### 1.4.10 (2020-03-13) - -- ASCII::to_ascii() -> fix extra symbol handling in the regex -- ASCII::to_ascii() -> fix for languages with multi-length-special-char (e.g. Greek -> 'ει' => 'i') - -### 1.4.9 (2020-03-06) - -- ASCII::to_slugify() -> fix php warning from empty "separator" - -### 1.4.8 (2020-02-06) - -- small optimization for "ASCII::to_ascii()" performance - -### 1.4.7 (2020-01-27) - -- fix possible wrong type from "getDataIfExists()" -> e.g. a bug reported where "/data/" was modified -- inline variables -- do not use "=== true" for "bool"-types - -### 1.4.6 (2019-12-23) - -- optimize "ASCII::to_ascii()" performance -- add "armenian" chars -- add "ASCII:getAllLanguages()" - -### 1.4.5 (2019-12-19) - -- use "@psalm-pure" v2 - -### 1.4.4 (2019-12-19) - -- use "@psalm-pure" - -### 1.4.3 (2019-12-19) - -- use "@psalm-immutable" - -### 1.4.2 (2019-12-13) - -- optimize the performance v2 -- more fixes for non-ascii regex - -### 1.4.1 (2019-12-13) - -- fix regex for non-ascii - -### 1.4.0 (2019-12-13) - -- optimize the performance, via single char replacements - -### 1.3.6 (2019-12-13) - -- "ascii_extras" -> convert the static content into ascii - -> e.g.: instead of replacing "+" with "più" we use "piu" (Italian), because we want to use ascii anyway - -### 1.3.5 (2019-11-11) - -- fix "ASCII::remove_invisible_characters()" -> do not remove invisible encoded url strings by default - -### 1.3.4 (2019-10-14) - -- fix static cache for "ASCII::charsArrayWithOneLanguage" - -### 1.3.3 (2019-10-14) - -- fix "Turkish" mapping -> 'ä' -> 'a' - -### 1.3.2 (2019-10-14) - -- fix language parameter usage with e.g. "de_DE" -- re-add missing "extra"-mapping chars - -### 1.3.1 (2019-10-13) - -- fix "ASCII::to_slugify" -> remove unicode chars -- add more test for ascii chars in the mapping -- fix non ascii chars in the mapping - -### 1.3.0 (2019-10-12) - -- add transliteration "fr" (was supported before, but with chars from other languages) -- add transliteration "ru" - Passport (2013), ICAO -- add transliteration "ru" - GOST 7.79-2000(B) -- add transliteration "el" - greeklish -- add transliteration "zh" -- add transliteration "nl" -- add transliteration "it" -- add transliteration "mk" -- add transliteration "pt" -- add constants -> ASCII::*LANGUAGE_CODES -- add more special latin chars / (currency) symbols -- add simple tests for all supported languages -- optimize "Russian" to ASCII (via "translit.ru") -- optimize performance of string replacement -- optimize performance of array merging -- optimize phpdoc comments -- "ASCII::to_transliterate" -> use "transliterator_create" + static cache -- "ASCII::to_ascii" -> fix "remove unsupported chars" -- "ASCII::to_ascii" -> add some more special chars -- run/fix static analyse via "pslam" + "phpstan" -- auto fix code style via "php-cs-fixer" -- fix transliteration for "german" -- fix transliteration for "persian" (thanks @mardep) -- fix transliteration for "polish" (thanks @dariusz.drobisz) -- fix transliteration for "bulgarian" (thanks @mkosturkov) -- fix transliteration for "croatian" (thanks @ludifonovac) -- fix transliteration for "serbian" (thanks @ludifonovac) -- fix transliteration for "swedish" (thanks @nicholasruunu) -- fix transliteration for "france" (thanks @sharptsa) -- fix transliteration for "serbian" (thanks @nikolaposa) -- fix transliteration for "czech" (thanks @slepic) - -### 1.2.3 (2019-09-10) - -- fix language depending ASCII chars (the order matters) - -### 1.2.2 (2019-09-10) - -- fix bulgarian ASCII chars | thanks @bgphp - -### 1.2.1 (2019-09-07) - -- "charsArray()" -> add access to "ASCII::$ASCII_MAPS*"" - -### 1.2.0 (2019-09-07) - -- "to_slugify()" -> use the extra ascii array - -### 1.1.0 (2019-09-07) - -- add + split extra ascii replacements - -### 1.0.0 (2019-09-05) - -- initial commit \ No newline at end of file diff --git a/vendor/voku/portable-ascii/LICENSE.txt b/vendor/voku/portable-ascii/LICENSE.txt deleted file mode 100644 index b6ba47e..0000000 --- a/vendor/voku/portable-ascii/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2019 Lars Moelleken - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/voku/portable-ascii/README.md b/vendor/voku/portable-ascii/README.md deleted file mode 100644 index 3ce36d6..0000000 --- a/vendor/voku/portable-ascii/README.md +++ /dev/null @@ -1,451 +0,0 @@ -[//]: # (AUTO-GENERATED BY "PHP README Helper": base file -> docs/base.md) -[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) - -[![Build Status](https://github.com/voku/portable-ascii/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/voku/portable-ascii/actions) -[![Build status](https://ci.appveyor.com/api/projects/status/gnejjnk7qplr7f5t/branch/master?svg=true)](https://ci.appveyor.com/project/voku/portable-ascii/branch/master) -[![codecov.io](https://codecov.io/github/voku/portable-ascii/coverage.svg?branch=master)](https://codecov.io/github/voku/portable-ascii?branch=master) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/997c9bb10d1c4791967bdf2e42013e8e)](https://www.codacy.com/app/voku/portable-ascii) -[![Latest Stable Version](https://poser.pugx.org/voku/portable-ascii/v/stable)](https://packagist.org/packages/voku/portable-ascii) -[![Total Downloads](https://poser.pugx.org/voku/portable-ascii/downloads)](https://packagist.org/packages/voku/portable-ascii) -[![License](https://poser.pugx.org/voku/portable-ascii/license)](https://packagist.org/packages/voku/portable-ascii) -[![Donate to this project using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.me/moelleken) -[![Donate to this project using Patreon](https://img.shields.io/badge/patreon-donate-yellow.svg)](https://www.patreon.com/voku) - -# 🔡 Portable ASCII - -## Description - -It is written in PHP (PHP 7+) and can work without "mbstring", "iconv" or any other extra encoding php-extension on your server. - -The benefit of Portable ASCII is that it is easy to use, easy to bundle. - -The project based on ... -+ Sean M. Burke's work (https://metacpan.org/pod/Text::Unidecode) -+ Tomaz Solc's work (https://pypi.org/project/Unidecode/) -+ Portable UTF-8 work (https://github.com/voku/portable-utf8) -+ Daniel St. Jules's work (https://github.com/danielstjules/Stringy) -+ Johnny Broadway's work (https://github.com/jbroadway/urlify) -+ and many cherry-picks from "github"-gists and "Stack Overflow"-snippets ... - -## Index - -* [Alternative](#alternative) -* [Install](#install-portable-ascii-via-composer-require) -* [Why Portable ASCII?](#why-portable-ascii) -* [Requirements and Recommendations](#requirements-and-recommendations) -* [Usage](#usage) -* [Class methods](#class-methods) -* [Unit Test](#unit-test) -* [License and Copyright](#license-and-copyright) - -## Alternative - -If you like a more Object Oriented Way to edit strings, then you can take a look at [voku/Stringy](https://github.com/voku/Stringy), it's a fork of "danielstjules/Stringy" but it used the "Portable ASCII"-Class and some extra methods. - -```php -// Portable ASCII -use voku\helper\ASCII; -ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' - -// voku/Stringy -use Stringy\Stringy as S; -$stringy = S::create('déjà σσς iıii'); -$stringy->toTransliterate(); // 'deja sss iiii' -``` - -## Install "Portable ASCII" via "composer require" -```shell -composer require voku/portable-ascii -``` - -## Why Portable ASCII?[]() -I need ASCII char handling in different classes and before I added this functions into "Portable UTF-8", -but this repo is more modular and portable, because it has no dependencies. - -## Requirements and Recommendations - -* No extensions are required to run this library. Portable ASCII only needs PCRE library that is available by default since PHP 4.2.0 and cannot be disabled since PHP 5.3.0. "\u" modifier support in PCRE for ASCII handling is not a must. -* PHP 7.0 is the minimum requirement -* PHP 8.0 is also supported - -## Usage - -Example: ASCII::to_ascii() -```php - echo ASCII::to_ascii('�Düsseldorf�', 'de'); - - // will output - // Duesseldorf - - echo ASCII::to_ascii('�Düsseldorf�', 'en'); - - // will output - // Dusseldorf -``` - -# Portable ASCII | API - -The API from the "ASCII"-Class is written as small static methods. - - -## Class methods - -

charsArray -charsArrayWithMultiLanguageValues -charsArrayWithOneLanguage -charsArrayWithSingleLanguageValues -
clean -getAllLanguages -is_ascii -normalize_msword -
normalize_whitespace -remove_invisible_characters -to_ascii -to_ascii_remap -
to_filename -to_slugify -to_transliterate -
- -#### charsArray(bool $replace_extra_symbols): array - -Returns an replacement array for ASCII methods. - -EXAMPLE: -$array = ASCII::charsArray(); -var_dump($array['ru']['б']); // 'b' - - -**Parameters:** -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` - -**Return:** -- `array` - --------- - -#### charsArrayWithMultiLanguageValues(bool $replace_extra_symbols): array - -Returns an replacement array for ASCII methods with a mix of multiple languages. - -EXAMPLE: -$array = ASCII::charsArrayWithMultiLanguageValues(); -var_dump($array['b']); // ['β', 'б', 'ဗ', 'ბ', 'ب'] - - -**Parameters:** -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` - -**Return:** -- `array

An array of replacements.

` - --------- - -#### charsArrayWithOneLanguage(string $language, bool $replace_extra_symbols, bool $asOrigReplaceArray): array - -Returns an replacement array for ASCII methods with one language. - -For example, German will map 'ä' to 'ae', while other languages -will simply return e.g. 'a'. - -EXAMPLE: -$array = ASCII::charsArrayWithOneLanguage('ru'); -$tmpKey = \array_search('yo', $array['replace']); -echo $array['orig'][$tmpKey]; // 'ё' - - -**Parameters:** -- `ASCII::* $language [optional]

Language of the source string e.g.: en, de_at, or de-ch. -(default is 'en') | ASCII::*_LANGUAGE_CODE

` -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` -- `bool $asOrigReplaceArray [optional]

TRUE === return {orig: string[], replace: string[]} -array

` - -**Return:** -- `array

An array of replacements.

` - --------- - -#### charsArrayWithSingleLanguageValues(bool $replace_extra_symbols, bool $asOrigReplaceArray): array - -Returns an replacement array for ASCII methods with multiple languages. - -EXAMPLE: -$array = ASCII::charsArrayWithSingleLanguageValues(); -$tmpKey = \array_search('hnaik', $array['replace']); -echo $array['orig'][$tmpKey]; // '၌' - - -**Parameters:** -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` -- `bool $asOrigReplaceArray [optional]

TRUE === return {orig: string[], replace: string[]} -array

` - -**Return:** -- `array

An array of replacements.

` - --------- - -#### clean(string $str, bool $normalize_whitespace, bool $keep_non_breaking_space, bool $normalize_msword, bool $remove_invisible_characters): string - -Accepts a string and removes all non-UTF-8 characters from it + extras if needed. - -**Parameters:** -- `string $str

The string to be sanitized.

` -- `bool $normalize_whitespace [optional]

Set to true, if you need to normalize the -whitespace.

` -- `bool $keep_non_breaking_space [optional]

Set to true, to keep non-breaking-spaces, in -combination with -$normalize_whitespace

` -- `bool $normalize_msword [optional]

Set to true, if you need to normalize MS Word chars -e.g.: "…" -=> "..."

` -- `bool $remove_invisible_characters [optional]

Set to false, if you not want to remove invisible -characters e.g.: "\0"

` - -**Return:** -- `string

A clean UTF-8 string.

` - --------- - -#### getAllLanguages(): string[] - -Get all languages from the constants "ASCII::.*LANGUAGE_CODE". - -**Parameters:** -__nothing__ - -**Return:** -- `string[]` - --------- - -#### is_ascii(string $str): bool - -Checks if a string is 7 bit ASCII. - -EXAMPLE: -ASCII::is_ascii('白'); // false - - -**Parameters:** -- `string $str

The string to check.

` - -**Return:** -- `bool

-true if it is ASCII
-false otherwise -

` - --------- - -#### normalize_msword(string $str): string - -Returns a string with smart quotes, ellipsis characters, and dashes from -Windows-1252 (commonly used in Word documents) replaced by their ASCII -equivalents. - -EXAMPLE: -ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."' - - -**Parameters:** -- `string $str

The string to be normalized.

` - -**Return:** -- `string

A string with normalized characters for commonly used chars in Word documents.

` - --------- - -#### normalize_whitespace(string $str, bool $keepNonBreakingSpace, bool $keepBidiUnicodeControls, bool $normalize_control_characters): string - -Normalize the whitespace. - -EXAMPLE: -ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", true); // "abc-\xc2\xa0-öäü- -" - - -**Parameters:** -- `string $str

The string to be normalized.

` -- `bool $keepNonBreakingSpace [optional]

Set to true, to keep non-breaking-spaces.

` -- `bool $keepBidiUnicodeControls [optional]

Set to true, to keep non-printable (for the web) -bidirectional text chars.

` -- `bool $normalize_control_characters [optional]

Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".

` - -**Return:** -- `string

A string with normalized whitespace.

` - --------- - -#### remove_invisible_characters(string $str, bool $url_encoded, string $replacement, bool $keep_basic_control_characters): string - -Remove invisible characters from a string. - -e.g.: This prevents sandwiching null characters between ascii characters, like Java\0script. - -copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/Common.php - -**Parameters:** -- `string $str` -- `bool $url_encoded` -- `string $replacement` -- `bool $keep_basic_control_characters` - -**Return:** -- `string` - --------- - -#### to_ascii(string $str, string $language, bool $remove_unsupported_chars, bool $replace_extra_symbols, bool $use_transliterate, bool|null $replace_single_chars_only): string - -Returns an ASCII version of the string. A set of non-ASCII characters are -replaced with their closest ASCII counterparts, and the rest are removed -by default. The language or locale of the source string can be supplied -for language-specific transliteration in any of the following formats: -en, en_GB, or en-GB. For example, passing "de" results in "äöü" mapping -to "aeoeue" rather than "aou" as in other languages. - -EXAMPLE: -ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf - - -**Parameters:** -- `string $str

The input string.

` -- `ASCII::* $language [optional]

Language of the source string. -(default is 'en') | ASCII::*_LANGUAGE_CODE

` -- `bool $remove_unsupported_chars [optional]

Whether or not to remove the -unsupported characters.

` -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound -".

` -- `bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown chars.

` -- `bool|null $replace_single_chars_only [optional]

Single char replacement is better for the -performance, but some languages need to replace more then one char -at the same time. | NULL === auto-setting, depended on the -language

` - -**Return:** -- `string

A string that contains only ASCII characters.

` - --------- - -#### to_ascii_remap(string $str1, string $str2): string[] - -WARNING: This method will return broken characters and is only for special cases. - -Convert two UTF-8 encoded string to a single-byte strings suitable for -functions that need the same string length after the conversion. - -The function simply uses (and updates) a tailored dynamic encoding -(in/out map parameter) where non-ascii characters are remapped to -the range [128-255] in order of appearance. - -**Parameters:** -- `string $str1` -- `string $str2` - -**Return:** -- `string[]` - --------- - -#### to_filename(string $str, bool $use_transliterate, string $fallback_char): string - -Convert given string to safe filename (and keep string case). - -EXAMPLE: -ASCII::to_filename('שדגשדג.png', true)); // 'shdgshdg.png' - - -**Parameters:** -- `string $str` -- `bool $use_transliterate

ASCII::to_transliterate() is used by default - unsafe characters are -simply replaced with hyphen otherwise.

` -- `string $fallback_char` - -**Return:** -- `string

A string that contains only safe characters for a filename.

` - --------- - -#### to_slugify(string $str, string $separator, string $language, string[] $replacements, bool $replace_extra_symbols, bool $use_str_to_lower, bool $use_transliterate): string - -Converts the string into an URL slug. This includes replacing non-ASCII -characters with their closest ASCII equivalents, removing remaining -non-ASCII and non-alphanumeric characters, and replacing whitespace with -$separator. The separator defaults to a single dash, and the string -is also converted to lowercase. The language of the source string can -also be supplied for language-specific transliteration. - -**Parameters:** -- `string $str` -- `string $separator [optional]

The string used to replace whitespace.

` -- `ASCII::* $language [optional]

Language of the source string. -(default is 'en') | ASCII::*_LANGUAGE_CODE

` -- `array $replacements [optional]

A map of replaceable strings.

` -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " -pound ".

` -- `bool $use_str_to_lower [optional]

Use "string to lower" for the input.

` -- `bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown -chars.

` - -**Return:** -- `string

A string that has been converted to an URL slug.

` - --------- - -#### to_transliterate(string $str, string|null $unknown, bool $strict): string - -Returns an ASCII version of the string. A set of non-ASCII characters are -replaced with their closest ASCII counterparts, and the rest are removed -unless instructed otherwise. - -EXAMPLE: -ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' - - -**Parameters:** -- `string $str

The input string.

` -- `string|null $unknown [optional]

Character use if character unknown. (default is '?') -But you can also use NULL to keep the unknown chars.

` -- `bool $strict [optional]

Use "transliterator_transliterate()" from PHP-Intl` - -**Return:** -- `string

A String that contains only ASCII characters.

` - --------- - - - -## Unit Test - -1) [Composer](https://getcomposer.org) is a prerequisite for running the tests. - -``` -composer install -``` - -2) The tests can be executed by running this command from the root directory: - -```bash -./vendor/bin/phpunit -``` - -### Support - -For support and donations please visit [Github](https://github.com/voku/portable-ascii/) | [Issues](https://github.com/voku/portable-ascii/issues) | [PayPal](https://paypal.me/moelleken) | [Patreon](https://www.patreon.com/voku). - -For status updates and release announcements please visit [Releases](https://github.com/voku/portable-ascii/releases) | [Twitter](https://twitter.com/suckup_de) | [Patreon](https://www.patreon.com/voku/posts). - -For professional support please contact [me](https://about.me/voku). - -### Thanks - -- Thanks to [GitHub](https://github.com) (Microsoft) for hosting the code and a good infrastructure including Issues-Managment, etc. -- Thanks to [IntelliJ](https://www.jetbrains.com) as they make the best IDEs for PHP and they gave me an open source license for PhpStorm! -- Thanks to [Travis CI](https://travis-ci.com/) for being the most awesome, easiest continous integration tool out there! -- Thanks to [StyleCI](https://styleci.io/) for the simple but powerful code style check. -- Thanks to [PHPStan](https://github.com/phpstan/phpstan) && [Psalm](https://github.com/vimeo/psalm) for really great Static analysis tools and for discover bugs in the code! - -### License and Copyright - -Released under the MIT License - see `LICENSE.txt` for details. diff --git a/vendor/voku/portable-ascii/composer.json b/vendor/voku/portable-ascii/composer.json deleted file mode 100644 index b3a22fa..0000000 --- a/vendor/voku/portable-ascii/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "voku/portable-ascii", - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "type": "library", - "keywords": [ - "clean", - "php", - "ascii" - ], - "homepage": "https://github.com/voku/portable-ascii", - "license": "MIT", - "authors": [ - { - "name": "Lars Moelleken", - "homepage": "https://www.moelleken.org/" - } - ], - "require": { - "php": ">=7.0.0" - }, - "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" - }, - "suggest": { - "ext-intl": "Use Intl for transliterator_transliterate() support" - }, - "autoload": { - "psr-4": { - "voku\\": "src/voku/" - } - }, - "autoload-dev": { - "psr-4": { - "voku\\tests\\": "tests/" - } - } -} diff --git a/vendor/voku/portable-ascii/src/voku/helper/ASCII.php b/vendor/voku/portable-ascii/src/voku/helper/ASCII.php deleted file mode 100644 index 406407e..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/ASCII.php +++ /dev/null @@ -1,1424 +0,0 @@ ->|null - */ - private static $ASCII_MAPS; - - /** - * @var array>|null - */ - private static $ASCII_MAPS_AND_EXTRAS; - - /** - * @var array>|null - */ - private static $ASCII_EXTRAS; - - /** - * @var array|null - */ - private static $ORD; - - /** - * @var array|null - */ - private static $LANGUAGE_MAX_KEY; - - /** - * url: https://en.wikipedia.org/wiki/Wikipedia:ASCII#ASCII_printable_characters - * - * @var string - */ - private static $REGEX_ASCII = "[^\x09\x10\x13\x0A\x0D\x20-\x7E]"; - - /** - * bidirectional text chars - * - * url: https://www.w3.org/International/questions/qa-bidi-unicode-controls - * - * @var array - */ - private static $BIDI_UNI_CODE_CONTROLS_TABLE = [ - // LEFT-TO-RIGHT EMBEDDING (use -> dir = "ltr") - 8234 => "\xE2\x80\xAA", - // RIGHT-TO-LEFT EMBEDDING (use -> dir = "rtl") - 8235 => "\xE2\x80\xAB", - // POP DIRECTIONAL FORMATTING // (use -> ) - 8236 => "\xE2\x80\xAC", - // LEFT-TO-RIGHT OVERRIDE // (use -> ) - 8237 => "\xE2\x80\xAD", - // RIGHT-TO-LEFT OVERRIDE // (use -> ) - 8238 => "\xE2\x80\xAE", - // LEFT-TO-RIGHT ISOLATE // (use -> dir = "ltr") - 8294 => "\xE2\x81\xA6", - // RIGHT-TO-LEFT ISOLATE // (use -> dir = "rtl") - 8295 => "\xE2\x81\xA7", - // FIRST STRONG ISOLATE // (use -> dir = "auto") - 8296 => "\xE2\x81\xA8", - // POP DIRECTIONAL ISOLATE - 8297 => "\xE2\x81\xA9", - ]; - - /** - * Get all languages from the constants "ASCII::.*LANGUAGE_CODE". - * - * @return array - *

An associative array where the key is the language code in lowercase - * and the value is the corresponding language string.

- */ - public static function getAllLanguages(): array - { - // init - static $LANGUAGES = []; - - if ($LANGUAGES !== []) { - return $LANGUAGES; - } - - foreach ((new \ReflectionClass(__CLASS__))->getConstants() as $constant => $lang) { - if (\strpos($constant, 'EXTRA') !== false) { - $LANGUAGES[\strtolower($constant)] = $lang; - } else { - $LANGUAGES[\strtolower(\str_replace('_LANGUAGE_CODE', '', $constant))] = $lang; - } - } - - return $LANGUAGES; - } - - /** - * Returns an replacement array for ASCII methods. - * - * EXAMPLE: - * $array = ASCII::charsArray(); - * var_dump($array['ru']['б']); // 'b' - * - * - * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

- * - * @psalm-pure - * - * @return array> - *

An array where the key is the language code, and the value is - * an associative array mapping original characters to their replacements.

- */ - public static function charsArray(bool $replace_extra_symbols = false): array - { - if ($replace_extra_symbols) { - self::prepareAsciiAndExtrasMaps(); - - return self::$ASCII_MAPS_AND_EXTRAS ?? []; - } - - self::prepareAsciiMaps(); - - return self::$ASCII_MAPS ?? []; - } - - /** - * Returns an replacement array for ASCII methods with a mix of multiple languages. - * - * EXAMPLE: - * $array = ASCII::charsArrayWithMultiLanguageValues(); - * var_dump($array['b']); // ['β', 'б', 'ဗ', 'ბ', 'ب'] - * - * - * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

- * - * @psalm-pure - * - * @return array> - *

An array of replacements.

- */ - public static function charsArrayWithMultiLanguageValues(bool $replace_extra_symbols = false): array - { - static $CHARS_ARRAY = []; - $cacheKey = '' . $replace_extra_symbols; - - if (isset($CHARS_ARRAY[$cacheKey])) { - return $CHARS_ARRAY[$cacheKey]; - } - - // init - $return = []; - $language_all_chars = self::charsArrayWithSingleLanguageValues( - $replace_extra_symbols, - false - ); - - /* @noinspection AlterInForeachInspection | ok here */ - foreach ($language_all_chars as $key => &$value) { - $return[$value][] = $key; - } - - $CHARS_ARRAY[$cacheKey] = $return; - - return $return; - } - - /** - * Returns an replacement array for ASCII methods with one language. - * - * For example, German will map 'ä' to 'ae', while other languages - * will simply return e.g. 'a'. - * - * EXAMPLE: - * $array = ASCII::charsArrayWithOneLanguage('ru'); - * $tmpKey = \array_search('yo', $array['replace']); - * echo $array['orig'][$tmpKey]; // 'ё' - * - * - * @param string $language [optional]

Language of the source string e.g.: en, de_at, or de-ch. - * (default is 'en') | ASCII::*_LANGUAGE_CODE

- * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

- * @param bool $asOrigReplaceArray [optional]

TRUE === return {orig: list, replace: list} - * array

- * - * @psalm-pure - * - * @return ($asOrigReplaceArray is true ? array{orig: list, replace: list} : array) - * - * @phpstan-param ASCII::*_LANGUAGE_CODE $language - */ - public static function charsArrayWithOneLanguage( - string $language = self::ENGLISH_LANGUAGE_CODE, - bool $replace_extra_symbols = false, - bool $asOrigReplaceArray = true - ): array { - $language = self::get_language($language); - - // init - static $CHARS_ARRAY = []; - $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; - - // check static cache - if (isset($CHARS_ARRAY[$cacheKey][$language])) { - return $CHARS_ARRAY[$cacheKey][$language]; - } - - if ($replace_extra_symbols) { - self::prepareAsciiAndExtrasMaps(); - - if (isset(self::$ASCII_MAPS_AND_EXTRAS[$language])) { - $tmpArray = self::$ASCII_MAPS_AND_EXTRAS[$language]; - - if ($asOrigReplaceArray) { - $CHARS_ARRAY[$cacheKey][$language] = [ - 'orig' => \array_keys($tmpArray), - 'replace' => \array_values($tmpArray), - ]; - } else { - $CHARS_ARRAY[$cacheKey][$language] = $tmpArray; - } - } else { - if ($asOrigReplaceArray) { - $CHARS_ARRAY[$cacheKey][$language] = [ - 'orig' => [], - 'replace' => [], - ]; - } else { - $CHARS_ARRAY[$cacheKey][$language] = []; - } - } - } else { - self::prepareAsciiMaps(); - - if (isset(self::$ASCII_MAPS[$language])) { - $tmpArray = self::$ASCII_MAPS[$language]; - - if ($asOrigReplaceArray) { - $CHARS_ARRAY[$cacheKey][$language] = [ - 'orig' => \array_keys($tmpArray), - 'replace' => \array_values($tmpArray), - ]; - } else { - $CHARS_ARRAY[$cacheKey][$language] = $tmpArray; - } - } else { - if ($asOrigReplaceArray) { - $CHARS_ARRAY[$cacheKey][$language] = [ - 'orig' => [], - 'replace' => [], - ]; - } else { - $CHARS_ARRAY[$cacheKey][$language] = []; - } - } - } - - return $CHARS_ARRAY[$cacheKey][$language] ?? ['orig' => [], 'replace' => []]; - } - - /** - * Returns an replacement array for ASCII methods with multiple languages. - * - * EXAMPLE: - * $array = ASCII::charsArrayWithSingleLanguageValues(); - * $tmpKey = \array_search('hnaik', $array['replace']); - * echo $array['orig'][$tmpKey]; // '၌' - * - * - * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

- * @param bool $asOrigReplaceArray [optional]

TRUE === return {orig: list, replace: list} - * array

- * - * @psalm-pure - * - * @return ($asOrigReplaceArray is true ? array{orig: list, replace: list} : array) - */ - public static function charsArrayWithSingleLanguageValues( - bool $replace_extra_symbols = false, - bool $asOrigReplaceArray = true - ): array { - // init - static $CHARS_ARRAY = []; - $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; - - if (isset($CHARS_ARRAY[$cacheKey])) { - return $CHARS_ARRAY[$cacheKey]; - } - - if ($replace_extra_symbols) { - self::prepareAsciiAndExtrasMaps(); - - /* @noinspection AlterInForeachInspection | ok here */ - foreach (self::$ASCII_MAPS_AND_EXTRAS ?? [] as &$map) { - $CHARS_ARRAY[$cacheKey][] = $map; - } - } else { - self::prepareAsciiMaps(); - - /* @noinspection AlterInForeachInspection | ok here */ - foreach (self::$ASCII_MAPS ?? [] as &$map) { - $CHARS_ARRAY[$cacheKey][] = $map; - } - } - - $CHARS_ARRAY[$cacheKey] = \array_merge([], ...$CHARS_ARRAY[$cacheKey]); - - if ($asOrigReplaceArray) { - $CHARS_ARRAY[$cacheKey] = [ - 'orig' => \array_keys($CHARS_ARRAY[$cacheKey]), - 'replace' => \array_values($CHARS_ARRAY[$cacheKey]), - ]; - } - - return $CHARS_ARRAY[$cacheKey]; - } - - /** - * Accepts a string and removes all non-UTF-8 characters from it + extras if needed. - * - * @param string $str

The string to be sanitized.

- * @param bool $normalize_whitespace [optional]

Set to true, if you need to normalize the - * whitespace.

- * @param bool $normalize_msword [optional]

Set to true, if you need to normalize MS Word chars - * e.g.: "…" - * => "..."

- * @param bool $keep_non_breaking_space [optional]

Set to true, to keep non-breaking-spaces, in - * combination with - * $normalize_whitespace

- * @param bool $remove_invisible_characters [optional]

Set to false, if you not want to remove invisible - * characters e.g.: "\0"

- * - * @psalm-pure - * - * @return string - *

A clean UTF-8 string.

- */ - public static function clean( - string $str, - bool $normalize_whitespace = true, - bool $keep_non_breaking_space = false, - bool $normalize_msword = true, - bool $remove_invisible_characters = true - ): string { - // http://stackoverflow.com/questions/1401317/remove-non-utf8-characters-from-string - // caused connection reset problem on larger strings - - $regex = '/ - ( - (?: [\x00-\x7F] # single-byte sequences 0xxxxxxx - | [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx - | [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2 - | [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 - ){1,100} # ...one or more times - ) - | ( [\x80-\xBF] ) # invalid byte in range 10000000 - 10111111 - | ( [\xC0-\xFF] ) # invalid byte in range 11000000 - 11111111 - /x'; - $str = (string) \preg_replace($regex, '$1', $str); - - if ($normalize_whitespace) { - $str = self::normalize_whitespace($str, $keep_non_breaking_space); - } - - if ($normalize_msword) { - $str = self::normalize_msword($str); - } - - if ($remove_invisible_characters) { - $str = self::remove_invisible_characters($str); - } - - return $str; - } - - /** - * Checks if a string is 7 bit ASCII. - * - * EXAMPLE: - * ASCII::is_ascii('白'); // false - * - * - * @param string $str

The string to check.

- * - * @psalm-pure - * - * @return bool - *

- * true if it is ASCII
- * false otherwise - *

- */ - public static function is_ascii(string $str): bool - { - if ($str === '') { - return true; - } - - return !\preg_match('/' . self::$REGEX_ASCII . '/', $str); - } - - /** - * Returns a string with smart quotes, ellipsis characters, and dashes from - * Windows-1252 (commonly used in Word documents) replaced by their ASCII - * equivalents. - * - * EXAMPLE: - * ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."' - * - * - * @param string $str

The string to be normalized.

- * - * @psalm-pure - * - * @return string - *

A string with normalized characters for commonly used chars in Word documents.

- */ - public static function normalize_msword(string $str): string - { - if ($str === '') { - return ''; - } - - static $MSWORD_CACHE = ['orig' => [], 'replace' => []]; - - if (empty($MSWORD_CACHE['orig'])) { - self::prepareAsciiMaps(); - - $map = self::$ASCII_MAPS[self::EXTRA_MSWORD_CHARS_LANGUAGE_CODE] ?? []; - - $MSWORD_CACHE = [ - 'orig' => \array_keys($map), - 'replace' => \array_values($map), - ]; - } - - return \str_replace($MSWORD_CACHE['orig'], $MSWORD_CACHE['replace'], $str); - } - - /** - * Normalize the whitespace. - * - * EXAMPLE: - * ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", true); // "abc-\xc2\xa0-öäü- -" - * - * - * @param string $str

The string to be normalized.

- * @param bool $keepNonBreakingSpace [optional]

Set to true, to keep non-breaking-spaces.

- * @param bool $keepBidiUnicodeControls [optional]

Set to true, to keep non-printable (for the web) - * bidirectional text chars.

- * @param bool $normalize_control_characters [optional]

Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".

- * - * @psalm-pure - * - * @return string - *

A string with normalized whitespace.

- */ - public static function normalize_whitespace( - string $str, - bool $keepNonBreakingSpace = false, - bool $keepBidiUnicodeControls = false, - bool $normalize_control_characters = false - ): string { - if ($str === '') { - return ''; - } - - static $WHITESPACE_CACHE = []; - $cacheKey = (int) $keepNonBreakingSpace; - - if ($normalize_control_characters) { - $str = \str_replace( - [ - "\x0d\x0c", // 'END OF LINE' - "\xe2\x80\xa8", // 'LINE SEPARATOR' - "\xe2\x80\xa9", // 'PARAGRAPH SEPARATOR' - "\x0c", // 'FORM FEED' // "\f" - "\x0b", // 'VERTICAL TAB' // "\v" - ], - [ - "\n", - "\n", - "\n", - "\n", - "\t", - ], - $str - ); - } - - if (!isset($WHITESPACE_CACHE[$cacheKey])) { - self::prepareAsciiMaps(); - - $WHITESPACE_CACHE[$cacheKey] = self::$ASCII_MAPS[self::EXTRA_WHITESPACE_CHARS_LANGUAGE_CODE] ?? []; - - if ($keepNonBreakingSpace) { - unset($WHITESPACE_CACHE[$cacheKey]["\xc2\xa0"]); - } - - $WHITESPACE_CACHE[$cacheKey] = array_keys($WHITESPACE_CACHE[$cacheKey]); - } - - if (!$keepBidiUnicodeControls) { - static $BIDI_UNICODE_CONTROLS_CACHE = null; - - if ($BIDI_UNICODE_CONTROLS_CACHE === null) { - $BIDI_UNICODE_CONTROLS_CACHE = self::$BIDI_UNI_CODE_CONTROLS_TABLE; - } - - $str = \str_replace($BIDI_UNICODE_CONTROLS_CACHE, '', $str); - } - - return \str_replace($WHITESPACE_CACHE[$cacheKey], ' ', $str); - } - - /** - * Remove invisible characters from a string. - * - * This prevents malicious code injection through null bytes or other control characters. - * - * copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/Common.php - * - * @param string $str - * @param bool $url_encoded - * @param string $replacement - * @param bool $keep_basic_control_characters - * - * @psalm-pure - * - * @return string - */ - public static function remove_invisible_characters( - string $str, - bool $url_encoded = false, - string $replacement = '', - bool $keep_basic_control_characters = true - ): string { - // init - $non_displayables = []; - - // every control character except: - // - newline (dec 10), - // - carriage return (dec 13), - // - horizontal tab (dec 09) - if ($url_encoded) { - $non_displayables[] = '/%0[0-8bcefBCEF]/'; // url encoded 00-08, 11, 12, 14, 15 - $non_displayables[] = '/%1[0-9a-fA-F]/'; // url encoded 16-31 - } - - if ($keep_basic_control_characters) { - $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 - } else { - $str = self::normalize_whitespace($str, false, false, true); - $non_displayables[] = '/[^\P{C}\s]/u'; - } - - do { - $str = (string) \preg_replace($non_displayables, $replacement, $str, -1, $count); - } while ($count !== 0); - - return $str; - } - - /** - * WARNING: This method will return broken characters and is only for special cases. - * - * Convert two UTF-8 encoded strings to a single-byte strings suitable for - * functions that need the same string length after the conversion. - * - * The function simply uses (and updates) a tailored dynamic encoding - * (in/out map parameter) where non-ascii characters are remapped to - * the range [128-255] in order of appearance. - * - * @return array{0: string, 1: string} - */ - public static function to_ascii_remap(string $str1, string $str2): array - { - $charMap = []; - $str1 = self::to_ascii_remap_intern($str1, $charMap); - $str2 = self::to_ascii_remap_intern($str2, $charMap); - - return [$str1, $str2]; - } - - /** - * Returns an ASCII version of the string. A set of non-ASCII characters are - * replaced with their closest ASCII counterparts, and the rest are removed - * by default. The language or locale of the source string can be supplied - * for language-specific transliteration in any of the following formats: - * en, en_GB, or en-GB. For example, passing "de" results in "äöü" mapping - * to "aeoeue" rather than "aou" as in other languages. - * - * EXAMPLE: - * ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf - * - * - * @param string $str

The input string.

- * @param string $language [optional]

Language of the source string. - * (default is 'en') | ASCII::*_LANGUAGE_CODE

- * @param bool $remove_unsupported_chars [optional]

Whether to remove the - * unsupported characters.

- * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound - * ".

- * @param bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown chars.

- * @param bool $replace_single_chars_only [optional]

Single char replacement is better for the - * performance, but some languages need to replace more than one char - * at the same time. If FALSE === auto-setting, depended on the - * language

- * - * @psalm-pure - * - * @return string - *

A string that contains only ASCII characters.

- * - * @phpstan-param ASCII::*_LANGUAGE_CODE $language - */ - public static function to_ascii( - string $str, - string $language = self::ENGLISH_LANGUAGE_CODE, - bool $remove_unsupported_chars = true, - bool $replace_extra_symbols = false, - bool $use_transliterate = false, - bool $replace_single_chars_only = false - ): string { - if ($str === '') { - return ''; - } - - /** @phpstan-var ASCII::*_LANGUAGE_CODE $language - hack for phpstan */ - $language = self::get_language($language); - - static $EXTRA_SYMBOLS_CACHE = null; - - static $REPLACE_HELPER_CACHE = []; - $cacheKey = $language . '-' . $replace_extra_symbols; - - if (!isset($REPLACE_HELPER_CACHE[$cacheKey])) { - $langAll = self::charsArrayWithSingleLanguageValues($replace_extra_symbols, false); - - $langSpecific = self::charsArrayWithOneLanguage($language, $replace_extra_symbols, false); - - if ($langSpecific === []) { - $REPLACE_HELPER_CACHE[$cacheKey] = $langAll; - } else { - $REPLACE_HELPER_CACHE[$cacheKey] = \array_merge([], $langAll, $langSpecific); - } - } - - if ( - $replace_extra_symbols - && - $EXTRA_SYMBOLS_CACHE === null - ) { - $EXTRA_SYMBOLS_CACHE = []; - foreach (self::$ASCII_EXTRAS ?? [] as $extrasDataTmp) { - foreach ($extrasDataTmp as $extrasDataKeyTmp => $extrasDataValueTmp) { - $EXTRA_SYMBOLS_CACHE[$extrasDataKeyTmp] = $extrasDataKeyTmp; - } - } - $EXTRA_SYMBOLS_CACHE = \implode('', $EXTRA_SYMBOLS_CACHE); - } - - $charDone = []; - if (\preg_match_all('/' . self::$REGEX_ASCII . ($replace_extra_symbols ? '|[' . $EXTRA_SYMBOLS_CACHE . ']' : '') . '/u', $str, $matches)) { - if (!$replace_single_chars_only) { - if (self::$LANGUAGE_MAX_KEY === null) { - self::$LANGUAGE_MAX_KEY = self::getData('ascii_language_max_key'); - } - - $maxKeyLength = self::$LANGUAGE_MAX_KEY[$language] ?? 0; - - if ($maxKeyLength >= 5) { - foreach ($matches[0] as $keyTmp => $char) { - if (isset($matches[0][$keyTmp + 4])) { - $fiveChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2] . $matches[0][$keyTmp + 3] . $matches[0][$keyTmp + 4]; - } else { - $fiveChars = null; - } - if ( - $fiveChars - && - !isset($charDone[$fiveChars]) - && - isset($REPLACE_HELPER_CACHE[$cacheKey][$fiveChars]) - && - \strpos($str, $fiveChars) !== false - ) { - // DEBUG - //\var_dump($str, $fiveChars, $REPLACE_HELPER_CACHE[$cacheKey][$fiveChars]); - - $charDone[$fiveChars] = true; - $str = \str_replace($fiveChars, $REPLACE_HELPER_CACHE[$cacheKey][$fiveChars], $str); - - // DEBUG - //\var_dump($str, "\n"); - } - } - } - - if ($maxKeyLength >= 4) { - foreach ($matches[0] as $keyTmp => $char) { - if (isset($matches[0][$keyTmp + 3])) { - $fourChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2] . $matches[0][$keyTmp + 3]; - } else { - $fourChars = null; - } - if ( - $fourChars - && - !isset($charDone[$fourChars]) - && - isset($REPLACE_HELPER_CACHE[$cacheKey][$fourChars]) - && - \strpos($str, $fourChars) !== false - ) { - // DEBUG - //\var_dump($str, $fourChars, $REPLACE_HELPER_CACHE[$cacheKey][$fourChars]); - - $charDone[$fourChars] = true; - $str = \str_replace($fourChars, $REPLACE_HELPER_CACHE[$cacheKey][$fourChars], $str); - - // DEBUG - //\var_dump($str, "\n"); - } - } - } - - foreach ($matches[0] as $keyTmp => $char) { - if (isset($matches[0][$keyTmp + 2])) { - $threeChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2]; - } else { - $threeChars = null; - } - if ( - $threeChars - && - !isset($charDone[$threeChars]) - && - isset($REPLACE_HELPER_CACHE[$cacheKey][$threeChars]) - && - \strpos($str, $threeChars) !== false - ) { - // DEBUG - //\var_dump($str, $threeChars, $REPLACE_HELPER_CACHE[$cacheKey][$threeChars]); - - $charDone[$threeChars] = true; - $str = \str_replace($threeChars, $REPLACE_HELPER_CACHE[$cacheKey][$threeChars], $str); - - // DEBUG - //\var_dump($str, "\n"); - } - } - - foreach ($matches[0] as $keyTmp => $char) { - if (isset($matches[0][$keyTmp + 1])) { - $twoChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1]; - } else { - $twoChars = null; - } - if ( - $twoChars - && - !isset($charDone[$twoChars]) - && - isset($REPLACE_HELPER_CACHE[$cacheKey][$twoChars]) - && - \strpos($str, $twoChars) !== false - ) { - // DEBUG - //\var_dump($str, $twoChars, $REPLACE_HELPER_CACHE[$cacheKey][$twoChars]); - - $charDone[$twoChars] = true; - $str = \str_replace($twoChars, $REPLACE_HELPER_CACHE[$cacheKey][$twoChars], $str); - - // DEBUG - //\var_dump($str, "\n"); - } - } - } - - foreach ($matches[0] as $char) { - if ( - !isset($charDone[$char]) - && - isset($REPLACE_HELPER_CACHE[$cacheKey][$char]) - && - \strpos($str, $char) !== false - ) { - // DEBUG - //\var_dump($str, $char, $REPLACE_HELPER_CACHE[$cacheKey][$char]); - - $charDone[$char] = true; - $str = \str_replace($char, $REPLACE_HELPER_CACHE[$cacheKey][$char], $str); - - // DEBUG - //\var_dump($str, "\n"); - } - } - } - - if (!isset(self::$ASCII_MAPS[$language])) { - $use_transliterate = true; - } - - if ($use_transliterate) { - $str = self::to_transliterate($str, null, false); - } - - if ($remove_unsupported_chars) { - $str = (string) \str_replace(["\n\r", "\n", "\r", "\t"], ' ', $str); - $str = (string) \preg_replace('/' . self::$REGEX_ASCII . '/', '', $str); - } - - return $str; - } - - /** - * Convert given string to safe filename (and keep string case). - * - * EXAMPLE: - * ASCII::to_filename('שדגשדג.png', true)); // 'shdgshdg.png' - * - * - * @param string $str

The string input.

- * @param bool $use_transliterate

ASCII::to_transliterate() is used by default - unsafe characters are - * simply replaced with hyphen otherwise.

- * @param string $fallback_char

The fallback character. - "-" is the default

- * - * @psalm-pure - * - * @return string - *

A string that contains only safe characters for a filename.

- */ - public static function to_filename( - string $str, - bool $use_transliterate = true, - string $fallback_char = '-' - ): string { - if ($use_transliterate) { - $str = self::to_transliterate($str, $fallback_char); - } - - $fallback_char_escaped = \preg_quote($fallback_char, '/'); - - $str = (string) \preg_replace( - [ - '/[^' . $fallback_char_escaped . '.\\-a-zA-Z\d\\s]/', // 1) remove un-needed chars - '/\s+/u', // 2) convert spaces to $fallback_char - '/[' . $fallback_char_escaped . ']+/u', // 3) remove double $fallback_char's - ], - [ - '', - $fallback_char, - $fallback_char, - ], - $str - ); - - return \trim($str, $fallback_char); - } - - /** - * Converts a string into a URL-friendly slug. - * - * - This includes replacing non-ASCII characters with their closest ASCII equivalents, removing remaining - * non-ASCII and non-alphanumeric characters, and replacing whitespace with $separator. - * - The separator defaults to a single dash, and the string is also converted to lowercase. - * - The language of the source string can also be supplied for language-specific transliteration. - * - * @param string $str

The string input.

- * @param string $separator [optional]

The string used to replace whitespace.

- * @param string $language [optional]

Language of the source string. - * (default is 'en') | ASCII::*_LANGUAGE_CODE

- * @param array $replacements [optional]

A map of replaceable strings.

- * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " - * pound ".

- * @param bool $use_str_to_lower [optional]

Use "string to lower" for the input.

- * @param bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown - * chars.

- * @psalm-pure - * - * @return string - *

The URL-friendly slug.

- * - * @phpstan-param ASCII::*_LANGUAGE_CODE $language - */ - public static function to_slugify( - string $str, - string $separator = '-', - string $language = self::ENGLISH_LANGUAGE_CODE, - array $replacements = [], - bool $replace_extra_symbols = false, - bool $use_str_to_lower = true, - bool $use_transliterate = false - ): string { - if ($str === '') { - return ''; - } - - foreach ($replacements as $from => $to) { - $str = \str_replace($from, $to, $str); - } - - $str = self::to_ascii( - $str, - $language, - false, - $replace_extra_symbols, - $use_transliterate - ); - - $str = \str_replace('@', $separator, $str); - - $str = (string) \preg_replace( - '/[^a-zA-Z\\d\\s\\-_' . \preg_quote($separator, '/') . ']/', - '', - $str - ); - - if ($use_str_to_lower) { - $str = \strtolower($str); - } - - $str = (string) \preg_replace('/^[\'\\s]+|[\'\\s]+$/', '', $str); - $str = (string) \preg_replace('/\\B([A-Z])/', '-\1', $str); - $str = (string) \preg_replace('/[\\-_\\s]+/', $separator, $str); - - $l = \strlen($separator); - if ($l && \strpos($str, $separator) === 0) { - $str = (string) \substr($str, $l); - } - - if (\substr($str, -$l) === $separator) { - $str = (string) \substr($str, 0, \strlen($str) - $l); - } - - return $str; - } - - /** - * Returns an ASCII version of the string. A set of non-ASCII characters are - * replaced with their closest ASCII counterparts, and the rest are removed - * unless instructed otherwise. - * - * EXAMPLE: - * ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' - * - * - * @param string $str

The input string.

- * @param string|null $unknown [optional]

Character use if character unknown. (default is '?') - * But you can also use NULL to keep the unknown chars.

- * @param bool $strict [optional]

Use "transliterator_transliterate()" from PHP-Intl - * - * @psalm-pure - * - * @return string - *

A String that contains only ASCII characters.

- */ - public static function to_transliterate( - string $str, - $unknown = '?', - bool $strict = false - ): string { - static $UTF8_TO_TRANSLIT = null; - - static $TRANSLITERATOR = null; - - static $SUPPORT_INTL = null; - - if ($str === '') { - return ''; - } - - if ($SUPPORT_INTL === null) { - $SUPPORT_INTL = \extension_loaded('intl'); - } - - // check if we only have ASCII, first (better performance) - $str_tmp = $str; - if (self::is_ascii($str)) { - return $str; - } - - $str = self::clean($str); - - // check again if we only have ASCII, now ... - if ( - $str_tmp !== $str - && - self::is_ascii($str) - ) { - return $str; - } - - if ( - $strict - && - $SUPPORT_INTL === true - ) { - if (!isset($TRANSLITERATOR)) { - // INFO: see "*-Latin" rules via "transliterator_list_ids()" - $TRANSLITERATOR = \transliterator_create('NFKC; [:Nonspacing Mark:] Remove; NFKC; Any-Latin; Latin-ASCII;'); - } - - // INFO: https://unicode.org/cldr/utility/character.jsp - $str_tmp = \transliterator_transliterate($TRANSLITERATOR, $str); - - if ($str_tmp !== false) { - // check again if we only have ASCII, now ... - if ( - $str_tmp !== $str - && - self::is_ascii($str_tmp) - ) { - return $str_tmp; - } - - $str = $str_tmp; - } - } - - if (self::$ORD === null) { - self::$ORD = self::getData('ascii_ord'); - } - - \preg_match_all('/.|[^\x00]$/us', $str, $array_tmp); - $chars = $array_tmp[0]; - $ord = null; - $str_tmp = ''; - foreach ($chars as &$c) { - $ordC0 = self::$ORD[$c[0]]; - - if ($ordC0 >= 0 && $ordC0 <= 127) { - $str_tmp .= $c; - - continue; - } - - $ordC1 = self::$ORD[$c[1]]; - - // ASCII - next please - if ($ordC0 >= 192 && $ordC0 <= 223) { - $ord = ($ordC0 - 192) * 64 + ($ordC1 - 128); - } - - if ($ordC0 >= 224) { - $ordC2 = self::$ORD[$c[2]]; - - if ($ordC0 <= 239) { - $ord = ($ordC0 - 224) * 4096 + ($ordC1 - 128) * 64 + ($ordC2 - 128); - } - - if ($ordC0 >= 240) { - $ordC3 = self::$ORD[$c[3]]; - - if ($ordC0 <= 247) { - $ord = ($ordC0 - 240) * 262144 + ($ordC1 - 128) * 4096 + ($ordC2 - 128) * 64 + ($ordC3 - 128); - } - - // We only process valid UTF-8 chars (<= 4 byte), so we don't need this code here ... - /* - if ($ordC0 >= 248) { - $ordC4 = self::$ORD[$c[4]]; - - if ($ordC0 <= 251) { - $ord = ($ordC0 - 248) * 16777216 + ($ordC1 - 128) * 262144 + ($ordC2 - 128) * 4096 + ($ordC3 - 128) * 64 + ($ordC4 - 128); - } - - if ($ordC0 >= 252) { - $ordC5 = self::$ORD[$c[5]]; - - if ($ordC0 <= 253) { - $ord = ($ordC0 - 252) * 1073741824 + ($ordC1 - 128) * 16777216 + ($ordC2 - 128) * 262144 + ($ordC3 - 128) * 4096 + ($ordC4 - 128) * 64 + ($ordC5 - 128); - } - } - } - */ - } - } - - if ( - $ordC0 === 254 - || - $ordC0 === 255 - || - $ord === null - ) { - $str_tmp .= $unknown ?? $c; - - continue; - } - - $bank = $ord >> 8; - if (!isset($UTF8_TO_TRANSLIT[$bank])) { - $UTF8_TO_TRANSLIT[$bank] = self::getDataIfExists(\sprintf('x%03x', $bank)); - } - - $new_char = $ord & 255; - - if (isset($UTF8_TO_TRANSLIT[$bank][$new_char])) { - // keep for debugging - /* - echo "file: " . sprintf('x%02x', $bank) . "\n"; - echo "char: " . $c . "\n"; - echo "ord: " . $ord . "\n"; - echo "new_char: " . $new_char . "\n"; - echo "new_char: " . mb_chr($new_char) . "\n"; - echo "ascii: " . $UTF8_TO_TRANSLIT[$bank][$new_char] . "\n"; - echo "bank:" . $bank . "\n\n"; - */ - - $new_char = $UTF8_TO_TRANSLIT[$bank][$new_char]; - - /* @noinspection PhpStatementHasEmptyBodyInspection */ - if ($unknown === null && $new_char === '') { - // nothing - } elseif ( - $new_char === '[?]' - || - $new_char === '[?] ' - ) { - $c = $unknown ?? $c; - } else { - $c = $new_char; - } - } else { - // keep for debugging missing chars - /* - echo "file: " . sprintf('x%02x', $bank) . "\n"; - echo "char: " . $c . "\n"; - echo "ord: " . $ord . "\n"; - echo "new_char: " . $new_char . "\n"; - echo "new_char: " . mb_chr($new_char) . "\n"; - echo "bank:" . $bank . "\n\n"; - */ - - $c = $unknown ?? $c; - } - - $str_tmp .= $c; - } - - return $str_tmp; - } - - /** - * WARNING: This method will return broken characters and is only for special cases. - * - * Convert a UTF-8 encoded string to a single-byte string suitable for - * functions that need the same string length after the conversion. - * - * The function simply uses (and updates) a tailored dynamic encoding - * (in/out map parameter) where non-ascii characters are remapped to - * the range [128-255] in order of appearance. - * - * Thus, it supports up to 128 different multibyte code points max over - * the whole set of strings sharing this encoding. - * - * Source: https://github.com/KEINOS/mb_levenshtein - * - * @param string $str

UTF-8 string to be converted to extended ASCII.

- * @param array $map

Internal-Map of code points to ASCII characters.

- * - * @return string - *

Mapped broken string.

- * - * @phpstan-param array $map - */ - private static function to_ascii_remap_intern(string $str, array &$map): string - { - // find all utf-8 characters - $matches = []; - if (!\preg_match_all('/[\xC0-\xF7][\x80-\xBF]+/', $str, $matches)) { - return $str; // plain ascii string - } - - // update the encoding map with the characters not already met - $mapCount = \count($map); - foreach ($matches[0] as $mbc) { - if (!isset($map[$mbc])) { - $map[$mbc] = \chr(128 + $mapCount); - ++$mapCount; - } - } - - // finally, remap non-ascii characters - return \strtr($str, $map); - } - - /** - * Get the language from a string. - * - * e.g.: de_at -> de_at - * de_DE -> de - * DE_DE -> de - * de-de -> de - * - * @return string - */ - private static function get_language(string $language) - { - if ($language === '') { - return ''; - } - - if ( - \strpos($language, '_') === false - && - \strpos($language, '-') === false - ) { - return \strtolower($language); - } - - $language = \str_replace('-', '_', \strtolower($language)); - - $regex = '/(?[a-z]+)_\g{first}/'; - - return (string) \preg_replace($regex, '$1', $language); - } - - /** - * Get data from "/data/*.php". - * - * @return array - */ - private static function getData(string $file) - { - return include __DIR__ . '/data/' . $file . '.php'; - } - - /** - * Get data from "/data/*.php". - * - * @return array - */ - private static function getDataIfExists(string $file): array - { - $file = __DIR__ . '/data/' . $file . '.php'; - if (\is_file($file)) { - return include $file; - } - - return []; - } - - /** - * @return void - */ - private static function prepareAsciiAndExtrasMaps() - { - if (self::$ASCII_MAPS_AND_EXTRAS === null) { - self::prepareAsciiMaps(); - self::prepareAsciiExtras(); - - self::$ASCII_MAPS_AND_EXTRAS = \array_merge_recursive( - self::$ASCII_MAPS ?? [], - self::$ASCII_EXTRAS ?? [] - ); - } - } - - /** - * @return void - */ - private static function prepareAsciiMaps() - { - if (self::$ASCII_MAPS === null) { - self::$ASCII_MAPS = self::getData('ascii_by_languages'); - } - } - - /** - * @return void - */ - private static function prepareAsciiExtras() - { - if (self::$ASCII_EXTRAS === null) { - self::$ASCII_EXTRAS = self::getData('ascii_extras_by_languages'); - } - } -} diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php deleted file mode 100644 index 68c3f9d..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php +++ /dev/null @@ -1,2950 +0,0 @@ - [ - 'Á' => 'A', - 'á' => 'a', - 'Ä' => 'A', - 'ä' => 'a', - 'À' => 'A', - 'à' => 'a', - 'Â' => 'A', - 'â' => 'a', - 'É' => 'E', - 'é' => 'e', - 'Ë' => 'E', - 'ë' => 'e', - 'È' => 'E', - 'è' => 'e', - 'Ê' => 'E', - 'ê' => 'e', - 'Í' => 'I', - 'í' => 'i', - 'Ï' => 'I', - 'ï' => 'i', - 'Ì' => 'I', - 'ì' => 'i', - 'Î' => 'I', - 'î' => 'i', - 'Ó' => 'O', - 'ó' => 'o', - 'Ö' => 'O', - 'ö' => 'o', - 'Ò' => 'O', - 'ò' => 'o', - 'Ô' => 'O', - 'ô' => 'o', - 'Ú' => 'U', - 'ú' => 'u', - 'Ü' => 'U', - 'ü' => 'u', - 'Ù' => 'U', - 'ù' => 'u', - 'Û' => 'U', - 'û' => 'u', - 'Ý' => 'Y', - 'ý' => 'y', - 'Ÿ' => 'Y', - ], - // Italian - 'it' => [ - 'à' => 'a', - 'À' => 'A', - 'é' => 'e', - 'É' => 'E', - 'è' => 'e', - 'È' => 'E', - 'ì' => 'i', - 'Ì' => 'I', - 'Ò' => 'O', - 'ò' => 'o', - 'ù' => 'u', - 'Ù' => 'U', - ], - // Macedonian - 'mk' => [ - 'А' => 'A', - 'Б' => 'B', - 'В' => 'V', - 'Г' => 'G', - 'Д' => 'D', - 'Ѓ' => 'Gj', - 'Е' => 'E', - 'Ж' => 'Zh', - 'З' => 'Z', - 'Ѕ' => 'Dz', - 'И' => 'I', - 'Ј' => 'J', - 'К' => 'K', - 'Л' => 'L', - 'Љ' => 'Lj', - 'М' => 'M', - 'Н' => 'N', - 'Њ' => 'Nj', - 'О' => 'O', - 'П' => 'P', - 'Р' => 'R', - 'С' => 'S', - 'Т' => 'T', - 'Ќ' => 'Kj', - 'У' => 'U', - 'Ф' => 'F', - 'Х' => 'H', - 'Ц' => 'C', - 'Ч' => 'Ch', - 'Џ' => 'Dj', - 'Ш' => 'Sh', - 'а' => 'a', - 'б' => 'b', - 'в' => 'v', - 'г' => 'g', - 'д' => 'd', - 'ѓ' => 'gj', - 'е' => 'e', - 'ж' => 'zh', - 'з' => 'z', - 'ѕ' => 'dz', - 'и' => 'i', - 'ј' => 'j', - 'к' => 'k', - 'л' => 'l', - 'љ' => 'lj', - 'м' => 'm', - 'н' => 'n', - 'њ' => 'nj', - 'о' => 'o', - 'п' => 'p', - 'р' => 'r', - 'с' => 's', - 'т' => 't', - 'ќ' => 'kj', - 'у' => 'u', - 'ф' => 'f', - 'х' => 'h', - 'ц' => 'c', - 'ч' => 'ch', - 'џ' => 'dj', - 'ш' => 'sh', - ], - // Portuguese (Brazil) - 'pt' => [ - 'æ' => 'ae', - 'ǽ' => 'ae', - 'À' => 'A', - 'Á' => 'A', - 'Â' => 'A', - 'Ã' => 'A', - 'Å' => 'AA', - 'Ǻ' => 'A', - 'Ă' => 'A', - 'Ǎ' => 'A', - 'Æ' => 'AE', - 'Ǽ' => 'AE', - 'à' => 'a', - 'á' => 'a', - 'â' => 'a', - 'ã' => 'a', - 'å' => 'aa', - 'ǻ' => 'a', - 'ă' => 'a', - 'ǎ' => 'a', - 'ª' => 'a', - 'Ĉ' => 'C', - 'Ċ' => 'C', - 'Ç' => 'C', - 'ç' => 'c', - 'ĉ' => 'c', - 'ċ' => 'c', - 'Ð' => 'Dj', - 'Đ' => 'D', - 'ð' => 'dj', - 'đ' => 'd', - 'È' => 'E', - 'É' => 'E', - 'Ê' => 'E', - 'Ë' => 'E', - 'Ĕ' => 'E', - 'Ė' => 'E', - 'è' => 'e', - 'é' => 'e', - 'ê' => 'e', - 'ë' => 'e', - 'ĕ' => 'e', - 'ė' => 'e', - 'ƒ' => 'f', - 'Ĝ' => 'G', - 'Ġ' => 'G', - 'ĝ' => 'g', - 'ġ' => 'g', - 'Ĥ' => 'H', - 'Ħ' => 'H', - 'ĥ' => 'h', - 'ħ' => 'h', - 'Ì' => 'I', - 'Í' => 'I', - 'Î' => 'I', - 'Ï' => 'I', - 'Ĩ' => 'I', - 'Ĭ' => 'I', - 'Ǐ' => 'I', - 'Į' => 'I', - 'IJ' => 'IJ', - 'ì' => 'i', - 'í' => 'i', - 'î' => 'i', - 'ï' => 'i', - 'ĩ' => 'i', - 'ĭ' => 'i', - 'ǐ' => 'i', - 'į' => 'i', - 'ij' => 'ij', - 'Ĵ' => 'J', - 'ĵ' => 'j', - 'Ĺ' => 'L', - 'Ľ' => 'L', - 'Ŀ' => 'L', - 'ĺ' => 'l', - 'ľ' => 'l', - 'ŀ' => 'l', - 'Ñ' => 'N', - 'ñ' => 'n', - 'ʼn' => 'n', - 'Ò' => 'O', - 'Ó' => 'O', - 'Ô' => 'O', - 'Õ' => 'O', - 'Ō' => 'O', - 'Ŏ' => 'O', - 'Ǒ' => 'O', - 'Ő' => 'O', - 'Ơ' => 'O', - 'Ø' => 'OE', - 'Ǿ' => 'O', - 'Œ' => 'OE', - 'ò' => 'o', - 'ó' => 'o', - 'ô' => 'o', - 'õ' => 'o', - 'ō' => 'o', - 'ŏ' => 'o', - 'ǒ' => 'o', - 'ő' => 'o', - 'ơ' => 'o', - 'ø' => 'oe', - 'ǿ' => 'o', - 'º' => 'o', - 'œ' => 'oe', - 'Ŕ' => 'R', - 'Ŗ' => 'R', - 'ŕ' => 'r', - 'ŗ' => 'r', - 'Ŝ' => 'S', - 'Ș' => 'S', - 'ŝ' => 's', - 'ș' => 's', - 'ſ' => 's', - 'Ţ' => 'T', - 'Ț' => 'T', - 'Ŧ' => 'T', - 'Þ' => 'TH', - 'ţ' => 't', - 'ț' => 't', - 'ŧ' => 't', - 'þ' => 'th', - 'Ù' => 'U', - 'Ú' => 'U', - 'Û' => 'U', - 'Ü' => 'U', - 'Ũ' => 'U', - 'Ŭ' => 'U', - 'Ű' => 'U', - 'Ų' => 'U', - 'Ư' => 'U', - 'Ǔ' => 'U', - 'Ǖ' => 'U', - 'Ǘ' => 'U', - 'Ǚ' => 'U', - 'Ǜ' => 'U', - 'ù' => 'u', - 'ú' => 'u', - 'û' => 'u', - 'ü' => 'u', - 'ũ' => 'u', - 'ŭ' => 'u', - 'ű' => 'u', - 'ų' => 'u', - 'ư' => 'u', - 'ǔ' => 'u', - 'ǖ' => 'u', - 'ǘ' => 'u', - 'ǚ' => 'u', - 'ǜ' => 'u', - 'Ŵ' => 'W', - 'ŵ' => 'w', - 'Ý' => 'Y', - 'Ÿ' => 'Y', - 'Ŷ' => 'Y', - 'ý' => 'y', - 'ÿ' => 'y', - 'ŷ' => 'y', - ], - // Greek(lish) (Elláda) - 'el__greeklish' => [ - 'ΑΥ' => 'AU', - 'ΑΎ' => 'AU', - 'Αυ' => 'Au', - 'Αύ' => 'Au', - 'ΕΊ' => 'EI', - 'ΕΙ' => 'EI', - 'Ει' => 'EI', - 'ΕΥ' => 'EU', - 'ΕΎ' => 'EU', - 'Εί' => 'Ei', - 'Ευ' => 'Eu', - 'Εύ' => 'Eu', - 'ΟΙ' => 'OI', - 'ΟΊ' => 'OI', - 'ΟΥ' => 'OU', - 'ΟΎ' => 'OU', - 'Οι' => 'Oi', - 'Οί' => 'Oi', - 'Ου' => 'Ou', - 'Ού' => 'Ou', - 'ΥΙ' => 'YI', - 'ΎΙ' => 'YI', - 'Υι' => 'Yi', - 'Ύι' => 'Yi', - 'ΥΊ' => 'Yi', - 'Υί' => 'Yi', - 'αυ' => 'au', - 'αύ' => 'au', - 'εί' => 'ei', - 'ει' => 'ei', - 'ευ' => 'eu', - 'εύ' => 'eu', - 'οι' => 'oi', - 'οί' => 'oi', - 'ου' => 'ou', - 'ού' => 'ou', - 'υι' => 'yi', - 'ύι' => 'yi', - 'υί' => 'yi', - 'Α' => 'A', - 'Ά' => 'A', - 'Β' => 'B', - 'Δ' => 'D', - 'Ε' => 'E', - 'Έ' => 'E', - 'Φ' => 'F', - 'Γ' => 'G', - 'Η' => 'H', - 'Ή' => 'H', - 'Ι' => 'I', - 'Ί' => 'I', - 'Ϊ' => 'I', - 'Κ' => 'K', - 'Ξ' => 'Ks', - 'Λ' => 'L', - 'Μ' => 'M', - 'Ν' => 'N', - 'Π' => 'N', - 'Ο' => 'O', - 'Ό' => 'O', - 'Ψ' => 'Ps', - 'Ρ' => 'R', - 'Σ' => 'S', - 'Τ' => 'T', - 'Θ' => 'Th', - 'Ω' => 'W', - 'Ώ' => 'W', - 'Χ' => 'X', - 'ϒ' => 'Y', - 'Υ' => 'Y', - 'Ύ' => 'Y', - 'Ϋ' => 'Y', - 'Ζ' => 'Z', - 'α' => 'a', - 'ά' => 'a', - 'β' => 'b', - 'δ' => 'd', - 'ε' => 'e', - 'έ' => 'e', - 'φ' => 'f', - 'γ' => 'g', - 'η' => 'h', - 'ή' => 'h', - 'ι' => 'i', - 'ί' => 'i', - 'ϊ' => 'i', - 'ΐ' => 'i', - 'κ' => 'k', - 'ξ' => 'ks', - 'λ' => 'l', - 'μ' => 'm', - 'ν' => 'n', - 'ο' => 'o', - 'ό' => 'o', - 'π' => 'p', - 'ψ' => 'ps', - 'ρ' => 'r', - 'σ' => 's', - 'ς' => 's', - 'τ' => 't', - 'ϑ' => 'th', - 'θ' => 'th', - 'ϐ' => 'v', - 'ω' => 'w', - 'ώ' => 'w', - 'χ' => 'x', - 'υ' => 'y', - 'ύ' => 'y', - 'ΰ' => 'y', - 'ϋ' => 'y', - 'ζ' => 'z', - ], - // Greek (Elláda) - 'el' => [ - 'ΑΥ' => 'AU', - 'Αυ' => 'Au', - 'ΟΥ' => 'U', - 'Ου' => 'u', - 'ΕΥ' => 'EF', - 'Ευ' => 'Ef', - 'ΕΙ' => 'I', - 'Ει' => 'I', - 'ΟΙ' => 'I', - 'Οι' => 'I', - 'ΥΙ' => 'I', - 'Υι' => 'I', - 'ΑΎ' => 'AU', - 'Αύ' => 'Au', - 'ΟΎ' => 'OU', - 'Ού' => 'Ou', - 'ΕΎ' => 'EU', - 'Εύ' => 'Eu', - 'ΕΊ' => 'I', - 'Εί' => 'I', - 'ΟΊ' => 'I', - 'Οί' => 'I', - 'ΎΙ' => 'I', - 'Ύι' => 'I', - 'ΥΊ' => 'I', - 'Υί' => 'I', - 'αυ' => 'au', - 'ου' => 'u', - 'ευ' => 'ef', - 'ει' => 'i', - 'οι' => 'i', - 'υι' => 'i', - 'αύ' => 'au', - 'ού' => 'ou', - 'εύ' => 'eu', - 'εί' => 'i', - 'οί' => 'i', - 'ύι' => 'i', - 'υί' => 'i', - 'α' => 'a', - 'β' => 'v', - 'γ' => 'gh', - 'δ' => 'd', - 'ε' => 'e', - 'ζ' => 'z', - 'η' => 'i', - 'θ' => 'th', - 'ι' => 'i', - 'κ' => 'k', - 'λ' => 'l', - 'μ' => 'm', - 'ν' => 'n', - 'ξ' => 'ks', - 'ο' => 'o', - 'π' => 'p', - 'ρ' => 'r', - 'σ' => 's', - 'τ' => 't', - 'υ' => 'i', - 'φ' => 'f', - 'χ' => 'kh', - 'ψ' => 'ps', - 'ω' => 'o', - 'ά' => 'a', - 'έ' => 'e', - 'ί' => 'i', - 'ό' => 'o', - 'ϒ' => 'Y', - 'ύ' => 'y', - 'ή' => 'i', - 'ώ' => 'w', - 'ς' => 's', - 'ϊ' => 'i', - 'ΰ' => 'y', - 'ϋ' => 'y', - 'ΐ' => 'i', - 'Α' => 'A', - 'Β' => 'B', - 'Γ' => 'G', - 'Δ' => 'D', - 'Ε' => 'E', - 'Ζ' => 'Z', - 'Η' => 'H', - 'Θ' => 'Th', - 'Ι' => 'I', - 'Κ' => 'K', - 'Λ' => 'L', - 'Μ' => 'M', - 'Ν' => 'N', - 'Ξ' => 'Ks', - 'Ο' => 'O', - 'Π' => 'P', - 'Ρ' => 'R', - 'Σ' => 'S', - 'Τ' => 'T', - 'Υ' => 'Y', - 'Φ' => 'F', - 'Χ' => 'X', - 'Ψ' => 'Ps', - 'Ω' => 'O', - 'Ά' => 'A', - 'Έ' => 'E', - 'Ί' => 'I', - 'Ό' => 'O', - 'Ύ' => 'Y', - 'Ή' => 'I', - 'Ώ' => 'W', - 'Ϊ' => 'I', - 'Ϋ' => 'Y', - 'ϐ' => 'v', - 'ϑ' => 'th', - ], - // Hindi - 'hi' => [ - 'अ' => 'a', - 'आ' => 'aa', - 'ए' => 'e', - 'ई' => 'ii', - 'ऍ' => 'ei', - 'ऎ' => 'ae', - 'ऐ' => 'ai', - 'इ' => 'i', - 'ओ' => 'o', - 'ऑ' => 'oi', - 'ऒ' => 'oii', - 'ऊ' => 'uu', - 'औ' => 'ou', - 'उ' => 'u', - 'ब' => 'B', - 'भ' => 'Bha', - 'च' => 'Ca', - 'छ' => 'Chha', - 'ड' => 'Da', - 'ढ' => 'Dha', - 'फ' => 'Fa', - 'फ़' => 'Fi', - 'ग' => 'Ga', - 'घ' => 'Gha', - 'ग़' => 'Ghi', - 'ह' => 'Ha', - 'ज' => 'Ja', - 'झ' => 'Jha', - 'क' => 'Ka', - 'ख' => 'Kha', - 'ख़' => 'Khi', - 'ल' => 'L', - 'ळ' => 'Li', - 'ऌ' => 'Li', - 'ऴ' => 'Lii', - 'ॡ' => 'Lii', - 'म' => 'Ma', - 'न' => 'Na', - 'ङ' => 'Na', - 'ञ' => 'Nia', - 'ण' => 'Nae', - 'ऩ' => 'Ni', - 'ॐ' => 'oms', - 'प' => 'Pa', - 'क़' => 'Qi', - 'र' => 'Ra', - 'ऋ' => 'Ri', - 'ॠ' => 'Ri', - 'ऱ' => 'Ri', - 'स' => 'Sa', - 'श' => 'Sha', - 'ष' => 'Shha', - 'ट' => 'Ta', - 'त' => 'Ta', - 'ठ' => 'Tha', - 'द' => 'Tha', - 'थ' => 'Tha', - 'ध' => 'Thha', - 'ड़' => 'ugDha', - 'ढ़' => 'ugDhha', - 'व' => 'Va', - 'य' => 'Ya', - 'य़' => 'Yi', - 'ज़' => 'Za', - ], - // Armenian - 'hy' => [ - 'Ա' => 'A', - 'Բ' => 'B', - 'Գ' => 'G', - 'Դ' => 'D', - 'Ե' => 'E', - 'Զ' => 'Z', - 'Է' => 'E', - 'Ը' => 'Y', - 'Թ' => 'Th', - 'Ժ' => 'Zh', - 'Ի' => 'I', - 'Լ' => 'L', - 'Խ' => 'Kh', - 'Ծ' => 'Ts', - 'Կ' => 'K', - 'Հ' => 'H', - 'Ձ' => 'Dz', - 'Ղ' => 'Gh', - 'Ճ' => 'Tch', - 'Մ' => 'M', - 'Յ' => 'Y', - 'Ն' => 'N', - 'Շ' => 'Sh', - 'Ո' => 'Vo', - 'Չ' => 'Ch', - 'Պ' => 'P', - 'Ջ' => 'J', - 'Ռ' => 'R', - 'Ս' => 'S', - 'Վ' => 'V', - 'Տ' => 'T', - 'Ր' => 'R', - 'Ց' => 'C', - 'Ւ' => 'u', - 'Փ' => 'Ph', - 'Ք' => 'Q', - 'և' => 'ev', - 'Օ' => 'O', - 'Ֆ' => 'F', - 'ա' => 'a', - 'բ' => 'b', - 'գ' => 'g', - 'դ' => 'd', - 'ե' => 'e', - 'զ' => 'z', - 'է' => 'e', - 'ը' => 'y', - 'թ' => 'th', - 'ժ' => 'zh', - 'ի' => 'i', - 'լ' => 'l', - 'խ' => 'kh', - 'ծ' => 'ts', - 'կ' => 'k', - 'հ' => 'h', - 'ձ' => 'dz', - 'ղ' => 'gh', - 'ճ' => 'tch', - 'մ' => 'm', - 'յ' => 'y', - 'ն' => 'n', - 'շ' => 'sh', - 'ո' => 'vo', - 'չ' => 'ch', - 'պ' => 'p', - 'ջ' => 'j', - 'ռ' => 'r', - 'ս' => 's', - 'վ' => 'v', - 'տ' => 't', - 'ր' => 'r', - 'ց' => 'c', - 'ւ' => 'u', - 'փ' => 'ph', - 'ք' => 'q', - 'օ' => 'o', - 'ֆ' => 'f', - ], - // Swedish - 'sv' => [ - 'Ä' => 'A', - 'ä' => 'a', - 'Å' => 'A', - 'å' => 'a', - 'Ö' => 'O', - 'ö' => 'o', - ], - // Turkmen - 'tk' => [ - 'Ç' => 'C', - 'Ä' => 'A', - 'Ž' => 'Z', - 'Ň' => 'N', - 'Ö' => 'O', - 'Ş' => 'S', - 'Ü' => 'U', - 'Ý' => 'Y', - 'ç' => 'c', - 'ä' => 'a', - 'ž' => 'z', - 'ň' => 'n', - 'ö' => 'o', - 'ş' => 's', - 'ü' => 'u', - 'ý' => 'y', - ], - // Turkish - 'tr' => [ - 'ň' => 'n', - 'Ň' => 'N', - 'ş' => 's', - 'Ş' => 'S', - 'ı' => 'i', - 'İ' => 'I', - 'ç' => 'c', - 'Ç' => 'C', - 'ä' => 'a', - 'Ä' => 'A', - 'ü' => 'u', - 'Ü' => 'U', - 'ö' => 'o', - 'Ö' => 'O', - 'ğ' => 'g', - 'Ğ' => 'G', - 'ý' => 'y', - 'Ý' => 'Y', - 'ž' => 'z', - 'Ž' => 'Z', - ], - // Bulgarian - 'bg' => [ - 'ьо' => 'yo', - 'А' => 'A', - 'Б' => 'B', - 'В' => 'V', - 'Г' => 'G', - 'Д' => 'D', - 'Е' => 'E', - 'Ж' => 'Zh', - 'З' => 'Z', - 'И' => 'I', - 'Й' => 'Y', - 'К' => 'K', - 'Л' => 'L', - 'М' => 'M', - 'Н' => 'N', - 'О' => 'O', - 'П' => 'P', - 'Р' => 'R', - 'С' => 'S', - 'Т' => 'T', - 'У' => 'U', - 'Ф' => 'F', - 'Х' => 'H', - 'Ц' => 'C', - 'Ч' => 'Ch', - 'Ш' => 'Sh', - 'Щ' => 'Sht', - 'Ъ' => 'A', - 'Ь' => '', - 'Ю' => 'Yu', - 'Я' => 'Ya', - 'а' => 'a', - 'б' => 'b', - 'в' => 'v', - 'г' => 'g', - 'д' => 'd', - 'е' => 'e', - 'ж' => 'zh', - 'з' => 'z', - 'и' => 'i', - 'й' => 'y', - 'к' => 'k', - 'л' => 'l', - 'м' => 'm', - 'н' => 'n', - 'о' => 'o', - 'п' => 'p', - 'р' => 'r', - 'с' => 's', - 'т' => 't', - 'у' => 'u', - 'ф' => 'f', - 'х' => 'h', - 'ц' => 'c', - 'ч' => 'ch', - 'ш' => 'sh', - 'щ' => 'sht', - 'ъ' => 'a', - 'ь' => '', - 'ю' => 'yu', - 'я' => 'ya', - ], - // Hungarian - 'hu' => [ - 'Á' => 'A', - 'Ē' => 'E', - 'É' => 'E', - 'Í' => 'I', - 'Ó' => 'O', - 'Ö' => 'O', - 'Ő' => 'O', - 'Ú' => 'U', - 'Ü' => 'U', - 'Ű' => 'U', - 'á' => 'a', - 'ē' => 'e', - 'é' => 'e', - 'í' => 'i', - 'ó' => 'o', - 'ö' => 'o', - 'ő' => 'o', - 'ú' => 'u', - 'ü' => 'u', - 'ű' => 'u', - ], - // Myanmar (Burmese) - 'my' => [ - 'န်ုပ်' => 'nub', - 'ောင်' => 'aung', - 'ိုက်' => 'aik', - 'ိုဒ်' => 'ok', - 'ိုင်' => 'aing', - 'ိုလ်' => 'ol', - 'ေါင်' => 'aung', - 'သြော' => 'aw', - 'ောက်' => 'auk', - 'ိတ်' => 'eik', - 'ုတ်' => 'ok', - 'ုန်' => 'on', - 'ေတ်' => 'it', - 'ုဒ်' => 'ait', - 'ာန်' => 'an', - 'ိန်' => 'ein', - 'ွတ်' => 'ut', - 'ေါ်' => 'aw', - 'ွန်' => 'un', - 'ိပ်' => 'eik', - 'ုပ်' => 'ok', - 'ွပ်' => 'ut', - 'ိမ်' => 'ein', - 'ုမ်' => 'on', - 'ော်' => 'aw', - 'ွမ်' => 'un', - 'က်' => 'et', - 'ေါ' => 'aw', - 'ော' => 'aw', - 'ျွ' => 'ywa', - 'ြွ' => 'yw', - 'ို' => 'o', - 'ုံ' => 'on', - 'တ်' => 'at', - 'င်' => 'in', - 'ည်' => 'i', - 'ဒ်' => 'd', - 'န်' => 'an', - 'ပ်' => 'at', - 'မ်' => 'an', - 'စျ' => 'za', - 'ယ်' => 'e', - 'ဉ်' => 'in', - 'စ်' => 'it', - 'ိံ' => 'ein', - 'ဲ' => 'e', - 'း' => '', - 'ာ' => 'a', - 'ါ' => 'a', - 'ေ' => 'e', - 'ံ' => 'an', - 'ိ' => 'i', - 'ီ' => 'i', - 'ု' => 'u', - 'ူ' => 'u', - '်' => 'at', - '္' => '', - '့' => '', - 'က' => 'k', - '၉' => '9', - 'တ' => 't', - 'ရ' => 'ya', - 'ယ' => 'y', - 'မ' => 'm', - 'ဘ' => 'ba', - 'ဗ' => 'b', - 'ဖ' => 'pa', - 'ပ' => 'p', - 'န' => 'n', - 'ဓ' => 'da', - 'ဒ' => 'd', - 'ထ' => 'ta', - 'ဏ' => 'na', - 'ဝ' => 'w', - 'ဎ' => 'da', - 'ဍ' => 'd', - 'ဌ' => 'ta', - 'ဋ' => 't', - 'ည' => 'ny', - 'ဇ' => 'z', - 'ဆ' => 'sa', - 'စ' => 's', - 'င' => 'ng', - 'ဃ' => 'ga', - 'ဂ' => 'g', - 'လ' => 'l', - 'သ' => 'th', - '၈' => '8', - 'ဩ' => 'aw', - 'ခ' => 'kh', - '၆' => '6', - '၅' => '5', - '၄' => '4', - '၃' => '3', - '၂' => '2', - '၁' => '1', - '၀' => '0', - '၌' => 'hnaik', - '၍' => 'ywae', - 'ဪ' => 'aw', - 'ဦ' => '-u', - 'ဟ' => 'h', - 'ဉ' => 'u', - 'ဤ' => '-i', - 'ဣ' => 'i', - '၏' => '-e', - 'ဧ' => 'e', - 'ှ' => 'h', - 'ွ' => 'w', - 'ျ' => 'ya', - 'ြ' => 'y', - 'အ' => 'a', - 'ဠ' => 'la', - '၇' => '7', - ], - // Croatian (Hrvatska) - 'hr' => [ - 'DŽ' => 'DZ', - 'Dž' => 'Dz', - 'dž' => 'dz', - 'DZ' => 'DZ', - 'Dz' => 'Dz', - 'dz' => 'dz', - 'IJ' => 'IJ', - 'ij' => 'ij', - 'LJ' => 'LJ', - 'Lj' => 'Lj', - 'lj' => 'lj', - 'NJ' => 'NJ', - 'Nj' => 'Nj', - 'nj' => 'nj', - 'ž' => 'z', - 'Ž' => 'Z', - 'đ' => 'dj', - 'Đ' => 'Dj', - 'č' => 'c', - 'Č' => 'C', - 'ć' => 'c', - 'Ć' => 'C', - 'š' => 's', - 'Š' => 'S', - ], - // Finnish - 'fi' => [ - 'Ä' => 'A', - 'Ö' => 'O', - 'ä' => 'a', - 'ö' => 'o', - ], - // Georgian (Kartvelian) - 'ka' => [ - 'ა' => 'a', - 'ბ' => 'b', - 'გ' => 'g', - 'დ' => 'd', - 'ე' => 'e', - 'ვ' => 'v', - 'ზ' => 'z', - 'თ' => 't', - 'ი' => 'i', - 'კ' => 'k', - 'ლ' => 'l', - 'მ' => 'm', - 'ნ' => 'n', - 'ო' => 'o', - 'პ' => 'p', - 'ჟ' => 'zh', - 'რ' => 'r', - 'ს' => 's', - 'ტ' => 't', - 'უ' => 'u', - 'ფ' => 'f', - 'ქ' => 'q', - 'ღ' => 'gh', - 'ყ' => 'y', - 'შ' => 'sh', - 'ჩ' => 'ch', - 'ც' => 'ts', - 'ძ' => 'dz', - 'წ' => 'ts', - 'ჭ' => 'ch', - 'ხ' => 'kh', - 'ჯ' => 'j', - 'ჰ' => 'h', - ], - // Russian - 'ru' => [ - 'А' => 'A', - 'а' => 'a', - 'Б' => 'B', - 'б' => 'b', - 'В' => 'V', - 'в' => 'v', - 'Г' => 'G', - 'г' => 'g', - 'Д' => 'D', - 'д' => 'd', - 'Е' => 'E', - 'е' => 'e', - 'Ё' => 'Yo', - 'ё' => 'yo', - 'Ж' => 'Zh', - 'ж' => 'zh', - 'З' => 'Z', - 'з' => 'z', - 'И' => 'I', - 'и' => 'i', - 'Й' => 'Y', - 'й' => 'y', - 'К' => 'K', - 'к' => 'k', - 'Л' => 'L', - 'л' => 'l', - 'М' => 'M', - 'м' => 'm', - 'Н' => 'N', - 'н' => 'n', - 'О' => 'O', - 'о' => 'o', - 'П' => 'P', - 'п' => 'p', - 'Р' => 'R', - 'р' => 'r', - 'С' => 'S', - 'с' => 's', - 'Т' => 'T', - 'т' => 't', - 'У' => 'U', - 'у' => 'u', - 'Ф' => 'F', - 'ф' => 'f', - 'Х' => 'H', - 'х' => 'h', - 'Ц' => 'Ts', - 'ц' => 'ts', - 'Ч' => 'Ch', - 'ч' => 'ch', - 'ш' => 'sh', - 'Ш' => 'Sh', - 'Щ' => 'Sch', - 'щ' => 'sch', - 'Ъ' => '', - 'ъ' => '', - 'Ы' => 'Y', - 'ы' => 'y', - 'Ь' => '', - 'ь' => '', - 'Э' => 'E', - 'э' => 'e', - 'Ю' => 'Yu', - 'ю' => 'yu', - 'Я' => 'Ya', - 'я' => 'ya', - ], - // Russian - GOST 7.79-2000(B) - // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 - 'ru__gost_2000_b' => [ - 'А' => 'A', - 'а' => 'a', - 'Б' => 'B', - 'б' => 'b', - 'В' => 'V', - 'в' => 'v', - 'Г' => 'G', - 'г' => 'g', - 'Д' => 'D', - 'д' => 'd', - 'Е' => 'E', - 'е' => 'e', - 'Ё' => 'Yo', - 'ё' => 'yo', - 'Ж' => 'Zh', - 'ж' => 'zh', - 'З' => 'Z', - 'з' => 'z', - 'И' => 'i', - 'и' => 'i', - 'Й' => 'i', - 'й' => 'i', - 'К' => 'K', - 'к' => 'k', - 'Л' => 'L', - 'л' => 'l', - 'М' => 'M', - 'м' => 'm', - 'Н' => 'N', - 'н' => 'n', - 'О' => 'O', - 'о' => 'o', - 'П' => 'P', - 'п' => 'p', - 'Р' => 'R', - 'р' => 'r', - 'С' => 'S', - 'с' => 's', - 'Т' => 'T', - 'т' => 't', - 'У' => 'U', - 'у' => 'u', - 'Ф' => 'F', - 'ф' => 'f', - 'Х' => 'X', - 'х' => 'x', - 'Ц' => 'Cz', - 'ц' => 'cz', - 'Ч' => 'Ch', - 'ч' => 'ch', - 'ш' => 'sh', - 'Ш' => 'Sh', - 'Щ' => 'Shh', - 'щ' => 'shh', - 'Ъ' => '', - 'ъ' => '', - 'Ы' => 'Y\'', - 'ы' => 'y\'', - 'Ь' => '', - 'ь' => '', - 'Э' => 'E\'', - 'э' => 'e\'', - 'Ю' => 'Yu', - 'ю' => 'yu', - 'Я' => 'Ya', - 'я' => 'ya', - 'І' => 'I', - 'і' => 'i', - 'Ѳ' => 'Fh', - 'ѳ' => 'fh', - 'Ѣ' => 'Ye', - 'ѣ' => 'ye', - 'Ѵ' => 'Yh', - 'ѵ' => 'yh', - 'Є' => '', - 'є' => '', - 'Ѥ' => '', - 'ѥ' => '', - 'Ѕ' => 'Js', - 'ѕ' => 'js', - 'Ꙋ' => '', - 'ꙋ' => '', - 'Ѡ' => '', - 'ѡ' => '', - 'Ѿ' => '', - 'ѿ' => '', - 'Ѫ' => '', - 'ѫ' => '', - 'Ѧ' => '', - 'ѧ' => '', - 'Ѭ' => '', - 'ѭ' => '', - 'Ѩ' => '', - 'ѩ' => '', - 'Ѯ' => '', - 'ѯ' => '', - 'Ѱ' => '', - 'ѱ' => '', - ], - // Russian - Passport (2013), ICAO - // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 - 'ru__passport_2013' => [ - 'А' => 'A', - 'а' => 'a', - 'Б' => 'B', - 'б' => 'b', - 'В' => 'V', - 'в' => 'v', - 'Г' => 'G', - 'г' => 'g', - 'Д' => 'D', - 'д' => 'd', - 'Е' => 'E', - 'е' => 'e', - 'Ё' => 'E', - 'ё' => 'e', - 'Ж' => 'Zh', - 'ж' => 'zh', - 'З' => 'Z', - 'з' => 'z', - 'И' => 'i', - 'и' => 'i', - 'Й' => 'i', - 'й' => 'i', - 'К' => 'K', - 'к' => 'k', - 'Л' => 'L', - 'л' => 'l', - 'М' => 'M', - 'м' => 'm', - 'Н' => 'N', - 'н' => 'n', - 'О' => 'O', - 'о' => 'o', - 'П' => 'P', - 'п' => 'p', - 'Р' => 'R', - 'р' => 'r', - 'С' => 'S', - 'с' => 's', - 'Т' => 'T', - 'т' => 't', - 'У' => 'U', - 'у' => 'u', - 'Ф' => 'F', - 'ф' => 'f', - 'Х' => 'Kh', - 'х' => 'kh', - 'Ц' => 'Ts', - 'ц' => 'ts', - 'Ч' => 'Ch', - 'ч' => 'ch', - 'ш' => 'sh', - 'Ш' => 'Sh', - 'Щ' => 'Shch', - 'щ' => 'shch', - 'Ъ' => 'Ie', - 'ъ' => 'ie', - 'Ы' => 'Y', - 'ы' => 'y', - 'Ь' => '', - 'ь' => '', - 'Э' => 'E', - 'э' => 'e', - 'Ю' => 'Iu', - 'ю' => 'iu', - 'Я' => 'Ia', - 'я' => 'ia', - 'І' => '', - 'і' => '', - 'Ѳ' => '', - 'ѳ' => '', - 'Ѣ' => '', - 'ѣ' => '', - 'Ѵ' => '', - 'ѵ' => '', - 'Є' => '', - 'є' => '', - 'Ѥ' => '', - 'ѥ' => '', - 'Ѕ' => '', - 'ѕ' => '', - 'Ꙋ' => '', - 'ꙋ' => '', - 'Ѡ' => '', - 'ѡ' => '', - 'Ѿ' => '', - 'ѿ' => '', - 'Ѫ' => '', - 'ѫ' => '', - 'Ѧ' => '', - 'ѧ' => '', - 'Ѭ' => '', - 'ѭ' => '', - 'Ѩ' => '', - 'ѩ' => '', - 'Ѯ' => '', - 'ѯ' => '', - 'Ѱ' => '', - 'ѱ' => '', - ], - // Ukrainian - // -> https://zakon.rada.gov.ua/laws/show/55-2010-%D0%BF?lang=en - 'uk' => [ - 'Г' => 'H', - 'г' => 'h', - 'Ґ' => 'G', - 'ґ' => 'g', - 'Є' => 'Ye', - 'є' => 'ye', - 'И' => 'Y', - 'и' => 'y', - 'І' => 'I', - 'і' => 'i', - 'Ї' => 'Yi', - 'ї' => 'yi', - 'Й' => 'Y', - 'й' => 'y', - 'Х' => 'Kh', - 'х' => 'kh', - 'Ц' => 'Ts', - 'ц' => 'ts', - 'Ч' => 'Ch', - 'ч' => 'ch', - 'Ш' => 'Sh', - 'ш' => 'sh', - 'Щ' => 'Shch', - 'щ' => 'shch', - ], - // Kazakh - 'kk' => [ - 'Ә' => 'A', - 'Ғ' => 'G', - 'Қ' => 'Q', - 'Ң' => 'N', - 'Ө' => 'O', - 'Ұ' => 'U', - 'Ү' => 'U', - 'Һ' => 'H', - 'ә' => 'a', - 'ғ' => 'g', - 'қ' => 'q', - 'ң' => 'n', - 'ө' => 'o', - 'ұ' => 'u', - 'ү' => 'u', - 'һ' => 'h', - ], - // Czech - 'cs' => [ - 'á' => 'a', - 'Á' => 'A', - 'č' => 'c', - 'Č' => 'C', - 'ď' => 'd', - 'Ď' => 'D', - 'é' => 'e', - 'É' => 'E', - 'ě' => 'e', - 'Ě' => 'E', - 'í' => 'i', - 'Í' => 'I', - 'ň' => 'n', - 'Ň' => 'N', - 'ó' => 'o', - 'Ó' => 'O', - 'ř' => 'r', - 'Ř' => 'R', - 'š' => 's', - 'Š' => 'S', - 'ť' => 't', - 'Ť' => 'T', - 'ú' => 'u', - 'Ú' => 'U', - 'ů' => 'u', - 'Ů' => 'U', - 'ý' => 'y', - 'Ý' => 'Y', - 'ž' => 'z', - 'Ž' => 'Z', - ], - // Danish - 'da' => [ - 'Æ' => 'Ae', - 'æ' => 'ae', - 'Ø' => 'Oe', - 'ø' => 'oe', - 'Å' => 'Aa', - 'å' => 'aa', - 'É' => 'E', - 'é' => 'e', - ], - // Polish - 'pl' => [ - 'ą' => 'a', - 'ć' => 'c', - 'ę' => 'e', - 'ł' => 'l', - 'ń' => 'n', - 'ó' => 'o', - 'ś' => 's', - 'ź' => 'z', - 'ż' => 'z', - 'Ą' => 'A', - 'Ć' => 'C', - 'Ę' => 'E', - 'Ł' => 'L', - 'Ń' => 'N', - 'Ó' => 'O', - 'Ś' => 'S', - 'Ź' => 'Z', - 'Ż' => 'Z', - ], - // Romanian - 'ro' => [ - 'ă' => 'a', - 'â' => 'a', - 'Ă' => 'A', - 'Â' => 'A', - 'î' => 'i', - 'Î' => 'I', - 'ș' => 's', - 'ş' => 's', - 'Ş' => 'S', - 'Ș' => 'S', - 'ț' => 't', - 'ţ' => 't', - 'Ţ' => 'T', - 'Ț' => 'T', - ], - // Esperanto - 'eo' => [ - 'ĉ' => 'cx', - 'ĝ' => 'gx', - 'ĥ' => 'hx', - 'ĵ' => 'jx', - 'ŝ' => 'sx', - 'ŭ' => 'ux', - 'Ĉ' => 'CX', - 'Ĝ' => 'GX', - 'Ĥ' => 'HX', - 'Ĵ' => 'JX', - 'Ŝ' => 'SX', - 'Ŭ' => 'UX', - ], - // Estonian - 'et' => [ - 'Š' => 'S', - 'Ž' => 'Z', - 'Õ' => 'O', - 'Ä' => 'A', - 'Ö' => 'O', - 'Ü' => 'U', - 'š' => 's', - 'ž' => 'z', - 'õ' => 'o', - 'ä' => 'a', - 'ö' => 'o', - 'ü' => 'u', - ], - // Latvian - 'lv' => [ - 'ā' => 'a', - 'č' => 'c', - 'ē' => 'e', - 'ģ' => 'g', - 'ī' => 'i', - 'ķ' => 'k', - 'ļ' => 'l', - 'ņ' => 'n', - 'š' => 's', - 'ū' => 'u', - 'ž' => 'z', - 'Ā' => 'A', - 'Č' => 'C', - 'Ē' => 'E', - 'Ģ' => 'G', - 'Ī' => 'i', - 'Ķ' => 'k', - 'Ļ' => 'L', - 'Ņ' => 'N', - 'Š' => 'S', - 'Ū' => 'u', - 'Ž' => 'Z', - ], - // Lithuanian - 'lt' => [ - 'ą' => 'a', - 'č' => 'c', - 'ę' => 'e', - 'ė' => 'e', - 'į' => 'i', - 'š' => 's', - 'ų' => 'u', - 'ū' => 'u', - 'ž' => 'z', - 'Ą' => 'A', - 'Č' => 'C', - 'Ę' => 'E', - 'Ė' => 'E', - 'Į' => 'I', - 'Š' => 'S', - 'Ų' => 'U', - 'Ū' => 'U', - 'Ž' => 'Z', - ], - // Norwegian - 'no' => [ - 'Æ' => 'AE', - 'æ' => 'ae', - 'Ø' => 'OE', - 'ø' => 'oe', - 'Å' => 'AA', - 'å' => 'aa', - ], - // Vietnamese - 'vi' => [ - 'Á' => 'A', - 'À' => 'A', - 'Ả' => 'A', - 'Ã' => 'A', - 'Ạ' => 'A', - 'Ă' => 'A', - 'Ắ' => 'A', - 'Ằ' => 'A', - 'Ẳ' => 'A', - 'Ẵ' => 'A', - 'Ặ' => 'A', - 'Â' => 'A', - 'Ấ' => 'A', - 'Ầ' => 'A', - 'Ẩ' => 'A', - 'Ẫ' => 'A', - 'Ậ' => 'A', - 'á' => 'a', - 'à' => 'a', - 'ả' => 'a', - 'ã' => 'a', - 'ạ' => 'a', - 'ă' => 'a', - 'ắ' => 'a', - 'ằ' => 'a', - 'ẳ' => 'a', - 'ẵ' => 'a', - 'ặ' => 'a', - 'â' => 'a', - 'ấ' => 'a', - 'ầ' => 'a', - 'ẩ' => 'a', - 'ẫ' => 'a', - 'ậ' => 'a', - 'É' => 'E', - 'È' => 'E', - 'Ẻ' => 'E', - 'Ẽ' => 'E', - 'Ẹ' => 'E', - 'Ê' => 'E', - 'Ế' => 'E', - 'Ề' => 'E', - 'Ể' => 'E', - 'Ễ' => 'E', - 'Ệ' => 'E', - 'é' => 'e', - 'è' => 'e', - 'ẻ' => 'e', - 'ẽ' => 'e', - 'ẹ' => 'e', - 'ê' => 'e', - 'ế' => 'e', - 'ề' => 'e', - 'ể' => 'e', - 'ễ' => 'e', - 'ệ' => 'e', - 'Í' => 'I', - 'Ì' => 'I', - 'Ỉ' => 'I', - 'Ĩ' => 'I', - 'Ị' => 'I', - 'í' => 'i', - 'ì' => 'i', - 'ỉ' => 'i', - 'ĩ' => 'i', - 'ị' => 'i', - 'Ó' => 'O', - 'Ò' => 'O', - 'Ỏ' => 'O', - 'Õ' => 'O', - 'Ọ' => 'O', - 'Ô' => 'O', - 'Ố' => 'O', - 'Ồ' => 'O', - 'Ổ' => 'O', - 'Ỗ' => 'O', - 'Ộ' => 'O', - 'Ơ' => 'O', - 'Ớ' => 'O', - 'Ờ' => 'O', - 'Ở' => 'O', - 'Ỡ' => 'O', - 'Ợ' => 'O', - 'ó' => 'o', - 'ò' => 'o', - 'ỏ' => 'o', - 'õ' => 'o', - 'ọ' => 'o', - 'ô' => 'o', - 'ố' => 'o', - 'ồ' => 'o', - 'ổ' => 'o', - 'ỗ' => 'o', - 'ộ' => 'o', - 'ơ' => 'o', - 'ớ' => 'o', - 'ờ' => 'o', - 'ở' => 'o', - 'ỡ' => 'o', - 'ợ' => 'o', - 'Ú' => 'U', - 'Ù' => 'U', - 'Ủ' => 'U', - 'Ũ' => 'U', - 'Ụ' => 'U', - 'Ư' => 'U', - 'Ứ' => 'U', - 'Ừ' => 'U', - 'Ử' => 'U', - 'Ữ' => 'U', - 'Ự' => 'U', - 'ú' => 'u', - 'ù' => 'u', - 'ủ' => 'u', - 'ũ' => 'u', - 'ụ' => 'u', - 'ư' => 'u', - 'ứ' => 'u', - 'ừ' => 'u', - 'ử' => 'u', - 'ữ' => 'u', - 'ự' => 'u', - 'Ý' => 'Y', - 'Ỳ' => 'Y', - 'Ỷ' => 'Y', - 'Ỹ' => 'Y', - 'Ỵ' => 'Y', - 'ý' => 'y', - 'ỳ' => 'y', - 'ỷ' => 'y', - 'ỹ' => 'y', - 'ỵ' => 'y', - 'Đ' => 'D', - 'đ' => 'd', - ], - // Persian (Farsi) - 'fa' => [ - 'ا' => 'a', - 'ب' => 'b', - 'پ' => 'p', - 'ت' => 't', - 'ث' => 's', - 'ج' => 'j', - 'چ' => 'ch', - 'ح' => 'h', - 'خ' => 'kh', - 'د' => 'd', - 'ذ' => 'z', - 'ر' => 'r', - 'ز' => 'z', - 'س' => 's', - 'ش' => 'sh', - 'ص' => 's', - 'ض' => 'z', - 'ط' => 't', - 'ظ' => 'z', - 'ع' => 'a', - 'غ' => 'gh', - 'ف' => 'f', - 'ق' => 'gh', - 'ک' => 'k', - 'گ' => 'g', - 'ل' => 'l', - 'ژ' => 'zh', - 'ك' => 'k', - 'م' => 'm', - 'ن' => 'n', - 'ه' => 'h', - 'و' => 'o', - 'ی' => 'y', - 'آ' => 'a', - '٠' => '0', - '١' => '1', - '٢' => '2', - '٣' => '3', - '٤' => '4', - '٥' => '5', - '٦' => '6', - '٧' => '7', - '٨' => '8', - '٩' => '9', - ], - // Arabic - 'ar' => [ - 'أ' => 'a', - 'ب' => 'b', - 'ت' => 't', - 'ث' => 'th', - 'ج' => 'g', - 'ح' => 'h', - 'خ' => 'kh', - 'د' => 'd', - 'ذ' => 'th', - 'ر' => 'r', - 'ز' => 'z', - 'س' => 's', - 'ش' => 'sh', - 'ص' => 's', - 'ض' => 'd', - 'ط' => 't', - 'ظ' => 'th', - 'ع' => 'aa', - 'غ' => 'gh', - 'ف' => 'f', - 'ق' => 'k', - 'ك' => 'k', - 'ل' => 'l', - 'م' => 'm', - 'ن' => 'n', - 'ه' => 'h', - 'و' => 'o', - 'ي' => 'y', - 'ا' => 'a', - 'إ' => 'a', - 'آ' => 'a', - 'ؤ' => 'o', - 'ئ' => 'y', - 'ء' => 'aa', - '٠' => '0', - '١' => '1', - '٢' => '2', - '٣' => '3', - '٤' => '4', - '٥' => '5', - '٦' => '6', - '٧' => '7', - '٨' => '8', - '٩' => '9', - ], - // Serbian - 'sr' => [ - 'đ' => 'dj', - 'ž' => 'z', - 'ć' => 'c', - 'č' => 'c', - 'š' => 's', - 'Đ' => 'Dj', - 'Ž' => 'Z', - 'Ć' => 'C', - 'Č' => 'C', - 'Š' => 'S', - 'а' => 'a', - 'б' => 'b', - 'в' => 'v', - 'г' => 'g', - 'д' => 'd', - 'ђ' => 'dj', - 'е' => 'e', - 'ж' => 'z', - 'з' => 'z', - 'и' => 'i', - 'ј' => 'j', - 'к' => 'k', - 'л' => 'l', - 'љ' => 'lj', - 'м' => 'm', - 'н' => 'n', - 'њ' => 'nj', - 'о' => 'o', - 'п' => 'p', - 'р' => 'r', - 'с' => 's', - 'т' => 't', - 'ћ' => 'c', - 'у' => 'u', - 'ф' => 'f', - 'х' => 'h', - 'ц' => 'c', - 'ч' => 'c', - 'џ' => 'dz', - 'ш' => 's', - 'А' => 'A', - 'Б' => 'B', - 'В' => 'V', - 'Г' => 'G', - 'Д' => 'D', - 'Ђ' => 'Dj', - 'Е' => 'E', - 'Ж' => 'Z', - 'З' => 'Z', - 'И' => 'I', - 'Ј' => 'j', - 'К' => 'K', - 'Л' => 'L', - 'Љ' => 'Lj', - 'М' => 'M', - 'Н' => 'N', - 'Њ' => 'Nj', - 'О' => 'O', - 'П' => 'P', - 'Р' => 'R', - 'С' => 'S', - 'Т' => 'T', - 'Ћ' => 'C', - 'У' => 'U', - 'Ф' => 'F', - 'Х' => 'H', - 'Ц' => 'C', - 'Ч' => 'C', - 'Џ' => 'Dz', - 'Ш' => 'S', - ], - // Serbian - Cyrillic - 'sr__cyr' => [ - 'а' => 'a', - 'б' => 'b', - 'в' => 'v', - 'г' => 'g', - 'д' => 'd', - 'ђ' => 'dj', - 'е' => 'e', - 'ж' => 'z', - 'з' => 'z', - 'и' => 'i', - 'ј' => 'j', - 'к' => 'k', - 'л' => 'l', - 'љ' => 'lj', - 'м' => 'm', - 'н' => 'n', - 'њ' => 'nj', - 'о' => 'o', - 'п' => 'p', - 'р' => 'r', - 'с' => 's', - 'т' => 't', - 'ћ' => 'c', - 'у' => 'u', - 'ф' => 'f', - 'х' => 'h', - 'ц' => 'c', - 'ч' => 'c', - 'џ' => 'dz', - 'ш' => 's', - 'А' => 'A', - 'Б' => 'B', - 'В' => 'V', - 'Г' => 'G', - 'Д' => 'D', - 'Ђ' => 'Dj', - 'Е' => 'E', - 'Ж' => 'Z', - 'З' => 'Z', - 'И' => 'I', - 'Ј' => 'j', - 'К' => 'K', - 'Л' => 'L', - 'Љ' => 'Lj', - 'М' => 'M', - 'Н' => 'N', - 'Њ' => 'Nj', - 'О' => 'O', - 'П' => 'P', - 'Р' => 'R', - 'С' => 'S', - 'Т' => 'T', - 'Ћ' => 'C', - 'У' => 'U', - 'Ф' => 'F', - 'Х' => 'H', - 'Ц' => 'C', - 'Ч' => 'C', - 'Џ' => 'Dz', - 'Ш' => 'S', - ], - // Serbian - Latin - 'sr__lat' => [ - 'đ' => 'dj', - 'ž' => 'z', - 'ć' => 'c', - 'č' => 'c', - 'š' => 's', - 'Đ' => 'Dj', - 'Ž' => 'Z', - 'Ć' => 'C', - 'Č' => 'C', - 'Š' => 'S', - ], - // Azerbaijani - 'az' => [ - 'ç' => 'c', - 'ə' => 'e', - 'ğ' => 'g', - 'ı' => 'i', - 'ö' => 'o', - 'ş' => 's', - 'ü' => 'u', - 'Ç' => 'C', - 'Ə' => 'E', - 'Ğ' => 'G', - 'İ' => 'I', - 'Ö' => 'O', - 'Ş' => 'S', - 'Ü' => 'U', - ], - // Slovak - 'sk' => [ - 'á' => 'a', - 'ä' => 'a', - 'č' => 'c', - 'ď' => 'd', - 'é' => 'e', - 'í' => 'i', - 'ľ' => 'l', - 'ĺ' => 'l', - 'ň' => 'n', - 'ó' => 'o', - 'ô' => 'o', - 'ŕ' => 'r', - 'š' => 's', - 'ť' => 't', - 'ú' => 'u', - 'ý' => 'y', - 'ž' => 'z', - 'Á' => 'A', - 'Ä' => 'A', - 'Č' => 'C', - 'Ď' => 'D', - 'É' => 'E', - 'Í' => 'I', - 'Ľ' => 'L', - 'Ĺ' => 'L', - 'Ň' => 'N', - 'Ó' => 'O', - 'Ô' => 'O', - 'Ŕ' => 'R', - 'Š' => 'S', - 'Ť' => 'T', - 'Ú' => 'U', - 'Ý' => 'Y', - 'Ž' => 'Z', - ], - // French - 'fr' => [ - 'Æ' => 'AE', - 'æ' => 'ae', - 'Œ' => 'OE', - 'œ' => 'oe', - 'â' => 'a', - 'Â' => 'A', - 'à' => 'a', - 'À' => 'A', - 'ä' => 'a', - 'Ä' => 'A', - 'ç' => 'c', - 'Ç' => 'C', - 'é' => 'e', - 'É' => 'E', - 'ê' => 'e', - 'Ê' => 'E', - 'ë' => 'e', - 'Ë' => 'E', - 'è' => 'e', - 'È' => 'E', - 'ï' => 'i', - 'î' => 'i', - 'Ï' => 'I', - 'Î' => 'I', - 'ÿ' => 'y', - 'Ÿ' => 'Y', - 'ô' => 'o', - 'Ô' => 'O', - 'ö' => 'o', - 'Ö' => 'O', - 'û' => 'u', - 'Û' => 'U', - 'ù' => 'u', - 'Ù' => 'U', - 'ü' => 'u', - 'Ü' => 'U', - ], - // Austrian (French) - 'fr_at' => [ - 'ß' => 'sz', - 'ẞ' => 'SZ', - 'Æ' => 'AE', - 'æ' => 'ae', - 'Œ' => 'OE', - 'œ' => 'oe', - 'â' => 'a', - 'Â' => 'A', - 'à' => 'a', - 'À' => 'A', - 'ä' => 'a', - 'Ä' => 'A', - 'ç' => 'c', - 'Ç' => 'C', - 'é' => 'e', - 'É' => 'E', - 'ê' => 'e', - 'Ê' => 'E', - 'ë' => 'e', - 'Ë' => 'E', - 'è' => 'e', - 'È' => 'E', - 'ï' => 'i', - 'î' => 'i', - 'Ï' => 'I', - 'Î' => 'I', - 'ÿ' => 'y', - 'Ÿ' => 'Y', - 'ô' => 'o', - 'Ô' => 'O', - 'ö' => 'o', - 'Ö' => 'O', - 'û' => 'u', - 'Û' => 'U', - 'ù' => 'u', - 'Ù' => 'U', - 'ü' => 'u', - 'Ü' => 'U', - ], - // Switzerland (French) - 'fr_ch' => [ - 'ß' => 'ss', - 'ẞ' => 'SS', - 'Æ' => 'AE', - 'æ' => 'ae', - 'Œ' => 'OE', - 'œ' => 'oe', - 'â' => 'a', - 'Â' => 'A', - 'à' => 'a', - 'À' => 'A', - 'ä' => 'a', - 'Ä' => 'A', - 'ç' => 'c', - 'Ç' => 'C', - 'é' => 'e', - 'É' => 'E', - 'ê' => 'e', - 'Ê' => 'E', - 'ë' => 'e', - 'Ë' => 'E', - 'è' => 'e', - 'È' => 'E', - 'ï' => 'i', - 'î' => 'i', - 'Ï' => 'I', - 'Î' => 'I', - 'ÿ' => 'y', - 'Ÿ' => 'Y', - 'ô' => 'o', - 'Ô' => 'O', - 'ö' => 'o', - 'Ö' => 'O', - 'û' => 'u', - 'Û' => 'U', - 'ù' => 'u', - 'Ù' => 'U', - 'ü' => 'u', - 'Ü' => 'U', - ], - // German - 'de' => [ - 'Ä' => 'Ae', - 'Ö' => 'Oe', - 'Ü' => 'Ue', - 'ä' => 'ae', - 'ö' => 'oe', - 'ü' => 'ue', - 'ß' => 'ss', - 'ẞ' => 'SS', - ], - // Austrian (German) - 'de_at' => [ - 'Ä' => 'Ae', - 'Ö' => 'Oe', - 'Ü' => 'Ue', - 'ä' => 'ae', - 'ö' => 'oe', - 'ü' => 'ue', - 'ß' => 'sz', - 'ẞ' => 'SZ', - ], - // Switzerland (German) - 'de_ch' => [ - 'Ä' => 'Ae', - 'Ö' => 'Oe', - 'Ü' => 'Ue', - 'ä' => 'ae', - 'ö' => 'oe', - 'ü' => 'ue', - 'ß' => 'ss', - 'ẞ' => 'SS', - ], - // Bengali (Bangla) - 'bn' => [ - 'ভ্ল' => 'vl', - 'পশ' => 'psh', - 'ব্ধ' => 'bdh', - 'ব্জ' => 'bj', - 'ব্দ' => 'bd', - 'ব্ব' => 'bb', - 'ব্ল' => 'bl', - 'ভ' => 'v', - 'ব' => 'b', - 'চ্ঞ' => 'cNG', - 'চ্ছ' => 'cch', - 'চ্চ' => 'cc', - 'ছ' => 'ch', - 'চ' => 'c', - 'ধ্ন' => 'dhn', - 'ধ্ম' => 'dhm', - 'দ্ঘ' => 'dgh', - 'দ্ধ' => 'ddh', - 'দ্ভ' => 'dv', - 'দ্ম' => 'dm', - 'ড্ড' => 'DD', - 'ঢ' => 'Dh', - 'ধ' => 'dh', - 'দ্গ' => 'dg', - 'দ্দ' => 'dd', - 'ড' => 'D', - 'দ' => 'd', - '।' => '.', - 'ঘ্ন' => 'Ghn', - 'গ্ধ' => 'Gdh', - 'গ্ণ' => 'GN', - 'গ্ন' => 'Gn', - 'গ্ম' => 'Gm', - 'গ্ল' => 'Gl', - 'জ্ঞ' => 'jNG', - 'ঘ' => 'Gh', - 'গ' => 'g', - 'হ্ণ' => 'hN', - 'হ্ন' => 'hn', - 'হ্ম' => 'hm', - 'হ্ল' => 'hl', - 'হ' => 'h', - 'জ্ঝ' => 'jjh', - 'ঝ' => 'jh', - 'জ্জ' => 'jj', - 'জ' => 'j', - 'ক্ষ্ণ' => 'kxN', - 'ক্ষ্ম' => 'kxm', - 'ক্ষ' => 'ksh', - 'কশ' => 'ksh', - 'ক্ক' => 'kk', - 'ক্ট' => 'kT', - 'ক্ত' => 'kt', - 'ক্ল' => 'kl', - 'ক্স' => 'ks', - 'খ' => 'kh', - 'ক' => 'k', - 'ল্ভ' => 'lv', - 'ল্ধ' => 'ldh', - 'লখ' => 'lkh', - 'লঘ' => 'lgh', - 'লফ' => 'lph', - 'ল্ক' => 'lk', - 'ল্গ' => 'lg', - 'ল্ট' => 'lT', - 'ল্ড' => 'lD', - 'ল্প' => 'lp', - 'ল্ম' => 'lm', - 'ল্ল' => 'll', - 'ল্ব' => 'lb', - 'ল' => 'l', - 'ম্থ' => 'mth', - 'ম্ফ' => 'mf', - 'ম্ভ' => 'mv', - 'মপ্ল' => 'mpl', - 'ম্ন' => 'mn', - 'ম্প' => 'mp', - 'ম্ম' => 'mm', - 'ম্ল' => 'ml', - 'ম্ব' => 'mb', - 'ম' => 'm', - '০' => '0', - '১' => '1', - '২' => '2', - '৩' => '3', - '৪' => '4', - '৫' => '5', - '৬' => '6', - '৭' => '7', - '৮' => '8', - '৯' => '9', - 'ঙ্ক্ষ' => 'Ngkx', - 'ঞ্ছ' => 'nch', - 'ঙ্ঘ' => 'ngh', - 'ঙ্খ' => 'nkh', - 'ঞ্ঝ' => 'njh', - 'ঙ্গৌ' => 'ngOU', - 'ঙ্গৈ' => 'ngOI', - 'ঞ্চ' => 'nc', - 'ঙ্ক' => 'nk', - 'ঙ্ষ' => 'Ngx', - 'ঙ্গ' => 'ngo', - 'ঙ্ম' => 'Ngm', - 'ঞ্জ' => 'nj', - 'ন্ধ' => 'ndh', - 'ন্ঠ' => 'nTh', - 'ণ্ঠ' => 'NTh', - 'ন্থ' => 'nth', - 'ঙ্গা' => 'nga', - 'ঙ্গি' => 'ngi', - 'ঙ্গী' => 'ngI', - 'ঙ্গু' => 'ngu', - 'ঙ্গূ' => 'ngU', - 'ঙ্গে' => 'nge', - 'ঙ্গো' => 'ngO', - 'ণ্ঢ' => 'NDh', - 'নশ' => 'nsh', - 'ঙর' => 'Ngr', - 'ঞর' => 'NGr', - 'ংর' => 'ngr', - 'ঙ' => 'Ng', - 'ঞ' => 'NG', - 'ং' => 'ng', - 'ন্ন' => 'nn', - 'ণ্ণ' => 'NN', - 'ণ্ন' => 'Nn', - 'ন্ম' => 'nm', - 'ণ্ম' => 'Nm', - 'ন্দ' => 'nd', - 'ন্ট' => 'nT', - 'ণ্ট' => 'NT', - 'ন্ড' => 'nD', - 'ণ্ড' => 'ND', - 'ন্ত' => 'nt', - 'ন্স' => 'ns', - 'ন' => 'n', - 'ণ' => 'N', - 'ৈ' => 'OI', - 'ৌ' => 'OU', - 'ো' => 'O', - 'ঐ' => 'OI', - 'ঔ' => 'OU', - 'অ' => 'o', - 'ও' => 'oo', - 'ফ্ল' => 'fl', - 'প্ট' => 'pT', - 'প্ত' => 'pt', - 'প্ন' => 'pn', - 'প্প' => 'pp', - 'প্ল' => 'pl', - 'প্স' => 'ps', - 'ফ' => 'f', - 'প' => 'p', - 'ৃ' => 'rri', - 'ঋ' => 'rri', - 'রর‍্য' => 'rry', - '্র্য' => 'ry', - '্রর' => 'rr', - 'ড়্গ' => 'Rg', - 'ঢ়' => 'Rh', - 'ড়' => 'R', - 'র' => 'r', - '্র' => 'r', - 'শ্ছ' => 'Sch', - 'ষ্ঠ' => 'ShTh', - 'ষ্ফ' => 'Shf', - 'স্ক্ল' => 'skl', - 'স্খ' => 'skh', - 'স্থ' => 'sth', - 'স্ফ' => 'sf', - 'শ্চ' => 'Sc', - 'শ্ত' => 'St', - 'শ্ন' => 'Sn', - 'শ্ম' => 'Sm', - 'শ্ল' => 'Sl', - 'ষ্ক' => 'Shk', - 'ষ্ট' => 'ShT', - 'ষ্ণ' => 'ShN', - 'ষ্প' => 'Shp', - 'ষ্ম' => 'Shm', - 'স্প্ল' => 'spl', - 'স্ক' => 'sk', - 'স্ট' => 'sT', - 'স্ত' => 'st', - 'স্ন' => 'sn', - 'স্প' => 'sp', - 'স্ম' => 'sm', - 'স্ল' => 'sl', - 'শ' => 'S', - 'ষ' => 'Sh', - 'স' => 's', - 'ু' => 'u', - 'উ' => 'u', - 'অ্য' => 'oZ', - 'ত্থ' => 'tth', - 'ৎ' => 'tt', - 'ট্ট' => 'TT', - 'ট্ম' => 'Tm', - 'ঠ' => 'Th', - 'ত্ন' => 'tn', - 'ত্ম' => 'tm', - 'থ' => 'th', - 'ত্ত' => 'tt', - 'ট' => 'T', - 'ত' => 't', - 'অ্যা' => 'AZ', - 'া' => 'a', - 'আ' => 'a', - 'য়া' => 'ya', - 'য়' => 'y', - 'ি' => 'i', - 'ই' => 'i', - 'ী' => 'ee', - 'ঈ' => 'ee', - 'ূ' => 'uu', - 'ঊ' => 'uu', - 'ে' => 'e', - 'এ' => 'e', - 'য' => 'z', - '্য' => 'Z', - 'ইয়' => 'y', - 'ওয়' => 'w', - '্ব' => 'w', - 'এক্স' => 'x', - 'ঃ' => ':', - 'ঁ' => 'nn', - '্‌' => '', - ], - // English - 'en' => [ - ], - // Latin (+ Cyrillic ?) chars - // - // -> Mix of languages, but we need to keep this here, so that different languages can handle there own behavior. - 'latin' => [ - '˚' => '0', - '¹' => '1', - '²' => '2', - '³' => '3', - '⁴' => '4', - '⁵' => '5', - '⁶' => '6', - '⁷' => '7', - '⁸' => '8', - '⁹' => '9', - '₀' => '0', - '₁' => '1', - '₂' => '2', - '₃' => '3', - '₄' => '4', - '₅' => '5', - '₆' => '6', - '₇' => '7', - '₈' => '8', - '₉' => '9', - '௦' => '0', - '௧' => '1', - '௨' => '2', - '௩' => '3', - '௪' => '4', - '௫' => '5', - '௬' => '6', - '௭' => '7', - '௮' => '8', - '௯' => '9', - '௰' => '10', - '௱' => '100', - '௲' => '1000', - 'Ꜳ' => 'AA', - 'ꜳ' => 'aa', - 'Æ' => 'AE', - 'æ' => 'ae', - 'Ǽ' => 'AE', - 'ǽ' => 'ae', - 'Ꜵ' => 'AO', - 'ꜵ' => 'ao', - 'Ꜷ' => 'AU', - 'ꜷ' => 'au', - 'Ꜹ' => 'AV', - 'ꜹ' => 'av', - 'Ꜻ' => 'av', - 'ꜻ' => 'av', - 'Ꜽ' => 'AY', - 'ꜽ' => 'ay', - 'ȸ' => 'db', - 'ʣ' => 'dz', - 'ʥ' => 'dz', - 'ʤ' => 'dezh', - '🙰' => 'et', - 'ff' => 'ff', - 'ffi' => 'ffi', - 'ffl' => 'ffl', - 'fi' => 'fi', - 'fl' => 'fl', - 'ʩ' => 'feng', - 'IJ' => 'IJ', - 'ij' => 'ij', - 'ʪ' => 'ls', - 'ʫ' => 'lz', - 'ɮ' => 'lezh', - 'ȹ' => 'qp', - 'ʨ' => 'tc', - 'ʦ' => 'ts', - 'ʧ' => 'tesh', - 'Œ' => 'OE', - 'œ' => 'oe', - 'Ꝏ' => 'OO', - 'ꝏ' => 'oo', - 'ẞ' => 'SS', - 'ß' => 'ss', - 'st' => 'st', - 'ſt' => 'st', - 'Ꜩ' => 'TZ', - 'ꜩ' => 'tz', - 'ᵫ' => 'ue', - 'Aι' => 'Ai', - 'αι' => 'ai', - 'Ει' => 'Ei', - 'ει' => 'ei', - 'Οι' => 'Oi', - 'οι' => 'oi', - 'Ου' => 'Oy', - 'ου' => 'oy', - 'Υι' => 'Yi', - 'υι' => 'yi', - 'ἀ' => 'a', - 'ἁ' => 'a', - 'ἂ' => 'a', - 'ἃ' => 'a', - 'ἄ' => 'a', - 'ἅ' => 'a', - 'ἆ' => 'a', - 'ἇ' => 'a', - 'Ἀ' => 'A', - 'Ἁ' => 'A', - 'Ἂ' => 'A', - 'Ἃ' => 'A', - 'Ἄ' => 'A', - 'Ἅ' => 'A', - 'Ἆ' => 'A', - 'Ἇ' => 'A', - 'ᾰ' => 'a', - 'ᾱ' => 'a', - 'ᾲ' => 'a', - 'ᾳ' => 'a', - 'ᾴ' => 'a', - 'ᾶ' => 'a', - 'ᾷ' => 'a', - 'Ᾰ' => 'A', - 'Ᾱ' => 'A', - 'Ὰ' => 'A', - 'Ά' => 'A', - 'ᾼ' => 'A', - 'Ä' => 'A', - 'ä' => 'a', - 'À' => 'A', - 'à' => 'a', - 'Á' => 'A', - 'á' => 'a', - 'Â' => 'A', - 'â' => 'a', - 'Ã' => 'A', - 'ã' => 'a', - 'A̧' => 'A', - 'a̧' => 'a', - 'Ą' => 'A', - 'ą' => 'a', - 'Ⱥ' => 'A', - 'ⱥ' => 'a', - 'Å' => 'A', - 'å' => 'a', - 'Ǻ' => 'A', - 'ǻ' => 'a', - 'Ă' => 'A', - 'ă' => 'a', - 'Ǎ' => 'A', - 'ǎ' => 'a', - 'Ȧ' => 'A', - 'ȧ' => 'a', - 'Ạ' => 'A', - 'ạ' => 'a', - 'Ā' => 'A', - 'ā' => 'a', - 'ª' => 'a', - 'Ɓ' => 'B', - 'Ѣ' => 'E', - 'ѣ' => 'e', - 'Ç' => 'C', - 'ç' => 'c', - 'Ĉ' => 'C', - 'ĉ' => 'c', - 'C̈' => 'C', - 'c̈' => 'c', - 'C̨' => 'C', - 'c̨' => 'c', - 'Ȼ' => 'C', - 'ȼ' => 'c', - 'Č' => 'C', - 'č' => 'c', - 'Ć' => 'C', - 'ć' => 'c', - 'C̀' => 'C', - 'c̀' => 'c', - 'Ċ' => 'C', - 'ċ' => 'c', - 'C̣' => 'C', - 'c̣' => 'c', - 'C̄' => 'C', - 'c̄' => 'c', - 'C̃' => 'C', - 'c̃' => 'c', - 'Ð' => 'D', - 'Đ' => 'D', - 'ð' => 'd', - 'đ' => 'd', - 'È' => 'E', - 'É' => 'E', - 'Ê' => 'E', - 'Ë' => 'E', - 'Ĕ' => 'E', - 'Ė' => 'E', - 'Ȩ' => 'E', - 'ȩ' => 'e', - 'Ę' => 'E', - 'ę' => 'e', - 'Ɇ' => 'E', - 'ɇ' => 'e', - 'Ě' => 'E', - 'ě' => 'e', - 'Ẹ' => 'E', - 'ẹ' => 'e', - 'Ē' => 'E', - 'ē' => 'e', - 'Ẽ' => 'E', - 'ẽ' => 'e', - 'è' => 'e', - 'é' => 'e', - 'ê' => 'e', - 'ë' => 'e', - 'ĕ' => 'e', - 'ė' => 'e', - 'ƒ' => 'f', - 'Ѳ' => 'F', - 'ѳ' => 'f', - 'Ĝ' => 'G', - 'Ġ' => 'G', - 'ĝ' => 'g', - 'ġ' => 'g', - 'Ĥ' => 'H', - 'Ħ' => 'H', - 'ĥ' => 'h', - 'ħ' => 'h', - 'Ì' => 'I', - 'Í' => 'I', - 'Î' => 'I', - 'Ï' => 'I', - 'Ĩ' => 'I', - 'Ĭ' => 'I', - 'Ǐ' => 'I', - 'Į' => 'I', - 'ì' => 'i', - 'í' => 'i', - 'î' => 'i', - 'ï' => 'i', - 'ĩ' => 'i', - 'ĭ' => 'i', - 'ǐ' => 'i', - 'į' => 'i', - 'І' => 'I', - 'і' => 'i', - 'I̧' => 'I', - 'i̧' => 'i', - 'Ɨ' => 'I', - 'ɨ' => 'i', - 'İ' => 'I', - 'i' => 'i', - 'Ị' => 'I', - 'ị' => 'i', - 'Ī' => 'I', - 'ī' => 'i', - 'Ĵ' => 'J', - 'ĵ' => 'j', - 'J́́' => 'J', - 'j́' => 'j', - 'J̀̀' => 'J', - 'j̀' => 'j', - 'J̈' => 'J', - 'j̈' => 'j', - 'J̧' => 'J', - 'j̧' => 'j', - 'J̨' => 'J', - 'j̨' => 'j', - 'Ɉ' => 'J', - 'ɉ' => 'j', - 'J̌' => 'J', - 'ǰ' => 'j', - 'J̇' => 'J', - 'j' => 'j', - 'J̣' => 'J', - 'j̣' => 'j', - 'J̄' => 'J', - 'j̄' => 'j', - 'J̃' => 'J', - 'j̃' => 'j', - 'Й' => 'i', - 'й' => 'i', - 'ĸ' => 'k', - 'Ĺ' => 'L', - 'Ľ' => 'L', - 'Ŀ' => 'L', - 'ĺ' => 'l', - 'ľ' => 'l', - 'ŀ' => 'l', - 'L̀' => 'L', - 'l̀' => 'l', - 'L̂' => 'L', - 'l̂' => 'l', - 'L̈' => 'L', - 'l̈' => 'l', - 'Ļ' => 'L', - 'ļ' => 'l', - 'L̨' => 'L', - 'l̨' => 'l', - 'Ł' => 'L', - 'ł' => 'l', - 'Ƚ' => 'L', - 'ƚ' => 'l', - 'L̇' => 'L', - 'l̇' => 'l', - 'Ḷ' => 'L', - 'ḷ' => 'l', - 'L̄' => 'L', - 'l̄' => 'l', - 'L̃' => 'L', - 'l̃' => 'l', - 'Ñ' => 'N', - 'ñ' => 'n', - 'Ŋ' => 'N', - 'ŋ' => 'n', - 'ʼn' => 'n', - 'Ń' => 'N', - 'ń' => 'n', - 'Ǹ' => 'N', - 'ǹ' => 'n', - 'N̂' => 'N', - 'n̂' => 'n', - 'N̈' => 'N', - 'n̈' => 'n', - 'Ņ' => 'N', - 'ņ' => 'n', - 'N̨' => 'N', - 'n̨' => 'n', - 'Ꞥ' => 'N', - 'ꞥ' => 'n', - 'Ň' => 'N', - 'ň' => 'n', - 'Ṅ' => 'N', - 'ṅ' => 'n', - 'Ṇ' => 'N', - 'ṇ' => 'n', - 'N̄' => 'N', - 'n̄' => 'n', - 'Ö' => 'O', - 'Ò' => 'O', - 'Ó' => 'O', - 'Ô' => 'O', - 'Õ' => 'O', - 'Ō' => 'O', - 'Ŏ' => 'O', - 'Ǒ' => 'O', - 'Ő' => 'O', - 'Ơ' => 'O', - 'Ø' => 'O', - 'Ǿ' => 'O', - 'ö' => 'o', - 'ò' => 'o', - 'ó' => 'o', - 'ô' => 'o', - 'õ' => 'o', - 'ō' => 'o', - 'ŏ' => 'o', - 'ǒ' => 'o', - 'ő' => 'o', - 'ơ' => 'o', - 'ø' => 'o', - 'ǿ' => 'o', - 'º' => 'o', - 'O̧' => 'O', - 'o̧' => 'o', - 'Ǫ' => 'O', - 'ǫ' => 'o', - 'Ɵ' => 'O', - 'ɵ' => 'o', - 'Ȯ' => 'O', - 'ȯ' => 'o', - 'Ọ' => 'O', - 'ọ' => 'o', - 'Ŕ' => 'R', - 'Ŗ' => 'R', - 'ŕ' => 'r', - 'ŗ' => 'r', - 'Ŝ' => 'S', - 'Ș' => 'S', - 'ș' => 's', - 'Ś' => 'S', - 'ś' => 's', - 'S̀' => 'S', - 's̀' => 's', - 'Ŝ̀' => 'S', - 'ŝ' => 's', - 'S̈' => 'S', - 's̈' => 's', - 'Ş' => 'S', - 'ş' => 's', - 'S̨' => 'S', - 's̨' => 's', - 'Ꞩ' => 'S', - 'ꞩ' => 's', - 'Š' => 'S', - 'š' => 's', - 'Ṡ' => 'S', - 'ṡ' => 's', - 'Ṣ' => 'S', - 'ṣ' => 's', - 'S̄' => 'S', - 's̄' => 's', - 'S̃' => 'S', - 's̃' => 's', - 'ſ' => 's', - 'Ţ' => 'T', - 'Ț' => 'T', - 'Ŧ' => 'T', - 'Þ' => 'TH', - 'ţ' => 't', - 'ț' => 't', - 'ŧ' => 't', - 'þ' => 'th', - 'T́' => 'T', - 't́' => 't', - 'T̀' => 'T', - 't̀' => 't', - 'T̂' => 'T', - 't̂' => 't', - 'T̈' => 'T', - 'ẗ' => 't', - 'T̨' => 'T', - 't̨' => 't', - 'Ⱦ' => 'T', - 'ⱦ' => 't', - 'Ť' => 'T', - 'ť' => 't', - 'Ṫ' => 'T', - 'ṫ' => 't', - 'Ṭ' => 'T', - 'ṭ' => 't', - 'T̄' => 'T', - 't̄' => 't', - 'T̃' => 'T', - 't̃' => 't', - 'Ü' => 'U', - 'Ù' => 'U', - 'Ú' => 'U', - 'Û' => 'U', - 'Ũ' => 'U', - 'Ŭ' => 'U', - 'Ű' => 'U', - 'Ų' => 'U', - 'Ư' => 'U', - 'Ǔ' => 'U', - 'Ǖ' => 'U', - 'Ǘ' => 'U', - 'Ǚ' => 'U', - 'Ǜ' => 'U', - 'ü' => 'u', - 'ù' => 'u', - 'ú' => 'u', - 'û' => 'u', - 'ũ' => 'u', - 'ŭ' => 'u', - 'ű' => 'u', - 'ų' => 'u', - 'ư' => 'u', - 'ǔ' => 'u', - 'ǖ' => 'u', - 'ǘ' => 'u', - 'ǚ' => 'u', - 'ǜ' => 'u', - 'U̧' => 'U', - 'u̧' => 'u', - 'Ʉ' => 'U', - 'ʉ' => 'u', - 'U̇' => 'U', - 'u̇' => 'u', - 'Ụ' => 'U', - 'ụ' => 'u', - 'Ū' => 'U', - 'ū' => 'u', - 'Ʊ' => 'U', - 'ʊ' => 'u', - 'Ŵ' => 'W', - 'ŵ' => 'w', - 'Ẁ' => 'W', - 'ẁ' => 'w', - 'Ẃ' => 'W', - 'ẃ' => 'w', - 'Ẅ' => 'W', - 'ẅ' => 'w', - 'Ѵ' => 'I', - 'ѵ' => 'i', - 'Ꙗ' => 'Ja', - 'ꙗ' => 'ja', - 'Є' => 'Je', - 'є' => 'je', - 'Ѥ' => 'Je', - 'ѥ' => 'je', - 'Ѕ' => 'Dz', - 'ѕ' => 'dz', - 'Ꙋ' => 'U', - 'ꙋ' => 'u', - 'Ѡ' => 'O', - 'ѡ' => 'o', - 'Ѿ' => 'Ot', - 'ѿ' => 'ot', - 'Ѫ' => 'U', - 'ѫ' => 'u', - 'Ѧ' => 'Ja', - 'ѧ' => 'ja', - 'Ѭ' => 'Ju', - 'ѭ' => 'ju', - 'Ѩ' => 'Ja', - 'ѩ' => 'Ja', - 'Ѯ' => 'Ks', - 'ѯ' => 'ks', - 'Ѱ' => 'Ps', - 'ѱ' => 'ps', - 'Х' => 'X', - 'х' => 'x', - 'Ý' => 'Y', - 'Ÿ' => 'Y', - 'Ŷ' => 'Y', - 'ý' => 'y', - 'ÿ' => 'y', - 'ŷ' => 'y', - 'Ỳ' => 'Y', - 'ỳ' => 'y', - 'Y̧' => 'Y', - 'y̧' => 'y', - 'Y̨' => 'Y', - 'y̨' => 'y', - 'Ɏ' => 'Y', - 'ɏ' => 'y', - 'Y̌' => 'Y', - 'y̌' => 'y', - 'Ẏ' => 'Y', - 'ẏ' => 'y', - 'Ỵ' => 'Y', - 'ỵ' => 'y', - 'Ȳ' => 'Y', - 'ȳ' => 'y', - 'Ỹ' => 'Y', - 'ỹ' => 'y', - 'Щ' => 'Shh', - 'щ' => 'shh', - 'Ź' => 'Z', - 'ź' => 'z', - 'Z̀' => 'Z', - 'z̀' => 'z', - 'Ẑ' => 'Z', - 'ẑ' => 'z', - 'Z̈' => 'Z', - 'z̈' => 'z', - 'Z̧' => 'Z', - 'z̧' => 'z', - 'Z̨' => 'Z', - 'z̨' => 'z', - 'Ƶ' => 'Z', - 'ƶ' => 'z', - 'Ž' => 'Z', - 'ž' => 'z', - 'Ż' => 'Z', - 'ż' => 'z', - 'Ẓ' => 'Z', - 'ẓ' => 'z', - 'Z̄' => 'Z', - 'z̄' => 'z', - 'Z̃' => 'Z', - 'z̃' => 'z', - ], - // whitespace chars - ' ' => [ - "\xc2\xa0" => ' ', // 'NO-BREAK SPACE' - "\xe1\x9a\x80" => ' ', // 'OGHAM SPACE MARK' - "\xe2\x80\x80" => ' ', // 'EN QUAD' - "\xe2\x80\x81" => ' ', // 'EM QUAD' - "\xe2\x80\x82" => ' ', // 'EN SPACE' - "\xe2\x80\x83" => ' ', // 'EM SPACE' - "\xe2\x80\x84" => ' ', // 'THREE-PER-EM SPACE' - "\xe2\x80\x85" => ' ', // 'FOUR-PER-EM SPACE' - "\xe2\x80\x86" => ' ', // 'SIX-PER-EM SPACE' - "\xe2\x80\x87" => ' ', // 'FIGURE SPACE' - "\xe2\x80\x88" => ' ', // 'PUNCTUATION SPACE' - "\xe2\x80\x89" => ' ', // 'THIN SPACE' - "\xe2\x80\x8a" => ' ', // 'HAIR SPACE' - "\xe2\x80\xa8" => ' ', // 'LINE SEPARATOR' - "\xe2\x80\xa9" => ' ', // 'PARAGRAPH SEPARATOR' - "\xe2\x80\x8b" => ' ', // 'ZERO WIDTH SPACE' - "\xe2\x80\xaf" => ' ', // 'NARROW NO-BREAK SPACE' - "\xe2\x81\x9f" => ' ', // 'MEDIUM MATHEMATICAL SPACE' - "\xe3\x80\x80" => ' ', // 'IDEOGRAPHIC SPACE' - "\xef\xbe\xa0" => ' ', // 'HALFWIDTH HANGUL FILLER' - ], - // commonly used in Word documents - 'msword' => [ - "\xc2\xab" => '<<', // « (U+00AB) in UTF-8 - "\xc2\xbb" => '>>', // » (U+00BB) in UTF-8 - "\xe2\x80\x98" => "'", // ‘ (U+2018) in UTF-8 - "\xe2\x80\x99" => "'", // ’ (U+2019) in UTF-8 - "\xe2\x80\x9a" => "'", // ‚ (U+201A) in UTF-8 - "\xe2\x80\x9b" => "'", // ‛ (U+201B) in UTF-8 - "\xe2\x80\x9c" => '"', // “ (U+201C) in UTF-8 - "\xe2\x80\x9d" => '"', // ” (U+201D) in UTF-8 - "\xe2\x80\x9e" => '"', // „ (U+201E) in UTF-8 - "\xe2\x80\x9f" => '"', // ‟ (U+201F) in UTF-8 - "\xe2\x80\xb9" => "'", // ‹ (U+2039) in UTF-8 - "\xe2\x80\xba" => "'", // › (U+203A) in UTF-8 - "\xe2\x80\x93" => '-', // – (U+2013) in UTF-8 - "\xe2\x80\x94" => '-', // — (U+2014) in UTF-8 - "\xe2\x80\xa6" => '...', // … (U+2026) in UTF-8 - ], - // Currency - // - // url => https://en.wikipedia.org/wiki/Currency_symbol - 'currency_short' => [ - '€' => 'EUR', - '$' => '$', - '₢' => 'Cr', - '₣' => 'Fr.', - '£' => 'PS', - '₤' => 'L.', - 'ℳ' => 'M', - '₥' => 'mil', - '₦' => 'N', - '₧' => 'Pts', - '₨' => 'Rs', - 'රු' => 'LKR', - 'ரூ' => 'LKR', - '௹' => 'Rs', - 'रू' => 'NPR', - '₹' => 'Rs', - '૱' => 'Rs', - '₩' => 'W', - '₪' => 'NS', - '₸' => 'KZT', - '₫' => 'D', - '֏' => 'AMD', - '₭' => 'K', - '₺' => 'TL', - '₼' => 'AZN', - '₮' => 'T', - '₯' => 'Dr', - '₲' => 'PYG', - '₾' => 'GEL', - '₳' => 'ARA', - '₴' => 'UAH', - '₽' => 'RUB', - '₵' => 'GHS', - '₡' => 'CL', - '¢' => 'c', - '¥' => 'YEN', - '円' => 'JPY', - '৳' => 'BDT', - '元' => 'CNY', - '﷼' => 'SAR', - '៛' => 'KR', - '₠' => 'ECU', - '¤' => '$?', - '฿' => 'THB', - '؋' => 'AFN', - ], -]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php deleted file mode 100644 index afe31ae..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php +++ /dev/null @@ -1,759 +0,0 @@ - [ - '=' => ' gelijk ', - '%' => ' procent ', - '∑' => ' som ', - '∆' => ' delta ', - '∞' => ' oneindig ', - '♥' => ' love ', - '&' => ' en ', - '+' => ' plus ', - ], - // Italian - 'it' => [ - '=' => ' uguale ', - '%' => ' percent ', - '∑' => ' somma ', - '∆' => ' delta ', - '∞' => ' infinito ', - '♥' => ' amore ', - '&' => ' e ', - '+' => ' piu ', - ], - // Macedonian - 'mk' => [ - '=' => ' ednakva ', - '%' => ' procenti ', - '∑' => ' zbir ', - '∆' => ' delta ', - '∞' => ' beskonecnost ', - '♥' => ' loveubov ', - '&' => ' i ', - '+' => ' plus ', - ], - // Portuguese (Brazil) - 'pt' => [ - '=' => ' igual ', - '%' => ' por cento ', - '∑' => ' soma ', - '∆' => ' delta ', - '∞' => ' infinito ', - '♥' => ' amor ', - '&' => ' e ', - '+' => ' mais ', - ], - // Greek(lish) (Elláda) - 'el__greeklish' => [ - '=' => ' isos ', - '%' => ' tois ekato ', - '∑' => ' athroisma ', - '∆' => ' delta ', - '∞' => ' apeiro ', - '♥' => ' agape ', - '&' => ' kai ', - '+' => ' syn ', - ], - // Greek (Elláda) - 'el' => [ - '=' => ' isos ', - '%' => ' tois ekato ', - '∑' => ' athroisma ', - '∆' => ' delta ', - '∞' => ' apeiro ', - '♥' => ' agape ', - '&' => ' kai ', - '+' => ' syn ', - ], - // Hindi - 'hi' => [ - '=' => ' samana ', - '%' => ' paratisata ', - '∑' => ' yoga ', - '∆' => ' dalata ', - '∞' => ' anata ', - '♥' => ' payara ', - '&' => ' aura ', - '+' => ' palasa ', - ], - // Armenian - 'hy' => [ - '=' => ' havasar ', - '%' => ' tvokvos ', - '∑' => ' gvoumar ', - '∆' => ' delta ', - '∞' => ' ansahmanvouthyvoun ', - '♥' => ' ser ', - '&' => ' ev ', - '+' => ' gvoumarats ', - ], - // Swedish - 'sv' => [ - '=' => ' lika ', - '%' => ' procent ', - '∑' => ' summa ', - '∆' => ' delta ', - '∞' => ' oandlighet ', - '♥' => ' alskar ', - '&' => ' och ', - '+' => ' plus ', - ], - // Turkmen - 'tk' => [ - '=' => ' den ', - '%' => ' yuzde ', - '∑' => ' jem ', - '∆' => ' delta ', - '∞' => ' mudimilik ', - '♥' => ' soygi ', - '&' => ' we ', - '+' => ' yzy ', - ], - // Turkish - 'tr' => [ - '=' => ' esit ', - '%' => ' yuzde ', - '∑' => ' Toplam ', - '∆' => ' delta ', - '∞' => ' sonsuzluk ', - '♥' => ' ask ', - '&' => ' ve ', - '+' => ' arti ', - ], - // Bulgarian - 'bg' => [ - '=' => ' raven ', - '%' => ' na sto ', - '∑' => ' suma ', - '∆' => ' delta ', - '∞' => ' bezkrajnost ', - '♥' => ' obicam ', - '&' => ' i ', - '+' => ' plus ', - ], - // Hungarian - 'hu' => [ - '=' => ' Egyenlo ', - '%' => ' Szazalek ', - '∑' => ' osszeg ', - '∆' => ' delta ', - '∞' => ' vegtelenitett ', - '♥' => ' love ', - '&' => ' Es ', - '+' => ' Plusz ', - ], - // Myanmar (Burmese) - 'my' => [ - '=' => ' ttn:ttnnym? ', - '%' => ' raakhngnn:k ', - '∑' => ' ld ', - '∆' => ' m?cwk?n:pe? ', - '∞' => ' ach:m ', - '♥' => ' mettttaa ', - '&' => ' n ', - '+' => ' ape?ng: ', - ], - // Croatian (Hrvatska) - 'hr' => [ - '=' => ' Jednaki ', - '%' => ' Posto ', - '∑' => ' zbroj ', - '∆' => ' Delta ', - '∞' => ' beskonacno ', - '♥' => ' ljubav ', - '&' => ' I ', - '+' => ' Plus ', - ], - // Finnish - 'fi' => [ - '=' => ' Sama ', - '%' => ' Prosenttia ', - '∑' => ' sum ', - '∆' => ' delta ', - '∞' => ' aareton ', - '♥' => ' rakkautta ', - '&' => ' Ja ', - '+' => ' Plus ', - ], - // Georgian (Kartvelian) - 'ka' => [ - '=' => ' tanasts\'ori ', - '%' => ' p\'rotsent\'i ', - '∑' => ' tankha ', - '∆' => ' delt\'a ', - '∞' => ' usasrulo ', - '♥' => ' siq\'varuli ', - '&' => ' da ', - '+' => ' p\'lus ', - ], - // Russian - 'ru' => [ - '=' => ' ravnyj ', - '%' => ' procent ', - '∑' => ' summa ', - '∆' => ' del\'ta ', - '∞' => ' beskonecnost\' ', - '♥' => ' lublu ', - '&' => ' i ', - '+' => ' plus ', - ], - // Russian - GOST 7.79-2000(B) - 'ru__gost_2000_b' => [ - '=' => ' ravnyj ', - '%' => ' procent ', - '∑' => ' summa ', - '∆' => ' del\'ta ', - '∞' => ' beskonecnost\' ', - '♥' => ' lublu ', - '&' => ' i ', - '+' => ' plus ', - ], - // Russian - Passport (2013), ICAO - 'ru__passport_2013' => [ - '=' => ' ravnyj ', - '%' => ' procent ', - '∑' => ' summa ', - '∆' => ' del\'ta ', - '∞' => ' beskonecnost\' ', - '♥' => ' lublu ', - '&' => ' i ', - '+' => ' plus ', - ], - // Ukrainian - 'uk' => [ - '=' => ' rivnij ', - '%' => ' vidsotkiv ', - '∑' => ' suma ', - '∆' => ' del\'ta ', - '∞' => ' neskincennist\' ', - '♥' => ' lubov ', - '&' => ' i ', - '+' => ' plus ', - ], - // Kazakh - 'kk' => [ - '=' => ' ten\' ', - '%' => ' Pajyzdar ', - '∑' => ' zalpy ', - '∆' => ' ajyrmasylyk, ', - '∞' => ' seksiz ', - '♥' => ' mahabbat ', - '&' => ' z@ne ', - '+' => ' plus ', - ], - // Czech - 'cs' => [ - '=' => ' rovnat se ', - '%' => ' procento ', - '∑' => ' soucet ', - '∆' => ' delta ', - '∞' => ' nekonecno ', - '♥' => ' laska ', - '&' => ' a ', - '+' => ' plus ', - ], - // Danish - 'da' => [ - '=' => ' Lige ', - '%' => ' Prozent ', - '∑' => ' sum ', - '∆' => ' delta ', - '∞' => ' uendelig ', - '♥' => ' kaerlighed ', - '&' => ' Og ', - '+' => ' Plus ', - ], - // Polish - 'pl' => [ - '=' => ' rowny ', - '%' => ' procent ', - '∑' => ' suma ', - '∆' => ' delta ', - '∞' => ' nieskonczonosc ', - '♥' => ' milosc ', - '&' => ' i ', - '+' => ' plus ', - ], - // Romanian - 'ro' => [ - '=' => ' egal ', - '%' => ' la suta ', - '∑' => ' suma ', - '∆' => ' delta ', - '∞' => ' infinit ', - '♥' => ' dragoste ', - '&' => ' si ', - '+' => ' la care se adauga ', - ], - // Esperanto - 'eo' => [ - '=' => ' Egalaj ', - '%' => ' Procento ', - '∑' => ' sumo ', - '∆' => ' delto ', - '∞' => ' senfina ', - '♥' => ' amo ', - '&' => ' Kaj ', - '+' => ' Pli ', - ], - // Estonian - 'et' => [ - '=' => ' Vordsed ', - '%' => ' Protsenti ', - '∑' => ' summa ', - '∆' => ' o ', - '∞' => ' loputut ', - '♥' => ' armastus ', - '&' => ' Ja ', - '+' => ' Pluss ', - ], - // Latvian - 'lv' => [ - '=' => ' vienads ', - '%' => ' procents ', - '∑' => ' summa ', - '∆' => ' delta ', - '∞' => ' bezgaliba ', - '♥' => ' milestiba ', - '&' => ' un ', - '+' => ' pluss ', - ], - // Lithuanian - 'lt' => [ - '=' => ' lygus ', - '%' => ' procentu ', - '∑' => ' suma ', - '∆' => ' delta ', - '∞' => ' begalybe ', - '♥' => ' meile ', - '&' => ' ir ', - '+' => ' plius ', - ], - // Norwegian - 'no' => [ - '=' => ' Lik ', - '%' => ' Prosent ', - '∑' => ' sum ', - '∆' => ' delta ', - '∞' => ' uendelig ', - '♥' => ' kjaerlighet ', - '&' => ' Og ', - '+' => ' Pluss ', - ], - // Vietnamese - 'vi' => [ - '=' => ' cong bang ', - '%' => ' phan tram ', - '∑' => ' tong so ', - '∆' => ' dong bang ', - '∞' => ' vo cuc ', - '♥' => ' Yeu ', - '&' => ' va ', - '+' => ' them ', - ], - // Arabic - 'ar' => [ - '=' => ' mtsawy ', - '%' => ' nsbh mywyh ', - '∑' => ' mjmw\' ', - '∆' => ' dlta ', - '∞' => ' ma la nhayt ', - '♥' => ' hb ', - '&' => ' w ', - '+' => ' zayd ', - ], - // Persian (Farsi) - 'fa' => [ - '=' => ' brabr ', - '%' => ' dr sd ', - '∑' => ' mjmw\' ', - '∆' => ' dlta ', - '∞' => ' by nhayt ', - '♥' => ' \'shq ', - '&' => ' w ', - '+' => ' bh \'lawh ', - ], - // Serbian - 'sr' => [ - '=' => ' jednak ', - '%' => ' procenat ', - '∑' => ' zbir ', - '∆' => ' delta ', - '∞' => ' beskraj ', - '♥' => ' lubav ', - '&' => ' i ', - '+' => ' vise ', - ], - // Serbian - Cyrillic - 'sr__cyr' => [ - '=' => ' jednak ', - '%' => ' procenat ', - '∑' => ' zbir ', - '∆' => ' delta ', - '∞' => ' beskraj ', - '♥' => ' lubav ', - '&' => ' i ', - '+' => ' vise ', - ], - // Serbian - Latin - 'sr__lat' => [ - '=' => ' jednak ', - '%' => ' procenat ', - '∑' => ' zbir ', - '∆' => ' delta ', - '∞' => ' beskraj ', - '♥' => ' lubav ', - '&' => ' i ', - '+' => ' vise ', - ], - // Azerbaijani - 'az' => [ - '=' => ' b@rab@r ', - '%' => ' faiz ', - '∑' => ' m@bl@g ', - '∆' => ' delta ', - '∞' => ' sonsuzluq ', - '♥' => ' sevgi ', - '&' => ' v@ ', - '+' => ' plus ', - ], - // Slovak - 'sk' => [ - '=' => ' rovny ', - '%' => ' percento ', - '∑' => ' sucet ', - '∆' => ' delta ', - '∞' => ' infinity ', - '♥' => ' milovat ', - '&' => ' a ', - '+' => ' viac ', - ], - // French - 'fr' => [ - '=' => ' Egal ', - '%' => ' Pourcentage ', - '∑' => ' somme ', - '∆' => ' delta ', - '∞' => ' infini ', - '♥' => ' amour ', - '&' => ' Et ', - '+' => ' Plus ', - ], - // Austrian (French) - 'fr_at' => [ - '=' => ' Egal ', - '%' => ' Pourcentage ', - '∑' => ' somme ', - '∆' => ' delta ', - '∞' => ' infini ', - '♥' => ' amour ', - '&' => ' Et ', - '+' => ' Plus ', - ], - // Switzerland (French) - 'fr_ch' => [ - '=' => ' Egal ', - '%' => ' Pourcentage ', - '∑' => ' somme ', - '∆' => ' delta ', - '∞' => ' infini ', - '♥' => ' amour ', - '&' => ' Et ', - '+' => ' Plus ', - ], - // German - 'de' => [ - '=' => ' gleich ', - '%' => ' Prozent ', - '∑' => ' gesamt ', - '∆' => ' Unterschied ', - '∞' => ' undendlich ', - '♥' => ' liebe ', - '&' => ' und ', - '+' => ' plus ', - ], - // Austrian (German) - 'de_at' => [ - '=' => ' gleich ', - '%' => ' Prozent ', - '∑' => ' gesamt ', - '∆' => ' Unterschied ', - '∞' => ' undendlich ', - '♥' => ' liebe ', - '&' => ' und ', - '+' => ' plus ', - ], - // Switzerland (German) - 'de_ch' => [ - '=' => ' gleich ', - '%' => ' Prozent ', - '∑' => ' gesamt ', - '∆' => ' Unterschied ', - '∞' => ' undendlich ', - '♥' => ' liebe ', - '&' => ' und ', - '+' => ' plus ', - ], - // Bengali (Bangla) - 'bn' => [ - '=' => ' Saman ', - '%' => ' Satakora ', - '∑' => ' Samasti ', - '∆' => ' Badhip ', - '∞' => ' Ananta ', - '♥' => ' Valobasa ', - '&' => ' Abong ', - '+' => ' Songzojon ', - ], - // English - 'en' => [ - '=' => ' equal ', - '%' => ' percent ', - '∑' => ' sum ', - '∆' => ' delta ', - '∞' => ' infinity ', - '♥' => ' love ', - '&' => ' and ', - '+' => ' plus ', - ], - // Currency - // - // url: https://en.wikipedia.org/wiki/Currency_symbol - 'currency' => [ - '€' => ' Euro ', - '$' => ' Dollar ', - '₢' => ' cruzeiro ', - '₣' => ' French franc ', - '£' => ' pound ', - '₤' => ' lira ', // Italian - '₶' => ' livre tournois ', - 'ℳ' => ' mark ', - '₥' => ' mill ', - '₦' => ' naira ', - '₧' => ' peseta ', - '₨' => ' rupee ', - 'රු' => ' rupee ', // Sri Lankan - 'ரூ' => ' rupee ', // Sri Lankan - '௹' => ' rupee ', // Tamil - 'रू' => ' rupee ', // Nepalese - '₹' => ' rupee ', // Indian - '૱' => ' rupee ', // Gujarat - '₩' => ' won ', - '₪' => ' new shequel ', - '₸' => ' tenge ', - '₫' => ' dong ', - '֏' => ' dram ', - '₭' => ' kip ', - '₺' => ' lira ', // Turkish - '₼' => ' manat ', - '₮' => ' tugrik ', - '₯' => ' drachma ', - '₰' => ' pfennig ', - '₷' => ' spesmilo ', - '₱' => ' peso ', // Philippine - '﷼‎' => ' riyal ', - '₲' => ' guarani ', - '₾' => ' lari ', - '₳' => ' austral ', - '₴' => ' hryvnia ', - '₽' => ' ruble ', - '₵' => ' cedi ', - '₡' => ' colon ', - '¢' => ' cent ', - '¥' => ' yen ', - '円' => ' yen ', - '৳' => ' taka ', - '元' => ' yuan ', - '﷼' => ' riyal ', - '៛' => ' riel ', - '₠' => ' European Currency ', - '¤' => ' currency ', - '฿' => ' baht ', - '؋' => ' afghani ', - ], - // Temperature - // - // url: https://en.wikipedia.org/wiki/Conversion_of_units_of_temperature - 'temperature' => [ - '°De' => ' Delisle ', - '°Re' => ' Reaumur ', // Réaumur - '°Ro' => ' Romer ', // Rømer - '°R' => ' Rankine ', - '°C' => ' Celsius ', - '°F' => ' Fahrenheit ', - '°N' => ' Newton ', - ], - 'latin_symbols' => [ - '=' => '=', - '%' => '%', - '∑' => '∑', - '∆' => '∆', - '∞' => '∞', - '♥' => '♥', - '&' => '&', - '+' => '+', - // --- - '©' => ' (c) ', - '®' => ' (r) ', - '@' => ' (at) ', - '№' => ' No. ', - '℞' => ' Rx ', - '[' => '[', - '\' => '\\', - ']' => ']', - '^' => '^', - '_' => '_', - '`' => '`', - '‐' => '-', - '‑' => '-', - '‒' => '-', - '–' => '-', - '−' => '-', - '—' => '-', - '―' => '-', - '﹘' => '-', - '│' => '|', - '∖' => '\\', - '∕' => '/', - '⁄' => '/', - '←' => '<-', - '→' => '->', - '↑' => '|', - '↓' => '|', - '⁅' => '[', - '⁆' => ']', - '⁎' => '*', - '、' => ',', - '。' => '.', - '〈' => '<', - '〉' => '>', - '《' => '<<', - '》' => '>>', - '〔' => '[', - '〕' => ']', - '〘' => '[', - '〙' => ']', - '〚' => '[', - '〛' => ']', - '﹝' => '[', - '﹞' => ']', - '︹' => '[', - '︺' => ']', - '﹇' => '[', - '﹈' => ']', - '︐' => ',', - '︑' => ',', - '︒' => '.', - '︓' => ':', - '︔' => ';', - '︕' => '!', - '︖' => '?', - '︙' => '...', - '︰' => '..', - '︵' => '(', - '︶' => ')', - '﹙' => '(', - '﹚' => ')', - '︷' => '{', - '︸' => '}', - '﹛' => '{', - '﹜' => '}', - '︽' => '<<', - '︾' => '>>', - '︿' => '<', - '﹀' => '>', - '×' => '*', - '÷' => '/', - '≪' => '<<', - '≫' => '>>', - '⦅' => '((', - '⦆' => '))', - '〇' => '0', - '′' => '\'', - '〝' => '"', - '〞' => '"', - '«' => '<<', - '»' => '>>', - '‘' => "'", - '’' => "'", - '‚' => ',', - '‛' => "'", - '“' => '"', - '”' => '"', - '„' => '"', - '‟' => '"', - '‹' => '<', - '›' => '>', - '․' => '.', - '‥' => '..', - '…' => '...', - '″' => '"', - '‴' => '\'\'\'', - '‶' => '``', - '‷' => '```', - '‼' => '!!', - '⁇' => '??', - '⁈' => '?!', - '⁉' => '!?', - '⁗' => '````', - '⩴' => '::=', - '⩵' => '==', - '⩶' => '===', - '﹔' => ';', - '﹕' => ':', - '﹖' => '?', - '﹗' => '!', - '﹍' => '_', - '﹎' => '_', - '﹏' => '_', - '﹐' => ',', - '﹑' => ',', - '﹒' => '.', - '﹟' => '#', - '﹠' => '&', - '﹡' => '*', - '﹢' => '+', - '﹣' => '-', - '﹤' => '<', - '﹥' => '>', - '﹦' => '=', - '﹨' => '\\', - '﹩' => '$', - '﹪' => '%', - '﹫' => '@', - '!' => '!', - '"' => '"', - '#' => '#', - '$' => '$', - '%' => '%', - '&' => '&', - ''' => '\'', - '(' => '(', - ')' => ')', - '*' => '*', - '+' => '+', - ',' => ',', - '-' => '-', - '.' => '.', - '/' => '/', - ':' => ':', - ';' => ';', - '<' => '<', - '=' => '=', - '>' => '>', - '?' => '?', - '@' => '@', - '{' => '{', - '|' => '|', - '}' => '}', - '~' => '~', - '⦅' => '((', - '⦆' => '))', - '¬' => '!', - ' ̄' => '-', - '¦' => '|', - '■' => '#', - ], -]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php deleted file mode 100644 index da81ae2..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php +++ /dev/null @@ -1,65 +0,0 @@ - 0, - 'tk' => 1, - 'th' => 0, - 'ps' => 0, - 'or' => 0, - 'mn' => 0, - 'ko' => 0, - 'ky' => 0, - 'hy' => 1, - 'bn' => 5, - 'be' => 0, - 'am' => 0, - 'ja' => 0, - 'zh' => 0, - 'nl' => 1, - 'it' => 1, - 'mk' => 1, - 'pt' => 1, - 'el__greeklish' => 2, - 'el' => 2, - 'hi' => 2, - 'sv' => 1, - 'tr' => 1, - 'bg' => 2, - 'hu' => 1, - 'my' => 5, - 'hr' => 2, - 'fi' => 1, - 'ka' => 1, - 'ru' => 1, - 'ru__gost_2000_b' => 1, - 'ru__passport_2013' => 1, - 'uk' => 1, - 'kk' => 1, - 'cs' => 1, - 'da' => 1, - 'pl' => 1, - 'ro' => 1, - 'eo' => 1, - 'et' => 1, - 'lv' => 1, - 'lt' => 1, - 'no' => 1, - 'vi' => 1, - 'ar' => 1, - 'fa' => 1, - 'sr' => 1, - 'sr__cyr' => 1, - 'sr__lat' => 1, - 'az' => 1, - 'sk' => 1, - 'fr' => 1, - 'fr_at' => 1, - 'fr_ch' => 1, - 'de' => 1, - 'de_at' => 1, - 'de_ch' => 1, - 'en' => 0, - 'latin' => 3, - ' ' => 1, - 'msword' => 1, -]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php deleted file mode 100644 index 142318c..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php +++ /dev/null @@ -1 +0,0 @@ - 0, "\x00" => 0, "\x01" => 1, "\x02" => 2, "\x03" => 3, "\x04" => 4, "\x05" => 5, "\x06" => 6, "\x07" => 7, "\x08" => 8, "\x09" => 9, "\x0A" => 10, "\x0B" => 11, "\x0C" => 12, "\x0D" => 13, "\x0E" => 14, "\x0F" => 15, "\x10" => 16, "\x11" => 17, "\x12" => 18, "\x13" => 19, "\x14" => 20, "\x15" => 21, "\x16" => 22, "\x17" => 23, "\x18" => 24, "\x19" => 25, "\x1A" => 26, "\x1B" => 27, "\x1C" => 28, "\x1D" => 29, "\x1E" => 30, "\x1F" => 31, "\x20" => 32, "\x21" => 33, "\x22" => 34, "\x23" => 35, "\x24" => 36, "\x25" => 37, "\x26" => 38, "\x27" => 39, "\x28" => 40, "\x29" => 41, "\x2A" => 42, "\x2B" => 43, "\x2C" => 44, "\x2D" => 45, "\x2E" => 46, "\x2F" => 47, "\x30" => 48, "\x31" => 49, "\x32" => 50, "\x33" => 51, "\x34" => 52, "\x35" => 53, "\x36" => 54, "\x37" => 55, "\x38" => 56, "\x39" => 57, "\x3A" => 58, "\x3B" => 59, "\x3C" => 60, "\x3D" => 61, "\x3E" => 62, "\x3F" => 63, "\x40" => 64, "\x41" => 65, "\x42" => 66, "\x43" => 67, "\x44" => 68, "\x45" => 69, "\x46" => 70, "\x47" => 71, "\x48" => 72, "\x49" => 73, "\x4A" => 74, "\x4B" => 75, "\x4C" => 76, "\x4D" => 77, "\x4E" => 78, "\x4F" => 79, "\x50" => 80, "\x51" => 81, "\x52" => 82, "\x53" => 83, "\x54" => 84, "\x55" => 85, "\x56" => 86, "\x57" => 87, "\x58" => 88, "\x59" => 89, "\x5A" => 90, "\x5B" => 91, "\x5C" => 92, "\x5D" => 93, "\x5E" => 94, "\x5F" => 95, "\x60" => 96, "\x61" => 97, "\x62" => 98, "\x63" => 99, "\x64" => 100, "\x65" => 101, "\x66" => 102, "\x67" => 103, "\x68" => 104, "\x69" => 105, "\x6A" => 106, "\x6B" => 107, "\x6C" => 108, "\x6D" => 109, "\x6E" => 110, "\x6F" => 111, "\x70" => 112, "\x71" => 113, "\x72" => 114, "\x73" => 115, "\x74" => 116, "\x75" => 117, "\x76" => 118, "\x77" => 119, "\x78" => 120, "\x79" => 121, "\x7A" => 122, "\x7B" => 123, "\x7C" => 124, "\x7D" => 125, "\x7E" => 126, "\x7F" => 127, "\x80" => 128, "\x81" => 129, "\x82" => 130, "\x83" => 131, "\x84" => 132, "\x85" => 133, "\x86" => 134, "\x87" => 135, "\x88" => 136, "\x89" => 137, "\x8A" => 138, "\x8B" => 139, "\x8C" => 140, "\x8D" => 141, "\x8E" => 142, "\x8F" => 143, "\x90" => 144, "\x91" => 145, "\x92" => 146, "\x93" => 147, "\x94" => 148, "\x95" => 149, "\x96" => 150, "\x97" => 151, "\x98" => 152, "\x99" => 153, "\x9A" => 154, "\x9B" => 155, "\x9C" => 156, "\x9D" => 157, "\x9E" => 158, "\x9F" => 159, "\xA0" => 160, "\xA1" => 161, "\xA2" => 162, "\xA3" => 163, "\xA4" => 164, "\xA5" => 165, "\xA6" => 166, "\xA7" => 167, "\xA8" => 168, "\xA9" => 169, "\xAA" => 170, "\xAB" => 171, "\xAC" => 172, "\xAD" => 173, "\xAE" => 174, "\xAF" => 175, "\xB0" => 176, "\xB1" => 177, "\xB2" => 178, "\xB3" => 179, "\xB4" => 180, "\xB5" => 181, "\xB6" => 182, "\xB7" => 183, "\xB8" => 184, "\xB9" => 185, "\xBA" => 186, "\xBB" => 187, "\xBC" => 188, "\xBD" => 189, "\xBE" => 190, "\xBF" => 191, "\xC0" => 192, "\xC1" => 193, "\xC2" => 194, "\xC3" => 195, "\xC4" => 196, "\xC5" => 197, "\xC6" => 198, "\xC7" => 199, "\xC8" => 200, "\xC9" => 201, "\xCA" => 202, "\xCB" => 203, "\xCC" => 204, "\xCD" => 205, "\xCE" => 206, "\xCF" => 207, "\xD0" => 208, "\xD1" => 209, "\xD2" => 210, "\xD3" => 211, "\xD4" => 212, "\xD5" => 213, "\xD6" => 214, "\xD7" => 215, "\xD8" => 216, "\xD9" => 217, "\xDA" => 218, "\xDB" => 219, "\xDC" => 220, "\xDD" => 221, "\xDE" => 222, "\xDF" => 223, "\xE0" => 224, "\xE1" => 225, "\xE2" => 226, "\xE3" => 227, "\xE4" => 228, "\xE5" => 229, "\xE6" => 230, "\xE7" => 231, "\xE8" => 232, "\xE9" => 233, "\xEA" => 234, "\xEB" => 235, "\xEC" => 236, "\xED" => 237, "\xEE" => 238, "\xEF" => 239, "\xF0" => 240, "\xF1" => 241, "\xF2" => 242, "\xF3" => 243, "\xF4" => 244, "\xF5" => 245, "\xF6" => 246, "\xF7" => 247, "\xF8" => 248, "\xF9" => 249, "\xFA" => 250, "\xFB" => 251, "\xFC" => 252, "\xFD" => 253, "\xFE" => 254, "\xFF" => 255]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x000.php b/vendor/voku/portable-ascii/src/voku/helper/data/x000.php deleted file mode 100644 index 6c9d81f..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x000.php +++ /dev/null @@ -1,16 +0,0 @@ -', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '', 'EUR', // "\xc2\x80" => "\xe2\x82\xac" => EURO SIGN - '', ',', 'f', ',,', // "\xc2\x84" => "\xe2\x80\x9e" => DOUBLE LOW-9 QUOTATION MARK - '...', // "\xc2\x85" => "\xe2\x80\xa6" => HORIZONTAL ELLIPSIS - '+', '++', // "\xc2\x87" => "\xe2\x80\xa1" => DOUBLE DAGGER - '^', '%0', // "\xc2\x89" => "\xe2\x80\xb0" => PER MILLE SIGN - 'S', '<', 'OE', // "\xc2\x8c" => "\xc5\x92" => LATIN CAPITAL LIGATURE OE - '', 'Z', '', '', '\'', // "\xc2\x91" => "\xe2\x80\x98" => LEFT SINGLE QUOTATION MARK - '\'', // "\xc2\x92" => "\xe2\x80\x99" => RIGHT SINGLE QUOTATION MARK - '"', '"', '*', '-', '--', // "\xc2\x97" => "\xe2\x80\x94" => EM DASH - '~', 'tm', 's', '>', 'oe', '', 'z', 'Y', ' ', '!', 'C/', 'PS', '$?', 'Y=', '|', 'SS', '"', '(c)', 'a', '<<', '!', '', '(r)', '-', 'deg', '+-', '2', '3', '\'', 'u', 'P', '*', ',', '1', 'o', '>>', '1/4', '1/2', '3/4', '?', 'A', 'A', 'A', 'A', // Not "AE" - used in languages other than German - 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', // Not "OE" - used in languages other than German - 'O', 'x', 'O', 'U', 'U', 'U', // Not "UE" - used in languages other than German - 'U', 'Y', 'Th', 'ss', 'a', 'a', 'a', 'a', // Not "ae" - used in languages other than German - 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'd', 'n', 'o', 'o', 'o', 'o', // Not "oe" - used in languages other than German - 'o', '/', 'o', 'u', 'u', 'u', // Not "ue" - used in languages other than German - 'u', 'y', 'th', 'y', ]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x001.php b/vendor/voku/portable-ascii/src/voku/helper/data/x001.php deleted file mode 100644 index 87fb12f..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x001.php +++ /dev/null @@ -1 +0,0 @@ -', '^', 'V', '^', 'V', '\'', '-', '/', '\\', ',', '_', '\\', '/', ':', '.', '`', '\'', '^', 'V', '+', '-', 'V', '.', '@', ',', '~', '"', 'R', 'X', 'G', 'l', 's', 'x', '?', '', '', '', '', '', '', '', 'V', '=', '"', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x003.php b/vendor/voku/portable-ascii/src/voku/helper/data/x003.php deleted file mode 100644 index 3d02b86..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x003.php +++ /dev/null @@ -1 +0,0 @@ -', '[?]', '[?]', '[?]', 'f', 'v', 'u', 'yr', 'y', 'w', 'th', 'th', 'a', 'o', 'ac', 'ae', 'o', 'o', 'o', 'oe', 'on', 'r', 'k', 'c', 'k', 'g', 'ng', 'g', 'g', 'w', 'h', 'h', 'h', 'h', 'n', 'n', 'n', 'i', 'e', 'j', 'g', 'ae', 'a', 'eo', 'p', 'z', 's', 's', 's', 'c', 'z', 't', 't', 'd', 'b', 'b', 'p', 'p', 'e', 'm', 'm', 'm', 'l', 'l', 'ng', 'ng', 'd', 'o', 'ear', 'ior', 'qu', 'qu', 'qu', 's', 'yr', 'yr', 'yr', 'q', 'x', '.', ':', '+', '17', '18', '19', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x017.php b/vendor/voku/portable-ascii/src/voku/helper/data/x017.php deleted file mode 100644 index 8f2a7ca..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x017.php +++ /dev/null @@ -1 +0,0 @@ -', '.', '..', '...', '.', "\n", - "\n\n", - '', '', '', '', '', ' ', '%0', '%00', '\'', '\'\'', '\'\'\'', '`', '``', '```', '^', '<', '>', '*', '!!', '!?', '-', '_', '-', '^', '***', '--', '/', '-[', ']-', '??', '?!', '!?', '7', 'PP', '(]', '[)', '*', '[?]', '[?]', '[?]', '%', '~', '[?]', '[?]', '[?]', "''''", // 0x57 - '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ' ', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '0', 'i', '', '', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', 'n', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', '[?]', 'a', 'e', 'o', 'x', '[?]', 'h', 'k', 'l', 'm', 'n', 'p', 's', 't', '[?]', '[?]', '[?]', 'ECU', 'CL', 'Cr', 'Fr.', 'L.', 'mil', 'N', 'Pts', 'Rs', 'W', 'NS', 'D', 'EUR', 'K', 'T', 'Dr', 'Pf', 'P', 'G', 'A', 'UAH', 'C|', 'L', 'Sm', 'T', 'Rs', 'L', 'M', 'm', 'R', 'l', 'BTC', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x021.php b/vendor/voku/portable-ascii/src/voku/helper/data/x021.php deleted file mode 100644 index 1643d67..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x021.php +++ /dev/null @@ -1 +0,0 @@ -=', '<=', '>=', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x023.php b/vendor/voku/portable-ascii/src/voku/helper/data/x023.php deleted file mode 100644 index b8f4ca0..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x023.php +++ /dev/null @@ -1 +0,0 @@ - ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x024.php b/vendor/voku/portable-ascii/src/voku/helper/data/x024.php deleted file mode 100644 index 26abcc6..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x024.php +++ /dev/null @@ -1 +0,0 @@ -', '>', '>', '>', '>', '>', 'V', 'V', 'V', 'V', '<', '<', '<', '<', '<', '<', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '#', '#', '#', '#', '#', '^', '^', '^', 'O', '#', '#', '#', '#', 'O', 'O', 'O', 'O', '/', '\\\\', '\\\\', '#', '#', '#', '#', '/']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x026.php b/vendor/voku/portable-ascii/src/voku/helper/data/x026.php deleted file mode 100644 index 0c97de3..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x026.php +++ /dev/null @@ -1 +0,0 @@ - ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x028.php b/vendor/voku/portable-ascii/src/voku/helper/data/x028.php deleted file mode 100644 index 9585d91..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x028.php +++ /dev/null @@ -1 +0,0 @@ -', 'n', 't', 'q', ',', '*', '5', '<', '-', 'u', '8', 'v', '.', '%', '[', '$', '+', 'x', '!', '&', ';', ':', '4', '\\', '0', 'z', '7', '(', '_', '?', 'w', ']', '#', 'y', ')', '=', '[d7]', '[d17]', '[d27]', '[d127]', '[d37]', '[d137]', '[d237]', '[d1237]', '[d47]', '[d147]', '[d247]', '[d1247]', '[d347]', '[d1347]', '[d2347]', '[d12347]', '[d57]', '[d157]', '[d257]', '[d1257]', '[d357]', '[d1357]', '[d2357]', '[d12357]', '[d457]', '[d1457]', '[d2457]', '[d12457]', '[d3457]', '[d13457]', '[d23457]', '[d123457]', '[d67]', '[d167]', '[d267]', '[d1267]', '[d367]', '[d1367]', '[d2367]', '[d12367]', '[d467]', '[d1467]', '[d2467]', '[d12467]', '[d3467]', '[d13467]', '[d23467]', '[d123467]', '[d567]', '[d1567]', '[d2567]', '[d12567]', '[d3567]', '[d13567]', '[d23567]', '[d123567]', '[d4567]', '[d14567]', '[d24567]', '[d124567]', '[d34567]', '[d134567]', '[d234567]', '[d1234567]', '[d8]', '[d18]', '[d28]', '[d128]', '[d38]', '[d138]', '[d238]', '[d1238]', '[d48]', '[d148]', '[d248]', '[d1248]', '[d348]', '[d1348]', '[d2348]', '[d12348]', '[d58]', '[d158]', '[d258]', '[d1258]', '[d358]', '[d1358]', '[d2358]', '[d12358]', '[d458]', '[d1458]', '[d2458]', '[d12458]', '[d3458]', '[d13458]', '[d23458]', '[d123458]', '[d68]', '[d168]', '[d268]', '[d1268]', '[d368]', '[d1368]', '[d2368]', '[d12368]', '[d468]', '[d1468]', '[d2468]', '[d12468]', '[d3468]', '[d13468]', '[d23468]', '[d123468]', '[d568]', '[d1568]', '[d2568]', '[d12568]', '[d3568]', '[d13568]', '[d23568]', '[d123568]', '[d4568]', '[d14568]', '[d24568]', '[d124568]', '[d34568]', '[d134568]', '[d234568]', '[d1234568]', '[d78]', '[d178]', '[d278]', '[d1278]', '[d378]', '[d1378]', '[d2378]', '[d12378]', '[d478]', '[d1478]', '[d2478]', '[d12478]', '[d3478]', '[d13478]', '[d23478]', '[d123478]', '[d578]', '[d1578]', '[d2578]', '[d12578]', '[d3578]', '[d13578]', '[d23578]', '[d123578]', '[d4578]', '[d14578]', '[d24578]', '[d124578]', '[d34578]', '[d134578]', '[d234578]', '[d1234578]', '[d678]', '[d1678]', '[d2678]', '[d12678]', '[d3678]', '[d13678]', '[d23678]', '[d123678]', '[d4678]', '[d14678]', '[d24678]', '[d124678]', '[d34678]', '[d134678]', '[d234678]', '[d1234678]', '[d5678]', '[d15678]', '[d25678]', '[d125678]', '[d35678]', '[d135678]', '[d235678]', '[d1235678]', '[d45678]', '[d145678]', '[d245678]', '[d1245678]', '[d345678]', '[d1345678]', '[d2345678]', '[d12345678]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x029.php b/vendor/voku/portable-ascii/src/voku/helper/data/x029.php deleted file mode 100644 index 5162de3..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x029.php +++ /dev/null @@ -1 +0,0 @@ -', '%', '[?]', '[?]', '>', '=', '[?]', '/', '-', '~', '\\', '/', '~', '~', '|-', '-|', '[?]', '[?]', '[?]', '[?]', '<=', '=>', '((', '))', '[?]', '[?]', '::', '[?]', '?', '\'', 'o', '.', ',', '.', ',', ';', '[?]', '[?]', '[?]', '[?]', '----', '------', 'x', '|', '[?]', '[?]', '=', ',', '"', '`--', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php deleted file mode 100644 index 5147b57..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php +++ /dev/null @@ -1 +0,0 @@ - ', '<<', '>> ', '[', '] ', '{', '} ', '[(', ')] ', '@', 'X ', '[', '] ', '[[', ']] ', '((', ')) ', '[[', ']] ', '~ ', '``', '\'\'', ',,', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '', '', '', '', '', '~', '+', '+', '+', '+', '', '@', ' // ', '+10+', '+20+', '+30+', '[?]', '[?]', '[?]', '', '', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0x57 - 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0x61 - 'di', 'tsu', // 0x63 - 'tsu', // 0x64 - 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '"', '"', '[?]', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0xb7 - 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0xc1 - 'di', 'tsu', // 0xc3 - 'tsu', // 0xc4 - 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', 'ka', 'ke', 'va', 'vi', 've', 'vo', '', '', '"', '"', ]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x031.php b/vendor/voku/portable-ascii/src/voku/helper/data/x031.php deleted file mode 100644 index 72c0260..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x031.php +++ /dev/null @@ -1 +0,0 @@ ->', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '(g)', '(n)', '(d)', '(r)', '(m)', '(b)', '(s)', '()', '(j)', '(c)', '(k)', '(t)', '(p)', '(h)', '(ga)', '(na)', '(da)', '(ra)', '(ma)', '(ba)', '(sa)', '(a)', '(ja)', '(ca)', '(ka)', '(ta)', '(pa)', '(ha)', '[?]', '[?]', '[?]', 'KIS ', '(1) ', '(2) ', '(3) ', '(4) ', '(5) ', '(6) ', '(7) ', '(8) ', '(9) ', '(10) ', '(Yue) ', '(Huo) ', '(Shui) ', '(Mu) ', '(Jin) ', '(Tu) ', '(Ri) ', '(Zhu) ', '(You) ', '(She) ', '(Ming) ', '(Te) ', '(Cai) ', '(Zhu) ', '(Lao) ', '(Mi) ', '(Nan) ', '(Nu) ', '(Shi) ', '(You) ', '(Yin) ', '(Zhu) ', '(Xiang) ', '(Xiu) ', '(Xie) ', '(Zheng) ', '(Shang) ', '(Zhong) ', '(Xia) ', '(Zuo) ', '(You) ', '(Yi) ', '(Zong) ', '(Xue) ', '(Jian) ', '(Qi) ', '(Zi) ', '(Xie) ', '(Ye) ', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '1M', '2M', '3M', '4M', '5M', '6M', '7M', '8M', '9M', '10M', '11M', '12M', 'Hg', 'erg', 'eV', 'LTD', 'a', 'i', 'u', 'u', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wi', 'we', 'wo']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x033.php b/vendor/voku/portable-ascii/src/voku/helper/data/x033.php deleted file mode 100644 index 8505337..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x033.php +++ /dev/null @@ -1 +0,0 @@ -> ', '<', '> ', '[', '] ', '{', '}', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', ',', ',', '.', '', ';', ':', '?', '!', '-', '(', ')', '{', '}', '{', '}', '#', '&', '*', '+', '-', '<', '>', '=', '', '\\', '$', '%', '@', '[?]', '[?]', '[?]', '[?]', '', '', '', '[?]', '', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php deleted file mode 100644 index b3a1539..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php +++ /dev/null @@ -1 +0,0 @@ -', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '[?]', '[?]', '.', '[', ']', ',', '*', 'wo', 'a', 'i', 'u', 'e', 'o', 'ya', 'yu', 'yo', 'tu', '+', 'a', 'i', 'u', 'e', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'n', ':', ';', '', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'dd', 'r', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'rh', 'm', 'b', 'bb', 'bs', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', '[?]', '[?]', '[?]', 'a', 'ae', 'ya', 'yae', 'eo', 'e', '[?]', '[?]', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', '[?]', '[?]', 'yo', 'u', 'weo', 'we', 'wi', 'yu', '[?]', '[?]', 'eu', 'yi', 'i', '[?]', '[?]', '[?]', '/C', 'PS', '!', '-', '|', 'Y=', 'W=', '[?]', '|', '-', '|', '-', '|', '#', 'O', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '{', '|', '}', '', '', '', '']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php deleted file mode 100644 index ad8d3b2..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php +++ /dev/null @@ -1 +0,0 @@ - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 52 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 78 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 104 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 130 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 156 => 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 181 => 'Z', 182 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 208 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 234 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php deleted file mode 100644 index a2a9b90..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php +++ /dev/null @@ -1,4 +0,0 @@ - 'w', 'x', 'y', 'z', 4 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 30 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 56 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 82 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 108 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 134 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 160 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 186 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 212 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 238 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php deleted file mode 100644 index 315ef5e..0000000 --- a/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php +++ /dev/null @@ -1 +0,0 @@ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 80 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 112 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 230 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ]; diff --git a/vendor/webman/database/LICENSE b/vendor/webman/database/LICENSE deleted file mode 100644 index af6d295..0000000 --- a/vendor/webman/database/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 webman - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/webman/database/README.md b/vendor/webman/database/README.md deleted file mode 100644 index 671ffb1..0000000 --- a/vendor/webman/database/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Webman database -This is Webman's database library, which includes database client and connection pool. \ No newline at end of file diff --git a/vendor/webman/database/composer.json b/vendor/webman/database/composer.json deleted file mode 100644 index 073c8aa..0000000 --- a/vendor/webman/database/composer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "webman/database", - "type": "library", - "license": "MIT", - "description": "Webman database", - "require": { - "workerman/webman-framework": "^2.1 || dev-master", - "illuminate/database": "^10.0 || ^11.0", - "laravel/serializable-closure": "^1.0 || ^2.0" - }, - "autoload": { - "psr-4": { - "Webman\\Database\\": "src", - "support\\": "src/support" - } - }, - "minimum-stability": "dev", - "prefer-stable": true -} diff --git a/vendor/webman/database/src/DatabaseManager.php b/vendor/webman/database/src/DatabaseManager.php deleted file mode 100644 index ff11d42..0000000 --- a/vendor/webman/database/src/DatabaseManager.php +++ /dev/null @@ -1,82 +0,0 @@ -getDefaultConnection(); - [$database, $type] = $this->parseConnectionName($name); - - $key = "database.connections.$name"; - $connection = Context::get($key); - if (!$connection) { - if (!isset(static::$pools[$name])) { - $poolConfig = $this->app['config']['database.connections'][$name]['pool'] ?? []; - $pool = new Pool($poolConfig['max_connections'] ?? 6, $poolConfig); - $pool->setConnectionCreator(function () use ($database, $type) { - return $this->configure($this->makeConnection($database), $type); - }); - $pool->setConnectionCloser(function ($connection) { - $this->closeAndFreeConnection($connection); - }); - $pool->setHeartbeatChecker(function ($connection) { - $connection->select('select 1'); - }); - static::$pools[$name] = $pool; - } - try { - $connection = static::$pools[$name]->get(); - Context::set($key, $connection); - } finally { - // We cannot use Coroutine::defer() because we may not be in a coroutine environment currently. - Context::onDestroy(function () use ($connection, $name) { - try { - $connection && static::$pools[$name]->put($connection); - } catch (Throwable) { - // ignore - } - }); - } - } - return $connection; - } - - /** - * Close connection. - * - * @param $connection - * @return void - */ - protected function closeAndFreeConnection($connection): void - { - $connection->disconnect(); - $clearProperties = function () { - $this->queryGrammar = null; - }; - $clearProperties->call($connection); - } - -} diff --git a/vendor/webman/database/src/Initializer.php b/vendor/webman/database/src/Initializer.php deleted file mode 100644 index de96aad..0000000 --- a/vendor/webman/database/src/Initializer.php +++ /dev/null @@ -1,113 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Database; - -use Illuminate\Container\Container as IlluminateContainer; -use Webman\Database\Manager as Capsule; -use Illuminate\Events\Dispatcher; -use Illuminate\Pagination\Paginator; -use Illuminate\Pagination\CursorPaginator; -use Illuminate\Pagination\Cursor; -use Jenssegers\Mongodb\Connection as JenssegersMongodbConnection; -use MongoDB\Laravel\Connection as LaravelMongodbConnection; -use support\Container; - -/** - * Class Initializer - */ -class Initializer -{ - - /** - * @var bool - */ - private static bool $initialized = false; - - /** - * @param $config - * @return void - */ - public static function init($config): void - { - if (self::$initialized) { - return; - } - self::$initialized = true; - - $connections = $config['connections'] ?? []; - if (!$connections) { - return; - } - - $capsule = new Capsule(IlluminateContainer::getInstance()); - - $capsule->getDatabaseManager()->extend('mongodb', function ($config, $name) { - $config['name'] = $name; - return class_exists(LaravelMongodbConnection::class) ? new LaravelMongodbConnection($config) : new JenssegersMongodbConnection($config); - }); - - $default = $config['default'] ?? false; - if ($default) { - $defaultConfig = $connections[$default] ?? false; - if ($defaultConfig) { - $capsule->addConnection($defaultConfig, $default); - $capsule->getDatabaseManager()->setDefaultConnection($default); - unset($connections[$default]); - } - } - - foreach ($connections as $name => $config) { - $capsule->addConnection($config, $name); - } - - if (class_exists(Dispatcher::class) && !$capsule->getEventDispatcher()) { - $capsule->setEventDispatcher(Container::make(Dispatcher::class, [IlluminateContainer::getInstance()])); - } - - $capsule->setAsGlobal(); - - $capsule->bootEloquent(); - - // Paginator - if (class_exists(Paginator::class)) { - if (method_exists(Paginator::class, 'queryStringResolver')) { - Paginator::queryStringResolver(function () { - $request = request(); - return $request?->queryString(); - }); - } - Paginator::currentPathResolver(function () { - $request = request(); - return $request ? $request->path(): '/'; - }); - Paginator::currentPageResolver(function ($pageName = 'page') { - $request = request(); - if (!$request) { - return 1; - } - $page = (int)($request->input($pageName, 1)); - return $page > 0 ? $page : 1; - }); - if (class_exists(CursorPaginator::class)) { - CursorPaginator::currentCursorResolver(function ($cursorName = 'cursor') { - return Cursor::fromEncoded(request()->input($cursorName)); - }); - } - } - } - -} - -Initializer::init(config('database', [])); diff --git a/vendor/webman/database/src/Install.php b/vendor/webman/database/src/Install.php deleted file mode 100644 index 6e01a77..0000000 --- a/vendor/webman/database/src/Install.php +++ /dev/null @@ -1,91 +0,0 @@ - $dest) { - if ($pos = strrpos($dest, '/')) { - $parent_dir = base_path().'/'.substr($dest, 0, $pos); - if (!is_dir($parent_dir)) { - mkdir($parent_dir, 0777, true); - } - } - copy_dir(__DIR__ . "/$source", base_path()."/$dest"); - } - } - - /** - * uninstallByRelation - * @return void - */ - public static function uninstallByRelation(): void - { - foreach (static::$pathRelation as $source => $dest) { - $path = base_path()."/$dest"; - if (!is_dir($path) && !is_file($path)) { - continue; - } - remove_dir($path); - } - } - -} \ No newline at end of file diff --git a/vendor/webman/database/src/Manager.php b/vendor/webman/database/src/Manager.php deleted file mode 100644 index 861065c..0000000 --- a/vendor/webman/database/src/Manager.php +++ /dev/null @@ -1,22 +0,0 @@ -container); - $this->manager = new DatabaseManager($this->container, $factory); - } -} \ No newline at end of file diff --git a/vendor/webman/database/src/config/database.php b/vendor/webman/database/src/config/database.php deleted file mode 100644 index d11a3de..0000000 --- a/vendor/webman/database/src/config/database.php +++ /dev/null @@ -1,30 +0,0 @@ - 'mysql', - 'connections' => [ - 'mysql' => [ - 'driver' => 'mysql', - 'host' => '127.0.0.1', - 'port' => '3306', - 'database' => 'your_database', - 'username' => 'your_username', - 'password' => 'your_password', - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_general_ci', - 'prefix' => '', - 'strict' => true, - 'engine' => null, - 'options' => [ - PDO::ATTR_EMULATE_PREPARES => false, // Must be false for Swoole and Swow drivers. - ], - // Connection pool, supports only Swoole or Swow drivers. - 'pool' => [ - 'max_connections' => 5, - 'min_connections' => 1, - 'wait_timeout' => 3, - 'idle_timeout' => 60, - 'heartbeat_interval' => 50, - ], - ], - ], -]; \ No newline at end of file diff --git a/vendor/webman/database/src/support/Db.php b/vendor/webman/database/src/support/Db.php deleted file mode 100644 index 980e812..0000000 --- a/vendor/webman/database/src/support/Db.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support; - -use Closure; -use Webman\Database\Manager; - -require_once __DIR__ . '/../Initializer.php'; - -/** - * Class Db - * @package support - * @method static array select(string $query, $bindings = [], $useReadPdo = true) - * @method static int insert(string $query, $bindings = []) - * @method static int update(string $query, $bindings = []) - * @method static int delete(string $query, $bindings = []) - * @method static bool statement(string $query, $bindings = []) - * @method static mixed transaction(Closure $callback, $attempts = 1) - * @method static void beginTransaction() - * @method static void rollBack($toLevel = null) - * @method static void commit() - */ -class Db extends Manager -{ - -} \ No newline at end of file diff --git a/vendor/webman/database/src/support/Model.php b/vendor/webman/database/src/support/Model.php deleted file mode 100644 index 0d3454f..0000000 --- a/vendor/webman/database/src/support/Model.php +++ /dev/null @@ -1,264 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support; - -use Closure; -use Illuminate\Contracts\Pagination\CursorPaginator; -use Illuminate\Contracts\Pagination\LengthAwarePaginator; -use Illuminate\Contracts\Pagination\Paginator; -use Illuminate\Database\Eloquent\Model as BaseModel; -use Illuminate\Database\Query\Builder; -use Illuminate\Database\Query\Expression; -use Illuminate\Database\Query\Grammars\Grammar; -use Illuminate\Database\Query\Processors\Processor; -use Illuminate\Support\Collection; -use Illuminate\Support\LazyCollection; - -require_once __DIR__ . '/../Initializer.php'; - -/** - * @method static BaseModel make($attributes = []) - * @method static \Illuminate\Database\Eloquent\Builder|static withGlobalScope($identifier, $scope) - * @method static \Illuminate\Database\Eloquent\Builder|static withoutGlobalScope($scope) - * @method static \Illuminate\Database\Eloquent\Builder|static withoutGlobalScopes($scopes = null) - * @method static array removedScopes() - * @method static \Illuminate\Database\Eloquent\Builder|static whereKey($id) - * @method static \Illuminate\Database\Eloquent\Builder|static whereKeyNot($id) - * @method static \Illuminate\Database\Eloquent\Builder|static where($column, $operator = null, $value = null, $boolean = 'and') - * @method static BaseModel|null firstWhere($column, $operator = null, $value = null, $boolean = 'and') - * @method static \Illuminate\Database\Eloquent\Builder|static orWhere($column, $operator = null, $value = null) - * @method static \Illuminate\Database\Eloquent\Builder|static latest($column = null) - * @method static \Illuminate\Database\Eloquent\Builder|static oldest($column = null) - * @method static \Illuminate\Database\Eloquent\Collection|static hydrate($items) - * @method static \Illuminate\Database\Eloquent\Collection|static fromQuery($query, $bindings = []) - * @method static BaseModel|\Illuminate\Database\Eloquent\Collection|static[]|static|null find($id, $columns = []) - * @method static \Illuminate\Database\Eloquent\Collection|static findMany($ids, $columns = []) - * @method static BaseModel|\Illuminate\Database\Eloquent\Collection|static|static[] findOrFail($id, $columns = []) - * @method static BaseModel|static findOrNew($id, $columns = []) - * @method static BaseModel|static firstOrNew($attributes = [], $values = []) - * @method static BaseModel|static firstOrCreate($attributes = [], $values = []) - * @method static BaseModel|static updateOrCreate($attributes, $values = []) - * @method static BaseModel|static firstOrFail($columns = []) - * @method static BaseModel|static|mixed firstOr($columns = [], $callback = null) - * @method static BaseModel sole($columns = []) - * @method static mixed value($column) - * @method static \Illuminate\Database\Eloquent\Collection[]|static[] get($columns = []) - * @method static BaseModel[]|static[] getModels($columns = []) - * @method static array eagerLoadRelations($models) - * @method static LazyCollection cursor() - * @method static Collection pluck($column, $key = null) - * @method static LengthAwarePaginator paginate($perPage = null, $columns = [], $pageName = 'page', $page = null) - * @method static Paginator simplePaginate($perPage = null, $columns = [], $pageName = 'page', $page = null) - * @method static CursorPaginator cursorPaginate($perPage = null, $columns = [], $cursorName = 'cursor', $cursor = null) - * @method static BaseModel|$this create($attributes = []) - * @method static BaseModel|$this forceCreate($attributes) - * @method static int upsert($values, $uniqueBy, $update = null) - * @method static void onDelete($callback) - * @method static static|mixed scopes($scopes) - * @method static static applyScopes() - * @method static \Illuminate\Database\Eloquent\Builder|static without($relations) - * @method static \Illuminate\Database\Eloquent\Builder|static withOnly($relations) - * @method static BaseModel newModelInstance($attributes = []) - * @method static \Illuminate\Database\Eloquent\Builder|static withCasts($casts) - * @method static Builder getQuery() - * @method static \Illuminate\Database\Eloquent\Builder|static setQuery($query) - * @method static Builder toBase() - * @method static array getEagerLoads() - * @method static \Illuminate\Database\Eloquent\Builder|static setEagerLoads($eagerLoad) - * @method static BaseModel getModel() - * @method static \Illuminate\Database\Eloquent\Builder|static setModel($model) - * @method static Closure getMacro($name) - * @method static bool hasMacro($name) - * @method static Closure getGlobalMacro($name) - * @method static bool hasGlobalMacro($name) - * @method static static clone () - * @method static \Illuminate\Database\Eloquent\Builder|static has($relation, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) - * @method static \Illuminate\Database\Eloquent\Builder|static orHas($relation, $operator = '>=', $count = 1) - * @method static \Illuminate\Database\Eloquent\Builder|static doesntHave($relation, $boolean = 'and', $callback = null) - * @method static \Illuminate\Database\Eloquent\Builder|static orDoesntHave($relation) - * @method static \Illuminate\Database\Eloquent\Builder|static whereHas($relation, $callback = null, $operator = '>=', $count = 1) - * @method static \Illuminate\Database\Eloquent\Builder|static orWhereHas($relation, $callback = null, $operator = '>=', $count = 1) - * @method static \Illuminate\Database\Eloquent\Builder|static whereDoesntHave($relation, $callback = null) - * @method static \Illuminate\Database\Eloquent\Builder|static orWhereDoesntHave($relation, $callback = null) - * @method static \Illuminate\Database\Eloquent\Builder|static hasMorph($relation, $types, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) - * @method static \Illuminate\Database\Eloquent\Builder|static orHasMorph($relation, $types, $operator = '>=', $count = 1) - * @method static \Illuminate\Database\Eloquent\Builder|static doesntHaveMorph($relation, $types, $boolean = 'and', $callback = null) - * @method static \Illuminate\Database\Eloquent\Builder|static orDoesntHaveMorph($relation, $types) - * @method static \Illuminate\Database\Eloquent\Builder|static whereHasMorph($relation, $types, $callback = null, $operator = '>=', $count = 1) - * @method static \Illuminate\Database\Eloquent\Builder|static orWhereHasMorph($relation, $types, $callback = null, $operator = '>=', $count = 1) - * @method static \Illuminate\Database\Eloquent\Builder|static whereDoesntHaveMorph($relation, $types, $callback = null) - * @method static \Illuminate\Database\Eloquent\Builder|static orWhereDoesntHaveMorph($relation, $types, $callback = null) - * @method static \Illuminate\Database\Eloquent\Builder|static withAggregate($relations, $column, $function = null) - * @method static \Illuminate\Database\Eloquent\Builder|static withCount($relations) - * @method static \Illuminate\Database\Eloquent\Builder|static withMax($relation, $column) - * @method static \Illuminate\Database\Eloquent\Builder|static withMin($relation, $column) - * @method static \Illuminate\Database\Eloquent\Builder|static withSum($relation, $column) - * @method static \Illuminate\Database\Eloquent\Builder|static withAvg($relation, $column) - * @method static \Illuminate\Database\Eloquent\Builder|static withExists($relation) - * @method static \Illuminate\Database\Eloquent\Builder|static mergeConstraintsFrom($from) - * @method static Collection explain() - * @method static bool chunk($count, $callback) - * @method static Collection chunkMap($callback, $count = 1000) - * @method static bool each($callback, $count = 1000) - * @method static bool chunkById($count, $callback, $column = null, $alias = null) - * @method static bool eachById($callback, $count = 1000, $column = null, $alias = null) - * @method static LazyCollection lazy($chunkSize = 1000) - * @method static LazyCollection lazyById($chunkSize = 1000, $column = null, $alias = null) - * @method static BaseModel|object|static|null first($columns = []) - * @method static BaseModel|object|null baseSole($columns = []) - * @method static \Illuminate\Database\Eloquent\Builder|static tap($callback) - * @method static mixed when($value, $callback, $default = null) - * @method static mixed unless($value, $callback, $default = null) - * @method static Builder select($columns = []) - * @method static Builder selectSub($query, $as) - * @method static Builder selectRaw($expression, $bindings = []) - * @method static Builder fromSub($query, $as) - * @method static Builder fromRaw($expression, $bindings = []) - * @method static Builder addSelect($column) - * @method static Builder distinct() - * @method static Builder from($table, $as = null) - * @method static Builder join($table, $first, $operator = null, $second = null, $type = 'inner', $where = false) - * @method static Builder joinWhere($table, $first, $operator, $second, $type = 'inner') - * @method static Builder joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false) - * @method static Builder leftJoin($table, $first, $operator = null, $second = null) - * @method static Builder leftJoinWhere($table, $first, $operator, $second) - * @method static Builder leftJoinSub($query, $as, $first, $operator = null, $second = null) - * @method static Builder rightJoin($table, $first, $operator = null, $second = null) - * @method static Builder rightJoinWhere($table, $first, $operator, $second) - * @method static Builder rightJoinSub($query, $as, $first, $operator = null, $second = null) - * @method static Builder crossJoin($table, $first = null, $operator = null, $second = null) - * @method static Builder crossJoinSub($query, $as) - * @method static void mergeWheres($wheres, $bindings) - * @method static array prepareValueAndOperator($value, $operator, $useDefault = false) - * @method static Builder whereColumn($first, $operator = null, $second = null, $boolean = 'and') - * @method static Builder orWhereColumn($first, $operator = null, $second = null) - * @method static Builder whereRaw($sql, $bindings = [], $boolean = 'and') - * @method static Builder orWhereRaw($sql, $bindings = []) - * @method static Builder whereIn($column, $values, $boolean = 'and', $not = false) - * @method static Builder orWhereIn($column, $values) - * @method static Builder whereNotIn($column, $values, $boolean = 'and') - * @method static Builder orWhereNotIn($column, $values) - * @method static Builder whereIntegerInRaw($column, $values, $boolean = 'and', $not = false) - * @method static Builder orWhereIntegerInRaw($column, $values) - * @method static Builder whereIntegerNotInRaw($column, $values, $boolean = 'and') - * @method static Builder orWhereIntegerNotInRaw($column, $values) - * @method static Builder whereNull($columns, $boolean = 'and', $not = false) - * @method static Builder orWhereNull($column) - * @method static Builder whereNotNull($columns, $boolean = 'and') - * @method static Builder whereBetween($column, $values, $boolean = 'and', $not = false) - * @method static Builder whereBetweenColumns($column, $values, $boolean = 'and', $not = false) - * @method static Builder orWhereBetween($column, $values) - * @method static Builder orWhereBetweenColumns($column, $values) - * @method static Builder whereNotBetween($column, $values, $boolean = 'and') - * @method static Builder whereNotBetweenColumns($column, $values, $boolean = 'and') - * @method static Builder orWhereNotBetween($column, $values) - * @method static Builder orWhereNotBetweenColumns($column, $values) - * @method static Builder orWhereNotNull($column) - * @method static Builder whereDate($column, $operator, $value = null, $boolean = 'and') - * @method static Builder orWhereDate($column, $operator, $value = null) - * @method static Builder whereTime($column, $operator, $value = null, $boolean = 'and') - * @method static Builder orWhereTime($column, $operator, $value = null) - * @method static Builder whereDay($column, $operator, $value = null, $boolean = 'and') - * @method static Builder orWhereDay($column, $operator, $value = null) - * @method static Builder whereMonth($column, $operator, $value = null, $boolean = 'and') - * @method static Builder orWhereMonth($column, $operator, $value = null) - * @method static Builder whereYear($column, $operator, $value = null, $boolean = 'and') - * @method static Builder orWhereYear($column, $operator, $value = null) - * @method static Builder whereNested($callback, $boolean = 'and') - * @method static Builder forNestedWhere() - * @method static Builder addNestedWhereQuery($query, $boolean = 'and') - * @method static Builder whereExists($callback, $boolean = 'and', $not = false) - * @method static Builder orWhereExists($callback, $not = false) - * @method static Builder whereNotExists($callback, $boolean = 'and') - * @method static Builder orWhereNotExists($callback) - * @method static Builder addWhereExistsQuery($query, $boolean = 'and', $not = false) - * @method static Builder whereRowValues($columns, $operator, $values, $boolean = 'and') - * @method static Builder orWhereRowValues($columns, $operator, $values) - * @method static Builder whereJsonContains($column, $value, $boolean = 'and', $not = false) - * @method static Builder orWhereJsonContains($column, $value) - * @method static Builder whereJsonDoesntContain($column, $value, $boolean = 'and') - * @method static Builder orWhereJsonDoesntContain($column, $value) - * @method static Builder whereJsonLength($column, $operator, $value = null, $boolean = 'and') - * @method static Builder orWhereJsonLength($column, $operator, $value = null) - * @method static Builder dynamicWhere($method, $parameters) - * @method static Builder groupBy(...$groups) - * @method static Builder groupByRaw($sql, $bindings = []) - * @method static Builder having($column, $operator = null, $value = null, $boolean = 'and') - * @method static Builder orHaving($column, $operator = null, $value = null) - * @method static Builder havingBetween($column, $values, $boolean = 'and', $not = false) - * @method static Builder havingRaw($sql, $bindings = [], $boolean = 'and') - * @method static Builder orHavingRaw($sql, $bindings = []) - * @method static Builder orderBy($column, $direction = 'asc') - * @method static Builder orderByDesc($column) - * @method static Builder inRandomOrder($seed = '') - * @method static Builder orderByRaw($sql, $bindings = []) - * @method static Builder skip($value) - * @method static Builder offset($value) - * @method static Builder take($value) - * @method static Builder limit($value) - * @method static Builder forPage($page, $perPage = 15) - * @method static Builder forPageBeforeId($perPage = 15, $lastId = 0, $column = 'id') - * @method static Builder forPageAfterId($perPage = 15, $lastId = 0, $column = 'id') - * @method static Builder reorder($column = null, $direction = 'asc') - * @method static Builder union($query, $all = false) - * @method static Builder unionAll($query) - * @method static Builder lock($value = true) - * @method static Builder lockForUpdate() - * @method static Builder sharedLock() - * @method static Builder beforeQuery($callback) - * @method static void applyBeforeQueryCallbacks() - * @method static string toSql() - * @method static int getCountForPagination($columns = []) - * @method static string implode($column, $glue = '') - * @method static bool exists() - * @method static bool doesntExist() - * @method static mixed existsOr($callback) - * @method static mixed doesntExistOr($callback) - * @method static int count($columns = '*') - * @method static mixed min($column) - * @method static mixed max($column) - * @method static mixed sum($column) - * @method static mixed avg($column) - * @method static mixed average($column) - * @method static mixed aggregate($function, $columns = []) - * @method static float|int numericAggregate($function, $columns = []) - * @method static bool insert($values) - * @method static int insertOrIgnore($values) - * @method static int insertGetId($values, $sequence = null) - * @method static int insertUsing($columns, $query) - * @method static bool updateOrInsert($attributes, $values = []) - * @method static void truncate() - * @method static Expression raw($value) - * @method static array getBindings() - * @method static array getRawBindings() - * @method static Builder setBindings($bindings, $type = 'where') - * @method static Builder addBinding($value, $type = 'where') - * @method static Builder mergeBindings($query) - * @method static array cleanBindings($bindings) - * @method static Processor getProcessor() - * @method static Grammar getGrammar() - * @method static Builder useWritePdo() - * @method static static cloneWithout($properties) - * @method static static cloneWithoutBindings($except) - * @method static Builder dump() - * @method static void dd() - * @method static void macro($name, $macro) - * @method static void mixin($mixin, $replace = true) - * @method static mixed macroCall($method, $parameters) - */ -class Model extends BaseModel -{ - -} diff --git a/vendor/workerman/coroutine/.gitignore b/vendor/workerman/coroutine/.gitignore deleted file mode 100644 index 68b9b27..0000000 --- a/vendor/workerman/coroutine/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -composer.lock -vendor -.idea -tests/.phpunit.result.cache -tests/workerman.log \ No newline at end of file diff --git a/vendor/workerman/coroutine/LICENSE b/vendor/workerman/coroutine/LICENSE deleted file mode 100644 index 62e1f43..0000000 --- a/vendor/workerman/coroutine/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 workerman - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/workerman/coroutine/README.md b/vendor/workerman/coroutine/README.md deleted file mode 100644 index ed2ebbe..0000000 --- a/vendor/workerman/coroutine/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Workerman coroutine library - -This is Workerman's coroutine library, which includes `Coroutine` `Channel` `Barrier` `Parallel` `Pool`. \ No newline at end of file diff --git a/vendor/workerman/coroutine/composer.json b/vendor/workerman/coroutine/composer.json deleted file mode 100644 index 4dfed18..0000000 --- a/vendor/workerman/coroutine/composer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "workerman/coroutine", - "type": "library", - "license": "MIT", - "description": "Workerman coroutine", - "require": { - "php": ">=8.1" - }, - "autoload": { - "psr-4": { - "Workerman\\Coroutine\\": "src", - "Workerman\\": "src" - } - }, - "require-dev": { - "phpunit/phpunit": "^11.0", - "psr/log": "*" - }, - "autoload-dev": { - "psr-4": { - "Workerman\\Coroutine\\": "src", - "Workerman\\": "src", - "tests\\": "tests" - } - }, - "scripts": { - "test": "php tests/start.php start" - }, - "minimum-stability": "dev", - "prefer-stable": true -} diff --git a/vendor/workerman/coroutine/src/Barrier.php b/vendor/workerman/coroutine/src/Barrier.php deleted file mode 100644 index 4b19004..0000000 --- a/vendor/workerman/coroutine/src/Barrier.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine; - -use Workerman\Coroutine\Barrier\BarrierInterface; -use Workerman\Events\Swoole; -use Workerman\Events\Swow; -use Workerman\Worker; - -/** - * Class Barrier - */ -class Barrier implements BarrierInterface -{ - - /** - * @var string - */ - protected static string $driver; - - /** - * Get driver. - * - * @return string - */ - protected static function getDriver(): string - { - return static::$driver ??= match (Worker::$eventLoopClass) { - Swoole::class => Barrier\Swoole::class, - Swow::class => Barrier\Swow::class, - default=> Barrier\Fiber::class, - }; - } - - /** - * @inheritDoc - */ - public static function wait(object &$barrier, int $timeout = -1): void - { - static::getDriver()::wait($barrier, $timeout); - } - - /** - * @inheritDoc - */ - public static function create(): object - { - return static::getDriver()::create(); - } - -} \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/Barrier/BarrierInterface.php b/vendor/workerman/coroutine/src/Barrier/BarrierInterface.php deleted file mode 100644 index 8ae4b8f..0000000 --- a/vendor/workerman/coroutine/src/Barrier/BarrierInterface.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Barrier; - -/** - * Interface BarrierInterface - */ -interface BarrierInterface -{ - /** - * Wait for the barrier to be released. - * - * @param object $barrier - * @param int $timeout - * @return void - */ - public static function wait(object &$barrier, int $timeout = -1): void; - - /** - * Create a new barrier instance. - * - * @return BarrierInterface - */ - public static function create(): object; -} diff --git a/vendor/workerman/coroutine/src/Barrier/Fiber.php b/vendor/workerman/coroutine/src/Barrier/Fiber.php deleted file mode 100644 index f33222a..0000000 --- a/vendor/workerman/coroutine/src/Barrier/Fiber.php +++ /dev/null @@ -1,85 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Barrier; - -use Revolt\EventLoop; -use RuntimeException; -use Workerman\Coroutine\Utils\DestructionWatcher; -use Workerman\Timer; -use Fiber as BaseFiber; -use Workerman\Worker; - -/** - * Class Fiber - */ -class Fiber implements BarrierInterface -{ - - /** - * @inheritDoc - */ - public static function wait(object &$barrier, int $timeout = -1): void - { - $coroutine = BaseFiber::getCurrent(); - $resumed = false; - $timerId = null; - - if ($timeout > 0 && $coroutine) { - $timerId = Timer::delay($timeout, function() use ($coroutine, &$resumed) { - if (!$resumed) { - $resumed = true; - $coroutine->resume(); - } - }); - } - - $coroutine && DestructionWatcher::watch($barrier, function() use ($coroutine, &$resumed, &$timerId) { - if (!$resumed) { - $resumed = true; - if ($timerId !== null) { - Timer::del($timerId); - } - // In PHP 8.4.0 and earlier, - // switching fibers during the execution of an object's destructor method is not allowed, - // so we implemented a delay. - if ($coroutine instanceof BaseFiber) { - Timer::delay(0.00001, function() use ($coroutine) { - $coroutine->resume(); - }); - return; - } - EventLoop::defer(function () use ($coroutine) { - $coroutine->resume(); - }); - } - }); - $barrier = null; - $coroutine && BaseFiber::suspend(); - } - - /** - * @inheritDoc - */ - public static function create(): object - { - if (!Worker::isRunning()) { - throw new RuntimeException('Fiber barrier only support in workerman runtime'); - } - return new self(); - } - -} diff --git a/vendor/workerman/coroutine/src/Barrier/Swoole.php b/vendor/workerman/coroutine/src/Barrier/Swoole.php deleted file mode 100644 index d140691..0000000 --- a/vendor/workerman/coroutine/src/Barrier/Swoole.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Barrier; - -use Swoole\Coroutine\Barrier as SwooleBarrier; -class Swoole implements BarrierInterface -{ - - /** - * @inheritDoc - */ - public static function wait(object &$barrier, int $timeout = -1): void - { - SwooleBarrier::wait($barrier, $timeout); - } - - /** - * @inheritDoc - */ - public static function create(): object - { - return SwooleBarrier::make(); - } - -} \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/Barrier/Swow.php b/vendor/workerman/coroutine/src/Barrier/Swow.php deleted file mode 100644 index a803f0e..0000000 --- a/vendor/workerman/coroutine/src/Barrier/Swow.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Barrier; - -use Swow\Sync\WaitReference; - -class Swow implements BarrierInterface -{ - /** - * @inheritDoc - */ - public static function wait(object &$barrier, int $timeout = -1): void - { - WaitReference::wait($barrier, $timeout); - } - - /** - * @inheritDoc - */ - public static function create(): object - { - return new WaitReference(); - } - -} \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/Channel.php b/vendor/workerman/coroutine/src/Channel.php deleted file mode 100644 index de5cc2f..0000000 --- a/vendor/workerman/coroutine/src/Channel.php +++ /dev/null @@ -1,114 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine; - -use InvalidArgumentException; -use Workerman\Coroutine\Channel\ChannelInterface; -use Workerman\Coroutine\Channel\Memory as ChannelMemory; -use Workerman\Coroutine\Channel\Swoole as ChannelSwoole; -use Workerman\Coroutine\Channel\Swow as ChannelSwow; -use Workerman\Coroutine\Channel\Fiber as ChannelFiber; -use Workerman\Events\Fiber; -use Workerman\Events\Swoole; -use Workerman\Events\Swow; -use Workerman\Worker; - -/** - * Class Channel - */ -class Channel implements ChannelInterface -{ - - /** - * @var ChannelInterface - */ - protected ChannelInterface $driver; - - /** - * Channel constructor. - * - * @param int $capacity - */ - public function __construct(int $capacity = 1) - { - if ($capacity < 1) { - throw new InvalidArgumentException("The capacity must be greater than 0"); - } - $this->driver = match (Worker::$eventLoopClass) { - Swoole::class => new ChannelSwoole($capacity), - Swow::class => new ChannelSwow($capacity), - Fiber::class => new ChannelFiber($capacity), - default => new ChannelMemory($capacity), - }; - } - - /** - * @inheritDoc - */ - public function push(mixed $data, float $timeout = -1): bool - { - return $this->driver->push($data, $timeout); - } - - /** - * @inheritDoc - */ - public function pop(float $timeout = -1): mixed - { - return $this->driver->pop($timeout); - } - - /** - * @inheritDoc - */ - public function length(): int - { - return $this->driver->length(); - } - - /** - * @inheritDoc - */ - public function getCapacity(): int - { - return $this->driver->getCapacity(); - } - - /** - * @inheritDoc - */ - public function hasConsumers(): bool - { - return $this->driver->hasConsumers(); - } - - /** - * @inheritDoc - */ - public function hasProducers(): bool - { - return $this->driver->hasProducers(); - } - - /** - * @inheritDoc - */ - public function close(): void - { - $this->driver->close(); - } -} diff --git a/vendor/workerman/coroutine/src/Channel/ChannelInterface.php b/vendor/workerman/coroutine/src/Channel/ChannelInterface.php deleted file mode 100644 index bbde495..0000000 --- a/vendor/workerman/coroutine/src/Channel/ChannelInterface.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Channel; - -/** - * ChannelInterface - */ -interface ChannelInterface -{ - /** - * Push data to channel. - * - * @param mixed $data - * @param float $timeout - * @return bool - */ - public function push(mixed $data, float $timeout = -1): bool; - - /** - * Pop data from channel. - * - * @param float $timeout - * @return mixed - */ - public function pop(float $timeout = -1): mixed; - - /** - * Get the length of channel. - * - * @return int - */ - public function length(): int; - - /** - * Get the capacity of channel. - * - * @return int - */ - public function getCapacity(): int; - - /** - * Check if there are consumers waiting to pop data from the channel. - * - * @return bool - */ - public function hasConsumers(): bool; - - /** - * Check if there are producers waiting to push data to the channel. - * - * @return bool - */ - public function hasProducers(): bool; - - /** - * Close the channel. - * - * @return void - */ - public function close(): void; - -} diff --git a/vendor/workerman/coroutine/src/Channel/Fiber.php b/vendor/workerman/coroutine/src/Channel/Fiber.php deleted file mode 100644 index 9bace9d..0000000 --- a/vendor/workerman/coroutine/src/Channel/Fiber.php +++ /dev/null @@ -1,252 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Channel; - -use Fiber as BaseFiber; -use RuntimeException; -use Workerman\Timer; -use WeakMap; -use Workerman\Worker; - -/** - * Channel - */ -class Fiber implements ChannelInterface -{ - /** - * @var array - */ - private array $queue = []; - - /** - * @var WeakMap - */ - private WeakMap $waitingPush; - - /** - * @var WeakMap - */ - private WeakMap $waitingPop; - - /** - * @var int - */ - private int $capacity; - - /** - * @var bool - */ - private bool $closed = false; - - /** - * Constructor - * - * @param int $capacity - */ - public function __construct(int $capacity = 1) - { - $this->capacity = $capacity; - $this->waitingPush = new WeakMap(); - $this->waitingPop = new WeakMap(); - } - - /** - * @inheritDoc - */ - public function push(mixed $data, float $timeout = -1): bool - { - if ($this->closed) { - return false; - } - - if (count($this->queue) >= $this->capacity) { - - if ($timeout == 0) { - return false; - } - - $fiber = BaseFiber::getCurrent(); - if ($fiber === null) { - throw new RuntimeException("Fiber::getCurrent() returned null. Ensure this method is called within a Fiber context."); - } - - $this->waitingPush[$fiber] = true; - - $timedOut = false; - $timerId = null; - if ($timeout > 0 && Worker::isRunning()) { - $timerId = Timer::delay($timeout, function () use ($fiber, &$timedOut) { - $timedOut = true; - if ($fiber->isSuspended()) { - unset($this->waitingPush[$fiber]); - $fiber->resume(false); - } - }); - } - - BaseFiber::suspend(); - unset($this->waitingPush[$fiber]); - - if (!$timedOut && $timerId) { - Timer::del($timerId); - } - - if ($timedOut) { - return false; - } - - // If the channel is closed while waiting, return false. - if ($this->closed) { - return false; - } - - } - - foreach ($this->waitingPop as $popFiber => $_) { - unset($this->waitingPop[$popFiber]); - if ($popFiber->isSuspended()) { - $popFiber->resume($data); - return true; - } - } - - $this->queue[] = $data; - return true; - } - - /** - * @inheritDoc - */ - public function pop(float $timeout = -1): mixed - { - if ($this->closed && empty($this->queue)) { - return false; - } - - if (empty($this->queue)) { - if ($timeout == 0) { - return false; - } - - $fiber = BaseFiber::getCurrent(); - if ($fiber === null) { - throw new RuntimeException("Fiber::getCurrent() returned null. Ensure this method is called within a Fiber context."); - } - - $this->waitingPop[$fiber] = true; - - $timedOut = false; - $timerId = null; - if ($timeout > 0) { - Worker::isRunning() && $timerId = Timer::delay($timeout, function () use ($fiber, &$timedOut) { - $timedOut = true; - if ($fiber->isSuspended()) { - unset($this->waitingPop[$fiber]); - $fiber->resume(false); - } - }); - } - - $data = BaseFiber::suspend(); - - unset($this->waitingPop[$fiber]); - - if (!$timedOut && $timerId !== null) { - Timer::del($timerId); - } - - if ($timedOut) { - return false; - } - - if ($data === false && $this->closed) { - return false; - } - - return $data; - } - - $value = array_shift($this->queue); - - foreach ($this->waitingPush as $pushFiber => $_) { - unset($this->waitingPush[$pushFiber]); - if ($pushFiber->isSuspended()) { - $pushFiber->resume(); - break; - } - } - - return $value; - } - - /** - * @inheritDoc - */ - public function length(): int - { - return count($this->queue); - } - - /** - * @inheritDoc - */ - public function getCapacity(): int - { - return $this->capacity; - } - - /** - * @inheritDoc - */ - public function hasConsumers(): bool - { - return count($this->waitingPop) > 0; - } - - /** - * @inheritDoc - */ - public function hasProducers(): bool - { - return count($this->waitingPush) > 0; - } - - /** - * @inheritDoc - */ - public function close(): void - { - $this->closed = true; - - foreach ($this->waitingPush as $fiber => $_) { - unset($this->waitingPush[$fiber]); - if ($fiber->isSuspended()) { - $fiber->resume(false); - } - } - $this->waitingPush = new WeakMap(); - - foreach ($this->waitingPop as $fiber => $_) { - unset($this->waitingPop[$fiber]); - if ($fiber->isSuspended()) { - $fiber->resume(false); - } - } - $this->waitingPop = new WeakMap(); - } - -} \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/Channel/Memory.php b/vendor/workerman/coroutine/src/Channel/Memory.php deleted file mode 100644 index 2d52bf5..0000000 --- a/vendor/workerman/coroutine/src/Channel/Memory.php +++ /dev/null @@ -1,69 +0,0 @@ -capacity = $capacity; - } - - public function push(mixed $data, float $timeout = -1): bool - { - if ($this->closed) { - return false; - } - if ($this->capacity > 0 && count($this->data) >= $this->capacity) { - // Channel is full - return false; - } - $this->data[] = $data; - return true; - } - - public function pop(float $timeout = -1): mixed - { - if (count($this->data) > 0) { - return array_shift($this->data); - } - return false; - } - - public function length(): int - { - return count($this->data); - } - - public function getCapacity(): int - { - return $this->capacity; - } - - /** - * @inheritDoc - */ - public function hasConsumers(): bool - { - return false; - } - - /** - * @inheritDoc - */ - public function hasProducers(): bool - { - return false; - } - - public function close(): void - { - $this->closed = true; - } -} diff --git a/vendor/workerman/coroutine/src/Channel/Swoole.php b/vendor/workerman/coroutine/src/Channel/Swoole.php deleted file mode 100644 index b56576d..0000000 --- a/vendor/workerman/coroutine/src/Channel/Swoole.php +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Channel; - -use Swoole\Coroutine\Channel; - -/** - * Class Swoole - */ -class Swoole implements ChannelInterface -{ - - /** - * @var Channel - */ - protected Channel $channel; - - /** - * Constructor. - * - * @param int $capacity - */ - public function __construct(protected int $capacity = 1) - { - $this->channel = new Channel($capacity); - } - - /** - * @inheritDoc - */ - public function push(mixed $data, float $timeout = -1): bool - { - return $this->channel->push($data, $timeout); - } - - /** - * @inheritDoc - */ - public function pop(float $timeout = -1): mixed - { - return $this->channel->pop($timeout); - } - - /** - * @inheritDoc - */ - public function length(): int - { - return $this->channel->length(); - } - - /** - * @inheritDoc - */ - public function getCapacity(): int - { - return $this->channel->capacity; - } - - /** - * @inheritDoc - */ - public function hasConsumers(): bool - { - return $this->channel->stats()['consumer_num'] > 0; - } - - /** - * @inheritDoc - */ - public function hasProducers(): bool - { - return $this->channel->stats()['producer_num'] > 0; - } - - /** - * @inheritDoc - */ - public function close(): void - { - $this->channel->close(); - } - -} diff --git a/vendor/workerman/coroutine/src/Channel/Swow.php b/vendor/workerman/coroutine/src/Channel/Swow.php deleted file mode 100644 index 5da353f..0000000 --- a/vendor/workerman/coroutine/src/Channel/Swow.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Channel; - -use Swow\Channel; -use Throwable; - -/** - * Class Swow - */ -class Swow implements ChannelInterface -{ - - /** - * @var Channel - */ - protected Channel $channel; - - /** - * Constructor. - * - * @param int $capacity - */ - public function __construct(protected int $capacity = 1) - { - $this->channel = new Channel($capacity); - } - - /** - * @inheritDoc - */ - public function push(mixed $data, float $timeout = -1): bool - { - try { - $this->channel->push($data, $timeout == -1 ? -1 : (int)($timeout * 1000)); - } catch (Throwable) { - return false; - } - return true; - } - - /** - * @inheritDoc - */ - public function pop(float $timeout = -1): mixed - { - try { - return $this->channel->pop($timeout == -1 ? -1 : (int)($timeout * 1000)); - } catch (Throwable) { - return false; - } - } - - /** - * @inheritDoc - */ - public function length(): int - { - return $this->channel->getLength(); - } - - /** - * @inheritDoc - */ - public function getCapacity(): int - { - return $this->channel->getCapacity(); - } - - /** - * @inheritDoc - */ - public function hasConsumers(): bool - { - return $this->channel->hasConsumers(); - } - - /** - * @inheritDoc - */ - public function hasProducers(): bool - { - return $this->channel->hasProducers(); - } - - /** - * @inheritDoc - */ - public function close(): void - { - $this->channel->close(); - } - -} diff --git a/vendor/workerman/coroutine/src/Context.php b/vendor/workerman/coroutine/src/Context.php deleted file mode 100644 index 48a073c..0000000 --- a/vendor/workerman/coroutine/src/Context.php +++ /dev/null @@ -1,90 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine; - -use ArrayObject; -use Workerman\Coroutine\Context\ContextInterface; -use Workerman\Events\Swoole; -use Workerman\Events\Swow; -use Workerman\Worker; - -/** - * Class Context - */ -class Context implements ContextInterface -{ - - /** - * @var class-string - */ - protected static string $driver; - - /** - * @inheritDoc - */ - public static function get(?string $name = null, mixed $default = null): mixed - { - return static::$driver::get($name, $default); - } - - /** - * @inheritDoc - */ - public static function set(string $name, $value): void - { - static::$driver::set($name, $value); - } - - /** - * @inheritDoc - */ - public static function has(string $name): bool - { - return static::$driver::has($name); - } - - /** - * @inheritDoc - */ - public static function reset(?ArrayObject $data = null): void - { - static::$driver::reset($data); - } - - /** - * @inheritDoc - */ - public static function destroy(): void - { - static::$driver::destroy(); - } - - /** - * @return void - */ - public static function initDriver(): void - { - static::$driver ??= match (Worker::$eventLoopClass) { - Swoole::class => Context\Swoole::class, - Swow::class => Context\Swow::class, - default=> Context\Fiber::class, - }; - } - -} - -Context::initDriver(); \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/Context/ContextInterface.php b/vendor/workerman/coroutine/src/Context/ContextInterface.php deleted file mode 100644 index 4920608..0000000 --- a/vendor/workerman/coroutine/src/Context/ContextInterface.php +++ /dev/null @@ -1,50 +0,0 @@ -offsetExists($name); - } - return isset(static::$contexts[$fiber]) && static::$contexts[$fiber]->offsetExists($name); - } - - /** - * @inheritDoc - */ - public static function reset(?ArrayObject $data = null): void - { - if ($data) { - $data->setFlags(ArrayObject::ARRAY_AS_PROPS); - } else { - $data = new ArrayObject([], ArrayObject::ARRAY_AS_PROPS); - } - $fiber = BaseFiber::getCurrent(); - if ($fiber === null) { - static::$nonFiberContext = $data; - return; - } - static::$contexts[$fiber] = $data; - } - - /** - * @inheritDoc - */ - public static function destroy(): void - { - $fiber = BaseFiber::getCurrent(); - if ($fiber === null) { - static::$nonFiberContext = new ArrayObject([], ArrayObject::ARRAY_AS_PROPS); - return; - } - unset(static::$contexts[$fiber]); - } - - /** - * Initialize the weakMap. - */ - public static function initContext(): void - { - static::$contexts = new WeakMap(); - static::$nonFiberContext = new ArrayObject([], ArrayObject::ARRAY_AS_PROPS); - } - -} - -Fiber::initContext(); \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/Context/Swoole.php b/vendor/workerman/coroutine/src/Context/Swoole.php deleted file mode 100644 index 70b48a8..0000000 --- a/vendor/workerman/coroutine/src/Context/Swoole.php +++ /dev/null @@ -1,60 +0,0 @@ -setFlags(ArrayObject::ARRAY_AS_PROPS); - if ($name === null) { - return $context; - } - return $context[$name] ?? $default; - } - - /** - * @inheritDoc - */ - public static function set(string $name, $value): void - { - Coroutine::getContext()[$name] = $value; - } - - /** - * @inheritDoc - */ - public static function has(string $name): bool - { - $context = Coroutine::getContext(); - return $context->offsetExists($name); - } - - /** - * @inheritDoc - */ - public static function reset(?ArrayObject $data = null): void - { - $context = Coroutine::getContext(); - $context->setFlags(ArrayObject::ARRAY_AS_PROPS); - $context->exchangeArray($data ?: []); - } - - /** - * @inheritDoc - */ - public static function destroy(): void - { - $context = Coroutine::getContext(); - $context->exchangeArray([]); - } - -} \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/Context/Swow.php b/vendor/workerman/coroutine/src/Context/Swow.php deleted file mode 100644 index 74d7737..0000000 --- a/vendor/workerman/coroutine/src/Context/Swow.php +++ /dev/null @@ -1,78 +0,0 @@ -offsetExists($name); - } - - /** - * @inheritDoc - */ - public static function reset(?ArrayObject $data = null): void - { - $coroutine = Coroutine::getCurrent(); - $data->setFlags(ArrayObject::ARRAY_AS_PROPS); - static::$contexts[$coroutine] = $data; - } - - /** - * @inheritDoc - */ - public static function destroy(): void - { - unset(static::$contexts[Coroutine::getCurrent()]); - } - - /** - * Initialize the weakMap. - * - * @return void - */ - public static function initContext(): void - { - self::$contexts = new WeakMap(); - } - -} - -Swow::initContext(); \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/Coroutine.php b/vendor/workerman/coroutine/src/Coroutine.php deleted file mode 100644 index 7d07deb..0000000 --- a/vendor/workerman/coroutine/src/Coroutine.php +++ /dev/null @@ -1,129 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman; - -use Workerman\Coroutine\Coroutine\CoroutineInterface; -use Workerman\Coroutine\Coroutine\Fiber; -use Workerman\Worker; -use Workerman\Coroutine\Coroutine\Swoole as SwooleCoroutine; -use Workerman\Coroutine\Coroutine\Swow as SwowCoroutine; -use Workerman\Events\Swoole as SwooleEvent; -use Workerman\Events\Swow as SwowEvent; - -/** - * Class Coroutine - */ -class Coroutine implements CoroutineInterface -{ - /** - * @var class-string - */ - protected static string $driverClass; - - /** - * @var CoroutineInterface - */ - public CoroutineInterface $driver; - - /** - * Coroutine constructor. - * - * @param callable $callable - */ - public function __construct(callable $callable) - { - $this->driver = new static::$driverClass($callable); - } - - /** - * @inheritDoc - */ - public static function create(callable $callable, ...$args): CoroutineInterface - { - return static::$driverClass::create($callable, ...$args); - } - - /** - * @inheritDoc - */ - public function start(mixed ...$args): mixed - { - return $this->driver->start(...$args); - } - - /** - * @inheritDoc - */ - public function resume(mixed ...$args): mixed - { - return $this->driver->resume(...$args); - } - - /** - * @inheritDoc - */ - public function id(): int - { - return $this->driver->id(); - } - - /** - * @inheritDoc - */ - public static function defer(callable $callable): void - { - static::$driverClass::defer($callable); - } - - /** - * @inheritDoc - */ - public static function suspend(mixed $value = null): mixed - { - return static::$driverClass::suspend($value); - } - - /** - * @inheritDoc - */ - public static function getCurrent(): CoroutineInterface - { - return static::$driverClass::getCurrent(); - } - - /** - * @inheritDoc - */ - public static function isCoroutine(): bool - { - return static::$driverClass::isCoroutine(); - } - - /** - * @return void - */ - public static function init(): void - { - static::$driverClass = match (Worker::$eventLoopClass ?? null) { - SwooleEvent::class => SwooleCoroutine::class, - SwowEvent::class => SwowCoroutine::class, - default => Fiber::class, - }; - } - -} -Coroutine::init(); diff --git a/vendor/workerman/coroutine/src/Coroutine/CoroutineInterface.php b/vendor/workerman/coroutine/src/Coroutine/CoroutineInterface.php deleted file mode 100644 index 2e0e4d5..0000000 --- a/vendor/workerman/coroutine/src/Coroutine/CoroutineInterface.php +++ /dev/null @@ -1,90 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Coroutine; - -use Fiber; -use Swow\Coroutine as SwowCoroutine; - -/** - * Interface CoroutineInterface - */ -interface CoroutineInterface -{ - - /** - * Create a coroutine. - * - * @param callable $callable - * @param ...$data - * @return CoroutineInterface - */ - public static function create(callable $callable, ...$data): CoroutineInterface; - - /** - * Start a coroutine. - * - * @param mixed ...$args - * @return mixed - */ - public function start(mixed ...$args): mixed; - - /** - * Resume a coroutine. - * - * @param mixed ...$args - * @return mixed - */ - public function resume(mixed ...$args): mixed; - - /** - * Get the id of the coroutine. - * - * @return int - */ - public function id(): int; - - /** - * Register a callable to be executed when the current fiber is destroyed - * - * @param callable $callable - * @return void - */ - public static function defer(callable $callable): void; - - /** - * Yield the coroutine. - * - * @param mixed|null $value - * @return mixed - */ - public static function suspend(mixed $value = null): mixed; - - /** - * Get the current coroutine. - * - * @return CoroutineInterface|Fiber|SwowCoroutine|static - */ - public static function getCurrent(): CoroutineInterface|Fiber|SwowCoroutine|static; - - /** - * Check if the current coroutine is in a coroutine. - * - * @return bool - */ - public static function isCoroutine(): bool; - -} \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/Coroutine/Fiber.php b/vendor/workerman/coroutine/src/Coroutine/Fiber.php deleted file mode 100644 index 6738893..0000000 --- a/vendor/workerman/coroutine/src/Coroutine/Fiber.php +++ /dev/null @@ -1,154 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Coroutine; - -use Fiber as BaseFiber; -use RuntimeException; -use WeakMap; -use Workerman\Coroutine\Utils\DestructionWatcher; - -/** - * Class Fiber - */ -class Fiber implements CoroutineInterface -{ - /** - * @var BaseFiber|null - */ - private ?BaseFiber $fiber; - - /** - * @var WeakMap - */ - private static WeakMap $instances; - - /** - * @var int - */ - private int $id; - - /** - * @param callable|null $callable - */ - public function __construct(?callable $callable = null) - { - static $id = 0; - $this->id = ++$id; - if ($callable) { - $callable = function(...$args) use ($callable) { - try { - $callable(...$args); - } finally { - $this->fiber = null; - } - }; - $this->fiber = new BaseFiber($callable); - self::$instances[$this->fiber] = $this; - } - } - - /** - * @inheritDoc - */ - public static function create(callable $callable, ...$args): CoroutineInterface - { - $fiber = new Fiber($callable); - $fiber->start(...$args); - return $fiber; - } - - /** - * @inheritDoc - */ - public function start(mixed ...$args): mixed - { - return $this->fiber->start(...$args); - } - - /** - * @inheritDoc - */ - public function resume(mixed ...$args): mixed - { - return $this->fiber->resume(...$args); - } - - /** - * @inheritDoc - */ - public static function suspend(mixed $value = null): mixed - { - return BaseFiber::suspend($value); - } - - /** - * @inheritDoc - */ - public function id(): int - { - return $this->id; - } - - /** - * @inheritDoc - */ - public static function defer(callable $callable): void - { - $baseFiber = BaseFiber::getCurrent(); - if ($baseFiber === null) { - throw new RuntimeException('Cannot defer outside of a fiber.'); - } - DestructionWatcher::watch($baseFiber, $callable); - } - - /** - * @inheritDoc - */ - public static function getCurrent(): CoroutineInterface - { - if (!$baseFiber = BaseFiber::getCurrent()) { - throw new RuntimeException('Not in fiber context'); - } - if (!isset(self::$instances[$baseFiber])) { - $fiber = new Fiber(); - $fiber->fiber = $baseFiber; - self::$instances[$baseFiber] = $fiber; - } - return self::$instances[$baseFiber]; - } - - /** - * @inheritDoc - */ - public static function isCoroutine(): bool - { - return BaseFiber::getCurrent() !== null; - } - - /** - * Initialize the fiber. - * - * @return void - */ - public static function init(): void - { - self::$instances = new WeakMap(); - } - -} - -Fiber::init(); diff --git a/vendor/workerman/coroutine/src/Coroutine/Swoole.php b/vendor/workerman/coroutine/src/Coroutine/Swoole.php deleted file mode 100644 index 89f82c2..0000000 --- a/vendor/workerman/coroutine/src/Coroutine/Swoole.php +++ /dev/null @@ -1,148 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Coroutine; - -use RuntimeException; -use Swoole\Coroutine; -use WeakReference; - -class Swoole implements CoroutineInterface -{ - - /** - * @var array - */ - private static array $instances = []; - - /** - * @var int - */ - private int $id = 0; - - /** - * @var callable|null - */ - private $callable; - - /** - * Coroutine constructor. - * - * @param callable|null $callable - */ - public function __construct(?callable $callable = null) - { - $this->callable = $callable; - } - - /** - * @inheritDoc - */ - public static function create(callable $callable, ...$args): CoroutineInterface - { - $id = Coroutine::create($callable, ...$args); - if (isset(self::$instances[$id]) && $coroutine = self::$instances[$id]->get()) { - return $coroutine; - } - $coroutine = new self($callable); - $coroutine->id = $id; - self::$instances[$id] = WeakReference::create($coroutine); - return $coroutine; - } - - /** - * @inheritDoc - */ - public function start(mixed ...$args): CoroutineInterface - { - if ($this->id) { - throw new RuntimeException('Coroutine has already started'); - } - $this->id = Coroutine::create($this->callable, ...$args); - $this->callable = null; - if (isset(self::$instances[$this->id]) && $coroutine = self::$instances[$this->id]->get()) { - return $coroutine; - } - self::$instances[$this->id] = WeakReference::create($this); - return $this; - } - - /** - * @inheritDoc - */ - public function resume(mixed ...$args): mixed - { - return Coroutine::resume($this->id, ...$args); - } - - /** - * @inheritDoc - */ - public function id(): int - { - return $this->id; - } - - /** - * @inheritDoc - */ - public static function defer(callable $callable): void - { - Coroutine::defer($callable); - } - - /** - * @inheritDoc - */ - public static function suspend(mixed $value = null): mixed - { - return Coroutine::suspend($value); - } - - /** - * @inheritDoc - */ - public static function getCurrent(): CoroutineInterface - { - $id = Coroutine::getCid(); - if ($id === -1) { - throw new RuntimeException('Not in coroutine'); - } - if (!isset(self::$instances[$id])) { - $coroutine = new self(); - $coroutine->id = $id; - self::$instances[$id] = WeakReference::create($coroutine); - } - return self::$instances[$id]->get(); - } - - /** - * @inheritDoc - */ - public static function isCoroutine(): bool - { - return Coroutine::getCid() > 0; - } - - /** - * Destructor. - */ - public function __destruct() - { - unset(self::$instances[$this->id]); - } - -} diff --git a/vendor/workerman/coroutine/src/Coroutine/Swow.php b/vendor/workerman/coroutine/src/Coroutine/Swow.php deleted file mode 100644 index 8963542..0000000 --- a/vendor/workerman/coroutine/src/Coroutine/Swow.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine\Coroutine; - -use Swow\Coroutine; - -/** - * Class Swow - */ -class Swow extends Coroutine implements CoroutineInterface -{ - - /** - * @var array - */ - private array $callbacks = []; - - /** - * @inheritDoc - */ - public static function defer(callable $callable): void - { - $coroutine = static::getCurrent(); - $coroutine->callbacks[] = $callable; - } - - /** - * @inheritDoc - */ - public static function create(callable $callable, ...$args): CoroutineInterface - { - return static::run($callable, ...$args); - } - - /** - * @inheritDoc - */ - public function start(mixed ...$args): mixed - { - return $this->resume(...$args); - } - - /** - * @inheritDoc - */ - public function id(): int - { - return $this->getId(); - } - - /** - * @inheritDoc - */ - public static function suspend(mixed $value = null): mixed - { - return Coroutine::yield($value); - } - - /** - * @inheritDoc - */ - public static function isCoroutine(): bool - { - return true; - } - - /** - * Destructor. - */ - public function __destruct() - { - foreach (array_reverse($this->callbacks) as $callable) { - $callable(); - } - } - -} \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/Locker.php b/vendor/workerman/coroutine/src/Locker.php deleted file mode 100644 index 47b59a5..0000000 --- a/vendor/workerman/coroutine/src/Locker.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine; - -use RuntimeException; - -/** - * Class Locker - */ -class Locker -{ - /** - * @var Channel[] - */ - protected static array $channels = []; - - /** - * Lock. - * - * @param string $key - * @return bool - */ - public static function lock(string $key): bool - { - if (!isset(static::$channels[$key])) { - static::$channels[$key] = new Channel(1); - } - return static::$channels[$key]->push(true); - } - - /** - * Unlock. - * - * @param string $key - * @return bool - */ - public static function unlock(string $key): bool - { - if ($channel = static::$channels[$key] ?? null) { - // Must check hasProducers before pop, because pop in swow will wake up the producer, leading to inaccurate judgment. - $hasProducers = $channel->hasProducers(); - $result = $channel->pop(); - if (!$hasProducers) { - $channel->close(); - unset(static::$channels[$key]); - } - return $result; - } - throw new RuntimeException("Unlock failed, because the key $key is not locked"); - } - -} \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/Parallel.php b/vendor/workerman/coroutine/src/Parallel.php deleted file mode 100644 index 80abfdb..0000000 --- a/vendor/workerman/coroutine/src/Parallel.php +++ /dev/null @@ -1,109 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine; - -use Throwable; -use Workerman\Coroutine; - -/** - * Class Parallel - */ -class Parallel -{ - /** - * @var Channel|null - */ - protected ?Channel $channel = null; - - /** - * @var array - */ - protected array $callbacks = []; - - /** - * @var array - */ - protected array $results = []; - - /** - * @var array - */ - protected array $exceptions = []; - - /** - * Constructor. - * - * @param int $concurrent - */ - public function __construct(int $concurrent = -1) - { - if ($concurrent > 0) { - $this->channel = new Channel($concurrent); - } - } - - /** - * Add a coroutine. - * - * @param callable $callable - * @param string|null $key - * @return void - */ - public function add(callable $callable, ?string $key = null): void - { - if ($key === null) { - $this->callbacks[] = $callable; - } else { - $this->callbacks[$key] = $callable; - } - } - - /** - * Wait all coroutines complete and return results. - * - * @return array - */ - public function wait(): array - { - $barrier = Barrier::create(); - foreach ($this->callbacks as $key => $callback) { - $this->channel?->push(true); - Coroutine::create(function () use ($callback, $key, $barrier) { - try { - $this->results[$key] = $callback(); - } catch (Throwable $throwable) { - $this->exceptions[$key] = $throwable; - } finally { - $this->channel?->pop(); - } - }); - } - Barrier::wait($barrier); - return $this->results; - } - - /** - * Get failed results. - * - * @return array - */ - public function getExceptions(): array - { - return $this->exceptions; - } - -} diff --git a/vendor/workerman/coroutine/src/Pool.php b/vendor/workerman/coroutine/src/Pool.php deleted file mode 100644 index eb3f7b2..0000000 --- a/vendor/workerman/coroutine/src/Pool.php +++ /dev/null @@ -1,386 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine; - -use Closure; -use Psr\Log\LoggerInterface; -use RuntimeException; -use stdClass; -use Throwable; -use WeakMap; -use Workerman\Coroutine; -use Workerman\Coroutine\Utils\DestructionWatcher; -use Workerman\Timer; -use Workerman\Worker; - -/** - * Class Pool - */ -class Pool implements PoolInterface -{ - /** - * @var Channel - */ - protected Channel $channel; - - /** - * @var int - */ - protected int $minConnections = 1; - - /** - * @var WeakMap - */ - protected WeakMap $connections; - - /** - * @var ?object - */ - protected ?object $nonCoroutineConnection = null; - - /** - * @var WeakMap - */ - protected WeakMap $lastUsedTimes; - - /** - * @var WeakMap - */ - protected WeakMap $lastHeartbeatTimes; - - /** - * @var Closure|null - */ - protected ?Closure $connectionCreateHandler = null; - - /** - * @var Closure|null - */ - protected ?Closure $connectionDestroyHandler = null; - - /** - * @var Closure|null - */ - protected ?Closure $connectionHeartbeatHandler = null; - - /** - * @var float - */ - protected float $idleTimeout = 60; - - /** - * @var float - */ - protected float $heartbeatInterval = 50; - - /** - * @var float - */ - protected float $waitTimeout = 10; - - /** - * @var LoggerInterface|Closure|null - */ - protected LoggerInterface|Closure|null $logger = null; - - /** - * @var array|string[] - */ - private array $configurableProperties = [ - 'minConnections', - 'idleTimeout', - 'heartbeatInterval', - 'waitTimeout', - ]; - - /** - * Constructor. - * - * @param int $maxConnections - * @param array $config - */ - public function __construct(protected int $maxConnections = 1, protected array $config = []) - { - foreach ($config as $key => $value) { - $camelCaseKey = lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $key)))); - if (in_array($camelCaseKey, $this->configurableProperties, true)) { - $this->$camelCaseKey = $value; - } - } - - $this->channel = new Channel($maxConnections); - $this->lastUsedTimes = new WeakMap(); - $this->lastHeartbeatTimes = new WeakMap(); - $this->connections = new WeakMap(); - - if (Worker::isRunning()) { - Timer::repeat(1, function () { - $this->checkConnections(); - }); - } - } - - /** - * Set the connection creator. - * - * @param callable $connectionCreateHandler - * @return $this - */ - public function setConnectionCreator(callable $connectionCreateHandler): self - { - $this->connectionCreateHandler = $connectionCreateHandler; - return $this; - } - - /** - * Set the connection closer. - * - * @param callable $connectionDestroyHandler - * @return $this - */ - public function setConnectionCloser(callable $connectionDestroyHandler): self - { - $this->connectionDestroyHandler = $connectionDestroyHandler; - return $this; - } - - /** - * Set the connection heartbeat checker. - * - * @param callable $connectionHeartbeatHandler - * @return $this - */ - public function setHeartbeatChecker(callable $connectionHeartbeatHandler): self - { - $this->connectionHeartbeatHandler = $connectionHeartbeatHandler; - return $this; - } - - /** - * Get connection. - * - * @return object - * @throws Throwable - */ - public function get(): object - { - if (!Coroutine::isCoroutine()) { - if (!$this->nonCoroutineConnection) { - $this->nonCoroutineConnection = $this->createConnection(); - } - return $this->nonCoroutineConnection; - } - $num = $this->channel->length(); - if ($num === 0 && $this->getConnectionCount() < $this->maxConnections) { - return $this->createConnection(); - } - $connection = $this->channel->pop($this->waitTimeout); - if (!$connection) { - throw new RuntimeException("Failed to get a connection from the pool within the wait timeout ($this->waitTimeout seconds). The connection pool is exhausted."); - } - $this->lastUsedTimes[$connection] = time(); - return $connection; - } - - /** - * Put connection to pool. - * - * @param object $connection - * @return void - * @throws Throwable - */ - public function put(object $connection): void - { - // This connection does not belong to the connection pool. - // It may have been closed by $this->closeConnection($connection). - if (!isset($this->connections[$connection])) { - throw new RuntimeException('The connection does not belong to the connection pool.'); - } - if ($connection === $this->nonCoroutineConnection) { - return; - } - try { - $this->channel->push($connection); - } catch (Throwable $throwable) { - $this->closeConnection($connection); - throw $throwable; - } - } - - /** - * Check if the connection is valid. - * - * @param $connection - * @return bool - */ - protected function isValidConnection($connection): bool - { - return is_object($connection); - } - - /** - * Create connection. - * - * @return object - * @throws Throwable - */ - public function createConnection(): object - { - if ($this->getConnectionCount() >= $this->maxConnections) { - throw new RuntimeException('CreateConnection failed, maximum connection limit reached.'); - } - // Create a placeholder to ensure the correct value of getConnectionCount(). - $placeholder = new stdClass; - $this->connections[$placeholder] = 0; - try { - // Coroutines will switch here, so we need $placeholder to ensure the correct value of getConnectionCount(). - $connection = ($this->connectionCreateHandler)(); - if (!$this->isValidConnection($connection)) { - throw new RuntimeException('CreateConnection failed, expected a connection object, but got ' . gettype($connection) . '.'); - } - unset($this->connections[$placeholder]); - $this->connections[$connection] = $this->lastUsedTimes[$connection] = $this->lastHeartbeatTimes[$connection] = time(); - } catch (Throwable $throwable) { - unset($this->connections[$placeholder]); - throw $throwable; - } - return $connection; - } - - /** - * Close the connection and remove the connection from the connection pool. - * - * @param object $connection - * @return void - */ - public function closeConnection(object $connection): void - { - if (!isset($this->connections[$connection])) { - return; - } - // Mark this connection as no longer belonging to the connection pool. - unset($this->lastUsedTimes[$connection], $this->lastHeartbeatTimes[$connection], $this->connections[$connection]); - if ($this->nonCoroutineConnection === $connection) { - $this->nonCoroutineConnection = null; - } - if (!$this->connectionDestroyHandler) { - return; - } - try { - ($this->connectionDestroyHandler)($connection); - } catch (Throwable $throwable) { - $this->log($throwable); - } - } - - /** - * Cleanup idle connections. - * - * @return void - */ - protected function checkConnections(): void - { - $num = $this->channel->length(); - $time = time(); - for($i = $num; $i > 0; $i--) { - $connection = $this->channel->pop(0.001); - if (!$connection) { - return; - } - $lastUsedTime = $this->lastUsedTimes[$connection]; - if ($time - $lastUsedTime > $this->idleTimeout && $this->channel->length() >= $this->minConnections) { - $this->closeConnection($connection); - continue; - } - $this->trySendHeartbeat($connection) && $this->channel->push($connection); - } - if ($this->nonCoroutineConnection) { - $this->trySendHeartbeat($this->nonCoroutineConnection); - } - } - - /** - * Try to send heartbeat. - * - * @param $connection - * @return bool - */ - private function trySendHeartbeat($connection): bool - { - $lastHeartbeatTime = $this->lastHeartbeatTimes[$connection] ?? 0; - $time = time(); - if ($this->connectionHeartbeatHandler && $time - $lastHeartbeatTime >= $this->heartbeatInterval) { - try { - ($this->connectionHeartbeatHandler)($connection); - $this->lastHeartbeatTimes[$connection] = $time; - } catch (Throwable $throwable) { - $this->log($throwable); - $this->closeConnection($connection); - return false; - } - } - return true; - } - - /** - * Get the number of connections in the connection pool. - * - * @return int - */ - public function getConnectionCount(): int - { - return count($this->connections); - } - - /** - * Close connections. - * - * @return void - */ - public function closeConnections(): void - { - $num = $this->channel->length(); - for ($i = $num; $i > 0; $i--) { - $connection = $this->channel->pop(0.001); - if (!$connection) { - return; - } - $this->closeConnection($connection); - } - $this->nonCoroutineConnection && $this->closeConnection($this->nonCoroutineConnection); - } - - /** - * Log. - * - * @param $message - * @return void - */ - protected function log($message): void - { - if (!$this->logger) { - echo $message . PHP_EOL; - return; - } - if ($this->logger instanceof Closure) { - ($this->logger)($message); - return; - } - $this->logger->info((string)$message); - } - -} diff --git a/vendor/workerman/coroutine/src/PoolInterface.php b/vendor/workerman/coroutine/src/PoolInterface.php deleted file mode 100644 index fd42899..0000000 --- a/vendor/workerman/coroutine/src/PoolInterface.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Coroutine; - -/** - * Interface PoolInterface - */ -interface PoolInterface -{ - - /** - * Get a connection from the pool. - * - * @return mixed - */ - public function get(): mixed; - - /** - * Put a connection back to the pool. - * - * @param object $connection - * @return void - */ - public function put(object $connection): void; - - /** - * Create a connection. - * - * @return object - */ - public function createConnection(): object; - - /** - * Close the connection and remove the connection from the connection pool. - * - * @param object $connection - * @return void - */ - public function closeConnection(object $connection): void; - - /** - * Get the number of connections in the connection pool. - * - * @return int - */ - public function getConnectionCount(): int; - - /** - * Close connections in the connection pool. - * - * @return void - */ - public function closeConnections(): void; - -} diff --git a/vendor/workerman/coroutine/src/Utils/DestructionWatcher.php b/vendor/workerman/coroutine/src/Utils/DestructionWatcher.php deleted file mode 100644 index 3a2b734..0000000 --- a/vendor/workerman/coroutine/src/Utils/DestructionWatcher.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Workerman\Coroutine\Utils; - -use WeakMap; - -class DestructionWatcher -{ - /** - * @var WeakMap - */ - protected static WeakMap $objects; - - /** - * @var callable[] - */ - protected array $callbacks = []; - - /** - * DestructionWatcher constructor. - * - * @param callable|null $callback - */ - public function __construct(?callable $callback = null) - { - if ($callback) { - $this->callbacks[] = $callback; - } - } - - /** - * DestructionWatcher destructor. - */ - public function __destruct() - { - foreach (array_reverse($this->callbacks) as $callback) { - $callback(); - } - } - - /** - * Watch object destruction. - * - * @param object $object - * @param callable $callback - * @return void - */ - public static function watch(object $object, callable $callback): void - { - static::$objects ??= new WeakMap(); - static::$objects[$object] ??= new static(); - static::$objects[$object]->callbacks[] = $callback; - } - -} \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/WaitGroup.php b/vendor/workerman/coroutine/src/WaitGroup.php deleted file mode 100644 index 9327860..0000000 --- a/vendor/workerman/coroutine/src/WaitGroup.php +++ /dev/null @@ -1,77 +0,0 @@ - - */ - protected static string $driverClass; - - /** - * @var WaitGroupInterface - */ - protected WaitGroupInterface $driver; - - /** - * 构造方法 - */ - public function __construct() - { - $this->driver = new (self::driverClass()); - } - - /** - * Get driver class. - * - * @return class-string - */ - protected static function driverClass(): string - { - return static::$driverClass ??= match (Worker::$eventLoopClass ?? null) { - Swoole::class => SwooleWaitGroup::class, - Swow::class => SwowWaitGroup::class, - default => FiberWaitGroup::class, - }; - } - - - /** - * 代理调用WaitGroupInterface方法 - * - * @codeCoverageIgnore 系统魔术方法,忽略覆盖 - * @param string $name - * @param array $arguments - * @return mixed - */ - public function __call(string $name, array $arguments): mixed - { - if (!method_exists($this->driver, $name)) { - throw new BadMethodCallException("Method $name not exists. "); - } - - return $this->driver->$name(...$arguments); - } -} diff --git a/vendor/workerman/coroutine/src/WaitGroup/Fiber.php b/vendor/workerman/coroutine/src/WaitGroup/Fiber.php deleted file mode 100644 index e89463f..0000000 --- a/vendor/workerman/coroutine/src/WaitGroup/Fiber.php +++ /dev/null @@ -1,63 +0,0 @@ -count = 0; - $this->channel = new Channel(1); - } - - /** @inheritdoc */ - public function add(int $delta = 1): bool - { - $this->count += max($delta, 1); - - return true; - } - - /** @inheritdoc */ - public function done(): bool - { - $this->count--; - if ($this->count <= 0) { - $this->channel->push(true); - } - - return true; - } - - /** @inheritdoc */ - public function count(): int - { - return $this->count; - } - - /** @inheritdoc */ - public function wait(int|float $timeout = -1): bool - { - if ($this->count() > 0) { - return $this->channel->pop($timeout); - } - return true; - } - -} \ No newline at end of file diff --git a/vendor/workerman/coroutine/src/WaitGroup/Swoole.php b/vendor/workerman/coroutine/src/WaitGroup/Swoole.php deleted file mode 100644 index 1aed50c..0000000 --- a/vendor/workerman/coroutine/src/WaitGroup/Swoole.php +++ /dev/null @@ -1,63 +0,0 @@ -waitGroup = new WaitGroup(); - } - - /** @inheritdoc */ - public function add(int $delta = 1): bool - { - $this->waitGroup->add(max($delta, 1)); - - return true; - } - - /** @inheritdoc */ - public function done(): bool - { - if ($this->count() > 0) { - $this->waitGroup->done(); - } - - return true; - } - - /** @inheritdoc */ - public function count(): int - { - return $this->waitGroup->count(); - } - - /** @inheritdoc */ - public function wait(int|float $timeout = -1): bool - { - try { - $this->waitGroup->wait(max($timeout, $timeout > 0 ? 0.001 : -1)); - return true; - } catch (Throwable) { - return false; - } - } - -} diff --git a/vendor/workerman/coroutine/src/WaitGroup/Swow.php b/vendor/workerman/coroutine/src/WaitGroup/Swow.php deleted file mode 100644 index 4344148..0000000 --- a/vendor/workerman/coroutine/src/WaitGroup/Swow.php +++ /dev/null @@ -1,64 +0,0 @@ -waitGroup = new WaitGroup(); - $this->count = 0; - } - - /** @inheritdoc */ - public function add(int $delta = 1): bool - { - $this->waitGroup->add($delta = max($delta, 1)); - $this->count += $delta; - - return true; - } - - /** @inheritdoc */ - public function done(): bool - { - if ($this->count() > 0) { - $this->count--; - $this->waitGroup->done(); - } - - return true; - } - - /** @inheritdoc */ - public function count(): int - { - return $this->count; - } - - /** @inheritdoc */ - public function wait(int|float $timeout = -1): bool - { - try { - $this->waitGroup->wait($timeout > 0 ? (int) ($timeout * 1000) : $timeout); - return true; - } catch (Throwable) { - return false; - } - } -} diff --git a/vendor/workerman/coroutine/src/WaitGroup/WaitGroupInterface.php b/vendor/workerman/coroutine/src/WaitGroup/WaitGroupInterface.php deleted file mode 100644 index 9fbfd7c..0000000 --- a/vendor/workerman/coroutine/src/WaitGroup/WaitGroupInterface.php +++ /dev/null @@ -1,42 +0,0 @@ -assertNull($barrier, 'Barrier should be null after wait is called.'); - $this->assertEquals([0, 1, 2, 3], $results, 'All coroutines should have been executed.'); - } -} diff --git a/vendor/workerman/coroutine/tests/ChannelTest.php b/vendor/workerman/coroutine/tests/ChannelTest.php deleted file mode 100644 index fefff80..0000000 --- a/vendor/workerman/coroutine/tests/ChannelTest.php +++ /dev/null @@ -1,313 +0,0 @@ -assertInstanceOf(Channel::class, $channel); - $this->assertEquals(1, $channel->getCapacity()); - } - - /** - * Test initializing channel with invalid capacities. - */ - #[DataProvider('invalidCapacitiesProvider')] - public function testInitializeWithInvalidCapacity($capacity) - { - $this->expectException(InvalidArgumentException::class); - new Channel($capacity); - } - - /** - * Data provider for invalid capacities. - */ - public static function invalidCapacitiesProvider(): array - { - return [ - [0], - [-1], - [-100] - ]; - } - - /** - * Test pushing and popping data. - */ - public function testPushAndPop() - { - $channel = new Channel(2); - $data1 = 'test data 1'; - $data2 = 'test data 2'; - - // Push data into the channel - $this->assertTrue($channel->push($data1)); - $this->assertTrue($channel->push($data2)); - - // Verify the length of the channel - $this->assertEquals(2, $channel->length()); - - // Pop data from the channel - $this->assertEquals($data1, $channel->pop()); - $this->assertEquals($data2, $channel->pop()); - } - - /** - * Test pushing data when the channel is full. - * @throws ReflectionException - */ - public function testPushWhenFull() - { - // Memory driver does not support push with timeout - if ($this->driverIsMemory()) { - $this->assertTrue(true); - return; - } - $channel = new Channel(1); - $this->assertTrue($channel->push('data1')); - - $timeout = 0.5; - // Attempt to push when the channel is full with a timeout - $startTime = microtime(true); - $this->assertFalse($channel->push('data2', $timeout)); - $elapsedTime = microtime(true) - $startTime; - - // Verify that the push operation timed out - $this->assertTrue(0.1 > abs($elapsedTime - $timeout)); - } - - /** - * Test popping data when the channel is empty. - * @throws ReflectionException - */ - public function testPopWhenEmpty() - { - // Memory driver does not support push with timeout - if ($this->driverIsMemory()) { - $this->assertTrue(true); - return; - } - $channel = new Channel(1); - - // Attempt to pop when the channel is empty with a timeout - $startTime = microtime(true); - $this->assertFalse($channel->pop(0.1)); - $elapsedTime = microtime(true) - $startTime; - - // Verify that the pop operation timed out - $this->assertGreaterThanOrEqual(0.09, $elapsedTime); - } - - /** - * Test closing the channel and its effects. - */ - public function testCloseChannel() - { - $channel = new Channel(1); - $this->assertTrue($channel->push('data')); - - // Close the channel - $channel->close(); - - // Attempt to push after closing - $this->assertFalse($channel->push('new data')); - - // Pop the remaining data - $this->assertEquals('data', $channel->pop()); - - // Attempt to pop after channel is empty and closed - $this->assertFalse($channel->pop()); - } - - /** - * Test that push and pop return false when channel is closed. - */ - public function testPushAndPopReturnFalseWhenClosed() - { - $channel = new Channel(1); - $channel->close(); - - $this->assertFalse($channel->push('data')); - $this->assertFalse($channel->pop()); - } - - /** - * Test the length and capacity methods. - */ - public function testLengthAndCapacity() - { - $channel = new Channel(5); - $this->assertEquals(0, $channel->length()); - $this->assertEquals(5, $channel->getCapacity()); - - $channel->push('data1'); - $channel->push('data2'); - - $this->assertEquals(2, $channel->length()); - } - - /** - * Test pushing and popping with different data types. - */ - #[DataProvider('dataTypesProvider')] - public function testPushAndPopWithDifferentDataTypes($data) - { - $channel = new Channel(1); - $this->assertTrue($channel->push($data)); - $this->assertSame($data, $channel->pop()); - } - - /** - * Data provider for different data types. - */ - public static function dataTypesProvider(): array - { - return [ - ['string'], - [123], - [123.456], - [true], - [false], - [null], - [[]], - [['key' => 'value']], - [new stdClass()], - [fopen('php://memory', 'r')], - ]; - } - - /** - * Test pushing to a closed channel immediately returns false. - */ - public function testPushToClosedChannel() - { - $channel = new Channel(1); - $channel->close(); - $this->assertFalse($channel->push('data', 0)); - } - - /** - * Test popping from a closed and empty channel immediately returns false. - */ - public function testPopFromClosedAndEmptyChannel() - { - $channel = new Channel(1); - $channel->close(); - $this->assertFalse($channel->pop(0)); - } - - /** - * @return bool - * @throws ReflectionException - */ - protected function driverIsMemory(): bool - { - $reflectionClass = new ReflectionClass(Channel::class); - $instance = $reflectionClass->newInstance(); - $property = $reflectionClass->getProperty('driver'); - $driverValue = $property->getValue($instance); - return $driverValue instanceof Memory; - } - - /** - * 测试 hasConsumers 当没有消费者时返回 false - */ - public function testHasConsumersWhenNoConsumers() - { - if (!Coroutine::isCoroutine()) { - $this->assertTrue(true); - return; - } - $channel = new Channel(1); - $this->assertFalse($channel->hasConsumers()); - $channel->close(); - } - - /** - * 测试 hasConsumers 当有消费者等待时返回 true - * @throws ReflectionException - */ - public function testHasConsumersWhenConsumersWaiting() - { - if ($this->driverIsMemory()) { - $this->assertTrue(true); - return; - } - $channel = new Channel(1); - $sync = new Channel(1); - - Coroutine::create(function () use ($channel, $sync) { - $sync->push(true); - $channel->pop(); - }); - - $sync->pop(); - - $this->assertTrue($channel->hasConsumers()); - - Coroutine::create(function () use ($channel) { - $channel->push('data'); - }); - $channel->close(); - } - - /** - * 测试 hasProducers 当没有生产者时返回 false - * @throws ReflectionException - */ - public function testHasProducersWhenNoProducers() - { - if ($this->driverIsMemory()) { - $this->assertTrue(true); - return; - } - $channel = new Channel(1); - $this->assertFalse($channel->hasProducers()); - $channel->close(); - } - - /** - * 测试 hasProducers 当有生产者等待时返回 true - * @throws ReflectionException - */ - public function testHasProducersWhenProducersWaiting() - { - if ($this->driverIsMemory()) { - $this->assertTrue(true); - return; - } - $channel = new Channel(1); - $channel->push('data1'); - - $sync = new Channel(1); - - Coroutine::create(function () use ($channel, $sync) { - $sync->push(true); - $channel->push('data2'); - }); - - $sync->pop(); - - $this->assertTrue($channel->hasProducers()); - - $channel->pop(); - $channel->close(); - } - -} diff --git a/vendor/workerman/coroutine/tests/ContextTest.php b/vendor/workerman/coroutine/tests/ContextTest.php deleted file mode 100644 index 788aeb8..0000000 --- a/vendor/workerman/coroutine/tests/ContextTest.php +++ /dev/null @@ -1,169 +0,0 @@ -assertEquals('value', Context::get($key)); - }); - } - - public function testContextGet() - { - Context::reset(new ArrayObject(['not_exist' => 'value'])); - $key = 'testContextGet'; - Context::reset(new ArrayObject([$key => 'value'])); - $context = Context::get(); - $this->assertArrayNotHasKey('not_exist', $context); - $this->assertObjectNotHasProperty('not_exist', $context); - $this->assertArrayHasKey($key, $context); - $this->assertObjectHasProperty($key, $context); - $this->assertEquals('value', $context[$key]); - $this->assertEquals('value', $context->$key); - $this->assertInstanceOf('ArrayObject', $context); - unset($context[$key]); - $this->assertNull(Context::get($key)); - $context[$key] = 'value'; - $this->assertEquals('value', Context::get($key)); - unset($context->$key); - $this->assertNull(Context::get($key)); - $context->$key = 'value'; - $this->assertEquals('value', Context::get($key)); - } - - public function testContextIsolationBetweenCoroutines() - { - $values = []; - - Coroutine::create(function () use (&$values) { - Context::set('key', 'value1'); - $values[] = Context::get('key'); - // Ensure the value is not available after coroutine ends - Context::destroy(); - }); - - Coroutine::create(function () use (&$values) { - Context::set('key', 'value2'); - $values[] = Context::get('key'); - // Ensure the value is not available after coroutine ends - Context::destroy(); - }); - - $this->assertEquals(['value1', 'value2'], $values); - } - - public function testContextDestroyedAfterCoroutineEnds() - { - Coroutine::create(function () { - Context::set('key', 'value'); - $this->assertTrue(Context::has('key')); - // Simulate coroutine end and context destruction - Context::destroy(); - }); - - // After coroutine ends, the context should be destroyed - // Need to simulate this by trying to access context outside coroutine - $this->assertNull(Context::get('key')); - $this->assertFalse(Context::has('key')); - } - - public function testContextHasMethod() - { - Coroutine::create(function () { - $this->assertFalse(Context::has('key')); - Context::set('key', 'value'); - $this->assertTrue(Context::has('key')); - }); - } - - public function testContextResetMethod() - { - Coroutine::create(function () { - Context::reset(new ArrayObject(['key3' => 'value1'])); - Context::reset(new ArrayObject(['key1' => 'value1', 'key2' => 'value2'])); - $this->assertEquals('value1', Context::get('key1')); - $this->assertEquals('value2', Context::get('key2')); - // Test that other keys are not set - $this->assertNull(Context::get('key3')); - }); - } - - public function testContextDataNotSharedBetweenCoroutines() - { - $result = []; - - Coroutine::create(function () use (&$result) { - Context::set('counter', 1); - $result[] = Context::get('counter'); - Context::destroy(); - }); - - Coroutine::create(function () use (&$result) { - $this->assertNull(Context::get('counter')); - Context::set('counter', 2); - $result[] = Context::get('counter'); - Context::destroy(); - }); - - $this->assertEquals([1, 2], $result); - } - - public function testContextDefaultValues() - { - Coroutine::create(function () { - $this->assertEquals('default', Context::get('non_existing_key', 'default')); - }); - } - - public function testContextSetOverrideValue() - { - Coroutine::create(function () { - Context::set('key', 'initial'); - $this->assertEquals('initial', Context::get('key')); - Context::set('key', 'overridden'); - $this->assertEquals('overridden', Context::get('key')); - }); - } - - public function testContextMultipleKeys() - { - Coroutine::create(function () { - Context::set('key1', 'value1'); - Context::set('key2', 'value2'); - $this->assertEquals('value1', Context::get('key1')); - $this->assertEquals('value2', Context::get('key2')); - }); - } - - public function testContextPersistenceWithinCoroutine() - { - Coroutine::create(function () { - Context::set('key', 'value'); - - // Simulate asynchronous operation within coroutine - $this->someAsyncOperation(function () { - $this->assertEquals('value', Context::get('key')); - }); - - // Context should persist throughout the coroutine - $this->assertEquals('value', Context::get('key')); - }); - } - - private function someAsyncOperation(callable $callback) - { - // Simulate async operation - $callback(); - } -} diff --git a/vendor/workerman/coroutine/tests/CoroutineTest.php b/vendor/workerman/coroutine/tests/CoroutineTest.php deleted file mode 100644 index c763fb0..0000000 --- a/vendor/workerman/coroutine/tests/CoroutineTest.php +++ /dev/null @@ -1,184 +0,0 @@ -assertInstanceOf(CoroutineInterface::class, $coroutine); - } - - public function testStartExecutesCoroutine() - { - $value = null; - Coroutine::create(function() use (&$value) { - $value = 'started'; - }); - $this->assertEquals('started', $value); - } - - public function testSuspendAndResumeCoroutine() - { - if (Worker::$eventLoopClass === Swoole::class) { - // Swoole does not support suspend and resume - $this->assertTrue(true); - return; - } - $value = []; - $coroutine = Coroutine::create(function() use (&$value) { - $value[] = 'before suspend'; - $resumedValue = Coroutine::suspend(); - $value[] = 'after resume'; - $value[] = $resumedValue; - }); - $this->assertEquals(['before suspend'], $value); - $coroutine->resume('resumed data'); - unset($coroutine); - gc_collect_cycles(); - $this->assertEquals(['before suspend', 'after resume', 'resumed data'], $value); - } - - public function testGetCurrentReturnsCurrentCoroutine() - { - $currentCoroutine = null; - $coroutine = Coroutine::create(function() use (&$currentCoroutine) { - $currentCoroutine = Coroutine::getCurrent(); - }); - $this->assertSame($coroutine, $currentCoroutine); - } - - public function testCoroutineIdIsInteger() - { - $coroutine = Coroutine::create(function() {}); - $id = $coroutine->id(); - $this->assertIsInt($id); - } - - public function testDeferExecutesAfterCoroutineDestruction() - { - $value = []; - $coroutine = Coroutine::create(function() use (&$value) { - Coroutine::defer(function() use (&$value) { - $value[] = 'defer1'; - }); - Coroutine::defer(function() use (&$value) { - $value[] = 'defer2'; - }); - $value[] = 'before suspend'; - Coroutine::suspend(); - $value[] = 'after resume'; - }); - $this->assertEquals(['before suspend'], $value); - $coroutine->resume(); - unset($coroutine); - gc_collect_cycles(); - $this->assertEquals(['before suspend', 'after resume', 'defer2', 'defer1'], $value); - } - - public function testMultipleCoroutines() - { - $sequence = []; - $coroutine1 = Coroutine::create(function() use (&$sequence) { - $sequence[] = 'coroutine1 start'; - Coroutine::suspend(); - $sequence[] = 'coroutine1 resumed'; - }); - $coroutine2 = Coroutine::create(function() use (&$sequence) { - $sequence[] = 'coroutine2 start'; - Coroutine::suspend(); - $sequence[] = 'coroutine2 resumed'; - }); - $this->assertEquals(['coroutine1 start', 'coroutine2 start'], $sequence); - $coroutine1->resume(); - $coroutine2->resume(); - $this->assertEquals( - ['coroutine1 start', 'coroutine2 start', 'coroutine1 resumed', 'coroutine2 resumed'], - $sequence - ); - } - - public function testCoroutineWithArguments() - { - $result = null; - $coroutine = new Coroutine(function($a, $b) use (&$result) { - $result = $a + $b; - }); - $coroutine->start(2, 3); - $this->assertEquals(5, $result); - } - - public function testSuspendReturnsValue() - { - if (Worker::$eventLoopClass === Swoole::class) { - // Swoole does not support suspend and resume - $this->assertTrue(true); - return; - } - $coroutine = new Coroutine(function() { - $valueFromResume = Coroutine::suspend('first suspend'); - Coroutine::suspend($valueFromResume); - }); - $first_suspend = $coroutine->start(); - $this->assertEquals('first suspend', $first_suspend); - $result = $coroutine->resume('value from resume'); - $this->assertEquals('value from resume', $result); - } - - public function testNestedCoroutines() - { - $sequence = []; - $coroutine = Coroutine::create(function() use (&$sequence) { - $sequence[] = 'outer start'; - $inner = Coroutine::create(function() use (&$sequence) { - $sequence[] = 'inner start'; - Coroutine::suspend(); - $sequence[] = 'inner resumed'; - }); - Coroutine::suspend(); - $sequence[] = 'outer resumed'; - $inner->resume(); - $sequence[] = 'outer end'; - }); - $this->assertEquals(['outer start', 'inner start'], $sequence); - $coroutine->resume(); - $this->assertEquals(['outer start', 'inner start', 'outer resumed', 'inner resumed', 'outer end'], $sequence); - } - - /*public function testCoroutineExceptionHandling() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('Test exception'); - Coroutine::create(function() { - throw new \Exception('Test exception'); - }); - }*/ - - public function testDeferOrder() - { - $value = []; - $coroutine = Coroutine::create(function() use (&$value) { - Coroutine::defer(function() use (&$value) { - $value[] = 'defer1'; - }); - Coroutine::defer(function() use (&$value) { - $value[] = 'defer2'; - }); - $value[] = 'coroutine body'; - }); - unset($coroutine); - // Force garbage collection - gc_collect_cycles(); - $this->assertEquals(['coroutine body', 'defer2', 'defer1'], $value); - } - -} - diff --git a/vendor/workerman/coroutine/tests/FiberChannelTest.php b/vendor/workerman/coroutine/tests/FiberChannelTest.php deleted file mode 100644 index dc5c8b9..0000000 --- a/vendor/workerman/coroutine/tests/FiberChannelTest.php +++ /dev/null @@ -1,346 +0,0 @@ -push('test data'); - }); - - $fiber->start(); - - $this->assertEquals('test data', $channel->pop()); - } - - /** - * Test that pop will block until data is available or timeout occurs. - */ - public function testPopWithTimeout() - { - $channel = new Channel(); - - $fiber = new BaseFiber(function() use ($channel) { - $result = $channel->pop(0.5); - $this->assertFalse($result); - }); - - $startTime = microtime(true); - - $fiber->start(); - - // Allow time for the fiber to suspend and wait - Timer::sleep(0.2); // 200 ms - - // Ensure that the fiber is still waiting (not timed out yet) - $this->assertTrue($fiber->isSuspended()); - - // Wait until the timeout should have occurred - Timer::sleep(0.4); // 400 ms - - $endTime = microtime(true); - - $this->assertTrue($fiber->isTerminated()); - $this->assertGreaterThanOrEqual(0.5, $endTime - $startTime); - } - - /** - * Test that push will block when capacity is reached and timeout occurs. - */ - public function testPushWithTimeout() - { - $channel = new Channel(1); - - $this->assertTrue($channel->push('data1')); - - $fiber = new BaseFiber(function() use ($channel) { - $result = $channel->push('data2', 0.5); - $this->assertFalse($result); - }); - - $startTime = microtime(true); - - $fiber->start(); - - // Allow time for the fiber to suspend and wait - Timer::sleep(0.2); // 200 ms - - // Ensure that the fiber is still waiting (not timed out yet) - $this->assertTrue($fiber->isSuspended()); - - // Wait until the timeout should have occurred - Timer::sleep(0.4); // 400 ms - - $endTime = microtime(true); - - $this->assertTrue($fiber->isTerminated()); - $this->assertGreaterThanOrEqual(0.5, $endTime - $startTime); - } - - /** - * Test that push returns false immediately if capacity is full and timeout is zero. - */ - public function testPushNonBlockingWhenFull() - { - $channel = new Channel(1); - - $this->assertTrue($channel->push('data1')); - - $result = $channel->push('data2', 0); - $this->assertFalse($result); - } - - /** - * Test that pop returns false immediately if the channel is empty and timeout is zero. - */ - public function testPopNonBlockingWhenEmpty() - { - $channel = new Channel(); - - $result = $channel->pop(0); - $this->assertFalse($result); - } - - /** - * Test closing the channel. - */ - public function testCloseChannel() - { - $channel = new Channel(); - - $channel->close(); - - $this->assertFalse($channel->push('data')); - $this->assertFalse($channel->pop()); - } - - /** - * Test that waiting pushers and poppers are resumed when the channel is closed. - */ - public function testWaitersAreResumedOnClose() - { - $channelPush = new Channel(1); - $channelPop = new Channel(1); - - $pushFiber = new BaseFiber(function() use ($channelPush) { - $channelPush->push('data', 1); - $result = $channelPush->push('data', 1); - $this->assertFalse($result); - }); - - $popFiber = new BaseFiber(function() use ($channelPop) { - $result = $channelPop->pop(1); - $this->assertFalse($result); - }); - - $pushFiber->start(); - $popFiber->start(); - - // Allow time for fibers to suspend - Timer::sleep(0.1); // 100 ms - - // Close the channel to resume fibers - $channelPush->close(); - $channelPop->close(); - - // Allow time for fibers to process after resuming - Timer::sleep(0.1); // 100 ms - - $this->assertTrue($pushFiber->isTerminated()); - $this->assertTrue($popFiber->isTerminated()); - } - - /** - * Test that length and getCapacity methods return correct values. - */ - public function testLengthAndCapacity() - { - $capacity = 2; - $channel = new Channel($capacity); - - $this->assertEquals(0, $channel->length()); - $this->assertEquals($capacity, $channel->getCapacity()); - - $channel->push('data1'); - $this->assertEquals(1, $channel->length()); - - $channel->push('data2'); - $this->assertEquals(2, $channel->length()); - - $channel->pop(); - $this->assertEquals(1, $channel->length()); - - $channel->pop(); - $this->assertEquals(0, $channel->length()); - } - - /** - * Test pushing to a closed channel. - */ - public function testPushToClosedChannel() - { - $channel = new Channel(); - - $channel->close(); - - $result = $channel->push('data'); - $this->assertFalse($result); - } - - /** - * Test popping from a closed channel. - */ - public function testPopFromClosedChannel() - { - $channel = new Channel(); - - $channel->push('data'); - - $channel->close(); - - $this->assertEquals('data', $channel->pop()); - $this->assertFalse($channel->pop()); - } - - /** - * Test multiple push and pop operations with fibers. - */ - public function testMultiplePushPopWithFibers() - { - $channel = new Channel(2); - - $results = []; - - $producerFiber = new BaseFiber(function() use ($channel) { - $channel->push('data1'); - $channel->push('data2'); - $channel->push('data3'); - }); - - $consumerFiber = new BaseFiber(function() use ($channel, &$results) { - $results[] = $channel->pop(); - $results[] = $channel->pop(); - $results[] = $channel->pop(); - }); - - $producerFiber->start(); - $consumerFiber->start(); - - // Allow time for fibers to execute - usleep(500000); // 500 ms - - $this->assertEquals(['data1', 'data2', 'data3'], $results); - } - - /** - * Test that fibers are properly blocked and resumed in push and pop operations. - */ - public function testFiberBlockingAndResuming() - { - $channel = new Channel(1); - - $pushFiber = new BaseFiber(function() use ($channel) { - $channel->push('data1'); - $channel->push('data2'); - $channel->push('data3'); - }); - - $popFiber = new BaseFiber(function() use ($channel) { - $this->assertEquals('data1', $channel->pop()); - $this->assertEquals('data2', $channel->pop()); - $this->assertEquals('data3', $channel->pop()); - }); - - $pushFiber->start(); - $popFiber->start(); - - // Allow time for fibers to execute - Timer::sleep(0.5); // 500 ms - - $this->assertTrue($pushFiber->isTerminated()); - $this->assertTrue($popFiber->isTerminated()); - } - - /** - * Test that pushing data after capacity is reached blocks until space is available. - */ - public function testPushBlocksWhenFull() - { - $channel = new Channel(1); - - $channel->push('data1'); - - $pushFiber = new BaseFiber(function() use ($channel) { - $channel->push('data2'); - }); - - $popFiber = new BaseFiber(function() use ($channel) { - Timer::sleep(0.2); // Wait before popping - $this->assertEquals('data1', $channel->pop()); - }); - - $pushFiber->start(); - $popFiber->start(); - - // Allow time for fibers to execute - Timer::sleep(0.5); // 500 ms - - $this->assertTrue($pushFiber->isTerminated()); - $this->assertTrue($popFiber->isTerminated()); - } - - /** - * Test that popping data from an empty channel blocks until data is available. - */ - public function testPopBlocksWhenEmpty() - { - $channel = new Channel(); - - $popFiber = new BaseFiber(function() use ($channel) { - $this->assertEquals('data1', $channel->pop()); - }); - - $pushFiber = new BaseFiber(function() use ($channel) { - Timer::sleep(0.2); // Wait before pushing - $channel->push('data1'); - }); - - $popFiber->start(); - $pushFiber->start(); - - // Allow time for fibers to execute - Timer::sleep(0.5); // 500 ms - - $this->assertTrue($pushFiber->isTerminated()); - $this->assertTrue($popFiber->isTerminated()); - } - - /** - * Test pushing and popping with zero timeout. - */ - public function testPushPopWithZeroTimeout() - { - $channel = new Channel(1); - - $this->assertTrue($channel->push('data1')); - - $result = $channel->push('data2', 0); - $this->assertFalse($result); - - $result = $channel->pop(0); - $this->assertEquals('data1', $result); - - $result = $channel->pop(0); - $this->assertFalse($result); - } -} diff --git a/vendor/workerman/coroutine/tests/LockerTest.php b/vendor/workerman/coroutine/tests/LockerTest.php deleted file mode 100644 index b1a18b1..0000000 --- a/vendor/workerman/coroutine/tests/LockerTest.php +++ /dev/null @@ -1,130 +0,0 @@ -assertChannelExists($key); - Locker::lock($key); - $timeDiff = microtime(true) - $timeStart; - $this->assertGreaterThan($timeDiff2, $timeDiff); - Locker::unlock($key); - }); - usleep(100000); - $timeDiff2 = microtime(true) - $timeStart; - Locker::unlock($key); - } - - public function testLockAndUnlock() - { - $key = 'testLockAndUnlock'; - $this->assertTrue(Locker::lock($key)); - $this->assertTrue(Locker::unlock($key)); - $this->assertChannelRemoved($key); - } - - public function testUnlockWithoutLockThrowsException() - { - $this->expectException(RuntimeException::class); - Locker::unlock('non_existent_key'); - } - - public function testRelockAfterUnlock() - { - $key = 'testRelockAfterUnlock'; - Locker::lock($key); - Locker::unlock($key); - - $this->assertTrue(Locker::lock($key)); - Locker::unlock($key); - $this->assertChannelRemoved($key); - } - - public function testMultipleCoroutinesLocking() - { - $key = 'testMultipleCoroutinesLocking'; - $results = []; - Coroutine::create(function () use ($key, &$results) { - Coroutine::create(function () use ($key, &$results) { - Locker::lock($key); - $results[] = 'A'; - Timer::sleep(0.1); - usleep(100000); - Locker::unlock($key); - }); - - Coroutine::create(function () use ($key, &$results) { - Timer::sleep(0.05); - Locker::lock($key); - $results[] = 'B'; - Locker::unlock($key); - }); - - Coroutine::create(function () use ($key, &$results) { - Timer::sleep(0.05); - Locker::lock($key); - $results[] = 'C'; - Locker::unlock($key); - }); - - }); - - Timer::sleep(0.3); - $this->assertEquals(['A', 'B', 'C'], $results); - $this->assertChannelRemoved($key); - } - - public function testChannelRemainsWhenWaiting() - { - $key = 'testChannelRemainsWhenWaiting'; - Locker::lock($key); - - Coroutine::create(function () use ($key) { - Coroutine::create(function () use ($key) { - Locker::lock($key); - Locker::unlock($key); - }); - - Locker::unlock($key); - - $this->assertChannelRemoved($key); - }); - } - - private function assertChannelExists(string $key): void - { - $channels = $this->getChannels(); - $this->assertArrayHasKey($key, $channels, "Channel for key '$key' should exist"); - } - - private function assertChannelRemoved(string $key): void - { - $channels = $this->getChannels(); - $this->assertArrayNotHasKey($key, $channels, "Channel for key '$key' should be removed"); - } - - private function getChannels(): array - { - $reflector = new ReflectionClass(Locker::class); - $property = $reflector->getProperty('channels'); - return $property->getValue(); - } - -} \ No newline at end of file diff --git a/vendor/workerman/coroutine/tests/ParallelTest.php b/vendor/workerman/coroutine/tests/ParallelTest.php deleted file mode 100644 index 9366ca3..0000000 --- a/vendor/workerman/coroutine/tests/ParallelTest.php +++ /dev/null @@ -1,302 +0,0 @@ -add(function () { - // Simulate some work. - Timer::sleep(0.01); - return 1; - }, 'task1'); - - $parallel->add(function () { - // Simulate some work. - Timer::sleep(0.005); - return 2; - }, 'task2'); - - $results = $parallel->wait(); - - $this->assertEquals(['task1' => 1, 'task2' => 2], $results); - } - - /** - * Test that exceptions thrown in callables are caught and can be retrieved. - */ - public function testExceptions() - { - $parallel = new Parallel(); - - $parallel->add(function () { - throw new \Exception('Test exception'); - }, 'task_with_exception'); - - $parallel->add(function () { - return 'normal result'; - }, 'normal_task'); - - $results = $parallel->wait(); - $exceptions = $parallel->getExceptions(); - - // Check that the normal task result is present. - $this->assertEquals(['normal_task' => 'normal result'], $results); - - // Check that the exception is captured for the failing task. - $this->assertArrayHasKey('task_with_exception', $exceptions); - $this->assertInstanceOf(\Exception::class, $exceptions['task_with_exception']); - $this->assertEquals('Test exception', $exceptions['task_with_exception']->getMessage()); - } - - /** - * Test concurrency control by limiting the number of concurrent tasks. - */ - public function testConcurrencyLimit() - { - $concurrentLimit = 2; - $parallel = new Parallel($concurrentLimit); - - $startTimes = []; - $endTimes = []; - - for ($i = 0; $i < 5; $i++) { - $parallel->add(function () use (&$startTimes, &$endTimes, $i) { - $startTimes[$i] = microtime(true); - // Simulate some work. - Timer::sleep(0.1); // 100 milliseconds - $endTimes[$i] = microtime(true); - return $i; - }, "task{$i}"); - } - - $parallel->wait(); - - // Since we limited concurrency to 2, tasks should finish in batches. - // We'll check that at no point more than $concurrentLimit tasks were running simultaneously. - - // Collect start and end times into an array of intervals. - $intervals = []; - for ($i = 0; $i < 5; $i++) { - $intervals[] = ['start' => $startTimes[$i], 'end' => $endTimes[$i]]; - } - - // Check the maximum number of overlapping intervals does not exceed the concurrency limit. - $maxConcurrent = $this->getMaxConcurrentIntervals($intervals); - - $this->assertLessThanOrEqual($concurrentLimit, $maxConcurrent); - } - - /** - * Helper function to determine the maximum number of overlapping intervals. - * - * @param array $intervals - * @return int - */ - private function getMaxConcurrentIntervals(array $intervals) - { - $events = []; - foreach ($intervals as $interval) { - $events[] = ['time' => $interval['start'], 'type' => 'start']; - $events[] = ['time' => $interval['end'], 'type' => 'end']; - } - - // Sort events by time, 'start' before 'end' if times are equal. - usort($events, function ($a, $b) { - if ($a['time'] == $b['time']) { - return $a['type'] === 'start' ? -1 : 1; - } - return $a['time'] < $b['time'] ? -1 : 1; - }); - - $maxConcurrent = 0; - $currentConcurrent = 0; - - foreach ($events as $event) { - if ($event['type'] === 'start') { - $currentConcurrent++; - if ($currentConcurrent > $maxConcurrent) { - $maxConcurrent = $currentConcurrent; - } - } else { - $currentConcurrent--; - } - } - - return $maxConcurrent; - } - - /** - * Test that callables are executed in parallel when no concurrency limit is set. - */ - public function testParallelExecutionWithoutConcurrencyLimit() - { - $parallel = new Parallel(); - - $startTimes = []; - $endTimes = []; - - $parallel->add(function () use (&$startTimes, &$endTimes) { - $startTimes[] = microtime(true); - Timer::sleep(0.1); // 100 milliseconds - $endTimes[] = microtime(true); - return 'task1'; - }, 'task1'); - - $parallel->add(function () use (&$startTimes, &$endTimes) { - $startTimes[] = microtime(true); - Timer::sleep(0.1);// 100 milliseconds - $endTimes[] = microtime(true); - return 'task2'; - }, 'task2'); - - $parallel->wait(); - - // Calculate total elapsed time. - $totalTime = max($endTimes) - min($startTimes); - - // The total time should be approximately the duration of one task, not the sum of both. - $this->assertLessThan(0.2, $totalTime); - } - - /** - * Test adding callables without specifying keys and ensure results are correctly indexed. - */ - public function testAddWithoutKeys() - { - $parallel = new Parallel(); - - $parallel->add(function () { - return 'result1'; - }); - - $parallel->add(function () { - return 'result2'; - }); - - $results = $parallel->wait(); - - // Since no keys were specified, indices should be 0 and 1. - $this->assertEquals(['result1', 'result2'], $results); - } - - /** - * Test that the Parallel class can handle a large number of tasks. - */ - public function testLargeNumberOfTasks() - { - $parallel = new Parallel(); - - $taskCount = 100; - for ($i = 0; $i < $taskCount; $i++) { - $parallel->add(function () use ($i) { - return $i * $i; - }, "task{$i}"); - } - - $results = $parallel->wait(); - - // Verify that all tasks have been completed and results are correct. - for ($i = 0; $i < $taskCount; $i++) { - $this->assertEquals($i * $i, $results["task{$i}"]); - } - } - - /** - * Test that adding a non-callable throws a TypeError. - */ - public function testAddNonCallable() - { - $this->expectException(\TypeError::class); - - $parallel = new Parallel(); - $parallel->add('not a callable'); - } - - /** - * Test that the wait method can be called multiple times safely. - */ - public function testMultipleWaitCalls() - { - $parallel = new Parallel(); - - $parallel->add(function () { - return 'first call'; - }, 'task1'); - - $resultsFirst = $parallel->wait(); - - $this->assertEquals(['task1' => 'first call'], $resultsFirst); - - // Add another task after first wait. - $parallel->add(function () { - return 'second call'; - }, 'task2'); - - $resultsSecond = $parallel->wait(); - - // Since the callbacks array is not cleared after wait, results should include both tasks. - $this->assertEquals(['task1' => 'first call', 'task2' => 'second call'], $resultsSecond); - } - - /** - * Test that the class properly handles empty tasks (no callables added). - */ - public function testNoTasks() - { - $parallel = new Parallel(); - - $results = $parallel->wait(); - - $this->assertEmpty($results); - } - - /** - * Test that the class handles tasks that return null. - */ - public function testTasksReturningNull() - { - $parallel = new Parallel(); - - $parallel->add(function () { - // No return statement, implicitly returns null. - }, 'nullTask'); - - $results = $parallel->wait(); - - $this->assertArrayHasKey('nullTask', $results); - $this->assertNull($results['nullTask']); - } - - /** - * Test defer can be used in tasks. - */ - public function testWithDefer() - { - $parallel = new Parallel(); - $results = []; - $parallel->add(function () use (&$results) { - Coroutine::defer(function () use (&$results) { - $results[] = 'defer1'; - }); - }); - $parallel->wait(); - $this->assertEquals(['defer1'], $results); - } - -} - diff --git a/vendor/workerman/coroutine/tests/PoolTest.php b/vendor/workerman/coroutine/tests/PoolTest.php deleted file mode 100644 index acc9f37..0000000 --- a/vendor/workerman/coroutine/tests/PoolTest.php +++ /dev/null @@ -1,398 +0,0 @@ - 2, - 'idle_timeout' => 30, - 'heartbeat_interval' => 10, - 'wait_timeout' => 5, - ]; - $pool = new Pool(10, $config); - - $this->assertEquals(10, $this->getPrivateProperty($pool, 'maxConnections')); - $this->assertEquals(2, $this->getPrivateProperty($pool, 'minConnections')); - $this->assertEquals(30, $this->getPrivateProperty($pool, 'idleTimeout')); - $this->assertEquals(10, $this->getPrivateProperty($pool, 'heartbeatInterval')); - $this->assertEquals(5, $this->getPrivateProperty($pool, 'waitTimeout')); - } - - public function testSetConnectionCreator() - { - $pool = new Pool(5); - $connectionCreator = function () { - return new stdClass(); - }; - $pool->setConnectionCreator($connectionCreator); - $this->assertSame($connectionCreator, $this->getPrivateProperty($pool, 'connectionCreateHandler')); - } - - public function testSetConnectionCloser() - { - $pool = new Pool(5); - $connectionCloser = function ($conn) { - // Close connection. - }; - $pool->setConnectionCloser($connectionCloser); - $this->assertSame($connectionCloser, $this->getPrivateProperty($pool, 'connectionDestroyHandler')); - } - - public function testGetConnection() - { - $pool = new Pool(5); - - $connectionMock = $this->createMock(stdClass::class); - - // 设置连接创建器 - $pool->setConnectionCreator(function () use ($connectionMock) { - return $connectionMock; - }); - - $connection = $pool->get(); - - $this->assertSame($connectionMock, $connection); - $this->assertEquals(1, $this->getCurrentConnections($pool)); - - // 检查 WeakMap 是否更新 - $connections = $this->getPrivateProperty($pool, 'connections'); - $lastUsedTimes = $this->getPrivateProperty($pool, 'lastUsedTimes'); - $lastHeartbeatTimes = $this->getPrivateProperty($pool, 'lastHeartbeatTimes'); - - $this->assertTrue($connections->offsetExists($connection)); - $this->assertTrue($lastUsedTimes->offsetExists($connection)); - $this->assertTrue($lastHeartbeatTimes->offsetExists($connection)); - } - - public function testPutConnection() - { - $pool = new Pool(5); - - $connectionMock = $this->createMock(stdClass::class); - - $pool->setConnectionCreator(function () use ($connectionMock) { - return $connectionMock; - }); - - $connection = $pool->get(); - - $pool->put($connection); - - if (Coroutine::isCoroutine()) { - $channel = $this->getPrivateProperty($pool, 'channel'); - $this->assertEquals(1, $channel->length()); - } - - $this->assertEquals(1, $pool->getConnectionCount()); - } - - public function testPutConnectionDoesNotBelong() - { - $this->expectException(RuntimeException::class); - $this->expectExceptionMessage('The connection does not belong to the connection pool.'); - - $pool = new Pool(5); - $connection = new stdClass(); - - $pool->put($connection); - } - - public function testCreateConnection() - { - $pool = new Pool(5); - $connectionMock = $this->createMock(stdClass::class); - - $pool->setConnectionCreator(function () use ($connectionMock) { - return $connectionMock; - }); - - $connection = $pool->createConnection(); - - $this->assertSame($connectionMock, $connection); - - // 确保 currentConnections 增加 - $this->assertEquals(1, $this->getCurrentConnections($pool)); - - // 检查 WeakMap 是否更新 - $connections = $this->getPrivateProperty($pool, 'connections'); - $lastUsedTimes = $this->getPrivateProperty($pool, 'lastUsedTimes'); - $lastHeartbeatTimes = $this->getPrivateProperty($pool, 'lastHeartbeatTimes'); - - $this->assertTrue($connections->offsetExists($connection)); - $this->assertTrue($lastUsedTimes->offsetExists($connection)); - $this->assertTrue($lastHeartbeatTimes->offsetExists($connection)); - } - - public function testCreateMaxConnections() - { - if (in_array(Worker::$eventLoopClass, [Select::class, Event::class])) { - $this->assertTrue(true); - return; - } - $maxConnections = 2; - $pool = new Pool($maxConnections); - - $pool->setConnectionCreator(function () { - Timer::sleep(0.01); - return $this->createMock(stdClass::class); - }); - - $connections = []; - for ($i = 0; $i < 3; $i++) { - Coroutine::create(function () use ($pool, &$connections) { - $connections[] = $pool->get(); - }); - } - - Timer::sleep(0.1); - $this->assertEquals($maxConnections, $this->getCurrentConnections($pool)); - - $lastUsedTimes = $this->getPrivateProperty($pool, 'lastUsedTimes'); - $lastHeartbeatTimes = $this->getPrivateProperty($pool, 'lastHeartbeatTimes'); - - $this->assertCount($maxConnections, $lastUsedTimes); - $this->assertCount($maxConnections, $lastHeartbeatTimes); - - foreach ($connections as $connection) { - $pool->put($connection); - } - - } - - public function testCreateConnectionThrowsException() - { - $pool = new Pool(5); - - $pool->setConnectionCreator(function () { - throw new Exception('Failed to create connection'); - }); - - $this->expectException(Exception::class); - $this->expectExceptionMessage('Failed to create connection'); - - try { - $pool->createConnection(); - } finally { - // 确保 currentConnections 减少 - $this->assertEquals(0, $this->getCurrentConnections($pool)); - } - } - - public function testCloseConnection() - { - $pool = new Pool(5); - - $connection = $this->createMock(ConnectionMock::class); - - // 模拟连接属于连接池 - $connections = $this->getPrivateProperty($pool, 'connections'); - $connections[$connection] = time(); - - $connection->expects($this->once())->method('close'); - $pool->setConnectionCloser(function ($conn) { - $conn->close(); - }); - - $pool->closeConnection($connection); - - // 确保 currentConnections 减少 - $this->assertEquals(0, $this->getCurrentConnections($pool)); - - // 确保连接从 WeakMap 中移除 - $this->assertFalse($connections->offsetExists($connection)); - } - - public function testCloseConnections() - { - $maxConnections = 5; - - $pool = new Pool($maxConnections); - - $pool->setConnectionCreator(function () { - $connection = $this->createMock(ConnectionMock::class); - $connection->expects($this->once())->method('close'); - return $connection; - }); - - $pool->setConnectionCloser(function ($conn) { - $conn->close(); - }); - - $connections = []; - for ($i = 0; $i < $maxConnections; $i++) { - $connections[] = $pool->get(); - } - - $this->assertEquals(Coroutine::isCoroutine() ? $maxConnections : 1, $this->getCurrentConnections($pool)); - - $pool->closeConnections(); - $this->assertEquals(Coroutine::isCoroutine() ? $maxConnections : 0, $this->getCurrentConnections($pool)); - if (!Coroutine::isCoroutine()) { - return; - } - - foreach ($connections as $connection) { - $pool->put($connection); - } - $this->assertEquals($maxConnections, $this->getCurrentConnections($pool)); - $pool->closeConnections(); - $this->assertEquals(0, $this->getCurrentConnections($pool)); - - $connections = []; - for ($i = 0; $i < $maxConnections; $i++) { - $connections[] = $pool->get(); - } - $this->assertEquals($maxConnections, $this->getCurrentConnections($pool)); - foreach ($connections as $connection) { - $pool->put($connection); - } - $pool->closeConnections(); - unset($connections); - $this->assertEquals(0, $this->getCurrentConnections($pool)); - } - - public function testCloseConnectionWithExceptionInDestroyHandler() - { - $pool = new Pool(5); - - $connection = $this->createMock(stdClass::class); - - // 模拟连接属于连接池 - $connections = $this->getPrivateProperty($pool, 'connections'); - $connections[$connection] = time(); - - $exception = new Exception('Error closing connection'); - - $pool->setConnectionCloser(function ($conn) use ($exception) { - throw $exception; - }); - - // 设置日志记录器 - $loggerMock = $this->createMock(LoggerInterface::class); - $loggerMock->expects($this->once()) - ->method('info') - ->with($this->stringContains('Error closing connection')); - - $this->setPrivateProperty($pool, 'logger', $loggerMock); - - $pool->closeConnection($connection); - - // 确保 currentConnections 减少 - $this->assertEquals(0, $this->getCurrentConnections($pool)); - - // 确保连接从 WeakMap 中移除 - $this->assertFalse($connections->offsetExists($connection)); - } - - public function testHeartbeatChecker() - { - $pool = $this->getMockBuilder(Pool::class) - ->setConstructorArgs([5]) - ->onlyMethods(['closeConnection']) - ->getMock(); - - $connection = $this->createMock(stdClass::class); - - // 设置连接心跳检测器 - $pool->setHeartbeatChecker(function ($conn) { - // 模拟心跳检测 - }); - - // 模拟连接在通道中 - $channel = $this->getPrivateProperty($pool, 'channel'); - $channel->push($connection); - - // 设置连接的上次使用时间和心跳时间 - $connections = $this->getPrivateProperty($pool, 'connections'); - $connections[$connection] = time(); - - $lastUsedTimes = $this->getPrivateProperty($pool, 'lastUsedTimes'); - $lastUsedTimes[$connection] = time(); - - $lastHeartbeatTimes = $this->getPrivateProperty($pool, 'lastHeartbeatTimes'); - $lastHeartbeatTimes[$connection] = time() - 100; // 超过心跳间隔 - - // 调用受保护的 checkConnections 方法 - $reflectedMethod = new ReflectionMethod($pool, 'checkConnections'); - $reflectedMethod->setAccessible(true); - $reflectedMethod->invoke($pool); - - // 检查心跳时间是否更新 - $lastHeartbeatTimes = $this->getPrivateProperty($pool, 'lastHeartbeatTimes'); - $this->assertGreaterThan(time() - 2, $lastHeartbeatTimes[$connection]); - } - - public function testConnectionDestroyedWithoutReturn() - { - $pool = new Pool(5); - - // 设置连接创建器 - $pool->setConnectionCreator(function () { - return new stdClass; - }); - - // 获取初始的 currentConnections - $initialConnections = $this->getCurrentConnections($pool); - - // 从连接池获取一个连接 - $connection = $pool->get(); - - // 检查 currentConnections 是否增加 - $this->assertEquals(Coroutine::isCoroutine() ? $initialConnections + 1 : 1, $this->getCurrentConnections($pool)); - - // 不归还连接,并销毁连接对象 - unset($connection); - - // 检查 currentConnections 是否减少 - $this->assertEquals(Coroutine::isCoroutine() ? $initialConnections : 1, $this->getCurrentConnections($pool)); - } - - private function getPrivateProperty($object, string $property) - { - $reflection = new ReflectionClass($object); - $prop = $reflection->getProperty($property); - $prop->setAccessible(true); - return $prop->getValue($object); - } - - private function setPrivateProperty($object, string $property, $value) - { - $reflection = new ReflectionClass($object); - $prop = $reflection->getProperty($property); - $prop->setAccessible(true); - $prop->setValue($object, $value); - } - - private function getCurrentConnections($object): int - { - return $object->getConnectionCount(); - } - -} - -// 定义 ConnectionMock 类用于测试 -class ConnectionMock -{ - public function close() - { - // 模拟关闭连接 - } -} diff --git a/vendor/workerman/coroutine/tests/WaitGroupTest.php b/vendor/workerman/coroutine/tests/WaitGroupTest.php deleted file mode 100644 index 17d16fc..0000000 --- a/vendor/workerman/coroutine/tests/WaitGroupTest.php +++ /dev/null @@ -1,56 +0,0 @@ -assertEquals(0, $waitGroup->count()); - $results = [0]; - $this->assertTrue($waitGroup->add()); - Coroutine::create(function () use ($waitGroup, &$results) { - try { - Timer::sleep(0.1); - $results[] = 1; - } finally { - $this->assertTrue($waitGroup->done()); - } - }); - $this->assertTrue($waitGroup->add()); - Coroutine::create(function () use ($waitGroup, &$results) { - try { - Timer::sleep(0.2); - $results[] = 2; - } finally { - $this->assertTrue($waitGroup->done()); - } - }); - $this->assertTrue($waitGroup->add()); - Coroutine::create(function () use ($waitGroup, &$results) { - try { - Timer::sleep(0.3); - $results[] = 3; - } finally { - $this->assertTrue($waitGroup->done()); - } - }); - $this->assertTrue($waitGroup->wait()); - $this->assertEquals(0, $waitGroup->count(), 'WaitGroup count should be 0 after wait is called.'); - $this->assertEquals([0, 1, 2, 3], $results, 'All coroutines should have been executed.'); - } -} diff --git a/vendor/workerman/coroutine/tests/start.php b/vendor/workerman/coroutine/tests/start.php deleted file mode 100644 index 6964bbb..0000000 --- a/vendor/workerman/coroutine/tests/start.php +++ /dev/null @@ -1,98 +0,0 @@ -run([ - __DIR__ . '/../vendor/bin/phpunit', - '--colors=always', - __DIR__ . '/ChannelTest.php', - __DIR__ . '/PoolTest.php', - __DIR__ . '/BarrierTest.php', - __DIR__ . '/ContextTest.php', - __DIR__ . '/WaitGroupTest.php', - ]); - }, Select::class); -} - -if (extension_loaded('event')) { - create_test_worker(function () { - (new PHPUnit\TextUI\Application)->run([ - __DIR__ . '/../vendor/bin/phpunit', - '--colors=always', - __DIR__ . '/ChannelTest.php', - __DIR__ . '/PoolTest.php', - __DIR__ . '/BarrierTest.php', - __DIR__ . '/ContextTest.php', - __DIR__ . '/WaitGroupTest.php', - ]); - }, Event::class); -} - -if (class_exists(Revolt\EventLoop::class) && (DIRECTORY_SEPARATOR === '/' || !extension_loaded('swow'))) { - create_test_worker(function () { - (new PHPUnit\TextUI\Application)->run([ - __DIR__ . '/../vendor/bin/phpunit', - '--colors=always', - ...glob(__DIR__ . '/*Test.php') - ]); - }, Fiber::class); -} - -if (extension_loaded('Swoole')) { - create_test_worker(function () { - (new PHPUnit\TextUI\Application)->run([ - __DIR__ . '/../vendor/bin/phpunit', - '--colors=always', - ...glob(__DIR__ . '/*Test.php') - ]); - }, Swoole::class); -} - -if (extension_loaded('Swow')) { - create_test_worker(function () { - (new PHPUnit\TextUI\Application)->run([ - __DIR__ . '/../vendor/bin/phpunit', - '--colors=always', - ...glob(__DIR__ . '/*Test.php') - ]); - }, Swow::class); -} - -function create_test_worker(Closure $callable, $eventLoopClass): void -{ - $worker = new Worker(); - $worker->eventLoop = $eventLoopClass; - $worker->onWorkerStart = function () use ($callable, $eventLoopClass) { - $fp = fopen(__FILE__, 'r+'); - flock($fp, LOCK_EX); - echo PHP_EOL . PHP_EOL. PHP_EOL . '[TEST EVENT-LOOP: ' . basename(str_replace('\\', '/', $eventLoopClass)) . ']' . PHP_EOL; - try { - $callable(); - } catch (Throwable $e) { - echo $e; - } finally { - flock($fp, LOCK_UN); - } - Timer::repeat(1, function () use ($fp) { - if (flock($fp, LOCK_EX | LOCK_NB)) { - if(function_exists('posix_kill')) { - posix_kill(posix_getppid(), SIGINT); - } else { - Worker::stopAll(); - } - } - }); - }; -} - -Worker::runAll(); diff --git a/vendor/workerman/webman-framework/.gitignore b/vendor/workerman/webman-framework/.gitignore deleted file mode 100644 index 3f2c43a..0000000 --- a/vendor/workerman/webman-framework/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -composer.lock -vendor -vendor/ -.idea -.idea/ \ No newline at end of file diff --git a/vendor/workerman/webman-framework/README.md b/vendor/workerman/webman-framework/README.md deleted file mode 100644 index 96a900a..0000000 --- a/vendor/workerman/webman-framework/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# webman-framework -Note: This repository is the core code of the webman framework. If you want to build an application using webman, visit the main [webman](https://github.com/walkor/webman) repository. - -## LICENSE -MIT diff --git a/vendor/workerman/webman-framework/composer.json b/vendor/workerman/webman-framework/composer.json deleted file mode 100644 index 0a104da..0000000 --- a/vendor/workerman/webman-framework/composer.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "workerman/webman-framework", - "type": "library", - "keywords": [ - "high performance", - "http service" - ], - "homepage": "https://www.workerman.net", - "license": "MIT", - "description": "High performance HTTP Service Framework.", - "authors": [ - { - "name": "walkor", - "email": "walkor@workerman.net", - "homepage": "https://www.workerman.net", - "role": "Developer" - } - ], - "support": { - "email": "walkor@workerman.net", - "issues": "https://github.com/walkor/webman/issues", - "forum": "https://wenda.workerman.net/", - "wiki": "https://doc.workerman.net/", - "source": "https://github.com/walkor/webman-framework" - }, - "require": { - "php": ">=8.1", - "ext-json": "*", - "workerman/workerman": "^5.1 || dev-master", - "nikic/fast-route": "^1.3", - "psr/container": ">=1.0", - "psr/log": "^3.0" - }, - "suggest": { - "ext-event": "For better performance. " - }, - "autoload": { - "psr-4": { - "Webman\\": "./src", - "support\\": "./src/support", - "Support\\": "./src/support", - "Support\\Bootstrap\\": "./src/support/bootstrap", - "Support\\Exception\\": "./src/support/exception", - "Support\\View\\": "./src/support/view" - }, - "files": [ - "./src/support/helpers.php" - ] - }, - "minimum-stability": "dev", - "prefer-stable": true -} diff --git a/vendor/workerman/webman-framework/src/Annotation/DisableDefaultRoute.php b/vendor/workerman/webman-framework/src/Annotation/DisableDefaultRoute.php deleted file mode 100644 index 05d40ae..0000000 --- a/vendor/workerman/webman-framework/src/Annotation/DisableDefaultRoute.php +++ /dev/null @@ -1,10 +0,0 @@ -middlewares = $middlewares; - } - - public function getMiddlewares(): array - { - $middlewares = []; - foreach ($this->middlewares as $middleware) { - $middlewares[] = [$middleware, 'process']; - } - return $middlewares; - } -} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/App.php b/vendor/workerman/webman-framework/src/App.php deleted file mode 100644 index 97c9f04..0000000 --- a/vendor/workerman/webman-framework/src/App.php +++ /dev/null @@ -1,1048 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman; - -use ArrayObject; -use Closure; -use Exception; -use FastRoute\Dispatcher; -use Illuminate\Database\Eloquent\Model; -use Psr\Log\LoggerInterface; -use ReflectionEnum; -use support\exception\InputValueException; -use support\exception\PageNotFoundException; -use think\Model as ThinkModel; -use InvalidArgumentException; -use Psr\Container\ContainerExceptionInterface; -use Psr\Container\ContainerInterface; -use Psr\Container\NotFoundExceptionInterface; -use ReflectionClass; -use ReflectionException; -use ReflectionFunction; -use ReflectionFunctionAbstract; -use ReflectionMethod; -use support\exception\BusinessException; -use support\exception\MissingInputException; -use support\exception\RecordNotFoundException; -use support\exception\InputTypeException; -use Throwable; -use Webman\Context; -use Webman\Exception\ExceptionHandler; -use Webman\Exception\ExceptionHandlerInterface; -use Webman\Http\Request; -use Webman\Http\Response; -use Webman\Route\Route as RouteObject; -use Workerman\Connection\TcpConnection; -use Workerman\Protocols\Http; -use Workerman\Worker; -use function array_merge; -use function array_pop; -use function array_reduce; -use function array_splice; -use function array_values; -use function class_exists; -use function clearstatcache; -use function count; -use function current; -use function end; -use function explode; -use function get_class_methods; -use function gettype; -use function implode; -use function is_a; -use function is_array; -use function is_dir; -use function is_file; -use function is_numeric; -use function is_string; -use function key; -use function method_exists; -use function ob_get_clean; -use function ob_start; -use function pathinfo; -use function scandir; -use function str_replace; -use function strpos; -use function strtolower; -use function substr; -use function trim; - -/** - * Class App - * @package Webman - */ -class App -{ - - /** - * @var callable[] - */ - protected static $callbacks = []; - - /** - * @var Worker - */ - protected static $worker = null; - - /** - * @var ?LoggerInterface - */ - protected static ?LoggerInterface $logger = null; - - /** - * @var string - */ - protected static $appPath = ''; - - /** - * @var string - */ - protected static $publicPath = ''; - - /** - * @var string - */ - protected static $requestClass = ''; - - /** - * App constructor. - * @param string $requestClass - * @param LoggerInterface $logger - * @param string $appPath - * @param string $publicPath - */ - public function __construct(string $requestClass, LoggerInterface $logger, string $appPath, string $publicPath) - { - static::$requestClass = $requestClass; - static::$logger = $logger; - static::$publicPath = $publicPath; - static::$appPath = $appPath; - } - - /** - * OnMessage. - * @param TcpConnection|mixed $connection - * @param Request|mixed $request - * @return null - * @throws Throwable - */ - public function onMessage($connection, $request) - { - try { - Context::reset(new ArrayObject([Request::class => $request])); - $path = $request->path(); - $key = $request->method() . $path; - if (isset(static::$callbacks[$key])) { - [$callback, $request->plugin, $request->app, $request->controller, $request->action, $request->route] = static::$callbacks[$key]; - static::send($connection, $callback($request), $request); - return null; - } - - $status = 200; - if ( - static::unsafeUri($connection, $path, $request) || - static::findFile($connection, $path, $key, $request) || - static::findRoute($connection, $path, $key, $request, $status) - ) { - return null; - } - - $controllerAndAction = static::parseControllerAction($path); - $plugin = $controllerAndAction['plugin'] ?? static::getPluginByPath($path); - if (!$controllerAndAction || Route::isDefaultRouteDisabled($plugin, $controllerAndAction['app'] ?: '*') || - Route::isDefaultRouteDisabled($controllerAndAction['controller']) || - Route::isDefaultRouteDisabled([$controllerAndAction['controller'], $controllerAndAction['action']])) { - $request->plugin = $plugin; - $callback = static::getFallback($plugin, $status); - $request->app = $request->controller = $request->action = ''; - static::send($connection, $callback($request), $request); - return null; - } - $app = $controllerAndAction['app']; - $controller = $controllerAndAction['controller']; - $action = $controllerAndAction['action']; - $callback = static::getCallback($plugin, $app, [$controller, $action]); - static::collectCallbacks($key, [$callback, $plugin, $app, $controller, $action, null]); - [$callback, $request->plugin, $request->app, $request->controller, $request->action, $request->route] = static::$callbacks[$key]; - static::send($connection, $callback($request), $request); - } catch (Throwable $e) { - static::send($connection, static::exceptionResponse($e, $request), $request); - } - return null; - } - - /** - * OnWorkerStart. - * @param $worker - * @return void - */ - public function onWorkerStart($worker) - { - static::$worker = $worker; - Http::requestClass(static::$requestClass); - } - - /** - * CollectCallbacks. - * @param string $key - * @param array $data - * @return void - */ - protected static function collectCallbacks(string $key, array $data) - { - static::$callbacks[$key] = $data; - if (count(static::$callbacks) >= 1024) { - unset(static::$callbacks[key(static::$callbacks)]); - } - } - - /** - * UnsafeUri. - * @param TcpConnection $connection - * @param string $path - * @param $request - * @return bool - */ - protected static function unsafeUri(TcpConnection $connection, string $path, $request): bool - { - if ( - !$path || - $path[0] !== '/' || - strpos($path, '/../') !== false || - substr($path, -3) === '/..' || - strpos($path, "\\") !== false || - strpos($path, "\0") !== false - ) { - $callback = static::getFallback('', 400); - $request->plugin = $request->app = $request->controller = $request->action = ''; - static::send($connection, $callback($request, 400), $request); - return true; - } - return false; - } - - /** - * GetFallback. - * @param string $plugin - * @param int $status - * @return Closure - * @throws ContainerExceptionInterface - * @throws NotFoundExceptionInterface - * @throws ReflectionException - */ - protected static function getFallback(string $plugin = '', int $status = 404): Closure - { - // When route, controller and action not found, try to use Route::fallback - return Route::getFallback($plugin, $status) ?: function () { - throw new PageNotFoundException(); - }; - } - - /** - * ExceptionResponse. - * @param Throwable $e - * @param $request - * @return Response - */ - protected static function exceptionResponse(Throwable $e, $request): Response - { - try { - $app = $request->app ?: ''; - $plugin = $request->plugin ?: ''; - $exceptionConfig = static::config($plugin, 'exception'); - $appExceptionConfig = static::config("", 'exception'); - if (!isset($exceptionConfig['']) && isset($appExceptionConfig['@'])) { - //如果插件没有配置自己的异常处理器并且配置了全局@异常处理器 则使用全局异常处理器 - $defaultException = $appExceptionConfig['@'] ?? ExceptionHandler::class; - } else { - $defaultException = $exceptionConfig[''] ?? ExceptionHandler::class; - } - $exceptionHandlerClass = $exceptionConfig[$app] ?? $defaultException; - - /** @var ExceptionHandlerInterface $exceptionHandler */ - $exceptionHandler = (static::container($plugin) ?? static::container(''))->make($exceptionHandlerClass, [ - 'logger' => static::$logger, - 'debug' => static::config($plugin, 'app.debug') - ]); - $exceptionHandler->report($e); - $response = $exceptionHandler->render($request, $e); - $response->exception($e); - return $response; - } catch (Throwable $e) { - $response = new Response(500, [], static::config($plugin ?? '', 'app.debug', true) ? (string)$e : $e->getMessage()); - $response->exception($e); - return $response; - } - } - - /** - * GetCallback. - * @param string $plugin - * @param string $app - * @param $call - * @param array $args - * @param bool $withGlobalMiddleware - * @param RouteObject|null $route - * @return callable - * @throws ContainerExceptionInterface - * @throws NotFoundExceptionInterface - * @throws ReflectionException - */ - public static function getCallback(string $plugin, string $app, $call, array $args = [], bool $withGlobalMiddleware = true, ?RouteObject $route = null) - { - $isController = is_array($call) && is_string($call[0]); - $middlewares = Middleware::getMiddleware($plugin, $app, $call, $route, $withGlobalMiddleware); - - $container = static::container($plugin) ?? static::container(''); - foreach ($middlewares as $key => $item) { - $middleware = $item[0]; - if (is_string($middleware)) { - $middleware = $container->get($middleware); - } elseif ($middleware instanceof Closure) { - $middleware = call_user_func($middleware, $container); - } - $middlewares[$key][0] = $middleware; - } - - $needInject = static::isNeedInject($call, $args); - $anonymousArgs = array_values($args); - if ($isController) { - $controllerReuse = static::config($plugin, 'app.controller_reuse', true); - if (!$controllerReuse) { - if ($needInject) { - $call = function ($request) use ($call, $plugin, $args, $container) { - $call[0] = $container->make($call[0]); - $reflector = static::getReflector($call); - $args = array_values(static::resolveMethodDependencies($container, $request, array_merge($request->all(), $args), $reflector, static::config($plugin, 'app.debug'))); - return $call(...$args); - }; - $needInject = false; - } else { - $call = function ($request, ...$anonymousArgs) use ($call, $plugin, $container) { - $call[0] = $container->make($call[0]); - return $call($request, ...$anonymousArgs); - }; - } - } else { - $call[0] = $container->get($call[0]); - } - } - - if ($needInject) { - $call = static::resolveInject($plugin, $call, $args); - } - - if ($middlewares) { - $callback = array_reduce($middlewares, function ($carry, $pipe) { - return function ($request) use ($carry, $pipe) { - try { - return $pipe($request, $carry); - } catch (Throwable $e) { - return static::exceptionResponse($e, $request); - } - }; - }, function ($request) use ($call, $anonymousArgs) { - try { - $response = $call($request, ...$anonymousArgs); - } catch (Throwable $e) { - return static::exceptionResponse($e, $request); - } - if (!$response instanceof Response) { - if (!is_string($response)) { - $response = static::stringify($response); - } - $response = new Response(200, [], $response); - } - return $response; - }); - } else { - if (!$anonymousArgs) { - $callback = $call; - } else { - $callback = function ($request) use ($call, $anonymousArgs) { - return $call($request, ...$anonymousArgs); - }; - } - } - return $callback; - } - - /** - * ResolveInject. - * @param string $plugin - * @param array|Closure $call - * @param $args - * @return Closure - * @see Dependency injection through reflection information - */ - protected static function resolveInject(string $plugin, $call, $args): Closure - { - return function (Request $request) use ($plugin, $call, $args) { - $reflector = static::getReflector($call); - $args = array_values(static::resolveMethodDependencies(static::container($plugin), $request, - array_merge($request->all(), $args), $reflector, static::config($plugin, 'app.debug'))); - return $call(...$args); - }; - } - - /** - * Check whether inject is required. - * @param $call - * @param array $args - * @return bool - * @throws ReflectionException - */ - protected static function isNeedInject($call, array &$args): bool - { - if (is_array($call) && !method_exists($call[0], $call[1])) { - return false; - } - $reflector = static::getReflector($call); - $reflectionParameters = $reflector->getParameters(); - if (!$reflectionParameters) { - return false; - } - $firstParameter = current($reflectionParameters); - unset($reflectionParameters[key($reflectionParameters)]); - $adaptersList = ['int', 'string', 'bool', 'array', 'object', 'float', 'mixed', 'resource']; - $keys = []; - $needInject = false; - foreach ($reflectionParameters as $parameter) { - $parameterName = $parameter->name; - $keys[] = $parameterName; - if ($parameter->hasType()) { - $typeName = $parameter->getType()->getName(); - if (!in_array($typeName, $adaptersList)) { - $needInject = true; - continue; - } - if (!array_key_exists($parameterName, $args)) { - $needInject = true; - continue; - } - switch ($typeName) { - case 'int': - case 'float': - if (!is_numeric($args[$parameterName])) { - return true; - } - $args[$parameterName] = $typeName === 'int' ? (int)$args[$parameterName]: (float)$args[$parameterName]; - break; - case 'bool': - $args[$parameterName] = (bool)$args[$parameterName]; - break; - case 'array': - case 'object': - if (!is_array($args[$parameterName])) { - return true; - } - $args[$parameterName] = $typeName === 'array' ? $args[$parameterName] : (object)$args[$parameterName]; - break; - case 'string': - case 'mixed': - case 'resource': - break; - } - } - } - if (array_keys($args) !== $keys) { - return true; - } - if (!$firstParameter->hasType()) { - return $firstParameter->getName() !== 'request'; - } - if (!is_a(static::$requestClass, $firstParameter->getType()->getName(), true)) { - return true; - } - - return $needInject; - } - - /** - * Get reflector. - * @param $call - * @return ReflectionFunction|ReflectionMethod - * @throws ReflectionException - */ - protected static function getReflector($call) - { - if ($call instanceof Closure || is_string($call)) { - return new ReflectionFunction($call); - } - return new ReflectionMethod($call[0], $call[1]); - } - - /** - * Return dependent parameters - * @param ContainerInterface $container - * @param Request $request - * @param array $inputs - * @param ReflectionFunctionAbstract $reflector - * @param bool $debug - * @return array - * @throws ReflectionException - */ - protected static function resolveMethodDependencies(ContainerInterface $container, Request $request, array $inputs, ReflectionFunctionAbstract $reflector, bool $debug): array - { - $parameters = []; - foreach ($reflector->getParameters() as $parameter) { - $parameterName = $parameter->name; - $type = $parameter->getType(); - $typeName = $type?->getName(); - - if ($typeName && is_a($request, $typeName)) { - $parameters[$parameterName] = $request; - continue; - } - - if (!array_key_exists($parameterName, $inputs)) { - if (!$parameter->isDefaultValueAvailable()) { - if (!$typeName || (!class_exists($typeName) && !enum_exists($typeName)) || enum_exists($typeName)) { - throw (new MissingInputException())->data([ - 'parameter' => $parameterName, - ])->debug($debug); - } - } else { - $parameters[$parameterName] = $parameter->getDefaultValue(); - continue; - } - } - - $parameterValue = $inputs[$parameterName] ?? null; - - switch ($typeName) { - case 'int': - case 'float': - if (!is_numeric($parameterValue)) { - throw (new InputTypeException())->data([ - 'parameter' => $parameterName, - 'exceptType' => $typeName, - 'actualType' => gettype($parameterValue), - ])->debug($debug); - } - $parameters[$parameterName] = $typeName === 'float' ? (float)$parameterValue : (int)$parameterValue; - break; - case 'bool': - $parameters[$parameterName] = (bool)$parameterValue; - break; - case 'array': - case 'object': - if (!is_array($parameterValue)) { - throw (new InputTypeException())->data([ - 'parameter' => $parameterName, - 'exceptType' => $typeName, - 'actualType' => gettype($parameterValue), - ])->debug($debug); - } - $parameters[$parameterName] = $typeName === 'object' ? (object)$parameterValue : $parameterValue; - break; - case 'string': - case 'mixed': - case 'resource': - case null: - $parameters[$parameterName] = $parameterValue; - break; - default: - $subInputs = is_array($parameterValue) ? $parameterValue : []; - if (is_a($typeName, Model::class, true) || is_a($typeName, ThinkModel::class, true)) { - $parameters[$parameterName] = $container->make($typeName, [ - 'attributes' => $subInputs, - 'data' => $subInputs - ]); - break; - } - if (enum_exists($typeName)) { - $reflection = new ReflectionEnum($typeName); - if ($reflection->hasCase($parameterValue)) { - $parameters[$parameterName] = $reflection->getCase($parameterValue)->getValue(); - break; - } elseif ($reflection->isBacked()) { - foreach ($reflection->getCases() as $case) { - if ($case->getValue()->value == $parameterValue) { - $parameters[$parameterName] = $case->getValue(); - break; - } - } - } - if (!array_key_exists($parameterName, $parameters)) { - throw (new InputValueException())->data([ - 'parameter' => $parameterName, - 'enum' => $typeName - ])->debug($debug); - } - break; - } - if (is_array($subInputs) && $constructor = (new ReflectionClass($typeName))->getConstructor()) { - $parameters[$parameterName] = $container->make($typeName, static::resolveMethodDependencies($container, $request, $subInputs, $constructor, $debug)); - } else { - $parameters[$parameterName] = $container->make($typeName); - } - break; - } - } - return $parameters; - } - - /** - * Container. - * @param string $plugin - * @return ContainerInterface - */ - public static function container(string $plugin = '') - { - return static::config($plugin, 'container'); - } - - /** - * Get request. - * @return Request|\support\Request - */ - public static function request() - { - return Context::get(Request::class); - } - - /** - * Get worker. - * @return Worker - */ - public static function worker(): ?Worker - { - return static::$worker; - } - - /** - * Find Route. - * @param TcpConnection $connection - * @param string $path - * @param string $key - * @param $request - * @param $status - * @return bool - * @throws ContainerExceptionInterface - * @throws NotFoundExceptionInterface - * @throws ReflectionException|Throwable - */ - protected static function findRoute(TcpConnection $connection, string $path, string $key, $request, &$status): bool - { - $routeInfo = Route::dispatch($request->method(), $path); - if ($routeInfo[0] === Dispatcher::FOUND) { - $status = 200; - $routeInfo[0] = 'route'; - $callback = $routeInfo[1]['callback']; - $route = clone $routeInfo[1]['route']; - $app = $controller = $action = ''; - $args = !empty($routeInfo[2]) ? $routeInfo[2] : []; - if ($args) { - $route->setParams($args); - } - if (is_array($callback)) { - $controller = $callback[0]; - $plugin = static::getPluginByClass($controller); - $app = static::getAppByController($controller); - $action = static::getRealMethod($controller, $callback[1]) ?? ''; - } else { - $plugin = static::getPluginByPath($path); - } - $callback = static::getCallback($plugin, $app, $callback, $args, true, $route); - static::collectCallbacks($key, [$callback, $plugin, $app, $controller ?: '', $action, $route]); - [$callback, $request->plugin, $request->app, $request->controller, $request->action, $request->route] = static::$callbacks[$key]; - static::send($connection, $callback($request), $request); - return true; - } - $status = $routeInfo[0] === Dispatcher::METHOD_NOT_ALLOWED ? 405 : 404; - return false; - } - - /** - * Find File. - * @param TcpConnection $connection - * @param string $path - * @param string $key - * @param $request - * @return bool - * @throws ContainerExceptionInterface - * @throws NotFoundExceptionInterface - * @throws ReflectionException - */ - protected static function findFile(TcpConnection $connection, string $path, string $key, $request): bool - { - if (preg_match('/%[0-9a-f]{2}/i', $path)) { - $path = urldecode($path); - if (static::unsafeUri($connection, $path, $request)) { - return true; - } - } - - $pathExplodes = explode('/', trim($path, '/')); - $plugin = ''; - if (isset($pathExplodes[1]) && $pathExplodes[0] === 'app') { - $plugin = $pathExplodes[1]; - $publicDir = static::config($plugin, 'app.public_path') ?: BASE_PATH . "/plugin/$pathExplodes[1]/public"; - $path = substr($path, strlen("/app/$pathExplodes[1]/")); - } else { - $publicDir = static::$publicPath; - } - $file = "$publicDir/$path"; - if (!is_file($file)) { - return false; - } - - if (pathinfo($file, PATHINFO_EXTENSION) === 'php') { - if (!static::config($plugin, 'app.support_php_files', false)) { - return false; - } - static::collectCallbacks($key, [function () use ($file) { - return static::execPhpFile($file); - }, '', '', '', '', null]); - [, $request->plugin, $request->app, $request->controller, $request->action, $request->route] = static::$callbacks[$key]; - static::send($connection, static::execPhpFile($file), $request); - return true; - } - - if (!static::config($plugin, 'static.enable', false)) { - return false; - } - - static::collectCallbacks($key, [static::getCallback($plugin, '__static__', function ($request) use ($file, $plugin) { - clearstatcache(true, $file); - if (!is_file($file)) { - $callback = static::getFallback($plugin); - return $callback($request); - } - return (new Response())->file($file); - }, [], false), '', '', '', '', null]); - [$callback, $request->plugin, $request->app, $request->controller, $request->action, $request->route] = static::$callbacks[$key]; - static::send($connection, $callback($request), $request); - return true; - } - - /** - * Send. - * @param TcpConnection|mixed $connection - * @param mixed|Response $response - * @param Request|mixed $request - * @return void - */ - protected static function send($connection, $response, $request) - { - Context::destroy(); - $keepAlive = $request->header('connection'); - if (($keepAlive === null && $request->protocolVersion() === '1.1') - || $keepAlive === 'keep-alive' || $keepAlive === 'Keep-Alive' - || (is_a($response, Response::class) && $response->getHeader('Transfer-Encoding') === 'chunked') - ) { - $connection->send($response); - return; - } - $connection->close($response); - } - - /** - * ParseControllerAction. - * @param string $path - * @return array|false - * @throws ReflectionException - */ - protected static function parseControllerAction(string $path) - { - $path = str_replace(['-', '//'], ['', '/'], $path); - static $cache = []; - if (isset($cache[$path])) { - return $cache[$path]; - } - $pathExplode = explode('/', trim($path, '/')); - $isPlugin = isset($pathExplode[1]) && $pathExplode[0] === 'app'; - $configPrefix = $isPlugin ? "plugin.$pathExplode[1]." : ''; - $pathPrefix = $isPlugin ? "/app/$pathExplode[1]" : ''; - $classPrefix = $isPlugin ? "plugin\\$pathExplode[1]" : ''; - $suffix = Config::get("{$configPrefix}app.controller_suffix", ''); - $relativePath = trim(substr($path, strlen($pathPrefix)), '/'); - $pathExplode = $relativePath ? explode('/', $relativePath) : []; - - $action = 'index'; - if (!$controllerAction = static::guessControllerAction($pathExplode, $action, $suffix, $classPrefix)) { - if (count($pathExplode) <= 1) { - return false; - } - $action = end($pathExplode); - unset($pathExplode[count($pathExplode) - 1]); - $controllerAction = static::guessControllerAction($pathExplode, $action, $suffix, $classPrefix); - } - if ($controllerAction && !isset($path[256])) { - $cache[$path] = $controllerAction; - if (count($cache) > 1024) { - unset($cache[key($cache)]); - } - } - return $controllerAction; - } - - /** - * GuessControllerAction. - * @param $pathExplode - * @param $action - * @param $suffix - * @param $classPrefix - * @return array|false - * @throws ReflectionException - */ - protected static function guessControllerAction($pathExplode, $action, $suffix, $classPrefix) - { - $map[] = trim("$classPrefix\\app\\controller\\" . implode('\\', $pathExplode), '\\'); - foreach ($pathExplode as $index => $section) { - $tmp = $pathExplode; - array_splice($tmp, $index, 1, [$section, 'controller']); - $map[] = trim("$classPrefix\\" . implode('\\', array_merge(['app'], $tmp)), '\\'); - } - foreach ($map as $item) { - $map[] = $item . '\\index'; - } - foreach ($map as $controllerClass) { - // Remove xx\xx\controller - if (substr($controllerClass, -11) === '\\controller') { - continue; - } - $controllerClass .= $suffix; - if ($controllerAction = static::getControllerAction($controllerClass, $action)) { - return $controllerAction; - } - } - return false; - } - - /** - * GetControllerAction. - * @param string $controllerClass - * @param string $action - * @return array|false - * @throws ReflectionException - */ - protected static function getControllerAction(string $controllerClass, string $action) - { - // Disable calling magic methods - if (strpos($action, '__') === 0) { - return false; - } - if (($controllerClass = static::getController($controllerClass)) && ($action = static::getAction($controllerClass, $action))) { - return [ - 'plugin' => static::getPluginByClass($controllerClass), - 'app' => static::getAppByController($controllerClass), - 'controller' => $controllerClass, - 'action' => $action - ]; - } - return false; - } - - /** - * GetController. - * @param string $controllerClass - * @return string|false - * @throws ReflectionException - */ - protected static function getController(string $controllerClass) - { - if (class_exists($controllerClass)) { - return (new ReflectionClass($controllerClass))->name; - } - $explodes = explode('\\', strtolower(ltrim($controllerClass, '\\'))); - $basePath = $explodes[0] === 'plugin' ? BASE_PATH . '/plugin' : static::$appPath; - unset($explodes[0]); - $fileName = array_pop($explodes) . '.php'; - $found = true; - foreach ($explodes as $pathSection) { - if (!$found) { - break; - } - $dirs = Util::scanDir($basePath, false); - $found = false; - foreach ($dirs as $name) { - $path = "$basePath/$name"; - - if (is_dir($path) && strtolower($name) === $pathSection) { - $basePath = $path; - $found = true; - break; - } - } - } - if (!$found) { - return false; - } - foreach (scandir($basePath) ?: [] as $name) { - if (strtolower($name) === $fileName) { - require_once "$basePath/$name"; - if (class_exists($controllerClass, false)) { - return (new ReflectionClass($controllerClass))->name; - } - } - } - return false; - } - - /** - * GetAction. - * @param string $controllerClass - * @param string $action - * @return string|false - */ - protected static function getAction(string $controllerClass, string $action) - { - $methods = get_class_methods($controllerClass); - $lowerAction = strtolower($action); - $found = false; - foreach ($methods as $candidate) { - if (strtolower($candidate) === $lowerAction) { - $action = $candidate; - $found = true; - break; - } - } - if ($found) { - return $action; - } - // Action is not public method - if (method_exists($controllerClass, $action)) { - return false; - } - if (method_exists($controllerClass, '__call')) { - return $action; - } - return false; - } - - /** - * GetPluginByClass. - * @param string $controllerClass - * @return mixed|string - */ - public static function getPluginByClass(string $controllerClass) - { - $controllerClass = trim($controllerClass, '\\'); - $tmp = explode('\\', $controllerClass, 3); - if ($tmp[0] !== 'plugin') { - return ''; - } - return $tmp[1] ?? ''; - } - - /** - * GetPluginByPath. - * @param string $path - * @return mixed|string - */ - public static function getPluginByPath(string $path) - { - $path = trim($path, '/'); - $tmp = explode('/', $path, 3); - if ($tmp[0] !== 'app') { - return ''; - } - $plugin = $tmp[1] ?? ''; - if ($plugin && !static::config('', "plugin.$plugin.app")) { - return ''; - } - return $plugin; - } - - /** - * GetAppByController. - * @param string $controllerClass - * @return mixed|string - */ - protected static function getAppByController(string $controllerClass) - { - $controllerClass = trim($controllerClass, '\\'); - $tmp = explode('\\', $controllerClass, 5); - $pos = $tmp[0] === 'plugin' ? 3 : 1; - if (!isset($tmp[$pos])) { - return ''; - } - return strtolower($tmp[$pos]) === 'controller' ? '' : $tmp[$pos]; - } - - /** - * ExecPhpFile. - * @param string $file - * @return false|string - */ - public static function execPhpFile(string $file) - { - ob_start(); - // Try to include php file. - try { - include $file; - } catch (Exception $e) { - echo $e; - } - return ob_get_clean(); - } - - /** - * GetRealMethod. - * @param string $class - * @param string $method - * @return string - */ - protected static function getRealMethod(string $class, string $method): string - { - $method = strtolower($method); - $methods = get_class_methods($class); - foreach ($methods as $candidate) { - if (strtolower($candidate) === $method) { - return $candidate; - } - } - return $method; - } - - /** - * Config. - * @param string $plugin - * @param string $key - * @param mixed $default - * @return mixed - */ - protected static function config(string $plugin, string $key, mixed $default = null) - { - return Config::get($plugin ? "plugin.$plugin.$key" : $key, $default); - } - - - /** - * @param mixed $data - * @return string - */ - protected static function stringify($data): string - { - $type = gettype($data); - switch ($type) { - case 'boolean': - return $data ? 'true' : 'false'; - case 'NULL': - return 'NULL'; - case 'array': - return 'Array'; - case 'object': - if (!method_exists($data, '__toString')) { - return 'Object'; - } - default: - return (string)$data; - } - } -} diff --git a/vendor/workerman/webman-framework/src/Bootstrap.php b/vendor/workerman/webman-framework/src/Bootstrap.php deleted file mode 100644 index 50774a1..0000000 --- a/vendor/workerman/webman-framework/src/Bootstrap.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman; - -use Workerman\Worker; - -interface Bootstrap -{ - /** - * onWorkerStart - * - * @param Worker|null $worker - * @return mixed - */ - public static function start(?Worker $worker); -} diff --git a/vendor/workerman/webman-framework/src/Config.php b/vendor/workerman/webman-framework/src/Config.php deleted file mode 100644 index 7d3fe1f..0000000 --- a/vendor/workerman/webman-framework/src/Config.php +++ /dev/null @@ -1,296 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman; - -use FilesystemIterator; -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; -use function array_replace_recursive; -use function array_reverse; -use function count; -use function explode; -use function in_array; -use function is_array; -use function is_dir; -use function is_file; -use function key; -use function str_replace; - -class Config -{ - - /** - * @var array - */ - protected static $config = []; - - /** - * @var string - */ - protected static $configPath = ''; - - /** - * @var bool - */ - protected static $loaded = false; - - /** - * Load. - * @param string $configPath - * @param array $excludeFile - * @param string|null $key - * @return void - */ - public static function load(string $configPath, array $excludeFile = [], ?string $key = null) - { - static::$configPath = $configPath; - if (!$configPath) { - return; - } - static::$loaded = false; - $config = static::loadFromDir($configPath, $excludeFile); - if (!$config) { - static::$loaded = true; - return; - } - if ($key !== null) { - foreach (array_reverse(explode('.', $key)) as $k) { - $config = [$k => $config]; - } - } - static::$config = array_replace_recursive(static::$config, $config); - static::formatConfig(); - static::$loaded = true; - } - - /** - * This deprecated method will certainly be removed in the future. - * @param string $configPath - * @param array $excludeFile - * @return void - * @deprecated - */ - public static function reload(string $configPath, array $excludeFile = []) - { - static::load($configPath, $excludeFile); - } - - /** - * Clear. - * @return void - */ - public static function clear() - { - static::$config = []; - } - - /** - * FormatConfig. - * @return void - */ - protected static function formatConfig() - { - $config = static::$config; - // Merge log config - foreach ($config['plugin'] ?? [] as $firm => $projects) { - if (isset($projects['app'])) { - foreach ($projects['log'] ?? [] as $key => $item) { - $config['log']["plugin.$firm.$key"] = $item; - } - } - foreach ($projects as $name => $project) { - if (!is_array($project)) { - continue; - } - foreach ($project['log'] ?? [] as $key => $item) { - $config['log']["plugin.$firm.$name.$key"] = $item; - } - } - } - // Merge database config - foreach ($config['plugin'] ?? [] as $firm => $projects) { - if (isset($projects['app'])) { - foreach ($projects['database']['connections'] ?? [] as $key => $connection) { - $config['database']['connections']["plugin.$firm.$key"] = $connection; - } - } - foreach ($projects as $name => $project) { - if (!is_array($project)) { - continue; - } - foreach ($project['database']['connections'] ?? [] as $key => $connection) { - $config['database']['connections']["plugin.$firm.$name.$key"] = $connection; - } - } - } - if (!empty($config['database']['connections'])) { - $config['database']['default'] = $config['database']['default'] ?? key($config['database']['connections']); - } - // Merge thinkorm config - foreach ($config['plugin'] ?? [] as $firm => $projects) { - if (isset($projects['app'])) { - foreach ($projects['thinkorm']['connections'] ?? [] as $key => $connection) { - $config['thinkorm']['connections']["plugin.$firm.$key"] = $connection; - } - } - foreach ($projects as $name => $project) { - if (!is_array($project)) { - continue; - } - foreach ($project['thinkorm']['connections'] ?? [] as $key => $connection) { - $config['thinkorm']['connections']["plugin.$firm.$name.$key"] = $connection; - } - } - } - if (!empty($config['thinkorm']['connections'])) { - $config['thinkorm']['default'] = $config['thinkorm']['default'] ?? key($config['thinkorm']['connections']); - } - // Merge redis config - foreach ($config['plugin'] ?? [] as $firm => $projects) { - if (isset($projects['app'])) { - foreach ($projects['redis'] ?? [] as $key => $connection) { - $config['redis']["plugin.$firm.$key"] = $connection; - } - } - foreach ($projects as $name => $project) { - if (!is_array($project)) { - continue; - } - foreach ($project['redis'] ?? [] as $key => $connection) { - $config['redis']["plugin.$firm.$name.$key"] = $connection; - } - } - } - static::$config = $config; - } - - /** - * LoadFromDir. - * @param string $configPath - * @param array $excludeFile - * @return array - */ - public static function loadFromDir(string $configPath, array $excludeFile = []): array - { - $allConfig = []; - $dirIterator = new RecursiveDirectoryIterator($configPath, FilesystemIterator::FOLLOW_SYMLINKS); - $iterator = new RecursiveIteratorIterator($dirIterator); - foreach ($iterator as $file) { - /** var SplFileInfo $file */ - if (is_dir($file) || $file->getExtension() != 'php' || in_array($file->getBaseName('.php'), $excludeFile)) { - continue; - } - $appConfigFile = $file->getPath() . '/app.php'; - if (!is_file($appConfigFile)) { - continue; - } - $relativePath = str_replace($configPath . DIRECTORY_SEPARATOR, '', substr($file, 0, -4)); - $explode = array_reverse(explode(DIRECTORY_SEPARATOR, $relativePath)); - if (count($explode) >= 2) { - $appConfig = include $appConfigFile; - if (empty($appConfig['enable'])) { - continue; - } - } - $config = include $file; - foreach ($explode as $section) { - $tmp = []; - $tmp[$section] = $config; - $config = $tmp; - } - $allConfig = array_replace_recursive($allConfig, $config); - } - return $allConfig; - } - - /** - * Get. - * @param string|null $key - * @param mixed $default - * @return mixed - */ - public static function get(?string $key = null, mixed $default = null) - { - if ($key === null) { - return static::$config; - } - $keyArray = explode('.', $key); - $value = static::$config; - $found = true; - foreach ($keyArray as $index) { - if (!isset($value[$index])) { - if (static::$loaded) { - return $default; - } - $found = false; - break; - } - $value = $value[$index]; - } - if ($found) { - return $value; - } - return static::read($key, $default); - } - - /** - * Read. - * @param string $key - * @param mixed $default - * @return mixed - */ - protected static function read(string $key, mixed $default = null) - { - $path = static::$configPath; - if ($path === '') { - return $default; - } - $keys = $keyArray = explode('.', $key); - foreach ($keyArray as $index => $section) { - unset($keys[$index]); - if (is_file($file = "$path/$section.php")) { - $config = include $file; - return static::find($keys, $config, $default); - } - if (!is_dir($path = "$path/$section")) { - return $default; - } - } - return $default; - } - - /** - * Find. - * @param array $keyArray - * @param mixed $stack - * @param mixed $default - * @return array|mixed - */ - protected static function find(array $keyArray, $stack, $default) - { - if (!is_array($stack)) { - return $default; - } - $value = $stack; - foreach ($keyArray as $index) { - if (!isset($value[$index])) { - return $default; - } - $value = $value[$index]; - } - return $value; - } - -} diff --git a/vendor/workerman/webman-framework/src/Container.php b/vendor/workerman/webman-framework/src/Container.php deleted file mode 100644 index ef39377..0000000 --- a/vendor/workerman/webman-framework/src/Container.php +++ /dev/null @@ -1,84 +0,0 @@ -instances[$name])) { - if (isset($this->definitions[$name])) { - $this->instances[$name] = call_user_func($this->definitions[$name], $this); - } else { - if (!class_exists($name)) { - throw new NotFoundException("Class '$name' not found"); - } - $this->instances[$name] = new $name(); - } - } - return $this->instances[$name]; - } - - /** - * Has. - * @param string $name - * @return bool - */ - public function has(string $name): bool - { - return array_key_exists($name, $this->instances) - || array_key_exists($name, $this->definitions); - } - - /** - * Make. - * @param string $name - * @param array $constructor - * @return mixed - * @throws NotFoundException - */ - public function make(string $name, array $constructor = []) - { - if (!class_exists($name)) { - throw new NotFoundException("Class '$name' not found"); - } - return new $name(... array_values($constructor)); - } - - /** - * AddDefinitions. - * @param array $definitions - * @return $this - */ - public function addDefinitions(array $definitions): Container - { - $this->definitions = array_merge($this->definitions, $definitions); - return $this; - } - -} diff --git a/vendor/workerman/webman-framework/src/Context.php b/vendor/workerman/webman-framework/src/Context.php deleted file mode 100644 index 8e3b9fa..0000000 --- a/vendor/workerman/webman-framework/src/Context.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Exception; - -use RuntimeException; -use Throwable; -use Webman\Http\Request; -use Webman\Http\Response; -use function json_encode; - -/** - * Class BusinessException - * @package support\exception - */ -class BusinessException extends RuntimeException -{ - - /** - * @var array - */ - protected $data = []; - - /** - * @var bool - */ - protected $debug = false; - - /** - * Render an exception into an HTTP response. - * @param Request $request - * @return Response|null - */ - public function render(Request $request): ?Response - { - if ($request->expectsJson()) { - $code = $this->getCode(); - $json = ['code' => $code ?: 500, 'msg' => $this->getMessage(), 'data' => $this->data]; - return new Response(200, ['Content-Type' => 'application/json'], - json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); - } - return new Response(200, [], $this->getMessage()); - } - - /** - * Set data. - * @param array|null $data - * @return array|$this - */ - public function data(?array $data = null): array|static - { - if ($data === null) { - return $this->data; - } - $this->data = $data; - return $this; - } - - /** - * Set debug. - * @param bool|null $value - * @return $this|bool - */ - public function debug(?bool $value = null): bool|static - { - if ($value === null) { - return $this->debug; - } - $this->debug = $value; - return $this; - } - - /** - * Get data. - * @return array - */ - public function getData(): array - { - return $this->data; - } - - /** - * Translate message. - * @param string $message - * @param array $parameters - * @param string|null $domain - * @param string|null $locale - * @return string - */ - protected function trans(string $message, array $parameters = [], ?string $domain = null, ?string $locale = null): string - { - $args = []; - foreach ($parameters as $key => $parameter) { - $args[":$key"] = $parameter; - } - try { - $message = trans($message, $args, $domain, $locale); - } catch (Throwable $e) { - } - foreach ($parameters as $key => $value) { - $message = str_replace(":$key", $value, $message); - } - return $message; - } - -} diff --git a/vendor/workerman/webman-framework/src/Exception/ExceptionHandler.php b/vendor/workerman/webman-framework/src/Exception/ExceptionHandler.php deleted file mode 100644 index ea8de87..0000000 --- a/vendor/workerman/webman-framework/src/Exception/ExceptionHandler.php +++ /dev/null @@ -1,121 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Exception; - -use Psr\Log\LoggerInterface; -use Throwable; -use Webman\Http\Request; -use Webman\Http\Response; -use function json_encode; -use function nl2br; -use function trim; - -/** - * Class Handler - * @package support\exception - */ -class ExceptionHandler implements ExceptionHandlerInterface -{ - /** - * @var LoggerInterface - */ - protected $logger = null; - - /** - * @var bool - */ - protected $debug = false; - - /** - * @var array - */ - public $dontReport = []; - - /** - * ExceptionHandler constructor. - * @param $logger - * @param $debug - */ - public function __construct($logger, $debug) - { - $this->logger = $logger; - $this->debug = $debug; - } - - /** - * @param Throwable $exception - * @return void - */ - public function report(Throwable $exception) - { - if ($this->shouldntReport($exception)) { - return; - } - $logs = ''; - if ($request = \request()) { - $logs = $request->getRealIp() . ' ' . $request->method() . ' ' . trim($request->fullUrl(), '/'); - } - $this->logger->error($logs . PHP_EOL . $exception); - } - - /** - * @param Request $request - * @param Throwable $exception - * @return Response - */ - public function render(Request $request, Throwable $exception): Response - { - if (method_exists($exception, 'render') && ($response = $exception->render($request))) { - return $response; - } - $code = $exception->getCode(); - if ($request->expectsJson()) { - $json = ['code' => $code ?: 500, 'msg' => $this->debug ? $exception->getMessage() : 'Server internal error']; - $this->debug && $json['traces'] = (string)$exception; - return new Response(200, ['Content-Type' => 'application/json'], - json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); - } - $error = $this->debug ? nl2br((string)$exception) : 'Server internal error'; - return new Response(500, [], $error); - } - - /** - * @param Throwable $e - * @return bool - */ - protected function shouldntReport(Throwable $e): bool - { - foreach ($this->dontReport as $type) { - if ($e instanceof $type) { - return true; - } - } - return false; - } - - /** - * Compatible $this->_debug - * - * @param string $name - * @return bool|null - */ - public function __get(string $name) - { - if ($name === '_debug') { - return $this->debug; - } - return null; - } -} diff --git a/vendor/workerman/webman-framework/src/Exception/ExceptionHandlerInterface.php b/vendor/workerman/webman-framework/src/Exception/ExceptionHandlerInterface.php deleted file mode 100644 index 8868707..0000000 --- a/vendor/workerman/webman-framework/src/Exception/ExceptionHandlerInterface.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Exception; - -use Throwable; -use Webman\Http\Request; -use Webman\Http\Response; - -interface ExceptionHandlerInterface -{ - /** - * @param Throwable $exception - * @return mixed - */ - public function report(Throwable $exception); - - /** - * @param Request $request - * @param Throwable $exception - * @return Response - */ - public function render(Request $request, Throwable $exception): Response; -} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/Exception/FileException.php b/vendor/workerman/webman-framework/src/Exception/FileException.php deleted file mode 100644 index fa5dbe6..0000000 --- a/vendor/workerman/webman-framework/src/Exception/FileException.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Exception; - -use RuntimeException; - -/** - * Class FileException - * @package Webman\Exception - */ -class FileException extends RuntimeException -{ -} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/Exception/NotFoundException.php b/vendor/workerman/webman-framework/src/Exception/NotFoundException.php deleted file mode 100644 index 735c1d4..0000000 --- a/vendor/workerman/webman-framework/src/Exception/NotFoundException.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Exception; - -use Psr\Container\NotFoundExceptionInterface; - -/** - * Class NotFoundException - * @package Webman\Exception - */ -class NotFoundException extends \Exception implements NotFoundExceptionInterface -{ -} diff --git a/vendor/workerman/webman-framework/src/File.php b/vendor/workerman/webman-framework/src/File.php deleted file mode 100644 index a43328c..0000000 --- a/vendor/workerman/webman-framework/src/File.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman; - -use SplFileInfo; -use Webman\Exception\FileException; -use function chmod; -use function is_dir; -use function mkdir; -use function pathinfo; -use function restore_error_handler; -use function set_error_handler; -use function sprintf; -use function strip_tags; -use function umask; - -class File extends SplFileInfo -{ - - /** - * Move. - * @param string $destination - * @return File - */ - public function move(string $destination): File - { - set_error_handler(function ($type, $msg) use (&$error) { - $error = $msg; - }); - $path = pathinfo($destination, PATHINFO_DIRNAME); - if (!is_dir($path) && !mkdir($path, 0777, true)) { - restore_error_handler(); - throw new FileException(sprintf('Unable to create the "%s" directory (%s)', $path, strip_tags($error))); - } - if (!rename($this->getPathname(), $destination)) { - restore_error_handler(); - throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $destination, strip_tags($error))); - } - restore_error_handler(); - @chmod($destination, 0666 & ~umask()); - return new self($destination); - } - -} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/Http/Request.php b/vendor/workerman/webman-framework/src/Http/Request.php deleted file mode 100644 index 0519425..0000000 --- a/vendor/workerman/webman-framework/src/Http/Request.php +++ /dev/null @@ -1,409 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Http; - -use Webman\Route\Route; -use function current; -use function filter_var; -use function ip2long; -use function is_array; -use function strpos; -use const FILTER_FLAG_IPV4; -use const FILTER_FLAG_NO_PRIV_RANGE; -use const FILTER_FLAG_NO_RES_RANGE; -use const FILTER_VALIDATE_IP; - -/** - * Class Request - * @package Webman\Http - */ -class Request extends \Workerman\Protocols\Http\Request -{ - /** - * @var string - */ - public $plugin = null; - - /** - * @var string - */ - public $app = null; - - /** - * @var string - */ - public $controller = null; - - /** - * @var string - */ - public $action = null; - - /** - * @var Route - */ - public $route = null; - - /** - * @var bool - */ - protected $isDirty = false; - - /** - * @return mixed|null - */ - public function all() - { - return $this->get() + $this->post(); - } - - /** - * Input - * @param string $name - * @param mixed $default - * @return mixed - */ - public function input(string $name, mixed $default = null) - { - return $this->get($name, $this->post($name, $default)); - } - - /** - * Only - * @param array $keys - * @return array - */ - public function only(array $keys): array - { - $all = $this->all(); - $result = []; - foreach ($keys as $key) { - if (isset($all[$key])) { - $result[$key] = $all[$key]; - } - } - return $result; - } - - /** - * Except - * @param array $keys - * @return mixed|null - */ - public function except(array $keys) - { - $all = $this->all(); - foreach ($keys as $key) { - unset($all[$key]); - } - return $all; - } - - /** - * File - * @param string|null $name - * @return UploadFile|UploadFile[]|null - */ - public function file(?string $name = null): array|null|UploadFile - { - $files = parent::file($name); - if (null === $files) { - return $name === null ? [] : null; - } - if ($name !== null) { - // Multi files - if (is_array(current($files))) { - return $this->parseFiles($files); - } - return $this->parseFile($files); - } - $uploadFiles = []; - foreach ($files as $name => $file) { - // Multi files - if (is_array(current($file))) { - $uploadFiles[$name] = $this->parseFiles($file); - } else { - $uploadFiles[$name] = $this->parseFile($file); - } - } - return $uploadFiles; - } - - /** - * ParseFile - * @param array $file - * @return UploadFile - */ - protected function parseFile(array $file): UploadFile - { - return new UploadFile($file['tmp_name'], $file['name'], $file['type'], $file['error']); - } - - /** - * ParseFiles - * @param array $files - * @return array - */ - protected function parseFiles(array $files): array - { - $uploadFiles = []; - foreach ($files as $key => $file) { - if (is_array(current($file))) { - $uploadFiles[$key] = $this->parseFiles($file); - } else { - $uploadFiles[$key] = $this->parseFile($file); - } - } - return $uploadFiles; - } - - /** - * GetRemoteIp - * @return string - */ - public function getRemoteIp(): string - { - return $this->connection ? $this->connection->getRemoteIp() : '0.0.0.0'; - } - - /** - * GetRemotePort - * @return int - */ - public function getRemotePort(): int - { - return $this->connection ? $this->connection->getRemotePort() : 0; - } - - /** - * GetLocalIp - * @return string - */ - public function getLocalIp(): string - { - return $this->connection ? $this->connection->getLocalIp() : '0.0.0.0'; - } - - /** - * GetLocalPort - * @return int - */ - public function getLocalPort(): int - { - return $this->connection ? $this->connection->getLocalPort() : 0; - } - - /** - * GetRealIp - * @param bool $safeMode - * @return string - */ - public function getRealIp(bool $safeMode = true): string - { - $remoteIp = $this->getRemoteIp(); - if ($safeMode && !static::isIntranetIp($remoteIp)) { - return $remoteIp; - } - $ip = $this->header('x-forwarded-for') - ?? $this->header('x-real-ip') - ?? $this->header('client-ip') - ?? $this->header('x-client-ip') - ?? $this->header('via') - ?? $remoteIp; - if (is_string($ip)) { - $ip = current(explode(',', $ip)); - } - return filter_var($ip, FILTER_VALIDATE_IP) ? $ip : $remoteIp; - } - - /** - * Url - * @return string - */ - public function url(): string - { - return '//' . $this->host() . $this->path(); - } - - /** - * FullUrl - * @return string - */ - public function fullUrl(): string - { - return '//' . $this->host() . $this->uri(); - } - - /** - * IsAjax - * @return bool - */ - public function isAjax(): bool - { - return $this->header('X-Requested-With') === 'XMLHttpRequest'; - } - - /** - * IsGet - * @return bool - */ - public function isGet(): bool - { - return $this->method() === 'GET'; - } - - - /** - * IsPost - * @return bool - */ - public function isPost(): bool - { - return $this->method() === 'POST'; - } - - - /** - * IsPjax - * @return bool - */ - public function isPjax(): bool - { - return (bool)$this->header('X-PJAX'); - } - - /** - * ExpectsJson - * @return bool - */ - public function expectsJson(): bool - { - return ($this->isAjax() && !$this->isPjax()) || $this->acceptJson(); - } - - /** - * AcceptJson - * @return bool - */ - public function acceptJson(): bool - { - return false !== strpos($this->header('accept', ''), 'json'); - } - - /** - * IsIntranetIp - * @param string $ip - * @return bool - */ - public static function isIntranetIp(string $ip): bool - { - // Not validate ip . - if (!filter_var($ip, FILTER_VALIDATE_IP)) { - return false; - } - // Is intranet ip ? For IPv4, the result of false may not be accurate, so we need to check it manually later . - if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { - return true; - } - // Manual check only for IPv4 . - if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { - return false; - } - // Manual check . - $reservedIps = [ - 1681915904 => 1686110207, // 100.64.0.0 - 100.127.255.255 - 3221225472 => 3221225727, // 192.0.0.0 - 192.0.0.255 - 3221225984 => 3221226239, // 192.0.2.0 - 192.0.2.255 - 3227017984 => 3227018239, // 192.88.99.0 - 192.88.99.255 - 3323068416 => 3323199487, // 198.18.0.0 - 198.19.255.255 - 3325256704 => 3325256959, // 198.51.100.0 - 198.51.100.255 - 3405803776 => 3405804031, // 203.0.113.0 - 203.0.113.255 - 3758096384 => 4026531839, // 224.0.0.0 - 239.255.255.255 - ]; - $ipLong = ip2long($ip); - foreach ($reservedIps as $ipStart => $ipEnd) { - if (($ipLong >= $ipStart) && ($ipLong <= $ipEnd)) { - return true; - } - } - return false; - } - - /** - * Set get. - * @param array|string $input - * @param mixed $value - * @return Request - */ - public function setGet(array|string $input, mixed $value = null): Request - { - $this->isDirty = true; - $input = is_array($input) ? $input : array_merge($this->get(), [$input => $value]); - if (isset($this->data)) { - $this->data['get'] = $input; - } else { - $this->_data['get'] = $input; - } - return $this; - } - - /** - * Set post. - * @param array|string $input - * @param mixed $value - * @return Request - */ - public function setPost(array|string $input, mixed $value = null): Request - { - $this->isDirty = true; - $input = is_array($input) ? $input : array_merge($this->post(), [$input => $value]); - if (isset($this->data)) { - $this->data['post'] = $input; - } else { - $this->_data['post'] = $input; - } - return $this; - } - - /** - * Set header. - * @param array|string $input - * @param mixed $value - * @return Request - */ - public function setHeader(array|string $input, mixed $value = null): Request - { - $this->isDirty = true; - $input = is_array($input) ? $input : array_merge($this->header(), [$input => $value]); - if (isset($this->data)) { - $this->data['headers'] = $input; - } else { - $this->_data['headers'] = $input; - } - return $this; - } - - /** - * Destroy - */ - public function destroy(): void - { - if ($this->isDirty) { - unset($this->data['get'], $this->data['post'], $this->data['headers']); - } - parent::destroy(); - } - -} diff --git a/vendor/workerman/webman-framework/src/Http/Response.php b/vendor/workerman/webman-framework/src/Http/Response.php deleted file mode 100644 index 541829e..0000000 --- a/vendor/workerman/webman-framework/src/Http/Response.php +++ /dev/null @@ -1,87 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Http; - -use Throwable; -use Webman\App; -use function filemtime; -use function gmdate; - -/** - * Class Response - * @package Webman\Http - */ -class Response extends \Workerman\Protocols\Http\Response -{ - /** - * @var Throwable - */ - protected $exception = null; - - /** - * File - * @param string $file - * @return $this - */ - public function file(string $file): Response - { - if ($this->notModifiedSince($file)) { - return $this->withStatus(304); - } - return $this->withFile($file); - } - - /** - * Download - * @param string $file - * @param string $downloadName - * @return $this - */ - public function download(string $file, string $downloadName = ''): Response - { - $this->withFile($file); - if ($downloadName) { - $this->header('Content-Disposition', "attachment; filename=\"$downloadName\""); - } - return $this; - } - - /** - * NotModifiedSince - * @param string $file - * @return bool - */ - protected function notModifiedSince(string $file): bool - { - $ifModifiedSince = App::request()->header('if-modified-since'); - if ($ifModifiedSince === null || !is_file($file) || !($mtime = filemtime($file))) { - return false; - } - return $ifModifiedSince === gmdate('D, d M Y H:i:s', $mtime) . ' GMT'; - } - - /** - * Exception - * @param Throwable|null $exception - * @return Throwable|null - */ - public function exception(?Throwable $exception = null): ?Throwable - { - if ($exception) { - $this->exception = $exception; - } - return $this->exception; - } -} diff --git a/vendor/workerman/webman-framework/src/Http/UploadFile.php b/vendor/workerman/webman-framework/src/Http/UploadFile.php deleted file mode 100644 index 8a63421..0000000 --- a/vendor/workerman/webman-framework/src/Http/UploadFile.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Http; - -use Webman\File; -use function pathinfo; - -/** - * Class UploadFile - * @package Webman\Http - */ -class UploadFile extends File -{ - /** - * @var string - */ - protected $uploadName = null; - - /** - * @var string - */ - protected $uploadMimeType = null; - - /** - * @var int - */ - protected $uploadErrorCode = null; - - /** - * UploadFile constructor. - * - * @param string $fileName - * @param string $uploadName - * @param string $uploadMimeType - * @param int $uploadErrorCode - */ - public function __construct(string $fileName, string $uploadName, string $uploadMimeType, int $uploadErrorCode) - { - $this->uploadName = $uploadName; - $this->uploadMimeType = $uploadMimeType; - $this->uploadErrorCode = $uploadErrorCode; - parent::__construct($fileName); - } - - /** - * GetUploadName - * @return string - */ - public function getUploadName(): ?string - { - return $this->uploadName; - } - - /** - * GetUploadMimeType - * @return string - */ - public function getUploadMimeType(): ?string - { - return $this->uploadMimeType; - } - - /** - * GetUploadExtension - * @return string - */ - public function getUploadExtension(): string - { - return pathinfo($this->uploadName, PATHINFO_EXTENSION); - } - - /** - * GetUploadErrorCode - * @return int - */ - public function getUploadErrorCode(): ?int - { - return $this->uploadErrorCode; - } - - /** - * IsValid - * @return bool - */ - public function isValid(): bool - { - return $this->uploadErrorCode === UPLOAD_ERR_OK; - } - - /** - * GetUploadMineType - * @return string - * @deprecated - */ - public function getUploadMineType(): ?string - { - return $this->uploadMimeType; - } -} diff --git a/vendor/workerman/webman-framework/src/Install.php b/vendor/workerman/webman-framework/src/Install.php deleted file mode 100644 index 346d6d4..0000000 --- a/vendor/workerman/webman-framework/src/Install.php +++ /dev/null @@ -1,78 +0,0 @@ - 'start.php', - 'windows.php' => 'windows.php', - 'support/bootstrap.php' => 'support/bootstrap.php', - ]; - - /** - * Install - * @return void - */ - public static function install() - { - static::installByRelation(); - static::removeLaravelDbFromBootstrap(); - } - - /** - * Uninstall - * @return void - */ - public static function uninstall() - { - - } - - /** - * InstallByRelation - * @return void - */ - public static function installByRelation() - { - foreach (static::$pathRelation as $source => $dest) { - $parentDir = base_path(dirname($dest)); - if (!is_dir($parentDir)) { - mkdir($parentDir, 0777, true); - } - $sourceFile = __DIR__ . "/$source"; - copy_dir($sourceFile, base_path($dest), true); - echo "Create $dest\r\n"; - if (is_file($sourceFile)) { - @unlink($sourceFile); - } - } - if (is_file($file = base_path('support/helpers.php'))) { - file_put_contents($file, " - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman; - - -use Closure; -use ReflectionAttribute; -use Webman\Route\Route; -use ReflectionClass; -use ReflectionMethod; -use RuntimeException; -use function array_merge; -use function array_reverse; -use function is_array; -use function method_exists; - -class Middleware -{ - - /** - * @var array - */ - protected static $instances = []; - - /** - * @param mixed $allMiddlewares - * @param string $plugin - * @return void - */ - public static function load($allMiddlewares, string $plugin = '') - { - if (!is_array($allMiddlewares)) { - return; - } - foreach ($allMiddlewares as $appName => $middlewares) { - if (!is_array($middlewares)) { - throw new RuntimeException('Bad middleware config'); - } - if ($appName === '@') { - $plugin = ''; - } - if (strpos($appName, 'plugin.') !== false) { - $explode = explode('.', $appName, 4); - $plugin = $explode[1]; - $appName = $explode[2] ?? ''; - } - foreach ($middlewares as $className) { - if (method_exists($className, 'process')) { - static::$instances[$plugin][$appName][] = [$className, 'process']; - } else { - // @todo Log - echo "middleware $className::process not exsits\n"; - } - } - } - } - - /** - * @param string $plugin - * @param string $appName - * @param string|array|Closure $controller - * @param Route|null $route - * @param bool $withGlobalMiddleware - * @return array - */ - public static function getMiddleware(string $plugin, string $appName, string|array|Closure $controller, Route|null $route, bool $withGlobalMiddleware = true): array - { - $isController = is_array($controller) && is_string($controller[0]); - $globalMiddleware = $withGlobalMiddleware ? static::$instances['']['@'] ?? [] : []; - $appGlobalMiddleware = $withGlobalMiddleware && isset(static::$instances[$plugin]['']) ? static::$instances[$plugin][''] : []; - $middlewares = $routeMiddlewares = []; - // Route middleware - if ($route) { - foreach (array_reverse($route->getMiddleware()) as $className) { - $routeMiddlewares[] = [$className, 'process']; - } - } - if ($isController && $controller[0] && class_exists($controller[0])) { - // Controller middleware annotation - $reflectionClass = new ReflectionClass($controller[0]); - self::prepareAttributeMiddlewares($middlewares, $reflectionClass); - // Controller middleware property - if ($reflectionClass->hasProperty('middleware')) { - $defaultProperties = $reflectionClass->getDefaultProperties(); - $middlewaresClasses = $defaultProperties['middleware']; - foreach ((array)$middlewaresClasses as $className) { - $middlewares[] = [$className, 'process']; - } - } - // Route middleware - $middlewares = array_merge($middlewares, $routeMiddlewares); - // Method middleware annotation - if ($reflectionClass->hasMethod($controller[1])) { - self::prepareAttributeMiddlewares($middlewares, $reflectionClass->getMethod($controller[1])); - } - } else { - // Route middleware - $middlewares = array_merge($middlewares, $routeMiddlewares); - } - if ($appName === '') { - return array_reverse(array_merge($globalMiddleware, $appGlobalMiddleware, $middlewares)); - } - $appMiddleware = static::$instances[$plugin][$appName] ?? []; - return array_reverse(array_merge($globalMiddleware, $appGlobalMiddleware, $appMiddleware, $middlewares)); - } - - /** - * @param array $middlewares - * @param ReflectionClass|ReflectionMethod $reflection - * @return void - */ - private static function prepareAttributeMiddlewares(array &$middlewares, ReflectionClass|ReflectionMethod $reflection): void - { - $middlewareAttributes = $reflection->getAttributes(Annotation\Middleware::class, ReflectionAttribute::IS_INSTANCEOF); - foreach ($middlewareAttributes as $middlewareAttribute) { - $middlewareAttributeInstance = $middlewareAttribute->newInstance(); - $middlewares = array_merge($middlewares, $middlewareAttributeInstance->getMiddlewares()); - } - } - - /** - * @return void - * @deprecated - */ - public static function container($_) - { - - } -} diff --git a/vendor/workerman/webman-framework/src/MiddlewareInterface.php b/vendor/workerman/webman-framework/src/MiddlewareInterface.php deleted file mode 100644 index 47c6d51..0000000 --- a/vendor/workerman/webman-framework/src/MiddlewareInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman; - -use Webman\Http\Request; -use Webman\Http\Response; - -interface MiddlewareInterface -{ - /** - * Process an incoming server request. - * - * Processes an incoming server request in order to produce a response. - * If unable to produce the response itself, it may delegate to the provided - * request handler to do so. - */ - public function process(Request $request, callable $handler): Response; -} diff --git a/vendor/workerman/webman-framework/src/Route.php b/vendor/workerman/webman-framework/src/Route.php deleted file mode 100644 index 70ced02..0000000 --- a/vendor/workerman/webman-framework/src/Route.php +++ /dev/null @@ -1,572 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman; - -use FastRoute\Dispatcher\GroupCountBased; -use FastRoute\RouteCollector; -use FilesystemIterator; -use Psr\Container\ContainerExceptionInterface; -use Psr\Container\NotFoundExceptionInterface; -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; -use ReflectionAttribute; -use ReflectionClass; -use ReflectionException; -use Webman\Annotation\DisableDefaultRoute; -use Webman\Route\Route as RouteObject; -use function array_diff; -use function array_values; -use function class_exists; -use function explode; -use function FastRoute\simpleDispatcher; -use function in_array; -use function is_array; -use function is_callable; -use function is_file; -use function is_scalar; -use function is_string; -use function json_encode; -use function method_exists; -use function strpos; - -/** - * Class Route - * @package Webman - */ -class Route -{ - /** - * @var Route - */ - protected static $instance = null; - - /** - * @var GroupCountBased - */ - protected static $dispatcher = null; - - /** - * @var RouteCollector - */ - protected static $collector = null; - - /** - * @var RouteObject[] - */ - protected static $fallbackRoutes = []; - - /** - * @var array - */ - protected static $fallback = []; - - /** - * @var array - */ - protected static $nameList = []; - - /** - * @var string - */ - protected static $groupPrefix = ''; - - /** - * @var bool - */ - protected static $disabledDefaultRoutes = []; - - /** - * @var array - */ - protected static $disabledDefaultRouteControllers = []; - - /** - * @var array - */ - protected static $disabledDefaultRouteActions = []; - - /** - * @var RouteObject[] - */ - protected static $allRoutes = []; - - /** - * @var RouteObject[] - */ - protected $routes = []; - - /** - * @var Route[] - */ - protected $children = []; - - /** - * @param string $path - * @param callable|mixed $callback - * @return RouteObject - */ - public static function get(string $path, $callback): RouteObject - { - return static::addRoute('GET', $path, $callback); - } - - /** - * @param string $path - * @param callable|mixed $callback - * @return RouteObject - */ - public static function post(string $path, $callback): RouteObject - { - return static::addRoute('POST', $path, $callback); - } - - /** - * @param string $path - * @param callable|mixed $callback - * @return RouteObject - */ - public static function put(string $path, $callback): RouteObject - { - return static::addRoute('PUT', $path, $callback); - } - - /** - * @param string $path - * @param callable|mixed $callback - * @return RouteObject - */ - public static function patch(string $path, $callback): RouteObject - { - return static::addRoute('PATCH', $path, $callback); - } - - /** - * @param string $path - * @param callable|mixed $callback - * @return RouteObject - */ - public static function delete(string $path, $callback): RouteObject - { - return static::addRoute('DELETE', $path, $callback); - } - - /** - * @param string $path - * @param callable|mixed $callback - * @return RouteObject - */ - public static function head(string $path, $callback): RouteObject - { - return static::addRoute('HEAD', $path, $callback); - } - - /** - * @param string $path - * @param callable|mixed $callback - * @return RouteObject - */ - public static function options(string $path, $callback): RouteObject - { - return static::addRoute('OPTIONS', $path, $callback); - } - - /** - * @param string $path - * @param callable|mixed $callback - * @return RouteObject - */ - public static function any(string $path, $callback): RouteObject - { - return static::addRoute(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'], $path, $callback); - } - - /** - * @param $method - * @param string $path - * @param callable|mixed $callback - * @return RouteObject - */ - public static function add($method, string $path, $callback): RouteObject - { - return static::addRoute($method, $path, $callback); - } - - /** - * @param string|callable $path - * @param callable|null $callback - * @return static - */ - public static function group($path, ?callable $callback = null): Route - { - if ($callback === null) { - $callback = $path; - $path = ''; - } - $previousGroupPrefix = static::$groupPrefix; - static::$groupPrefix = $previousGroupPrefix . $path; - $previousInstance = static::$instance; - $instance = static::$instance = new static; - static::$collector->addGroup($path, $callback); - static::$groupPrefix = $previousGroupPrefix; - static::$instance = $previousInstance; - if ($previousInstance) { - $previousInstance->addChild($instance); - } - return $instance; - } - - /** - * @param string $name - * @param string $controller - * @param array $options - * @return void - */ - public static function resource(string $name, string $controller, array $options = []) - { - $name = trim($name, '/'); - if (is_array($options) && !empty($options)) { - $diffOptions = array_diff($options, ['index', 'create', 'store', 'update', 'show', 'edit', 'destroy', 'recovery']); - if (!empty($diffOptions)) { - foreach ($diffOptions as $action) { - static::any("/$name/{$action}[/{id}]", [$controller, $action])->name("$name.{$action}"); - } - } - // 注册路由 由于顺序不同会导致路由无效 因此不适用循环注册 - if (in_array('index', $options)) static::get("/$name", [$controller, 'index'])->name("$name.index"); - if (in_array('create', $options)) static::get("/$name/create", [$controller, 'create'])->name("$name.create"); - if (in_array('store', $options)) static::post("/$name", [$controller, 'store'])->name("$name.store"); - if (in_array('update', $options)) static::put("/$name/{id}", [$controller, 'update'])->name("$name.update"); - if (in_array('patch', $options)) static::patch("/$name/{id}", [$controller, 'patch'])->name("$name.patch"); - if (in_array('show', $options)) static::get("/$name/{id}", [$controller, 'show'])->name("$name.show"); - if (in_array('edit', $options)) static::get("/$name/{id}/edit", [$controller, 'edit'])->name("$name.edit"); - if (in_array('destroy', $options)) static::delete("/$name/{id}", [$controller, 'destroy'])->name("$name.destroy"); - if (in_array('recovery', $options)) static::put("/$name/{id}/recovery", [$controller, 'recovery'])->name("$name.recovery"); - } else { - //为空时自动注册所有常用路由 - if (method_exists($controller, 'index')) static::get("/$name", [$controller, 'index'])->name("$name.index"); - if (method_exists($controller, 'create')) static::get("/$name/create", [$controller, 'create'])->name("$name.create"); - if (method_exists($controller, 'store')) static::post("/$name", [$controller, 'store'])->name("$name.store"); - if (method_exists($controller, 'update')) static::put("/$name/{id}", [$controller, 'update'])->name("$name.update"); - if (method_exists($controller, 'patch')) static::patch("/$name/{id}", [$controller, 'patch'])->name("$name.patch"); - if (method_exists($controller, 'show')) static::get("/$name/{id}", [$controller, 'show'])->name("$name.show"); - if (method_exists($controller, 'edit')) static::get("/$name/{id}/edit", [$controller, 'edit'])->name("$name.edit"); - if (method_exists($controller, 'destroy')) static::delete("/$name/{id}", [$controller, 'destroy'])->name("$name.destroy"); - if (method_exists($controller, 'recovery')) static::put("/$name/{id}/recovery", [$controller, 'recovery'])->name("$name.recovery"); - } - } - - /** - * @return RouteObject[] - */ - public static function getRoutes(): array - { - return static::$allRoutes; - } - - /** - * disableDefaultRoute. - * - * @param array|string $plugin - * @param string|null $app - * @return bool - */ - public static function disableDefaultRoute(array|string $plugin = '', ?string $app = null): bool - { - // Is [controller action] - if (is_array($plugin)) { - $controllerAction = $plugin; - if (!isset($controllerAction[0]) || !is_string($controllerAction[0]) || - !isset($controllerAction[1]) || !is_string($controllerAction[1])) { - return false; - } - $controller = $controllerAction[0]; - $action = $controllerAction[1]; - static::$disabledDefaultRouteActions[$controller][$action] = $action; - return true; - } - // Is plugin - if (is_string($plugin) && (preg_match('/^[a-zA-Z0-9_]+$/', $plugin) || $plugin === '')) { - if (!isset(static::$disabledDefaultRoutes[$plugin])) { - static::$disabledDefaultRoutes[$plugin] = []; - } - $app = $app ?? '*'; - static::$disabledDefaultRoutes[$plugin][$app] = $app; - return true; - } - // Is controller - if (is_string($plugin) && class_exists($plugin)) { - static::$disabledDefaultRouteControllers[$plugin] = $plugin; - return true; - } - return false; - } - - /** - * @param array|string $plugin - * @param string|null $app - * @return bool - */ - public static function isDefaultRouteDisabled(array|string $plugin = '', ?string $app = null): bool - { - // Is [controller action] - if (is_array($plugin)) { - if (!isset($plugin[0]) || !is_string($plugin[0]) || - !isset($plugin[1]) || !is_string($plugin[1])) { - return false; - } - return isset(static::$disabledDefaultRouteActions[$plugin[0]][$plugin[1]]) || static::isDefaultRouteDisabledByAnnotation($plugin[0], $plugin[1]); - } - // Is plugin - if (is_string($plugin) && (preg_match('/^[a-zA-Z0-9_]+$/', $plugin) || $plugin === '')) { - $app = $app ?? '*'; - return isset(static::$disabledDefaultRoutes[$plugin]['*']) || isset(static::$disabledDefaultRoutes[$plugin][$app]); - } - // Is controller - if (is_string($plugin) && class_exists($plugin)) { - return isset(static::$disabledDefaultRouteControllers[$plugin]); - } - return false; - } - - /** - * @param string $controller - * @param string|null $action - * @return bool - */ - protected static function isDefaultRouteDisabledByAnnotation(string $controller, ?string $action = null): bool - { - if (class_exists($controller)) { - $reflectionClass = new ReflectionClass($controller); - if ($reflectionClass->getAttributes(DisableDefaultRoute::class, ReflectionAttribute::IS_INSTANCEOF)) { - return true; - } - if ($action && $reflectionClass->hasMethod($action)) { - $reflectionMethod = $reflectionClass->getMethod($action); - if ($reflectionMethod->getAttributes(DisableDefaultRoute::class, ReflectionAttribute::IS_INSTANCEOF)) { - return true; - } - } - } - return false; - } - - /** - * @param $middleware - * @return $this - */ - public function middleware($middleware): Route - { - foreach ($this->routes as $route) { - $route->middleware($middleware); - } - foreach ($this->getChildren() as $child) { - $child->middleware($middleware); - } - return $this; - } - - /** - * @param RouteObject $route - */ - public function collect(RouteObject $route) - { - $this->routes[] = $route; - } - - /** - * @param string $name - * @param RouteObject $instance - */ - public static function setByName(string $name, RouteObject $instance) - { - static::$nameList[$name] = $instance; - } - - /** - * @param string $name - * @return null|RouteObject - */ - public static function getByName(string $name): ?RouteObject - { - return static::$nameList[$name] ?? null; - } - - /** - * @param Route $route - * @return void - */ - public function addChild(Route $route) - { - $this->children[] = $route; - } - - /** - * @return Route[] - */ - public function getChildren() - { - return $this->children; - } - - /** - * @param string $method - * @param string $path - * @return array - */ - public static function dispatch(string $method, string $path): array - { - return static::$dispatcher->dispatch($method, $path); - } - - /** - * @param string $path - * @param callable|mixed $callback - * @return callable|false|string[] - */ - public static function convertToCallable(string $path, $callback) - { - if (is_string($callback) && strpos($callback, '@')) { - $callback = explode('@', $callback, 2); - } - - if (!is_array($callback)) { - if (!is_callable($callback)) { - $callStr = is_scalar($callback) ? $callback : 'Closure'; - echo "Route $path $callStr is not callable\n"; - return false; - } - } else { - $callback = array_values($callback); - if (!isset($callback[1]) || !class_exists($callback[0]) || !method_exists($callback[0], $callback[1])) { - echo "Route $path " . json_encode($callback) . " is not callable\n"; - return false; - } - } - - return $callback; - } - - /** - * @param array|string $methods - * @param string $path - * @param callable|mixed $callback - * @return RouteObject - */ - protected static function addRoute($methods, string $path, $callback): RouteObject - { - $route = new RouteObject($methods, static::$groupPrefix . $path, $callback); - static::$allRoutes[] = $route; - - if ($callback = static::convertToCallable($path, $callback)) { - static::$collector->addRoute($methods, $path, ['callback' => $callback, 'route' => $route]); - } - if (static::$instance) { - static::$instance->collect($route); - } - return $route; - } - - /** - * Load. - * @param mixed $paths - * @return void - */ - public static function load($paths) - { - if (!is_array($paths)) { - return; - } - static::$dispatcher = simpleDispatcher(function (RouteCollector $route) use ($paths) { - Route::setCollector($route); - foreach ($paths as $configPath) { - $routeConfigFile = $configPath . '/route.php'; - if (is_file($routeConfigFile)) { - require_once $routeConfigFile; - } - if (!is_dir($pluginConfigPath = $configPath . '/plugin')) { - continue; - } - $dirIterator = new RecursiveDirectoryIterator($pluginConfigPath, FilesystemIterator::FOLLOW_SYMLINKS); - $iterator = new RecursiveIteratorIterator($dirIterator); - foreach ($iterator as $file) { - if ($file->getBaseName('.php') !== 'route') { - continue; - } - $appConfigFile = pathinfo($file, PATHINFO_DIRNAME) . '/app.php'; - if (!is_file($appConfigFile)) { - continue; - } - $appConfig = include $appConfigFile; - if (empty($appConfig['enable'])) { - continue; - } - require_once $file; - } - } - }); - } - - /** - * SetCollector. - * @param RouteCollector $route - * @return void - */ - public static function setCollector(RouteCollector $route) - { - static::$collector = $route; - } - - /** - * Fallback. - * @param callable|mixed $callback - * @param string $plugin - * @return void - */ - public static function fallback(callable $callback, string $plugin = '') - { - $route = new RouteObject([], '', $callback); - static::$fallbackRoutes[$plugin] = $route; - return $route; - } - - /** - * GetFallBack. - * @param string $plugin - * @param int $status - * @return callable|null - * @throws ContainerExceptionInterface - * @throws NotFoundExceptionInterface - * @throws ReflectionException - */ - public static function getFallback(string $plugin = '', int $status = 404) - { - if (!isset(static::$fallback[$plugin])) { - $callback = null; - $route = static::$fallbackRoutes[$plugin] ?? null; - static::$fallback[$plugin] = $route ? App::getCallback($plugin, 'NOT_FOUND', $route->getCallback(), ['status' => $status], false, $route) : null; - } - return static::$fallback[$plugin]; - } - - /** - * @return void - * @deprecated - */ - public static function container() - { - - } - -} diff --git a/vendor/workerman/webman-framework/src/Route/Route.php b/vendor/workerman/webman-framework/src/Route/Route.php deleted file mode 100644 index f95aed7..0000000 --- a/vendor/workerman/webman-framework/src/Route/Route.php +++ /dev/null @@ -1,199 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Route; - -use Webman\Route as Router; -use function array_merge; -use function count; -use function preg_replace_callback; -use function str_replace; - -/** - * Class Route - * @package Webman - */ -class Route -{ - /** - * @var string|null - */ - protected $name = null; - - /** - * @var array - */ - protected $methods = []; - - /** - * @var string - */ - protected $path = ''; - - /** - * @var callable - */ - protected $callback = null; - - /** - * @var array - */ - protected $middlewares = []; - - /** - * @var array - */ - protected $params = []; - - /** - * Route constructor. - * @param array $methods - * @param string $path - * @param callable $callback - */ - public function __construct($methods, string $path, $callback) - { - $this->methods = (array)$methods; - $this->path = $path; - $this->callback = $callback; - } - - /** - * Get name. - * @return string|null - */ - public function getName(): ?string - { - return $this->name ?? null; - } - - /** - * Name. - * @param string $name - * @return $this - */ - public function name(string $name): Route - { - $this->name = $name; - Router::setByName($name, $this); - return $this; - } - - /** - * Middleware. - * @param mixed $middleware - * @return $this|array - */ - public function middleware(mixed $middleware = null) - { - if ($middleware === null) { - return $this->middlewares; - } - $this->middlewares = array_merge($this->middlewares, is_array($middleware) ? array_reverse($middleware) : [$middleware]); - return $this; - } - - /** - * GetPath. - * @return string - */ - public function getPath(): string - { - return $this->path; - } - - /** - * GetMethods. - * @return array - */ - public function getMethods(): array - { - return $this->methods; - } - - /** - * GetCallback. - * @return callable|null - */ - public function getCallback() - { - return $this->callback; - } - - /** - * GetMiddleware. - * @return array - */ - public function getMiddleware(): array - { - return $this->middlewares; - } - - /** - * Param. - * @param string|null $name - * @param mixed $default - * @return mixed - */ - public function param(?string $name = null, mixed $default = null) - { - if ($name === null) { - return $this->params; - } - return $this->params[$name] ?? $default; - } - - /** - * SetParams. - * @param array $params - * @return $this - */ - public function setParams(array $params): Route - { - $this->params = array_merge($this->params, $params); - return $this; - } - - /** - * Url. - * @param array $parameters - * @return string - */ - public function url(array $parameters = []): string - { - if (empty($parameters)) { - return $this->path; - } - $path = str_replace(['[', ']'], '', $this->path); - $path = preg_replace_callback('/\{(.*?)(?:\:[^\}]*?)*?\}/', function ($matches) use (&$parameters) { - if (!$parameters) { - return $matches[0]; - } - if (isset($parameters[$matches[1]])) { - $value = $parameters[$matches[1]]; - unset($parameters[$matches[1]]); - return $value; - } - $key = key($parameters); - if (is_int($key)) { - $value = $parameters[$key]; - unset($parameters[$key]); - return $value; - } - return $matches[0]; - }, $path); - return count($parameters) > 0 ? $path . '?' . http_build_query($parameters) : $path; - } - -} diff --git a/vendor/workerman/webman-framework/src/Session/FileSessionHandler.php b/vendor/workerman/webman-framework/src/Session/FileSessionHandler.php deleted file mode 100644 index 10fda70..0000000 --- a/vendor/workerman/webman-framework/src/Session/FileSessionHandler.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Session; - -use Workerman\Protocols\Http\Session\FileSessionHandler as FileHandler; - -/** - * Class FileSessionHandler - * @package Webman - */ -class FileSessionHandler extends FileHandler -{ - -} diff --git a/vendor/workerman/webman-framework/src/Session/RedisClusterSessionHandler.php b/vendor/workerman/webman-framework/src/Session/RedisClusterSessionHandler.php deleted file mode 100644 index c00efae..0000000 --- a/vendor/workerman/webman-framework/src/Session/RedisClusterSessionHandler.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Session; - -use Workerman\Protocols\Http\Session\RedisClusterSessionHandler as RedisClusterHandler; - -class RedisClusterSessionHandler extends RedisClusterHandler -{ - -} diff --git a/vendor/workerman/webman-framework/src/Session/RedisSessionHandler.php b/vendor/workerman/webman-framework/src/Session/RedisSessionHandler.php deleted file mode 100644 index c124cbd..0000000 --- a/vendor/workerman/webman-framework/src/Session/RedisSessionHandler.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman\Session; - -use Workerman\Protocols\Http\Session\RedisSessionHandler as RedisHandler; - -/** - * Class FileSessionHandler - * @package Webman - */ -class RedisSessionHandler extends RedisHandler -{ - -} diff --git a/vendor/workerman/webman-framework/src/Util.php b/vendor/workerman/webman-framework/src/Util.php deleted file mode 100644 index 2084605..0000000 --- a/vendor/workerman/webman-framework/src/Util.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman; - -use function array_diff; -use function array_map; -use function scandir; - -/** - * Class Util - * @package Webman - */ -class Util -{ - /** - * ScanDir. - * @param string $basePath - * @param bool $withBasePath - * @return array - */ - public static function scanDir(string $basePath, bool $withBasePath = true): array - { - if (!is_dir($basePath)) { - return []; - } - $paths = array_diff(scandir($basePath), array('.', '..')) ?: []; - return $withBasePath ? array_map(static function ($path) use ($basePath) { - return $basePath . DIRECTORY_SEPARATOR . $path; - }, $paths) : $paths; - } - -} diff --git a/vendor/workerman/webman-framework/src/View.php b/vendor/workerman/webman-framework/src/View.php deleted file mode 100644 index 7539621..0000000 --- a/vendor/workerman/webman-framework/src/View.php +++ /dev/null @@ -1,27 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace Webman; - -interface View -{ - /** - * Render. - * @param string $template - * @param array $vars - * @param string|null $app - * @return string - */ - public static function render(string $template, array $vars, ?string $app = null): string; -} diff --git a/vendor/workerman/webman-framework/src/start.php b/vendor/workerman/webman-framework/src/start.php deleted file mode 100644 index 41ad7ef..0000000 --- a/vendor/workerman/webman-framework/src/start.php +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env php -load(); - } else { - Dotenv::createMutable(run_path())->load(); - } - } - - if (!$appConfigFile = config_path('app.php')) { - throw new RuntimeException('Config file not found: app.php'); - } - $appConfig = require $appConfigFile; - if ($timezone = $appConfig['default_timezone'] ?? '') { - date_default_timezone_set($timezone); - } - - static::loadAllConfig(['route', 'container']); - - if (!is_phar() && DIRECTORY_SEPARATOR === '\\' && empty(config('server.listen'))) { - echo "Please run 'php windows.php' on windows system." . PHP_EOL; - exit; - } - - $errorReporting = config('app.error_reporting'); - if (isset($errorReporting)) { - error_reporting($errorReporting); - } - - $runtimeLogsPath = runtime_path() . DIRECTORY_SEPARATOR . 'logs'; - if (!file_exists($runtimeLogsPath) || !is_dir($runtimeLogsPath)) { - if (!mkdir($runtimeLogsPath, 0777, true)) { - throw new RuntimeException("Failed to create runtime logs directory. Please check the permission."); - } - } - - $runtimeViewsPath = runtime_path() . DIRECTORY_SEPARATOR . 'views'; - if (!file_exists($runtimeViewsPath) || !is_dir($runtimeViewsPath)) { - if (!mkdir($runtimeViewsPath, 0777, true)) { - throw new RuntimeException("Failed to create runtime views directory. Please check the permission."); - } - } - - Worker::$onMasterReload = function () { - if (function_exists('opcache_get_status')) { - if ($status = opcache_get_status()) { - if (isset($status['scripts']) && $scripts = $status['scripts']) { - foreach (array_keys($scripts) as $file) { - opcache_invalidate($file, true); - } - } - } - } - }; - - $config = config('server'); - Worker::$pidFile = $config['pid_file']; - Worker::$stdoutFile = $config['stdout_file']; - Worker::$logFile = $config['log_file']; - Worker::$eventLoopClass = $config['event_loop'] ?? ''; - TcpConnection::$defaultMaxPackageSize = $config['max_package_size'] ?? 10 * 1024 * 1024; - if (property_exists(Worker::class, 'statusFile')) { - Worker::$statusFile = $config['status_file'] ?? ''; - } - if (property_exists(Worker::class, 'stopTimeout')) { - Worker::$stopTimeout = $config['stop_timeout'] ?? 2; - } - - if ($config['listen'] ?? false) { - $worker = new Worker($config['listen'], $config['context']); - $propertyMap = [ - 'name', - 'count', - 'user', - 'group', - 'reusePort', - 'transport', - 'protocol' - ]; - foreach ($propertyMap as $property) { - if (isset($config[$property])) { - $worker->$property = $config[$property]; - } - } - - $worker->onWorkerStart = function ($worker) { - require_once base_path() . '/support/bootstrap.php'; - $app = new \Webman\App(config('app.request_class', Request::class), Log::channel('default'), app_path(), public_path()); - $worker->onMessage = [$app, 'onMessage']; - call_user_func([$app, 'onWorkerStart'], $worker); - }; - } - - $windowsWithoutServerListen = is_phar() && DIRECTORY_SEPARATOR === '\\' && empty($config['listen']); - $process = config('process', []); - if ($windowsWithoutServerListen && $process) { - $processName = isset($process['webman']) ? 'webman' : key($process); - worker_start($processName, $process[$processName]); - } else if (DIRECTORY_SEPARATOR === '/') { - foreach (config('process', []) as $processName => $config) { - worker_start($processName, $config); - } - foreach (config('plugin', []) as $firm => $projects) { - foreach ($projects as $name => $project) { - if (!is_array($project)) { - continue; - } - foreach ($project['process'] ?? [] as $processName => $config) { - worker_start("plugin.$firm.$name.$processName", $config); - } - } - foreach ($projects['process'] ?? [] as $processName => $config) { - worker_start("plugin.$firm.$processName", $config); - } - } - } - - Worker::runAll(); - } - - /** - * LoadAllConfig. - * @param array $excludes - * @return void - */ - public static function loadAllConfig(array $excludes = []) - { - Config::load(config_path(), $excludes); - $directory = base_path() . '/plugin'; - foreach (Util::scanDir($directory, false) as $name) { - $dir = "$directory/$name/config"; - if (is_dir($dir)) { - Config::load($dir, $excludes, "plugin.$name"); - } - } - } - -} diff --git a/vendor/workerman/webman-framework/src/support/Container.php b/vendor/workerman/webman-framework/src/support/Container.php deleted file mode 100644 index c3734c7..0000000 --- a/vendor/workerman/webman-framework/src/support/Container.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support; - -use Webman\Config; - -/** - * Class Container - * @package support - * @method static mixed get($name) - * @method static mixed make($name, array $parameters) - * @method static bool has($name) - */ -class Container -{ - /** - * Instance - * @param string $plugin - * @return array|mixed|void|null - */ - public static function instance(string $plugin = '') - { - return Config::get($plugin ? "plugin.$plugin.container" : 'container'); - } - - /** - * @param string $name - * @param array $arguments - * @return mixed - */ - public static function __callStatic(string $name, array $arguments) - { - $plugin = \Webman\App::getPluginByClass($name); - return static::instance($plugin)->{$name}(... $arguments); - } -} diff --git a/vendor/workerman/webman-framework/src/support/Context.php b/vendor/workerman/webman-framework/src/support/Context.php deleted file mode 100644 index 7a8348b..0000000 --- a/vendor/workerman/webman-framework/src/support/Context.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support; - -/** - * Class Context - * @package Webman - */ -class Context extends \Webman\Context -{ - -} diff --git a/vendor/workerman/webman-framework/src/support/Log.php b/vendor/workerman/webman-framework/src/support/Log.php deleted file mode 100644 index 11512de..0000000 --- a/vendor/workerman/webman-framework/src/support/Log.php +++ /dev/null @@ -1,139 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support; - -use Monolog\Formatter\FormatterInterface; -use Monolog\Handler\FormattableHandlerInterface; -use Monolog\Handler\HandlerInterface; -use Monolog\Logger; -use function array_values; -use function config; -use function is_array; - -/** - * Class Log - * @package support - * - * @method static void log($level, $message, array $context = []) - * @method static void debug($message, array $context = []) - * @method static void info($message, array $context = []) - * @method static void notice($message, array $context = []) - * @method static void warning($message, array $context = []) - * @method static void error($message, array $context = []) - * @method static void critical($message, array $context = []) - * @method static void alert($message, array $context = []) - * @method static void emergency($message, array $context = []) - */ -class Log -{ - /** - * @var array - */ - protected static $instance = []; - - /** - * Channel. - * @param string $name - * @return Logger - */ - public static function channel(string $name = 'default'): Logger - { - if (!isset(static::$instance[$name])) { - $config = config('log', [])[$name]; - $handlers = self::handlers($config); - $processors = self::processors($config); - static::$instance[$name] = new Logger($name, $handlers, $processors); - } - return static::$instance[$name]; - } - - /** - * Handlers. - * @param array $config - * @return array - */ - protected static function handlers(array $config): array - { - $handlerConfigs = $config['handlers'] ?? [[]]; - $handlers = []; - foreach ($handlerConfigs as $value) { - $class = $value['class'] ?? []; - $constructor = $value['constructor'] ?? []; - - $formatterConfig = $value['formatter'] ?? []; - - $class && $handlers[] = self::handler($class, $constructor, $formatterConfig); - } - - return $handlers; - } - - /** - * Handler. - * @param string $class - * @param array $constructor - * @param array $formatterConfig - * @return HandlerInterface - */ - protected static function handler(string $class, array $constructor, array $formatterConfig): HandlerInterface - { - /** @var HandlerInterface $handler */ - $handler = new $class(... array_values($constructor)); - - if ($handler instanceof FormattableHandlerInterface && $formatterConfig) { - $formatterClass = $formatterConfig['class']; - $formatterConstructor = $formatterConfig['constructor']; - - /** @var FormatterInterface $formatter */ - $formatter = new $formatterClass(... array_values($formatterConstructor)); - - $handler->setFormatter($formatter); - } - - return $handler; - } - - /** - * Processors. - * @param array $config - * @return array - */ - protected static function processors(array $config): array - { - $result = []; - if (!isset($config['processors']) && isset($config['processor'])) { - $config['processors'] = [$config['processor']]; - } - - foreach ($config['processors'] ?? [] as $value) { - if (is_array($value) && isset($value['class'])) { - $value = new $value['class'](... array_values($value['constructor'] ?? [])); - } - $result[] = $value; - } - - return $result; - } - - /** - * @param string $name - * @param array $arguments - * @return mixed - */ - public static function __callStatic(string $name, array $arguments) - { - return static::channel()->{$name}(... $arguments); - } -} diff --git a/vendor/workerman/webman-framework/src/support/Plugin.php b/vendor/workerman/webman-framework/src/support/Plugin.php deleted file mode 100644 index 6f548e6..0000000 --- a/vendor/workerman/webman-framework/src/support/Plugin.php +++ /dev/null @@ -1,102 +0,0 @@ - $path) { - $pluginConst = "\\{$namespace}Install::WEBMAN_PLUGIN"; - if (!defined($pluginConst)) { - continue; - } - $installFunction = "\\{$namespace}Install::install"; - if (is_callable($installFunction)) { - $installFunction(true); - } - } - } - - /** - * Update. - * @param mixed $event - * @return void - */ - public static function update($event) - { - static::findHelper(); - $psr4 = static::getPsr4($event); - foreach ($psr4 as $namespace => $path) { - $pluginConst = "\\{$namespace}Install::WEBMAN_PLUGIN"; - if (!defined($pluginConst)) { - continue; - } - $updateFunction = "\\{$namespace}Install::update"; - if (is_callable($updateFunction)) { - $updateFunction(); - continue; - } - $installFunction = "\\{$namespace}Install::install"; - if (is_callable($installFunction)) { - $installFunction(false); - } - } - } - - /** - * Uninstall. - * @param mixed $event - * @return void - */ - public static function uninstall($event) - { - static::findHelper(); - $psr4 = static::getPsr4($event); - foreach ($psr4 as $namespace => $path) { - $pluginConst = "\\{$namespace}Install::WEBMAN_PLUGIN"; - if (!defined($pluginConst)) { - continue; - } - $uninstallFunction = "\\{$namespace}Install::uninstall"; - if (is_callable($uninstallFunction)) { - $uninstallFunction(); - } - } - } - - /** - * Get psr-4 info - * - * @param mixed $event - * @return array - */ - protected static function getPsr4($event) - { - $operation = $event->getOperation(); - $autoload = method_exists($operation, 'getPackage') ? $operation->getPackage()->getAutoload() : $operation->getTargetPackage()->getAutoload(); - return $autoload['psr-4'] ?? []; - } - - /** - * FindHelper. - * @return void - */ - protected static function findHelper() - { - // Plugin.php in webman - require_once __DIR__ . '/helpers.php'; - } -} diff --git a/vendor/workerman/webman-framework/src/support/Request.php b/vendor/workerman/webman-framework/src/support/Request.php deleted file mode 100644 index e3f6ac3..0000000 --- a/vendor/workerman/webman-framework/src/support/Request.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support; - -/** - * Class Request - * @package support - */ -class Request extends \Webman\Http\Request -{ - -} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/support/Response.php b/vendor/workerman/webman-framework/src/support/Response.php deleted file mode 100644 index 9bc4e1e..0000000 --- a/vendor/workerman/webman-framework/src/support/Response.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support; - -/** - * Class Response - * @package support - */ -class Response extends \Webman\Http\Response -{ - -} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/support/Translation.php b/vendor/workerman/webman-framework/src/support/Translation.php deleted file mode 100644 index fb3973d..0000000 --- a/vendor/workerman/webman-framework/src/support/Translation.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support; - -use FilesystemIterator; -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; -use RegexIterator; -use Symfony\Component\Translation\Translator; -use Webman\Exception\NotFoundException; -use function basename; -use function config; -use function get_realpath; -use function pathinfo; -use function request; -use function substr; - -/** - * Class Translation - * @package support - * @method static string trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) - * @method static void setLocale(string $locale) - * @method static string getLocale() - */ -class Translation -{ - - /** - * @var Translator[] - */ - protected static $instance = []; - - /** - * Instance. - * @param string $plugin - * @return Translator - * @throws NotFoundException - */ - public static function instance(string $plugin = ''): Translator - { - if (!isset(static::$instance[$plugin])) { - $config = config($plugin ? "plugin.$plugin.translation" : 'translation', []); - $paths = (array)($config['path'] ?? []); - - static::$instance[$plugin] = $translator = new Translator($config['locale']); - $translator->setFallbackLocales($config['fallback_locale']); - - $classes = $config['loader'] ?? [ - 'Symfony\Component\Translation\Loader\PhpFileLoader' => [ - 'extension' => '.php', - 'format' => 'phpfile' - ], - 'Symfony\Component\Translation\Loader\PoFileLoader' => [ - 'extension' => '.po', - 'format' => 'pofile' - ] - ]; - foreach ($paths as $path) { - // Phar support. Compatible with the 'realpath' function in the phar file. - if (!$translationsPath = get_realpath($path)) { - throw new NotFoundException("File {$path} not found"); - } - - foreach ($classes as $class => $opts) { - $translator->addLoader($opts['format'], new $class); - $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($translationsPath, FilesystemIterator::SKIP_DOTS)); - $files = new RegexIterator($iterator, '/^.+' . preg_quote($opts['extension']) . '$/i', RegexIterator::GET_MATCH); - foreach ($files as $file) { - $file = $file[0]; - $domain = basename($file, $opts['extension']); - $dirName = pathinfo($file, PATHINFO_DIRNAME); - $locale = substr(strrchr($dirName, DIRECTORY_SEPARATOR), 1); - if ($domain && $locale) { - $translator->addResource($opts['format'], $file, $locale, $domain); - } - } - } - } - } - return static::$instance[$plugin]; - } - - /** - * @param string $name - * @param array $arguments - * @return mixed - * @throws NotFoundException - */ - public static function __callStatic(string $name, array $arguments) - { - $request = request(); - $plugin = $request->plugin ?? ''; - return static::instance($plugin)->{$name}(... $arguments); - } -} diff --git a/vendor/workerman/webman-framework/src/support/View.php b/vendor/workerman/webman-framework/src/support/View.php deleted file mode 100644 index ceddc7b..0000000 --- a/vendor/workerman/webman-framework/src/support/View.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support; - -use function config; -use function request; - -class View -{ - /** - * Assign. - * @param mixed $name - * @param mixed $value - * @return void - */ - public static function assign($name, mixed $value = null) - { - $request = request(); - $plugin = $request->plugin ?? ''; - $handler = config($plugin ? "plugin.$plugin.view.handler" : 'view.handler'); - $handler::assign($name, $value); - } -} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/support/annotation/DisableDefaultRoute.php b/vendor/workerman/webman-framework/src/support/annotation/DisableDefaultRoute.php deleted file mode 100644 index ba45cbc..0000000 --- a/vendor/workerman/webman-framework/src/support/annotation/DisableDefaultRoute.php +++ /dev/null @@ -1,10 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -use Dotenv\Dotenv; -use support\Log; -use Webman\Bootstrap; -use Webman\Config; -use Webman\Middleware; -use Webman\Route; -use Webman\Util; -use Workerman\Events\Select; -use Workerman\Worker; - -$worker = $worker ?? null; - -if (empty(Worker::$eventLoopClass)) { - Worker::$eventLoopClass = Select::class; -} - -set_error_handler(function ($level, $message, $file = '', $line = 0) { - if (error_reporting() & $level) { - throw new ErrorException($message, 0, $level, $file, $line); - } -}); - -if ($worker) { - register_shutdown_function(function ($startTime) { - if (time() - $startTime <= 0.1) { - sleep(1); - } - }, time()); -} - -if (class_exists('Dotenv\Dotenv') && file_exists(base_path(false) . '/.env')) { - if (method_exists('Dotenv\Dotenv', 'createUnsafeMutable')) { - Dotenv::createUnsafeMutable(base_path(false))->load(); - } else { - Dotenv::createMutable(base_path(false))->load(); - } -} - -Config::clear(); -support\App::loadAllConfig(['route']); -if ($timezone = config('app.default_timezone')) { - date_default_timezone_set($timezone); -} - -foreach (config('autoload.files', []) as $file) { - include_once $file; -} -foreach (config('plugin', []) as $firm => $projects) { - foreach ($projects as $name => $project) { - if (!is_array($project)) { - continue; - } - foreach ($project['autoload']['files'] ?? [] as $file) { - include_once $file; - } - } - foreach ($projects['autoload']['files'] ?? [] as $file) { - include_once $file; - } -} - -Middleware::load(config('middleware', [])); -foreach (config('plugin', []) as $firm => $projects) { - foreach ($projects as $name => $project) { - if (!is_array($project) || $name === 'static') { - continue; - } - Middleware::load($project['middleware'] ?? []); - } - Middleware::load($projects['middleware'] ?? [], $firm); - if ($staticMiddlewares = config("plugin.$firm.static.middleware")) { - Middleware::load(['__static__' => $staticMiddlewares], $firm); - } -} -Middleware::load(['__static__' => config('static.middleware', [])]); - -foreach (config('bootstrap', []) as $className) { - if (!class_exists($className)) { - $log = "Warning: Class $className setting in config/bootstrap.php not found\r\n"; - echo $log; - Log::error($log); - continue; - } - /** @var Bootstrap $className */ - $className::start($worker); -} - -foreach (config('plugin', []) as $firm => $projects) { - foreach ($projects as $name => $project) { - if (!is_array($project)) { - continue; - } - foreach ($project['bootstrap'] ?? [] as $className) { - if (!class_exists($className)) { - $log = "Warning: Class $className setting in config/plugin/$firm/$name/bootstrap.php not found\r\n"; - echo $log; - Log::error($log); - continue; - } - /** @var Bootstrap $className */ - $className::start($worker); - } - } - foreach ($projects['bootstrap'] ?? [] as $className) { - /** @var string $className */ - if (!class_exists($className)) { - $log = "Warning: Class $className setting in plugin/$firm/config/bootstrap.php not found\r\n"; - echo $log; - Log::error($log); - continue; - } - /** @var Bootstrap $className */ - $className::start($worker); - } -} - -$directory = base_path() . '/plugin'; -$paths = [config_path()]; -foreach (Util::scanDir($directory) as $path) { - if (is_dir($path = "$path/config")) { - $paths[] = $path; - } -} -Route::load($paths); - diff --git a/vendor/workerman/webman-framework/src/support/bootstrap/Session.php b/vendor/workerman/webman-framework/src/support/bootstrap/Session.php deleted file mode 100644 index 7360d0e..0000000 --- a/vendor/workerman/webman-framework/src/support/bootstrap/Session.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support\bootstrap; - -use Webman\Bootstrap; -use Workerman\Protocols\Http; -use Workerman\Protocols\Http\Session as SessionBase; -use Workerman\Worker; -use function config; -use function property_exists; - -/** - * Class Session - * @package support - */ -class Session implements Bootstrap -{ - - /** - * @param Worker|null $worker - * @return void - */ - public static function start(?Worker $worker) - { - $config = config('session'); - if (property_exists(SessionBase::class, 'name')) { - SessionBase::$name = $config['session_name']; - } else { - Http::sessionName($config['session_name']); - } - SessionBase::handlerClass($config['handler'], $config['config'][$config['type']]); - $map = [ - 'auto_update_timestamp' => 'autoUpdateTimestamp', - 'cookie_lifetime' => 'cookieLifetime', - 'gc_probability' => 'gcProbability', - 'cookie_path' => 'cookiePath', - 'http_only' => 'httpOnly', - 'same_site' => 'sameSite', - 'lifetime' => 'lifetime', - 'domain' => 'domain', - 'secure' => 'secure', - ]; - foreach ($map as $key => $name) { - if (isset($config[$key]) && property_exists(SessionBase::class, $name)) { - SessionBase::${$name} = $config[$key]; - } - } - } -} diff --git a/vendor/workerman/webman-framework/src/support/exception/BusinessException.php b/vendor/workerman/webman-framework/src/support/exception/BusinessException.php deleted file mode 100644 index b72d488..0000000 --- a/vendor/workerman/webman-framework/src/support/exception/BusinessException.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support\exception; - -/** - * Class BusinessException - * @package support\exception - */ -class BusinessException extends \Webman\Exception\BusinessException -{ - -} diff --git a/vendor/workerman/webman-framework/src/support/exception/Handler.php b/vendor/workerman/webman-framework/src/support/exception/Handler.php deleted file mode 100644 index 985413f..0000000 --- a/vendor/workerman/webman-framework/src/support/exception/Handler.php +++ /dev/null @@ -1,43 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support\exception; - -use Throwable; -use Webman\Exception\ExceptionHandler; -use Webman\Http\Request; -use Webman\Http\Response; -use Webman\Exception\BusinessException; - -/** - * Class Handler - * @package support\exception - */ -class Handler extends ExceptionHandler -{ - public $dontReport = [ - BusinessException::class, - ]; - - public function report(Throwable $exception) - { - parent::report($exception); - } - - public function render(Request $request, Throwable $exception): Response - { - return parent::render($request, $exception); - } - -} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/support/exception/InputTypeException.php b/vendor/workerman/webman-framework/src/support/exception/InputTypeException.php deleted file mode 100644 index eed54fa..0000000 --- a/vendor/workerman/webman-framework/src/support/exception/InputTypeException.php +++ /dev/null @@ -1,24 +0,0 @@ -getCode() ?: 404; - $debug = config($request->plugin ? "plugin.$request->plugin.app.debug" : 'app.debug'); - $data = $debug ? $this->data : ['parameter' => '']; - $message = $this->trans($this->getMessage(), $data); - if ($request->expectsJson()) { - $json = ['code' => $code, 'msg' => $message, 'data' => $data]; - return new Response(200, ['Content-Type' => 'application/json'], - json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); - } - return new Response($code, [], $this->html($message)); - } - -} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/support/exception/NotFoundException.php b/vendor/workerman/webman-framework/src/support/exception/NotFoundException.php deleted file mode 100644 index 016741d..0000000 --- a/vendor/workerman/webman-framework/src/support/exception/NotFoundException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support\exception; - -class NotFoundException extends BusinessException -{ - -} diff --git a/vendor/workerman/webman-framework/src/support/exception/PageNotFoundException.php b/vendor/workerman/webman-framework/src/support/exception/PageNotFoundException.php deleted file mode 100644 index cd76376..0000000 --- a/vendor/workerman/webman-framework/src/support/exception/PageNotFoundException.php +++ /dev/null @@ -1,93 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support\exception; - -use Throwable; -use Webman\Http\Request; -use Webman\Http\Response; - -class PageNotFoundException extends NotFoundException -{ - - /** - * @var string - */ - protected $template = '/app/view/404'; - - /** - * PageNotFoundException constructor. - * @param string $message - * @param int $code - * @param Throwable|null $previous - */ - public function __construct(string $message = '404 Not Found', int $code = 404, ?Throwable $previous = null) { - parent::__construct($message, $code, $previous); - } - - /** - * Render an exception into an HTTP response. - * @param Request $request - * @return Response|null - * @throws Throwable - */ - public function render(Request $request): ?Response - { - $code = $this->getCode() ?: 404; - $data = $this->data; - $message = $this->trans($this->getMessage(), $data); - if ($request->expectsJson()) { - $json = ['code' => $code, 'msg' => $message, 'data' => $data]; - return new Response(200, ['Content-Type' => 'application/json'], - json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); - } - return new Response($code, [], $this->html($message)); - } - - /** - * Get the HTML representation of the exception. - * @param string $message - * @return string - * @throws Throwable - */ - protected function html(string $message): string - { - $message = htmlspecialchars($message); - if (is_file(base_path("$this->template.html"))) { - return raw_view($this->template, ['message' => $message])->rawBody(); - } - return << - - - - - $message - - - -

$message

-
-
webman
- - -EOF; - - } - -} diff --git a/vendor/workerman/webman-framework/src/support/helpers.php b/vendor/workerman/webman-framework/src/support/helpers.php deleted file mode 100644 index 3104785..0000000 --- a/vendor/workerman/webman-framework/src/support/helpers.php +++ /dev/null @@ -1,672 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -use support\Container; -use support\Request; -use support\Response; -use support\Translation; -use support\view\Blade; -use support\view\Raw; -use support\view\ThinkPHP; -use support\view\Twig; -use Twig\Error\LoaderError; -use Twig\Error\RuntimeError; -use Twig\Error\SyntaxError; -use Webman\App; -use Webman\Config; -use Webman\Route; -use Workerman\Protocols\Http\Session; -use Workerman\Worker; - -/** - * Get the base path of the application - */ -if (!defined('BASE_PATH')) { - if (!$basePath = Phar::running()) { - $basePath = getcwd(); - while ($basePath !== dirname($basePath)) { - if (is_dir("$basePath/vendor") && is_file("$basePath/start.php")) { - break; - } - $basePath = dirname($basePath); - } - if ($basePath === dirname($basePath)) { - $basePath = __DIR__ . '/../../../../../'; - } - } - define('BASE_PATH', realpath($basePath) ?: $basePath); -} - -if (!function_exists('run_path')) { - /** - * return the program execute directory - * @param string $path - * @return string - */ - function run_path(string $path = ''): string - { - static $runPath = ''; - if (!$runPath) { - $runPath = is_phar() ? dirname(Phar::running(false)) : BASE_PATH; - } - return path_combine($runPath, $path); - } -} - -if (!function_exists('base_path')) { - /** - * if the param $path equal false,will return this program current execute directory - * @param string|false $path - * @return string - */ - function base_path($path = ''): string - { - if (false === $path) { - return run_path(); - } - return path_combine(BASE_PATH, $path); - } -} - -if (!function_exists('app_path')) { - /** - * App path - * @param string $path - * @return string - */ - function app_path(string $path = ''): string - { - return path_combine(BASE_PATH . DIRECTORY_SEPARATOR . 'app', $path); - } -} - -if (!function_exists('public_path')) { - /** - * Public path - * @param string $path - * @param string|null $plugin - * @return string - */ - function public_path(string $path = '', ?string $plugin = null): string - { - static $publicPaths = []; - $plugin = $plugin ?? ''; - if (isset($publicPaths[$plugin])) { - $publicPath = $publicPaths[$plugin]; - } else { - $prefix = $plugin ? "plugin.$plugin." : ''; - $pathPrefix = $plugin ? 'plugin' . DIRECTORY_SEPARATOR . $plugin . DIRECTORY_SEPARATOR : ''; - $publicPath = \config("{$prefix}app.public_path", run_path("{$pathPrefix}public")); - if (count($publicPaths) > 32) { - $publicPaths = []; - } - $publicPaths[$plugin] = $publicPath; - } - return $path === '' ? $publicPath : path_combine($publicPath, $path); - } -} - -if (!function_exists('config_path')) { - /** - * Config path - * @param string $path - * @return string - */ - function config_path(string $path = ''): string - { - return path_combine(BASE_PATH . DIRECTORY_SEPARATOR . 'config', $path); - } -} - -if (!function_exists('runtime_path')) { - /** - * Runtime path - * @param string $path - * @return string - */ - function runtime_path(string $path = ''): string - { - static $runtimePath = ''; - if (!$runtimePath) { - $runtimePath = \config('app.runtime_path') ?: run_path('runtime'); - } - return path_combine($runtimePath, $path); - } -} - -if (!function_exists('path_combine')) { - /** - * Generate paths based on given information - * @param string $front - * @param string $back - * @return string - */ - function path_combine(string $front, string $back): string - { - return $front . ($back ? (DIRECTORY_SEPARATOR . ltrim($back, DIRECTORY_SEPARATOR)) : $back); - } -} - -if (!function_exists('response')) { - /** - * Response - * @param int $status - * @param array $headers - * @param string $body - * @return Response - */ - function response(string $body = '', int $status = 200, array $headers = []): Response - { - return new Response($status, $headers, $body); - } -} - -if (!function_exists('json')) { - /** - * Json response - * @param $data - * @param int $options - * @return Response - */ - function json($data, int $options = JSON_UNESCAPED_UNICODE): Response - { - return new Response(200, ['Content-Type' => 'application/json'], json_encode($data, $options)); - } -} - -if (!function_exists('xml')) { - /** - * Xml response - * @param $xml - * @return Response - */ - function xml($xml): Response - { - if ($xml instanceof SimpleXMLElement) { - $xml = $xml->asXML(); - } - return new Response(200, ['Content-Type' => 'text/xml'], $xml); - } -} - -if (!function_exists('jsonp')) { - /** - * Jsonp response - * @param $data - * @param string $callbackName - * @return Response - */ - function jsonp($data, string $callbackName = 'callback'): Response - { - if (!is_scalar($data) && null !== $data) { - $data = json_encode($data); - } - return new Response(200, [], "$callbackName($data)"); - } -} - -if (!function_exists('redirect')) { - /** - * Redirect response - * @param string $location - * @param int $status - * @param array $headers - * @return Response - */ - function redirect(string $location, int $status = 302, array $headers = []): Response - { - $response = new Response($status, ['Location' => $location]); - if (!empty($headers)) { - $response->withHeaders($headers); - } - return $response; - } -} - -if (!function_exists('view')) { - /** - * View response - * @param mixed $template - * @param array $vars - * @param string|null $app - * @param string|null $plugin - * @return Response - */ - function view(mixed $template = null, array $vars = [], ?string $app = null, ?string $plugin = null): Response - { - [$template, $vars, $app, $plugin] = template_inputs($template, $vars, $app, $plugin); - $handler = \config($plugin ? "plugin.$plugin.view.handler" : 'view.handler'); - return new Response(200, [], $handler::render($template, $vars, $app, $plugin)); - } -} - -if (!function_exists('raw_view')) { - /** - * Raw view response - * @param mixed $template - * @param array $vars - * @param string|null $app - * @param string|null $plugin - * @return Response - * @throws Throwable - */ - function raw_view(mixed $template = null, array $vars = [], ?string $app = null, ?string $plugin = null): Response - { - return new Response(200, [], Raw::render(...template_inputs($template, $vars, $app, $plugin))); - } -} - -if (!function_exists('blade_view')) { - /** - * Blade view response - * @param mixed $template - * @param array $vars - * @param string|null $app - * @param string|null $plugin - * @return Response - */ - function blade_view(mixed $template = null, array $vars = [], ?string $app = null, ?string $plugin = null): Response - { - return new Response(200, [], Blade::render(...template_inputs($template, $vars, $app, $plugin))); - } -} - -if (!function_exists('think_view')) { - /** - * Think view response - * @param mixed $template - * @param array $vars - * @param string|null $app - * @param string|null $plugin - * @return Response - */ - function think_view(mixed $template = null, array $vars = [], ?string $app = null, ?string $plugin = null): Response - { - return new Response(200, [], ThinkPHP::render(...template_inputs($template, $vars, $app, $plugin))); - } -} - -if (!function_exists('twig_view')) { - /** - * Twig view response - * @param mixed $template - * @param array $vars - * @param string|null $app - * @param string|null $plugin - * @return Response - */ - function twig_view(mixed $template = null, array $vars = [], ?string $app = null, ?string $plugin = null): Response - { - return new Response(200, [], Twig::render(...template_inputs($template, $vars, $app, $plugin))); - } -} - -if (!function_exists('request')) { - /** - * Get request - * @return \Webman\Http\Request|Request|null - */ - function request() - { - return App::request(); - } -} - -if (!function_exists('config')) { - /** - * Get config - * @param string|null $key - * @param mixed $default - * @return mixed - */ - function config(?string $key = null, mixed $default = null) - { - return Config::get($key, $default); - } -} - -if (!function_exists('route')) { - /** - * Create url - * @param string $name - * @param ...$parameters - * @return string - */ - function route(string $name, ...$parameters): string - { - $route = Route::getByName($name); - if (!$route) { - return ''; - } - - if (!$parameters) { - return $route->url(); - } - - if (is_array(current($parameters))) { - $parameters = current($parameters); - } - - return $route->url($parameters); - } -} - -if (!function_exists('session')) { - /** - * Session - * @param array|string|null $key - * @param mixed $default - * @return mixed|bool|Session - * @throws Exception - */ - function session(array|string|null $key = null, mixed $default = null): mixed - { - $session = \request()->session(); - if (null === $key) { - return $session; - } - if (is_array($key)) { - $session->put($key); - return null; - } - if (strpos($key, '.')) { - $keyArray = explode('.', $key); - $value = $session->all(); - foreach ($keyArray as $index) { - if (!isset($value[$index])) { - return $default; - } - $value = $value[$index]; - } - return $value; - } - return $session->get($key, $default); - } -} - -if (!function_exists('trans')) { - /** - * Translation - * @param string $id - * @param array $parameters - * @param string|null $domain - * @param string|null $locale - * @return string - */ - function trans(string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string - { - $res = Translation::trans($id, $parameters, $domain, $locale); - return $res === '' ? $id : $res; - } -} - -if (!function_exists('locale')) { - /** - * Locale - * @param string|null $locale - * @return string - */ - function locale(?string $locale = null): string - { - if (!$locale) { - return Translation::getLocale(); - } - Translation::setLocale($locale); - return $locale; - } -} - -if (!function_exists('not_found')) { - /** - * 404 not found - * @return Response - */ - function not_found(): Response - { - return new Response(404, [], file_get_contents(public_path() . '/404.html')); - } -} - -if (!function_exists('copy_dir')) { - /** - * Copy dir - * @param string $source - * @param string $dest - * @param bool $overwrite - * @return void - */ - function copy_dir(string $source, string $dest, bool $overwrite = false) - { - if (is_dir($source)) { - if (!is_dir($dest)) { - mkdir($dest); - } - $files = scandir($source); - foreach ($files as $file) { - if ($file !== "." && $file !== "..") { - copy_dir("$source/$file", "$dest/$file", $overwrite); - } - } - } else if (file_exists($source) && ($overwrite || !file_exists($dest))) { - copy($source, $dest); - } - } -} - -if (!function_exists('remove_dir')) { - /** - * Remove dir - * @param string $dir - * @return bool - */ - function remove_dir(string $dir): bool - { - if (is_link($dir) || is_file($dir)) { - return unlink($dir); - } - $files = array_diff(scandir($dir), array('.', '..')); - foreach ($files as $file) { - (is_dir("$dir/$file") && !is_link($dir)) ? remove_dir("$dir/$file") : unlink("$dir/$file"); - } - return rmdir($dir); - } -} - -if (!function_exists('worker_bind')) { - /** - * Bind worker - * @param $worker - * @param $class - */ - function worker_bind($worker, $class) - { - $callbackMap = [ - 'onConnect', - 'onMessage', - 'onClose', - 'onError', - 'onBufferFull', - 'onBufferDrain', - 'onWorkerStop', - 'onWebSocketConnect', - 'onWorkerReload' - ]; - foreach ($callbackMap as $name) { - if (method_exists($class, $name)) { - $worker->$name = [$class, $name]; - } - } - if (method_exists($class, 'onWorkerStart')) { - call_user_func([$class, 'onWorkerStart'], $worker); - } - } -} - -if (!function_exists('worker_start')) { - /** - * Start worker - * @param $processName - * @param $config - * @return void - */ - function worker_start($processName, $config) - { - if (isset($config['enable']) && !$config['enable']) { - return; - } - // feat:custom worker class [default: Workerman\Worker] - $class = is_a($class = $config['workerClass'] ?? '', Worker::class, true) ? $class : Worker::class; - $worker = new $class($config['listen'] ?? null, $config['context'] ?? []); - $properties = [ - 'count', - 'user', - 'group', - 'reloadable', - 'reusePort', - 'transport', - 'protocol', - 'eventLoop', - ]; - $worker->name = $processName; - foreach ($properties as $property) { - if (isset($config[$property])) { - $worker->$property = $config[$property]; - } - } - - $worker->onWorkerStart = function ($worker) use ($config) { - require_once base_path('/support/bootstrap.php'); - if (isset($config['handler'])) { - if (!class_exists($config['handler'])) { - echo "process error: class {$config['handler']} not exists\r\n"; - return; - } - - $instance = Container::make($config['handler'], $config['constructor'] ?? []); - worker_bind($worker, $instance); - } - }; - } -} - -if (!function_exists('get_realpath')) { - /** - * Get realpath - * @param string $filePath - * @return string - */ - function get_realpath(string $filePath): string - { - if (strpos($filePath, 'phar://') === 0) { - return $filePath; - } else { - return realpath($filePath); - } - } -} - -if (!function_exists('is_phar')) { - /** - * Is phar - * @return bool - */ - function is_phar(): bool - { - return class_exists(Phar::class, false) && Phar::running(); - } -} - -if (!function_exists('template_inputs')) { - /** - * Get template vars - * @param mixed $template - * @param array $vars - * @param string|null $app - * @param string|null $plugin - * @return array - */ - function template_inputs(mixed $template, array $vars, ?string $app, ?string $plugin): array - { - $request = \request(); - $plugin = $plugin === null ? ($request->plugin ?? '') : $plugin; - if (is_array($template)) { - $vars = $template; - $template = null; - } - if ($template === null && $controller = $request->controller) { - $controllerSuffix = config($plugin ? "plugin.$plugin.app.controller_suffix" : "app.controller_suffix", ''); - $controllerName = $controllerSuffix !== '' ? substr($controller, 0, -strlen($controllerSuffix)) : $controller; - $path = str_replace(['controller', 'Controller', '\\'], ['view', 'view', '/'], $controllerName); - $path = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $path)); - $action = $request->action; - $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - foreach ($backtrace as $backtraceItem) { - if (!isset($backtraceItem['class']) || !isset($backtraceItem['function'])) { - continue; - } - if ($backtraceItem['class'] === App::class) { - break; - } - if (preg_match('/\\\\controller\\\\/i', $backtraceItem['class'])) { - $action = $backtraceItem['function']; - break; - } - } - $actionFileBaseName = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $action)); - $template = "/$path/$actionFileBaseName"; - } - return [$template, $vars, $app, $plugin]; - } -} - -if (!function_exists('cpu_count')) { - /** - * Get cpu count - * @return int - */ - function cpu_count(): int - { - // Windows does not support the number of processes setting. - if (DIRECTORY_SEPARATOR === '\\') { - return 1; - } - $count = 4; - if (is_callable('shell_exec')) { - if (strtolower(PHP_OS) === 'darwin') { - $count = (int)shell_exec('sysctl -n machdep.cpu.core_count'); - } else { - try { - $count = (int)shell_exec('nproc'); - } catch (\Throwable $ex) { - // Do nothing - } - } - } - return $count > 0 ? $count : 4; - } -} - -if (!function_exists('input')) { - /** - * Get request parameters, if no parameter name is passed, an array of all values is returned, default values is supported - * @param string|null $param param's name - * @param mixed $default default value - * @return mixed - */ - function input(?string $param = null, mixed $default = null): mixed - { - return is_null($param) ? request()->all() : request()->input($param, $default); - } -} diff --git a/vendor/workerman/webman-framework/src/support/view/Blade.php b/vendor/workerman/webman-framework/src/support/view/Blade.php deleted file mode 100644 index c604b3c..0000000 --- a/vendor/workerman/webman-framework/src/support/view/Blade.php +++ /dev/null @@ -1,84 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support\view; - -use Jenssegers\Blade\Blade as BladeView; -use Webman\View; -use function app_path; -use function array_merge; -use function base_path; -use function config; -use function is_array; -use function request; -use function runtime_path; - -/** - * Class Blade - * composer require jenssegers/blade - * @package support\view - */ -class Blade implements View -{ - /** - * Assign. - * @param string|array $name - * @param mixed $value - */ - public static function assign(string|array $name, mixed $value = null): void - { - $request = request(); - $request->_view_vars = array_merge((array) $request->_view_vars, is_array($name) ? $name : [$name => $value]); - } - - /** - * Render. - * @param string $template - * @param array $vars - * @param string|null $app - * @param string|null $plugin - * @return string - */ - public static function render(string $template, array $vars, ?string $app = null, ?string $plugin = null): string - { - static $views = []; - $request = request(); - $plugin = $plugin === null ? ($request->plugin ?? '') : $plugin; - $app = $app === null ? ($request->app ?? '') : $app; - $configPrefix = $plugin ? "plugin.$plugin." : ''; - $baseViewPath = $plugin ? base_path() . "/plugin/$plugin/app" : app_path(); - if ($template[0] === '/') { - if (strpos($template, '/view/') !== false) { - [$viewPath, $template] = explode('/view/', $template, 2); - $viewPath = base_path("$viewPath/view"); - } else { - $viewPath = base_path(); - $template = ltrim($template, '/'); - } - } else { - $viewPath = $app === '' ? "$baseViewPath/view" : "$baseViewPath/$app/view"; - } - if (!isset($views[$viewPath])) { - $views[$viewPath] = new BladeView($viewPath, runtime_path() . '/views'); - $extension = config("{$configPrefix}view.extension"); - if ($extension) { - $extension($views[$viewPath]); - } - } - if(isset($request->_view_vars)) { - $vars = array_merge((array)$request->_view_vars, $vars); - } - return $views[$viewPath]->render($template, $vars); - } -} diff --git a/vendor/workerman/webman-framework/src/support/view/Raw.php b/vendor/workerman/webman-framework/src/support/view/Raw.php deleted file mode 100644 index 9747650..0000000 --- a/vendor/workerman/webman-framework/src/support/view/Raw.php +++ /dev/null @@ -1,79 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support\view; - -use Throwable; -use Webman\View; -use function app_path; -use function array_merge; -use function base_path; -use function config; -use function extract; -use function is_array; -use function ob_end_clean; -use function ob_get_clean; -use function ob_start; -use function request; - -/** - * Class Raw - * @package support\view - */ -class Raw implements View -{ - /** - * Assign. - * @param string|array $name - * @param mixed $value - */ - public static function assign(string|array $name, mixed $value = null): void - { - $request = request(); - $request->_view_vars = array_merge((array) $request->_view_vars, is_array($name) ? $name : [$name => $value]); - } - - /** - * Render. - * @param string $template - * @param array $vars - * @param string|null $app - * @param string|null $plugin - * @return string - */ - public static function render(string $template, array $vars, ?string $app = null, ?string $plugin = null): string - { - $request = request(); - $plugin = $plugin === null ? ($request->plugin ?? '') : $plugin; - $configPrefix = $plugin ? "plugin.$plugin." : ''; - $viewSuffix = config("{$configPrefix}view.options.view_suffix", 'html'); - $app = $app === null ? ($request->app ?? '') : $app; - $baseViewPath = $plugin ? base_path() . "/plugin/$plugin/app" : app_path(); - $__template_path__ = $template[0] === '/' ? base_path() . "$template.$viewSuffix" : ($app === '' ? "$baseViewPath/view/$template.$viewSuffix" : "$baseViewPath/$app/view/$template.$viewSuffix"); - if(isset($request->_view_vars)) { - extract((array)$request->_view_vars); - } - extract($vars); - ob_start(); - // Try to include php file. - try { - include $__template_path__; - } catch (Throwable $e) { - ob_end_clean(); - throw $e; - } - - return ob_get_clean(); - } -} diff --git a/vendor/workerman/webman-framework/src/support/view/ThinkPHP.php b/vendor/workerman/webman-framework/src/support/view/ThinkPHP.php deleted file mode 100644 index 64b6737..0000000 --- a/vendor/workerman/webman-framework/src/support/view/ThinkPHP.php +++ /dev/null @@ -1,87 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support\view; - -use think\Template; -use Webman\View; -use function app_path; -use function array_merge; -use function base_path; -use function config; -use function is_array; -use function ob_get_clean; -use function ob_start; -use function request; -use function runtime_path; - -/** - * Class Blade - * @package support\view - */ -class ThinkPHP implements View -{ - /** - * Assign. - * @param string|array $name - * @param mixed $value - */ - public static function assign(string|array $name, mixed $value = null): void - { - $request = request(); - $request->_view_vars = array_merge((array) $request->_view_vars, is_array($name) ? $name : [$name => $value]); - } - - /** - * Render. - * @param string $template - * @param array $vars - * @param string|null $app - * @param string|null $plugin - * @return string - */ - public static function render(string $template, array $vars, ?string $app = null, ?string $plugin = null): string - { - $request = request(); - $plugin = $plugin === null ? ($request->plugin ?? '') : $plugin; - $app = $app === null ? ($request->app ?? '') : $app; - $configPrefix = $plugin ? "plugin.$plugin." : ''; - $viewSuffix = config("{$configPrefix}view.options.view_suffix", 'html'); - $baseViewPath = $plugin ? base_path() . "/plugin/$plugin/app" : app_path(); - if ($template[0] === '/') { - if (strpos($template, '/view/') !== false) { - [$viewPath, $template] = explode('/view/', $template, 2); - $viewPath = base_path("$viewPath/view/"); - } else { - $viewPath = base_path() . dirname($template) . '/'; - $template = basename($template); - } - } else { - $viewPath = $app === '' ? "$baseViewPath/view/" : "$baseViewPath/$app/view/"; - } - $defaultOptions = [ - 'view_path' => $viewPath, - 'cache_path' => runtime_path() . '/views/', - 'view_suffix' => $viewSuffix - ]; - $options = array_merge($defaultOptions, config("{$configPrefix}view.options", [])); - $views = new Template($options); - ob_start(); - if(isset($request->_view_vars)) { - $vars = array_merge((array)$request->_view_vars, $vars); - } - $views->fetch($template, $vars); - return ob_get_clean(); - } -} diff --git a/vendor/workerman/webman-framework/src/support/view/Twig.php b/vendor/workerman/webman-framework/src/support/view/Twig.php deleted file mode 100644 index a8532e9..0000000 --- a/vendor/workerman/webman-framework/src/support/view/Twig.php +++ /dev/null @@ -1,87 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -namespace support\view; - -use Twig\Environment; -use Twig\Error\LoaderError; -use Twig\Error\RuntimeError; -use Twig\Error\SyntaxError; -use Twig\Loader\FilesystemLoader; -use Webman\View; -use function app_path; -use function array_merge; -use function base_path; -use function config; -use function is_array; -use function request; - -/** - * Class Blade - * @package support\view - */ -class Twig implements View -{ - /** - * Assign. - * @param string|array $name - * @param mixed $value - */ - public static function assign(string|array $name, mixed $value = null): void - { - $request = request(); - $request->_view_vars = array_merge((array) $request->_view_vars, is_array($name) ? $name : [$name => $value]); - } - - /** - * Render. - * @param string $template - * @param array $vars - * @param string|null $app - * @param string|null $plugin - * @return string - */ - public static function render(string $template, array $vars, ?string $app = null, ?string $plugin = null): string - { - static $views = []; - $request = request(); - $plugin = $plugin === null ? ($request->plugin ?? '') : $plugin; - $app = $app === null ? ($request->app ?? '') : $app; - $configPrefix = $plugin ? "plugin.$plugin." : ''; - $viewSuffix = config("{$configPrefix}view.options.view_suffix", 'html'); - $baseViewPath = $plugin ? base_path() . "/plugin/$plugin/app" : app_path(); - if ($template[0] === '/') { - $template = ltrim($template, '/'); - if (strpos($template, '/view/') !== false) { - [$viewPath, $template] = explode('/view/', $template, 2); - $viewPath = base_path("$viewPath/view"); - } else { - $viewPath = base_path(); - } - } else { - $viewPath = $app === '' ? "$baseViewPath/view/" : "$baseViewPath/$app/view/"; - } - if (!isset($views[$viewPath])) { - $views[$viewPath] = new Environment(new FilesystemLoader($viewPath), config("{$configPrefix}view.options", [])); - $extension = config("{$configPrefix}view.extension"); - if ($extension) { - $extension($views[$viewPath]); - } - } - if(isset($request->_view_vars)) { - $vars = array_merge((array)$request->_view_vars, $vars); - } - return $views[$viewPath]->render("$template.$viewSuffix", $vars); - } -} diff --git a/vendor/workerman/webman-framework/src/windows.php b/vendor/workerman/webman-framework/src/windows.php deleted file mode 100644 index f37a72c..0000000 --- a/vendor/workerman/webman-framework/src/windows.php +++ /dev/null @@ -1,136 +0,0 @@ -load(); - } else { - Dotenv::createMutable(base_path())->load(); - } -} - -App::loadAllConfig(['route']); - -$errorReporting = config('app.error_reporting'); -if (isset($errorReporting)) { - error_reporting($errorReporting); -} - -$runtimeProcessPath = runtime_path() . DIRECTORY_SEPARATOR . '/windows'; -$paths = [ - $runtimeProcessPath, - runtime_path('logs'), - runtime_path('views') -]; -foreach ($paths as $path) { - if (!is_dir($path)) { - mkdir($path, 0777, true); - } -} - -$processFiles = []; -if (config('server.listen')) { - $processFiles[] = __DIR__ . DIRECTORY_SEPARATOR . 'start.php'; -} -foreach (config('process', []) as $processName => $config) { - $processFiles[] = write_process_file($runtimeProcessPath, $processName, ''); -} - -foreach (config('plugin', []) as $firm => $projects) { - foreach ($projects as $name => $project) { - if (!is_array($project)) { - continue; - } - foreach ($project['process'] ?? [] as $processName => $config) { - $processFiles[] = write_process_file($runtimeProcessPath, $processName, "$firm.$name"); - } - } - foreach ($projects['process'] ?? [] as $processName => $config) { - $processFiles[] = write_process_file($runtimeProcessPath, $processName, $firm); - } -} - -function write_process_file($runtimeProcessPath, $processName, $firm): string -{ - $processParam = $firm ? "plugin.$firm.$processName" : $processName; - $configParam = $firm ? "config('plugin.$firm.process')['$processName']" : "config('process')['$processName']"; - $fileContent = << true]); - if (!$resource) { - exit("Can not execute $cmd\r\n"); - } - return $resource; -} - -$resource = popen_processes($processFiles); -echo "\r\n"; -while (1) { - sleep(1); - if (!empty($monitor) && $monitor->checkAllFilesChange()) { - $status = proc_get_status($resource); - $pid = $status['pid']; - shell_exec("taskkill /F /T /PID $pid"); - proc_close($resource); - $resource = popen_processes($processFiles); - } -} diff --git a/vendor/workerman/workerman/MIT-LICENSE.txt b/vendor/workerman/workerman/MIT-LICENSE.txt deleted file mode 100644 index 6f6ce35..0000000 --- a/vendor/workerman/workerman/MIT-LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2009-2025 walkor and contributors (see https://github.com/walkor/workerman/contributors) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/workerman/workerman/README.md b/vendor/workerman/workerman/README.md deleted file mode 100644 index 58cc9a6..0000000 --- a/vendor/workerman/workerman/README.md +++ /dev/null @@ -1,477 +0,0 @@ -# Workerman -[![Gitter](https://badges.gitter.im/walkor/Workerman.svg)](https://gitter.im/walkor/Workerman?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge) -[![Latest Stable Version](https://poser.pugx.org/workerman/workerman/v/stable)](https://packagist.org/packages/workerman/workerman) -[![Total Downloads](https://poser.pugx.org/workerman/workerman/downloads)](https://packagist.org/packages/workerman/workerman) -[![Monthly Downloads](https://poser.pugx.org/workerman/workerman/d/monthly)](https://packagist.org/packages/workerman/workerman) -[![Daily Downloads](https://poser.pugx.org/workerman/workerman/d/daily)](https://packagist.org/packages/workerman/workerman) -[![License](https://poser.pugx.org/workerman/workerman/license)](https://packagist.org/packages/workerman/workerman) - -## What is it -Workerman is an asynchronous event-driven PHP framework with high performance to build fast and scalable network applications. It supports HTTP, WebSocket, custom protocols, coroutines, and connection pools, making it ideal for handling high-concurrency scenarios efficiently. - -## Requires -A POSIX compatible operating system (Linux, OSX, BSD) -POSIX and PCNTL extensions required -Event/Swoole/Swow extension recommended for better performance - -## Installation - -``` -composer require workerman/workerman -``` - -## Documentation - -[https://manual.workerman.net](https://manual.workerman.net) - -## Basic Usage - -### A websocket server -```php -onConnect = function ($connection) { - echo "New connection\n"; -}; - -// Emitted when data received -$ws_worker->onMessage = function ($connection, $data) { - // Send hello $data - $connection->send('Hello ' . $data); -}; - -// Emitted when connection closed -$ws_worker->onClose = function ($connection) { - echo "Connection closed\n"; -}; - -// Run worker -Worker::runAll(); -``` - -### An http server -```php -use Workerman\Worker; - -require_once __DIR__ . '/vendor/autoload.php'; - -// #### http worker #### -$http_worker = new Worker('http://0.0.0.0:2345'); - -// 4 processes -$http_worker->count = 4; - -// Emitted when data received -$http_worker->onMessage = function ($connection, $request) { - //$request->get(); - //$request->post(); - //$request->header(); - //$request->cookie(); - //$request->session(); - //$request->uri(); - //$request->path(); - //$request->method(); - - // Send data to client - $connection->send("Hello World"); -}; - -// Run all workers -Worker::runAll(); -``` - -### A tcp server -```php -use Workerman\Worker; - -require_once __DIR__ . '/vendor/autoload.php'; - -// #### create socket and listen 1234 port #### -$tcp_worker = new Worker('tcp://0.0.0.0:1234'); - -// 4 processes -$tcp_worker->count = 4; - -// Emitted when new connection come -$tcp_worker->onConnect = function ($connection) { - echo "New Connection\n"; -}; - -// Emitted when data received -$tcp_worker->onMessage = function ($connection, $data) { - // Send data to client - $connection->send("Hello $data \n"); -}; - -// Emitted when connection is closed -$tcp_worker->onClose = function ($connection) { - echo "Connection closed\n"; -}; - -Worker::runAll(); -``` - -### Enable SSL -```php - [ - 'local_cert' => '/your/path/of/server.pem', - 'local_pk' => '/your/path/of/server.key', - 'verify_peer' => false, - ] -]; - -// Create a Websocket server with ssl context. -$ws_worker = new Worker('websocket://0.0.0.0:2346', $context); - -// Enable SSL. WebSocket+SSL means that Secure WebSocket (wss://). -// The similar approaches for Https etc. -$ws_worker->transport = 'ssl'; - -$ws_worker->onMessage = function ($connection, $data) { - // Send hello $data - $connection->send('Hello ' . $data); -}; - -Worker::runAll(); -``` - -### AsyncTcpConnection (tcp/ws/text/frame etc...) -```php - -use Workerman\Worker; -use Workerman\Connection\AsyncTcpConnection; - -require_once __DIR__ . '/vendor/autoload.php'; - -$worker = new Worker(); -$worker->onWorkerStart = function () { - // Websocket protocol for client. - $ws_connection = new AsyncTcpConnection('ws://echo.websocket.org:80'); - $ws_connection->onConnect = function ($connection) { - $connection->send('Hello'); - }; - $ws_connection->onMessage = function ($connection, $data) { - echo "Recv: $data\n"; - }; - $ws_connection->onError = function ($connection, $code, $msg) { - echo "Error: $msg\n"; - }; - $ws_connection->onClose = function ($connection) { - echo "Connection closed\n"; - }; - $ws_connection->connect(); -}; - -Worker::runAll(); -``` - -### Coroutine - -Coroutine is used to create coroutines, enabling the execution of asynchronous tasks to improve concurrency performance. - -```php -eventLoop = Swoole::class; // Or Swow::class or Fiber::class - -$worker->onMessage = function (TcpConnection $connection, Request $request) { - Coroutine::create(function () { - echo file_get_contents("http://www.example.com/event/notify"); - }); - $connection->send('ok'); -}; - -Worker::runAll(); -``` - -> Note: Coroutine require Swoole extension or Swow extension or [Fiber revolt/event-loop](https://github.com/revoltphp/event-loop), and the same applies below - -### Barrier -Barrier is used to manage concurrency and synchronization in coroutines. It allows tasks to run concurrently and waits until all tasks are completed, ensuring process synchronization. - -```php -eventLoop = Swoole::class; // Or Swow::class or Fiber::class -$worker->onMessage = function (TcpConnection $connection, Request $request) { - $barrier = Barrier::create(); - for ($i=1; $i<5; $i++) { - Coroutine::create(function () use ($barrier, $i) { - file_get_contents("http://127.0.0.1:8002?task_id=$i"); - }); - } - // Wait all coroutine done - Barrier::wait($barrier); - $connection->send('All Task Done'); -}; - -// Task Server -$task = new Worker('http://0.0.0.0:8002'); -$task->onMessage = function (TcpConnection $connection, Request $request) { - $task_id = $request->get('task_id'); - $message = "Task $task_id Done"; - echo $message . PHP_EOL; - $connection->close($message); -}; - -Worker::runAll(); -``` - -### Parallel -Parallel executes multiple tasks concurrently and collects results. Use add to add tasks and wait to wait for completion and get results. Unlike Barrier, Parallel directly returns the results of each task. - -```php -eventLoop = Swoole::class; // Or Swow::class or Fiber::class -$worker->onMessage = function (TcpConnection $connection, Request $request) { - $parallel = new Parallel(); - for ($i=1; $i<5; $i++) { - $parallel->add(function () use ($i) { - return file_get_contents("http://127.0.0.1:8002?task_id=$i"); - }); - } - $results = $parallel->wait(); - $connection->send(json_encode($results)); // Response: ["Task 1 Done","Task 2 Done","Task 3 Done","Task 4 Done"] -}; - -// Task Server -$task = new Worker('http://0.0.0.0:8002'); -$task->onMessage = function (TcpConnection $connection, Request $request) { - $task_id = $request->get('task_id'); - $message = "Task $task_id Done"; - $connection->close($message); -}; - -Worker::runAll(); -``` - -### Channel - -Channel is a mechanism for communication between coroutines. One coroutine can push data into the channel, while another can pop data from it, enabling synchronization and data sharing between coroutines. - -```php -eventLoop = Swoole::class; // Or Swow::class or Fiber::class -$worker->onMessage = function (TcpConnection $connection, Request $request) { - $channel = new Channel(2); - Coroutine::create(function () use ($channel) { - $channel->push('Task 1 Done'); - }); - Coroutine::create(function () use ($channel) { - $channel->push('Task 2 Done'); - }); - $result = []; - for ($i = 0; $i < 2; $i++) { - $result[] = $channel->pop(); - } - $connection->send(json_encode($result)); // Response: ["Task 1 Done","Task 2 Done"] -}; -Worker::runAll(); -``` - -### Pool - -Pool is used to manage connection or resource pools, improving performance by reusing resources (e.g., database connections). It supports acquiring, returning, creating, and destroying resources. - -```php -setConnectionCreator(function () use ($host, $port) { - $redis = new \Redis(); - $redis->connect($host, $port); - return $redis; - }); - $pool->setConnectionCloser(function ($redis) { - $redis->close(); - }); - $pool->setHeartbeatChecker(function ($redis) { - $redis->ping(); - }); - $this->pool = $pool; - } - public function get(): \Redis - { - return $this->pool->get(); - } - public function put($redis): void - { - $this->pool->put($redis); - } -} - -// Http Server -$worker = new Worker('http://0.0.0.0:8001'); -$worker->eventLoop = Swoole::class; // Or Swow::class or Fiber::class -$worker->onMessage = function (TcpConnection $connection, Request $request) { - static $pool; - if (!$pool) { - $pool = new RedisPool('127.0.0.1', 6379, 10); - } - $redis = $pool->get(); - $redis->set('key', 'hello'); - $value = $redis->get('key'); - $pool->put($redis); - $connection->send($value); -}; - -Worker::runAll(); -``` - - -### Pool for automatic acquisition and release - -```php -get(); - Context::set('pdo', $pdo); - // When the coroutine is destroyed, return the connection to the pool - Coroutine::defer(function () use ($pdo) { - self::$pool->put($pdo); - }); - } - return call_user_func_array([$pdo, $name], $arguments); - } - private static function initializePool(): void - { - self::$pool = new Pool(10); - self::$pool->setConnectionCreator(function () { - return new \PDO('mysql:host=127.0.0.1;dbname=your_database', 'your_username', 'your_password'); - }); - self::$pool->setConnectionCloser(function ($pdo) { - $pdo = null; - }); - self::$pool->setHeartbeatChecker(function ($pdo) { - $pdo->query('SELECT 1'); - }); - } -} - -// Http Server -$worker = new Worker('http://0.0.0.0:8001'); -$worker->eventLoop = Swoole::class; // Or Swow::class or Fiber::class -$worker->onMessage = function (TcpConnection $connection, Request $request) { - $value = Db::query('SELECT NOW() as now')->fetchAll(); - $connection->send(json_encode($value)); -}; - -Worker::runAll(); -``` - -## Available commands -```php start.php start ``` -```php start.php start -d ``` -```php start.php status ``` -```php start.php status -d ``` -```php start.php connections``` -```php start.php stop ``` -```php start.php stop -g ``` -```php start.php restart ``` -```php start.php reload ``` -```php start.php reload -g ``` - -# Benchmarks -https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=plaintext&l=zik073-1r - - -### Supported by - -[![JetBrains logo.](https://resources.jetbrains.com/storage/products/company/brand/logos/jetbrains.svg)](https://jb.gg/OpenSourceSupport) - - -## Other links with workerman - -[webman](https://github.com/walkor/webman) -[AdapterMan](https://github.com/joanhey/AdapterMan) - -## Donate -PayPal - -## LICENSE - -Workerman is released under the [MIT license](https://github.com/walkor/workerman/blob/master/MIT-LICENSE.txt). diff --git a/vendor/workerman/workerman/SECURITY.md b/vendor/workerman/workerman/SECURITY.md deleted file mode 100644 index c910997..0000000 --- a/vendor/workerman/workerman/SECURITY.md +++ /dev/null @@ -1,6 +0,0 @@ -# Security Policy - - -## Reporting a Vulnerability - -Please contact by email walkor@workerman.net diff --git a/vendor/workerman/workerman/composer.json b/vendor/workerman/workerman/composer.json deleted file mode 100644 index 8fd3452..0000000 --- a/vendor/workerman/workerman/composer.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "workerman/workerman", - "type": "library", - "keywords": [ - "event-loop", - "asynchronous", - "http", - "framework" - ], - "homepage": "https://www.workerman.net", - "license": "MIT", - "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.", - "authors": [ - { - "name": "walkor", - "email": "walkor@workerman.net", - "homepage": "https://www.workerman.net", - "role": "Developer" - } - ], - "support": { - "email": "walkor@workerman.net", - "issues": "https://github.com/walkor/workerman/issues", - "forum": "https://www.workerman.net/questions", - "wiki": "https://www.workerman.net/doc/workerman/", - "source": "https://github.com/walkor/workerman" - }, - "require": { - "php": ">=8.1", - "ext-json": "*", - "workerman/coroutine": "^1.1 || dev-main" - }, - "suggest": { - "ext-event": "For better performance. " - }, - "autoload": { - "psr-4": { - "Workerman\\": "src" - } - }, - "minimum-stability": "dev", - "conflict": { - "ext-swow": " - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Connection; - -use Exception; -use RuntimeException; -use stdClass; -use Throwable; -use Workerman\Timer; -use Workerman\Worker; -use function class_exists; -use function explode; -use function function_exists; -use function is_resource; -use function method_exists; -use function microtime; -use function parse_url; -use function socket_import_stream; -use function socket_set_option; -use function stream_context_create; -use function stream_set_blocking; -use function stream_set_read_buffer; -use function stream_socket_client; -use function stream_socket_get_name; -use function ucfirst; -use const DIRECTORY_SEPARATOR; -use const PHP_INT_MAX; -use const SO_KEEPALIVE; -use const SOL_SOCKET; -use const SOL_TCP; -use const STREAM_CLIENT_ASYNC_CONNECT; -use const TCP_NODELAY; - -/** - * AsyncTcpConnection. - */ -class AsyncTcpConnection extends TcpConnection -{ - /** - * PHP built-in protocols. - * - * @var array - */ - public const BUILD_IN_TRANSPORTS = [ - 'tcp' => 'tcp', - 'udp' => 'udp', - 'unix' => 'unix', - 'ssl' => 'ssl', - 'sslv2' => 'sslv2', - 'sslv3' => 'sslv3', - 'tls' => 'tls' - ]; - - /** - * Emitted when socket connection is successfully established. - * - * @var ?callable - */ - public $onConnect = null; - - /** - * Emitted when websocket handshake completed (Only work when protocol is ws). - * - * @var ?callable - */ - public $onWebSocketConnect = null; - - /** - * Transport layer protocol. - * - * @var string - */ - public string $transport = 'tcp'; - - /** - * Socks5 proxy. - * - * @var string - */ - public string $proxySocks5 = ''; - - /** - * Http proxy. - * - * @var string - */ - public string $proxyHttp = ''; - - /** - * Status. - * - * @var int - */ - protected int $status = self::STATUS_INITIAL; - - /** - * Remote host. - * - * @var string - */ - protected string $remoteHost = ''; - - /** - * Remote port. - * - * @var int - */ - protected int $remotePort = 80; - - /** - * Connect start time. - * - * @var float - */ - protected float $connectStartTime = 0; - - /** - * Remote URI. - * - * @var string - */ - protected string $remoteURI = ''; - - /** - * Context option. - * - * @var array - */ - protected array $socketContext = []; - - /** - * Reconnect timer. - * - * @var int - */ - protected int $reconnectTimer = 0; - - /** - * Construct. - * - * @param string $remoteAddress - * @param array $socketContext - */ - public function __construct(string $remoteAddress, array $socketContext = []) - { - $addressInfo = parse_url($remoteAddress); - if (!$addressInfo) { - [$scheme, $this->remoteAddress] = explode(':', $remoteAddress, 2); - if ('unix' === strtolower($scheme)) { - $this->remoteAddress = substr($remoteAddress, strpos($remoteAddress, '/') + 2); - } - if (!$this->remoteAddress) { - throw new RuntimeException('Bad remoteAddress'); - } - } else { - $addressInfo['port'] ??= 0; - $addressInfo['path'] ??= '/'; - if (!isset($addressInfo['query'])) { - $addressInfo['query'] = ''; - } else { - $addressInfo['query'] = '?' . $addressInfo['query']; - } - $this->remoteHost = $addressInfo['host']; - $this->remotePort = $addressInfo['port']; - $this->remoteURI = "{$addressInfo['path']}{$addressInfo['query']}"; - $scheme = $addressInfo['scheme'] ?? 'tcp'; - $this->remoteAddress = 'unix' === strtolower($scheme) - ? substr($remoteAddress, strpos($remoteAddress, '/') + 2) - : $this->remoteHost . ':' . $this->remotePort; - } - - $this->id = $this->realId = self::$idRecorder++; - if (PHP_INT_MAX === self::$idRecorder) { - self::$idRecorder = 0; - } - // Check application layer protocol class. - if (!isset(self::BUILD_IN_TRANSPORTS[$scheme])) { - $scheme = ucfirst($scheme); - $this->protocol = '\\Protocols\\' . $scheme; - if (!class_exists($this->protocol)) { - $this->protocol = "\\Workerman\\Protocols\\$scheme"; - if (!class_exists($this->protocol)) { - throw new RuntimeException("class \\Protocols\\$scheme not exist"); - } - } - } else { - $this->transport = self::BUILD_IN_TRANSPORTS[$scheme]; - } - - // For statistics. - ++self::$statistics['connection_count']; - $this->maxSendBufferSize = self::$defaultMaxSendBufferSize; - $this->maxPackageSize = self::$defaultMaxPackageSize; - $this->socketContext = $socketContext; - static::$connections[$this->realId] = $this; - $this->context = new stdClass; - } - - /** - * Reconnect. - * - * @param int $after - * @return void - */ - public function reconnect(int $after = 0): void - { - $this->status = self::STATUS_INITIAL; - static::$connections[$this->realId] = $this; - if ($this->reconnectTimer) { - Timer::del($this->reconnectTimer); - } - if ($after > 0) { - $this->reconnectTimer = Timer::add($after, $this->connect(...), null, false); - return; - } - $this->connect(); - } - - /** - * Do connect. - * - * @return void - */ - public function connect(): void - { - if ($this->status !== self::STATUS_INITIAL && $this->status !== self::STATUS_CLOSING && - $this->status !== self::STATUS_CLOSED) { - return; - } - - if (!$this->eventLoop) { - $this->eventLoop = Worker::$globalEvent; - } - - $this->status = self::STATUS_CONNECTING; - $this->connectStartTime = microtime(true); - set_error_handler(fn() => false); - if ($this->transport !== 'unix') { - if (!$this->remotePort) { - $this->remotePort = $this->transport === 'ssl' ? 443 : 80; - $this->remoteAddress = $this->remoteHost . ':' . $this->remotePort; - } - // Open socket connection asynchronously. - if ($this->proxySocks5) { - $this->socketContext['ssl']['peer_name'] = $this->remoteHost; - $context = stream_context_create($this->socketContext); - $this->socket = stream_socket_client("tcp://$this->proxySocks5", $errno, $err_str, 0, STREAM_CLIENT_ASYNC_CONNECT, $context); - } else if ($this->proxyHttp) { - $this->socketContext['ssl']['peer_name'] = $this->remoteHost; - $context = stream_context_create($this->socketContext); - $this->socket = stream_socket_client("tcp://$this->proxyHttp", $errno, $err_str, 0, STREAM_CLIENT_ASYNC_CONNECT, $context); - } else if ($this->socketContext) { - $context = stream_context_create($this->socketContext); - $this->socket = stream_socket_client("tcp://$this->remoteHost:$this->remotePort", - $errno, $err_str, 0, STREAM_CLIENT_ASYNC_CONNECT, $context); - } else { - $this->socket = stream_socket_client("tcp://$this->remoteHost:$this->remotePort", - $errno, $err_str, 0, STREAM_CLIENT_ASYNC_CONNECT); - } - } else { - $this->socket = stream_socket_client("$this->transport://$this->remoteAddress", $errno, $err_str, 0, - STREAM_CLIENT_ASYNC_CONNECT); - } - restore_error_handler(); - // If failed attempt to emit onError callback. - if (!$this->socket || !is_resource($this->socket)) { - $this->emitError(static::CONNECT_FAIL, $err_str); - if ($this->status === self::STATUS_CLOSING) { - $this->destroy(); - } - if ($this->status === self::STATUS_CLOSED) { - $this->onConnect = null; - } - return; - } - // Add socket to global event loop waiting connection is successfully established or failed. - $this->eventLoop->onWritable($this->socket, $this->checkConnection(...)); - // For windows. - if (DIRECTORY_SEPARATOR === '\\' && method_exists($this->eventLoop, 'onExcept')) { - $this->eventLoop->onExcept($this->socket, $this->checkConnection(...)); - } - } - - /** - * Try to emit onError callback. - * - * @param int $code - * @param mixed $msg - * @return void - */ - protected function emitError(int $code, mixed $msg): void - { - $this->status = self::STATUS_CLOSING; - if ($this->onError) { - try { - ($this->onError)($this, $code, $msg); - } catch (Throwable $e) { - $this->error($e); - } - } - } - - /** - * CancelReconnect. - */ - public function cancelReconnect(): void - { - if ($this->reconnectTimer) { - Timer::del($this->reconnectTimer); - $this->reconnectTimer = 0; - } - } - - /** - * Get remote address. - * - * @return string - */ - public function getRemoteHost(): string - { - return $this->remoteHost; - } - - /** - * Get remote URI. - * - * @return string - */ - public function getRemoteURI(): string - { - return $this->remoteURI; - } - - /** - * Check connection is successfully established or failed. - * - * @return void - */ - public function checkConnection(): void - { - // Remove EV_EXPECT for windows. - if (DIRECTORY_SEPARATOR === '\\' && method_exists($this->eventLoop, 'offExcept')) { - $this->eventLoop->offExcept($this->socket); - } - // Remove write listener. - $this->eventLoop->offWritable($this->socket); - - if ($this->status !== self::STATUS_CONNECTING) { - return; - } - - // Check socket state. - if ($address = stream_socket_get_name($this->socket, true)) { - // Proxy - if ($this->proxySocks5 && $address === $this->proxySocks5) { - fwrite($this->socket, chr(5) . chr(1) . chr(0)); - fread($this->socket, 512); - fwrite($this->socket, chr(5) . chr(1) . chr(0) . chr(3) . chr(strlen($this->remoteHost)) . $this->remoteHost . pack("n", $this->remotePort)); - fread($this->socket, 512); - } - if ($this->proxyHttp && $address === $this->proxyHttp) { - $str = "CONNECT $this->remoteHost:$this->remotePort HTTP/1.1\r\n"; - $str .= "Host: $this->remoteHost:$this->remotePort\r\n"; - $str .= "Proxy-Connection: keep-alive\r\n\r\n"; - fwrite($this->socket, $str); - fread($this->socket, 512); - } - // Nonblocking. - stream_set_blocking($this->socket, false); - stream_set_read_buffer($this->socket, 0); - // Try to open keepalive for tcp and disable Nagle algorithm. - if (function_exists('socket_import_stream') && $this->transport === 'tcp') { - $socket = socket_import_stream($this->socket); - socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1); - socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1); - if (defined('TCP_KEEPIDLE') && defined('TCP_KEEPINTVL') && defined('TCP_KEEPCNT')) { - socket_set_option($socket, SOL_TCP, TCP_KEEPIDLE, static::TCP_KEEPALIVE_INTERVAL); - socket_set_option($socket, SOL_TCP, TCP_KEEPINTVL, static::TCP_KEEPALIVE_INTERVAL); - socket_set_option($socket, SOL_TCP, TCP_KEEPCNT, 1); - } - } - // SSL handshake. - if ($this->transport === 'ssl') { - $this->sslHandshakeCompleted = $this->doSslHandshake($this->socket); - if ($this->sslHandshakeCompleted === false) { - return; - } - } else { - // There are some data waiting to send. - if ($this->sendBuffer) { - $this->eventLoop->onWritable($this->socket, $this->baseWrite(...)); - } - } - // Register a listener waiting read event. - $this->eventLoop->onReadable($this->socket, $this->baseRead(...)); - - $this->status = self::STATUS_ESTABLISHED; - $this->remoteAddress = $address; - - // Try to emit onConnect callback. - if ($this->onConnect) { - try { - ($this->onConnect)($this); - } catch (Throwable $e) { - $this->error($e); - } - } - // Try to emit protocol::onConnect - if ($this->protocol && method_exists($this->protocol, 'onConnect')) { - try { - $this->protocol::onConnect($this); - } catch (Throwable $e) { - $this->error($e); - } - } - } else { - // Connection failed. - $this->emitError(static::CONNECT_FAIL, 'connect ' . $this->remoteAddress . ' fail after ' . round(microtime(true) - $this->connectStartTime, 4) . ' seconds'); - if ($this->status === self::STATUS_CLOSING) { - $this->destroy(); - } - if ($this->status === self::STATUS_CLOSED) { - $this->onConnect = null; - } - } - } -} diff --git a/vendor/workerman/workerman/src/Connection/AsyncUdpConnection.php b/vendor/workerman/workerman/src/Connection/AsyncUdpConnection.php deleted file mode 100644 index 0ffd3a6..0000000 --- a/vendor/workerman/workerman/src/Connection/AsyncUdpConnection.php +++ /dev/null @@ -1,210 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Connection; - -use Exception; -use RuntimeException; -use Throwable; -use Workerman\Protocols\ProtocolInterface; -use Workerman\Worker; -use function class_exists; -use function explode; -use function fclose; -use function stream_context_create; -use function stream_set_blocking; -use function stream_socket_client; -use function stream_socket_recvfrom; -use function stream_socket_sendto; -use function strlen; -use function substr; -use function ucfirst; -use const STREAM_CLIENT_CONNECT; - -/** - * AsyncUdpConnection. - */ -class AsyncUdpConnection extends UdpConnection -{ - /** - * Emitted when socket connection is successfully established. - * - * @var ?callable - */ - public $onConnect = null; - - /** - * Emitted when socket connection closed. - * - * @var ?callable - */ - public $onClose = null; - - /** - * Connected or not. - * - * @var bool - */ - protected bool $connected = false; - - /** - * Context option. - * - * @var array - */ - protected array $contextOption = []; - - /** - * Construct. - * - * @param string $remoteAddress - * @throws Throwable - */ - public function __construct($remoteAddress, $contextOption = []) - { - // Get the application layer communication protocol and listening address. - [$scheme, $address] = explode(':', $remoteAddress, 2); - // Check application layer protocol class. - if ($scheme !== 'udp') { - $scheme = ucfirst($scheme); - $this->protocol = '\\Protocols\\' . $scheme; - if (!class_exists($this->protocol)) { - $this->protocol = "\\Workerman\\Protocols\\$scheme"; - if (!class_exists($this->protocol)) { - throw new RuntimeException("class \\Protocols\\$scheme not exist"); - } - } - } - - $this->remoteAddress = substr($address, 2); - $this->contextOption = $contextOption; - } - - /** - * For udp package. - * - * @param resource $socket - * @return void - */ - public function baseRead($socket): void - { - $recvBuffer = stream_socket_recvfrom($socket, static::MAX_UDP_PACKAGE_SIZE, 0, $remoteAddress); - if (false === $recvBuffer || empty($remoteAddress)) { - return; - } - - if ($this->onMessage) { - if ($this->protocol) { - $recvBuffer = $this->protocol::decode($recvBuffer, $this); - } - ++ConnectionInterface::$statistics['total_request']; - try { - ($this->onMessage)($this, $recvBuffer); - } catch (Throwable $e) { - $this->error($e); - } - } - } - - /** - * Close connection. - * - * @param mixed $data - * @param bool $raw - * @return void - */ - public function close(mixed $data = null, bool $raw = false): void - { - if ($data !== null) { - $this->send($data, $raw); - } - $this->eventLoop->offReadable($this->socket); - fclose($this->socket); - $this->connected = false; - // Try to emit onClose callback. - if ($this->onClose) { - try { - ($this->onClose)($this); - } catch (Throwable $e) { - $this->error($e); - } - } - $this->onConnect = $this->onMessage = $this->onClose = $this->eventLoop = $this->errorHandler = null; - } - - /** - * Sends data on the connection. - * - * @param mixed $sendBuffer - * @param bool $raw - * @return bool|null - */ - public function send(mixed $sendBuffer, bool $raw = false): bool|null - { - if (false === $raw && $this->protocol) { - $sendBuffer = $this->protocol::encode($sendBuffer, $this); - if ($sendBuffer === '') { - return null; - } - } - if ($this->connected === false) { - $this->connect(); - } - return strlen($sendBuffer) === stream_socket_sendto($this->socket, $sendBuffer); - } - - /** - * Connect. - * - * @return void - */ - public function connect(): void - { - if ($this->connected === true) { - return; - } - if (!$this->eventLoop) { - $this->eventLoop = Worker::$globalEvent; - } - if ($this->contextOption) { - $context = stream_context_create($this->contextOption); - $this->socket = stream_socket_client("udp://$this->remoteAddress", $errno, $errmsg, - 30, STREAM_CLIENT_CONNECT, $context); - } else { - $this->socket = stream_socket_client("udp://$this->remoteAddress", $errno, $errmsg); - } - - if (!$this->socket) { - Worker::safeEcho((string)(new Exception($errmsg))); - $this->eventLoop = null; - return; - } - - stream_set_blocking($this->socket, false); - if ($this->onMessage) { - $this->eventLoop->onReadable($this->socket, $this->baseRead(...)); - } - $this->connected = true; - // Try to emit onConnect callback. - if ($this->onConnect) { - try { - ($this->onConnect)($this); - } catch (Throwable $e) { - $this->error($e); - } - } - } -} diff --git a/vendor/workerman/workerman/src/Connection/ConnectionInterface.php b/vendor/workerman/workerman/src/Connection/ConnectionInterface.php deleted file mode 100644 index a120442..0000000 --- a/vendor/workerman/workerman/src/Connection/ConnectionInterface.php +++ /dev/null @@ -1,187 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Connection; - -use Throwable; -use Workerman\Events\Event; -use Workerman\Events\EventInterface; -use Workerman\Worker; -use AllowDynamicProperties; - -/** - * ConnectionInterface. - */ -#[AllowDynamicProperties] -abstract class ConnectionInterface -{ - /** - * Connect failed. - * - * @var int - */ - public const CONNECT_FAIL = 1; - - /** - * Send failed. - * - * @var int - */ - public const SEND_FAIL = 2; - - /** - * Statistics for status command. - * - * @var array - */ - public static array $statistics = [ - 'connection_count' => 0, - 'total_request' => 0, - 'throw_exception' => 0, - 'send_fail' => 0, - ]; - - /** - * Application layer protocol. - * The format is like this Workerman\\Protocols\\Http. - * - * @var ?class-string - */ - public ?string $protocol = null; - - /** - * Emitted when data is received. - * - * @var ?callable - */ - public $onMessage = null; - - /** - * Emitted when the other end of the socket sends a FIN packet. - * - * @var ?callable - */ - public $onClose = null; - - /** - * Emitted when an error occurs with connection. - * - * @var ?callable - */ - public $onError = null; - - /** - * @var ?EventInterface - */ - public ?EventInterface $eventLoop = null; - - /** - * @var ?callable - */ - public $errorHandler = null; - - /** - * Sends data on the connection. - * - * @param mixed $sendBuffer - * @param bool $raw - * @return bool|null - */ - abstract public function send(mixed $sendBuffer, bool $raw = false): bool|null; - - /** - * Get remote IP. - * - * @return string - */ - abstract public function getRemoteIp(): string; - - /** - * Get remote port. - * - * @return int - */ - abstract public function getRemotePort(): int; - - /** - * Get remote address. - * - * @return string - */ - abstract public function getRemoteAddress(): string; - - /** - * Get local IP. - * - * @return string - */ - abstract public function getLocalIp(): string; - - /** - * Get local port. - * - * @return int - */ - abstract public function getLocalPort(): int; - - /** - * Get local address. - * - * @return string - */ - abstract public function getLocalAddress(): string; - - /** - * Close connection. - * - * @param mixed $data - * @param bool $raw - * @return void - */ - abstract public function close(mixed $data = null, bool $raw = false): void; - - /** - * Is ipv4. - * - * return bool. - */ - abstract public function isIpV4(): bool; - - /** - * Is ipv6. - * - * return bool. - */ - abstract public function isIpV6(): bool; - - /** - * @param Throwable $exception - * @return void - */ - public function error(Throwable $exception): void - { - if (!$this->errorHandler) { - Worker::stopAll(250, $exception); - return; - } - try { - ($this->errorHandler)($exception); - } catch (Throwable $exception) { - Worker::stopAll(250, $exception); - return; - } - } -} diff --git a/vendor/workerman/workerman/src/Connection/TcpConnection.php b/vendor/workerman/workerman/src/Connection/TcpConnection.php deleted file mode 100644 index e396d90..0000000 --- a/vendor/workerman/workerman/src/Connection/TcpConnection.php +++ /dev/null @@ -1,1152 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -declare(strict_types=1); - -namespace Workerman\Connection; - -use JsonSerializable; -use RuntimeException; -use stdClass; -use Throwable; -use Workerman\Events\Ev; -use Workerman\Events\Event; -use Workerman\Events\EventInterface; -use Workerman\Events\Select; -use Workerman\Protocols\Http\Request; -use Workerman\Protocols\ProtocolInterface; -use Workerman\Worker; - -use function ceil; -use function count; -use function fclose; -use function feof; -use function fread; -use function function_exists; -use function fwrite; -use function is_object; -use function is_resource; -use function key; -use function method_exists; -use function posix_getpid; -use function restore_error_handler; -use function set_error_handler; -use function stream_set_blocking; -use function stream_set_read_buffer; -use function stream_socket_enable_crypto; -use function stream_socket_get_name; -use function strlen; -use function strrchr; -use function strrpos; -use function substr; -use function var_export; - -use const PHP_INT_MAX; -use const STREAM_CRYPTO_METHOD_SSLv23_CLIENT; -use const STREAM_CRYPTO_METHOD_SSLv23_SERVER; -use const STREAM_CRYPTO_METHOD_SSLv2_CLIENT; -use const STREAM_CRYPTO_METHOD_SSLv2_SERVER; - -/** - * TcpConnection. - * @property string $websocketType - */ -class TcpConnection extends ConnectionInterface implements JsonSerializable -{ - /** - * Read buffer size. - * - * @var int - */ - public const READ_BUFFER_SIZE = 87380; - - /** - * Status initial. - * - * @var int - */ - public const STATUS_INITIAL = 0; - - /** - * Status connecting. - * - * @var int - */ - public const STATUS_CONNECTING = 1; - - /** - * Status connection established. - * - * @var int - */ - public const STATUS_ESTABLISHED = 2; - - /** - * Status closing. - * - * @var int - */ - public const STATUS_CLOSING = 4; - - /** - * Status closed. - * - * @var int - */ - public const STATUS_CLOSED = 8; - - /** - * Maximum string length for cache - * - * @var int - */ - public const MAX_CACHE_STRING_LENGTH = 2048; - - /** - * Maximum cache size. - * - * @var int - */ - public const MAX_CACHE_SIZE = 512; - - /** - * Tcp keepalive interval. - */ - public const TCP_KEEPALIVE_INTERVAL = 55; - - /** - * Emitted when socket connection is successfully established. - * - * @var ?callable - */ - public $onConnect = null; - - /** - * Emitted before websocket handshake (Only works when protocol is ws). - * - * @var ?callable - */ - public $onWebSocketConnect = null; - - /** - * Emitted after websocket handshake (Only works when protocol is ws). - * - * @var ?callable - */ - public $onWebSocketConnected = null; - - /** - * Emitted when data is received. - * - * @var ?callable - */ - public $onMessage = null; - - /** - * Emitted when the other end of the socket sends a FIN packet. - * - * @var ?callable - */ - public $onClose = null; - - /** - * Emitted when an error occurs with connection. - * - * @var ?callable - */ - public $onError = null; - - /** - * Emitted when the send buffer becomes full. - * - * @var ?callable - */ - public $onBufferFull = null; - - /** - * Emitted when send buffer becomes empty. - * - * @var ?callable - */ - public $onBufferDrain = null; - - /** - * Transport (tcp/udp/unix/ssl). - * - * @var string - */ - public string $transport = 'tcp'; - - /** - * Which worker belong to. - * - * @var ?Worker - */ - public ?Worker $worker = null; - - /** - * Bytes read. - * - * @var int - */ - public int $bytesRead = 0; - - /** - * Bytes written. - * - * @var int - */ - public int $bytesWritten = 0; - - /** - * Connection->id. - * - * @var int - */ - public int $id = 0; - - /** - * A copy of $worker->id which used to clean up the connection in worker->connections - * - * @var int - */ - protected int $realId = 0; - - /** - * Sets the maximum send buffer size for the current connection. - * OnBufferFull callback will be emitted When send buffer is full. - * - * @var int - */ - public int $maxSendBufferSize = 1048576; - - /** - * Context. - * - * @var ?stdClass - */ - public ?stdClass $context = null; - - /** - * @var array - */ - public array $headers = []; - - /** - * @var ?Request - */ - public ?Request $request = null; - - /** - * Is safe. - * - * @var bool - */ - protected bool $isSafe = true; - - /** - * Default send buffer size. - * - * @var int - */ - public static int $defaultMaxSendBufferSize = 1048576; - - /** - * Sets the maximum acceptable packet size for the current connection. - * - * @var int - */ - public int $maxPackageSize = 1048576; - - /** - * Default maximum acceptable packet size. - * - * @var int - */ - public static int $defaultMaxPackageSize = 10485760; - - /** - * Id recorder. - * - * @var int - */ - protected static int $idRecorder = 1; - - /** - * Socket - * - * @var resource - */ - protected $socket = null; - - /** - * Send buffer. - * - * @var string - */ - protected string $sendBuffer = ''; - - /** - * Receive buffer. - * - * @var string - */ - protected string $recvBuffer = ''; - - /** - * Current package length. - * - * @var int - */ - protected int $currentPackageLength = 0; - - /** - * Connection status. - * - * @var int - */ - protected int $status = self::STATUS_ESTABLISHED; - - /** - * Remote address. - * - * @var string - */ - protected string $remoteAddress = ''; - - /** - * Is paused. - * - * @var bool - */ - protected bool $isPaused = false; - - /** - * SSL handshake completed or not. - * - * @var bool - */ - protected bool|int $sslHandshakeCompleted = false; - - /** - * All connection instances. - * - * @var array - */ - public static array $connections = []; - - - /** - * Reuse request. - * - * @var bool - */ - protected static bool $reuseRequest = false; - - /** - * Status to string. - * - * @var array - */ - public const STATUS_TO_STRING = [ - self::STATUS_INITIAL => 'INITIAL', - self::STATUS_CONNECTING => 'CONNECTING', - self::STATUS_ESTABLISHED => 'ESTABLISHED', - self::STATUS_CLOSING => 'CLOSING', - self::STATUS_CLOSED => 'CLOSED', - ]; - - /** - * Construct. - * - * @param EventInterface $eventLoop - * @param resource $socket - * @param string $remoteAddress - */ - public function __construct(EventInterface $eventLoop, $socket, string $remoteAddress = '') - { - ++self::$statistics['connection_count']; - $this->id = $this->realId = self::$idRecorder++; - if (self::$idRecorder === PHP_INT_MAX) { - self::$idRecorder = 0; - } - $this->socket = $socket; - stream_set_blocking($this->socket, false); - stream_set_read_buffer($this->socket, 0); - $this->eventLoop = $eventLoop; - $this->eventLoop->onReadable($this->socket, $this->baseRead(...)); - $this->maxSendBufferSize = self::$defaultMaxSendBufferSize; - $this->maxPackageSize = self::$defaultMaxPackageSize; - $this->remoteAddress = $remoteAddress; - static::$connections[$this->id] = $this; - $this->context = new stdClass(); - } - - /** - * Get status. - * - * @param bool $rawOutput - * - * @return int|string - */ - public function getStatus(bool $rawOutput = true): int|string - { - if ($rawOutput) { - return $this->status; - } - return self::STATUS_TO_STRING[$this->status]; - } - - /** - * Sends data on the connection. - * - * @param mixed $sendBuffer - * @param bool $raw - * @return bool|null - */ - public function send(mixed $sendBuffer, bool $raw = false): bool|null - { - if ($this->status === self::STATUS_CLOSING || $this->status === self::STATUS_CLOSED) { - return false; - } - - // Try to call protocol::encode($sendBuffer) before sending. - if (false === $raw && $this->protocol !== null) { - try { - $sendBuffer = $this->protocol::encode($sendBuffer, $this); - } catch(Throwable $e) { - $this->error($e); - } - if ($sendBuffer === '') { - return null; - } - } - - if ($this->status !== self::STATUS_ESTABLISHED || - ($this->transport === 'ssl' && $this->sslHandshakeCompleted !== true) - ) { - if ($this->sendBuffer && $this->bufferIsFull()) { - ++self::$statistics['send_fail']; - return false; - } - $this->sendBuffer .= $sendBuffer; - $this->checkBufferWillFull(); - return null; - } - - // Attempt to send data directly. - if ($this->sendBuffer === '') { - if ($this->transport === 'ssl') { - $this->eventLoop->onWritable($this->socket, $this->baseWrite(...)); - $this->sendBuffer = $sendBuffer; - $this->checkBufferWillFull(); - return null; - } - $len = 0; - try { - $len = @fwrite($this->socket, $sendBuffer); - } catch (Throwable $e) { - Worker::log($e); - } - // send successful. - if ($len === strlen($sendBuffer)) { - $this->bytesWritten += $len; - return true; - } - // Send only part of the data. - if ($len > 0) { - $this->sendBuffer = substr($sendBuffer, $len); - $this->bytesWritten += $len; - } else { - // Connection closed? - if (!is_resource($this->socket) || feof($this->socket)) { - ++self::$statistics['send_fail']; - if ($this->onError) { - try { - ($this->onError)($this, static::SEND_FAIL, 'client closed'); - } catch (Throwable $e) { - $this->error($e); - } - } - $this->destroy(); - return false; - } - $this->sendBuffer = $sendBuffer; - } - $this->eventLoop->onWritable($this->socket, $this->baseWrite(...)); - // Check if send buffer will be full. - $this->checkBufferWillFull(); - return null; - } - - if ($this->bufferIsFull()) { - ++self::$statistics['send_fail']; - return false; - } - - $this->sendBuffer .= $sendBuffer; - // Check if send buffer is full. - $this->checkBufferWillFull(); - return null; - } - - /** - * Get remote IP. - * - * @return string - */ - public function getRemoteIp(): string - { - $pos = strrpos($this->remoteAddress, ':'); - if ($pos) { - return substr($this->remoteAddress, 0, $pos); - } - return ''; - } - - /** - * Get remote port. - * - * @return int - */ - public function getRemotePort(): int - { - if ($this->remoteAddress) { - return (int)substr(strrchr($this->remoteAddress, ':'), 1); - } - return 0; - } - - /** - * Get remote address. - * - * @return string - */ - public function getRemoteAddress(): string - { - return $this->remoteAddress; - } - - /** - * Get local IP. - * - * @return string - */ - public function getLocalIp(): string - { - $address = $this->getLocalAddress(); - $pos = strrpos($address, ':'); - if (!$pos) { - return ''; - } - return substr($address, 0, $pos); - } - - /** - * Get local port. - * - * @return int - */ - public function getLocalPort(): int - { - $address = $this->getLocalAddress(); - $pos = strrpos($address, ':'); - if (!$pos) { - return 0; - } - return (int)substr(strrchr($address, ':'), 1); - } - - /** - * Get local address. - * - * @return string - */ - public function getLocalAddress(): string - { - if (!is_resource($this->socket)) { - return ''; - } - return (string)@stream_socket_get_name($this->socket, false); - } - - /** - * Get send buffer queue size. - * - * @return integer - */ - public function getSendBufferQueueSize(): int - { - return strlen($this->sendBuffer); - } - - /** - * Get receive buffer queue size. - * - * @return integer - */ - public function getRecvBufferQueueSize(): int - { - return strlen($this->recvBuffer); - } - - /** - * Pauses the reading of data. That is onMessage will not be emitted. Useful to throttle back an upload. - * - * @return void - */ - public function pauseRecv(): void - { - if($this->eventLoop !== null){ - $this->eventLoop->offReadable($this->socket); - } - $this->isPaused = true; - } - - /** - * Resumes reading after a call to pauseRecv. - * - * @return void - */ - public function resumeRecv(): void - { - if ($this->isPaused === true) { - $this->eventLoop->onReadable($this->socket, $this->baseRead(...)); - $this->isPaused = false; - $this->baseRead($this->socket, false); - } - } - - - /** - * Base read handler. - * - * @param resource $socket - * @param bool $checkEof - * @return void - */ - public function baseRead($socket, bool $checkEof = true): void - { - static $requests = []; - // SSL handshake. - if ($this->transport === 'ssl' && $this->sslHandshakeCompleted !== true) { - if ($this->doSslHandshake($socket)) { - $this->sslHandshakeCompleted = true; - if ($this->sendBuffer) { - $this->eventLoop->onWritable($socket, $this->baseWrite(...)); - } - } else { - return; - } - } - - $buffer = ''; - try { - $buffer = @fread($socket, self::READ_BUFFER_SIZE); - } catch (Throwable) { - // do nothing - } - - // Check connection closed. - if ($buffer === '' || $buffer === false) { - if ($checkEof && (feof($socket) || !is_resource($socket) || $buffer === false)) { - $this->destroy(); - return; - } - } else { - $this->bytesRead += strlen($buffer); - if ($this->recvBuffer === '') { - if (!isset($buffer[static::MAX_CACHE_STRING_LENGTH]) && isset($requests[$buffer])) { - ++self::$statistics['total_request']; - $request = $requests[$buffer]; - if ($request instanceof Request) { - $request->connection = $this; - $this->request = $request; - try { - ($this->onMessage)($this, $request); - } catch (Throwable $e) { - $this->error($e); - } - $request->destroy(); - $requests[$buffer] = static::$reuseRequest ? $request : clone $request; - return; - } - try { - ($this->onMessage)($this, $request); - } catch (Throwable $e) { - $this->error($e); - } - return; - } - $this->recvBuffer = $buffer; - } else { - $this->recvBuffer .= $buffer; - } - } - - // If the application layer protocol has been set up. - if ($this->protocol !== null) { - while ($this->recvBuffer !== '' && !$this->isPaused) { - // The current packet length is known. - if ($this->currentPackageLength) { - // Data is not enough for a package. - if ($this->currentPackageLength > strlen($this->recvBuffer)) { - break; - } - } else { - // Get current package length. - try { - $this->currentPackageLength = $this->protocol::input($this->recvBuffer, $this); - } catch (Throwable $e) { - $this->currentPackageLength = -1; - Worker::safeEcho((string)$e); - } - // The packet length is unknown. - if ($this->currentPackageLength === 0) { - break; - } elseif ($this->currentPackageLength > 0 && $this->currentPackageLength <= $this->maxPackageSize) { - // Data is not enough for a package. - if ($this->currentPackageLength > strlen($this->recvBuffer)) { - break; - } - } // Wrong package. - else { - Worker::safeEcho((string)(new RuntimeException("Protocol $this->protocol Error package. package_length=" . var_export($this->currentPackageLength, true)))); - $this->destroy(); - return; - } - } - - // The data is enough for a packet. - ++self::$statistics['total_request']; - // The current packet length is equal to the length of the buffer. - if ($one = (strlen($this->recvBuffer) === $this->currentPackageLength)) { - $oneRequestBuffer = $this->recvBuffer; - $this->recvBuffer = ''; - } else { - // Get a full package from the buffer. - $oneRequestBuffer = substr($this->recvBuffer, 0, $this->currentPackageLength); - // Remove the current package from receive buffer. - $this->recvBuffer = substr($this->recvBuffer, $this->currentPackageLength); - } - // Reset the current packet length to 0. - $this->currentPackageLength = 0; - try { - // Decode request buffer before Emitting onMessage callback. - $request = $this->protocol::decode($oneRequestBuffer, $this); - if ((!is_object($request) || $request instanceof Request) && $one && !isset($oneRequestBuffer[static::MAX_CACHE_STRING_LENGTH])) { - ($this->onMessage)($this, $request); - if ($request instanceof Request) { - $request->destroy(); - $requests[$oneRequestBuffer] = clone $request; - } else { - $requests[$oneRequestBuffer] = $request; - } - if (count($requests) > static::MAX_CACHE_SIZE) { - unset($requests[key($requests)]); - } - return; - } - ($this->onMessage)($this, $request); - } catch (Throwable $e) { - $this->error($e); - } - } - return; - } - - if ($this->recvBuffer === '' || $this->isPaused) { - return; - } - - // Applications protocol is not set. - ++self::$statistics['total_request']; - try { - ($this->onMessage)($this, $this->recvBuffer); - } catch (Throwable $e) { - $this->error($e); - } - // Clean receive buffer. - $this->recvBuffer = ''; - } - - /** - * Base write handler. - * - * @return void - */ - public function baseWrite(): void - { - $len = 0; - try { - if ($this->transport === 'ssl') { - $len = @fwrite($this->socket, $this->sendBuffer, 8192); - } else { - $len = @fwrite($this->socket, $this->sendBuffer); - } - } catch (Throwable) { - } - if ($len === strlen($this->sendBuffer)) { - $this->bytesWritten += $len; - $this->eventLoop->offWritable($this->socket); - $this->sendBuffer = ''; - // Try to emit onBufferDrain callback when send buffer becomes empty. - if ($this->onBufferDrain) { - try { - ($this->onBufferDrain)($this); - } catch (Throwable $e) { - $this->error($e); - } - } - if ($this->status === self::STATUS_CLOSING) { - if (!empty($this->context->streamSending)) { - return; - } - $this->destroy(); - } - return; - } - if ($len > 0) { - $this->bytesWritten += $len; - $this->sendBuffer = substr($this->sendBuffer, $len); - } else { - ++self::$statistics['send_fail']; - $this->destroy(); - } - } - - /** - * SSL handshake. - * - * @param resource $socket - * @return bool|int - */ - public function doSslHandshake($socket): bool|int - { - if (feof($socket)) { - $this->destroy(); - return false; - } - $async = $this instanceof AsyncTcpConnection; - - /** - * We disabled ssl3 because https://blog.qualys.com/ssllabs/2014/10/15/ssl-3-is-dead-killed-by-the-poodle-attack. - * You can enable ssl3 by the codes below. - */ - /*if($async){ - $type = STREAM_CRYPTO_METHOD_SSLv2_CLIENT | STREAM_CRYPTO_METHOD_SSLv23_CLIENT | STREAM_CRYPTO_METHOD_SSLv3_CLIENT; - }else{ - $type = STREAM_CRYPTO_METHOD_SSLv2_SERVER | STREAM_CRYPTO_METHOD_SSLv23_SERVER | STREAM_CRYPTO_METHOD_SSLv3_SERVER; - }*/ - - if ($async) { - $type = STREAM_CRYPTO_METHOD_SSLv2_CLIENT | STREAM_CRYPTO_METHOD_SSLv23_CLIENT; - } else { - $type = STREAM_CRYPTO_METHOD_SSLv2_SERVER | STREAM_CRYPTO_METHOD_SSLv23_SERVER; - } - - // Hidden error. - set_error_handler(static function (int $code, string $msg): bool { - if (!Worker::$daemonize) { - Worker::safeEcho(sprintf("SSL handshake error: %s\n", $msg)); - } - return true; - }); - $ret = stream_socket_enable_crypto($socket, true, $type); - restore_error_handler(); - // Negotiation has failed. - if (false === $ret) { - $this->destroy(); - return false; - } - if (0 === $ret) { - // There isn't enough data and should try again. - return 0; - } - return true; - } - - /** - * This method pulls all the data out of a readable stream, and writes it to the supplied destination. - * - * @param self $dest - * @return void - */ - public function pipe(self $dest): void - { - $source = $this; - $this->onMessage = function ($source, $data) use ($dest) { - $dest->send($data); - }; - $this->onClose = function () use ($dest) { - $dest->close(); - }; - $dest->onBufferFull = function () use ($source) { - $source->pauseRecv(); - }; - $dest->onBufferDrain = function () use ($source) { - $source->resumeRecv(); - }; - } - - /** - * Remove $length of data from receive buffer. - * - * @param int $length - * @return void - */ - public function consumeRecvBuffer(int $length): void - { - $this->recvBuffer = substr($this->recvBuffer, $length); - } - - /** - * Close connection. - * - * @param mixed $data - * @param bool $raw - * @return void - */ - public function close(mixed $data = null, bool $raw = false): void - { - if ($this->status === self::STATUS_CONNECTING) { - $this->destroy(); - return; - } - - if ($this->status === self::STATUS_CLOSING || $this->status === self::STATUS_CLOSED) { - return; - } - - if ($data !== null) { - $this->send($data, $raw); - } - - $this->status = self::STATUS_CLOSING; - - if ($this->sendBuffer === '') { - $this->destroy(); - } else { - $this->pauseRecv(); - } - } - - /** - * Is ipv4. - * - * return bool. - */ - public function isIpV4(): bool - { - if ($this->transport === 'unix') { - return false; - } - return !str_contains($this->getRemoteIp(), ':'); - } - - /** - * Is ipv6. - * - * return bool. - */ - public function isIpV6(): bool - { - if ($this->transport === 'unix') { - return false; - } - return str_contains($this->getRemoteIp(), ':'); - } - - /** - * Get the real socket. - * - * @return resource - */ - public function getSocket() - { - return $this->socket; - } - - /** - * Check whether send buffer will be full. - * - * @return void - */ - protected function checkBufferWillFull(): void - { - if ($this->onBufferFull && $this->maxSendBufferSize <= strlen($this->sendBuffer)) { - try { - ($this->onBufferFull)($this); - } catch (Throwable $e) { - $this->error($e); - } - } - } - - /** - * Whether send buffer is full. - * - * @return bool - */ - protected function bufferIsFull(): bool - { - // Buffer has been marked as full but still has data to send then the packet is discarded. - if ($this->maxSendBufferSize <= strlen($this->sendBuffer)) { - if ($this->onError) { - try { - ($this->onError)($this, static::SEND_FAIL, 'send buffer full and drop package'); - } catch (Throwable $e) { - $this->error($e); - } - } - return true; - } - return false; - } - - /** - * Whether send buffer is Empty. - * - * @return bool - */ - public function bufferIsEmpty(): bool - { - return empty($this->sendBuffer); - } - - /** - * Destroy connection. - * - * @return void - */ - public function destroy(): void - { - // Avoid repeated calls. - if ($this->status === self::STATUS_CLOSED) { - return; - } - // Remove event listener. - if($this->eventLoop !== null){ - $this->eventLoop->offReadable($this->socket); - $this->eventLoop->offWritable($this->socket); - if (DIRECTORY_SEPARATOR === '\\' && method_exists($this->eventLoop, 'offExcept')) { - $this->eventLoop->offExcept($this->socket); - } - } - - // Close socket. - try { - @fclose($this->socket); - } catch (Throwable) { - } - - $this->status = self::STATUS_CLOSED; - // Try to emit onClose callback. - if ($this->onClose) { - try { - ($this->onClose)($this); - } catch (Throwable $e) { - $this->error($e); - } - } - // Try to emit protocol::onClose - if ($this->protocol && method_exists($this->protocol, 'onClose')) { - try { - $this->protocol::onClose($this); - } catch (Throwable $e) { - $this->error($e); - } - } - $this->sendBuffer = $this->recvBuffer = ''; - $this->currentPackageLength = 0; - $this->isPaused = $this->sslHandshakeCompleted = false; - if ($this->status === self::STATUS_CLOSED) { - // Cleaning up the callback to avoid memory leaks. - $this->onMessage = $this->onClose = $this->onError = $this->onBufferFull = $this->onBufferDrain = $this->eventLoop = $this->errorHandler = null; - // Remove from worker->connections. - if ($this->worker) { - unset($this->worker->connections[$this->realId]); - } - $this->worker = null; - unset(static::$connections[$this->realId]); - } - } - - /** - * Init. - * - * @return void - */ - public static function init(): void - { - static::$reuseRequest = in_array(get_class(Worker::$globalEvent), [Event::class, Select::class, Ev::class]); - } - - /** - * Get the json_encode information. - * - * @return array - */ - public function jsonSerialize(): array - { - return [ - 'id' => $this->id, - 'status' => $this->getStatus(), - 'transport' => $this->transport, - 'getRemoteIp' => $this->getRemoteIp(), - 'remotePort' => $this->getRemotePort(), - 'getRemoteAddress' => $this->getRemoteAddress(), - 'getLocalIp' => $this->getLocalIp(), - 'getLocalPort' => $this->getLocalPort(), - 'getLocalAddress' => $this->getLocalAddress(), - 'isIpV4' => $this->isIpV4(), - 'isIpV6' => $this->isIpV6(), - ]; - } - - /** - * __wakeup. - * - * @return void - */ - public function __wakeup() - { - $this->isSafe = false; - } - - /** - * Destruct. - * - * @return void - */ - public function __destruct() - { - static $mod; - if (!$this->isSafe) { - return; - } - self::$statistics['connection_count']--; - if (Worker::getGracefulStop()) { - $mod ??= ceil((self::$statistics['connection_count'] + 1) / 3); - - if (0 === self::$statistics['connection_count'] % $mod) { - $pid = function_exists('posix_getpid') ? posix_getpid() : 0; - Worker::log('worker[' . $pid . '] remains ' . self::$statistics['connection_count'] . ' connection(s)'); - } - - if (0 === self::$statistics['connection_count']) { - Worker::stopAll(); - } - } - } -} diff --git a/vendor/workerman/workerman/src/Connection/UdpConnection.php b/vendor/workerman/workerman/src/Connection/UdpConnection.php deleted file mode 100644 index 7d301ff..0000000 --- a/vendor/workerman/workerman/src/Connection/UdpConnection.php +++ /dev/null @@ -1,224 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Connection; - -use JsonSerializable; -use Workerman\Protocols\ProtocolInterface; -use function stream_socket_get_name; -use function stream_socket_sendto; -use function strlen; -use function strrchr; -use function strrpos; -use function substr; -use function trim; - -/** - * UdpConnection. - */ -class UdpConnection extends ConnectionInterface implements JsonSerializable -{ - /** - * Max udp package size. - * - * @var int - */ - public const MAX_UDP_PACKAGE_SIZE = 65535; - - /** - * Transport layer protocol. - * - * @var string - */ - public string $transport = 'udp'; - - /** - * Construct. - * - * @param resource $socket - * @param string $remoteAddress - */ - public function __construct( - protected $socket, - protected string $remoteAddress) {} - - /** - * Sends data on the connection. - * - * @param mixed $sendBuffer - * @param bool $raw - * @return bool|null - */ - public function send(mixed $sendBuffer, bool $raw = false): bool|null - { - if (false === $raw && $this->protocol) { - $sendBuffer = $this->protocol::encode($sendBuffer, $this); - if ($sendBuffer === '') { - return null; - } - } - return strlen($sendBuffer) === stream_socket_sendto($this->socket, $sendBuffer, 0, $this->isIpV6() ? '[' . $this->getRemoteIp() . ']:' . $this->getRemotePort() : $this->remoteAddress); - } - - /** - * Get remote IP. - * - * @return string - */ - public function getRemoteIp(): string - { - $pos = strrpos($this->remoteAddress, ':'); - if ($pos) { - return trim(substr($this->remoteAddress, 0, $pos), '[]'); - } - return ''; - } - - /** - * Get remote port. - * - * @return int - */ - public function getRemotePort(): int - { - if ($this->remoteAddress) { - return (int)substr(strrchr($this->remoteAddress, ':'), 1); - } - return 0; - } - - /** - * Get remote address. - * - * @return string - */ - public function getRemoteAddress(): string - { - return $this->remoteAddress; - } - - /** - * Get local IP. - * - * @return string - */ - public function getLocalIp(): string - { - $address = $this->getLocalAddress(); - $pos = strrpos($address, ':'); - if (!$pos) { - return ''; - } - return substr($address, 0, $pos); - } - - /** - * Get local port. - * - * @return int - */ - public function getLocalPort(): int - { - $address = $this->getLocalAddress(); - $pos = strrpos($address, ':'); - if (!$pos) { - return 0; - } - return (int)substr(strrchr($address, ':'), 1); - } - - /** - * Get local address. - * - * @return string - */ - public function getLocalAddress(): string - { - return (string)@stream_socket_get_name($this->socket, false); - } - - - /** - * Close connection. - * - * @param mixed $data - * @param bool $raw - * @return void - */ - public function close(mixed $data = null, bool $raw = false): void - { - if ($data !== null) { - $this->send($data, $raw); - } - $this->eventLoop = $this->errorHandler = null; - } - - /** - * Is ipv4. - * - * return bool. - */ - public function isIpV4(): bool - { - if ($this->transport === 'unix') { - return false; - } - return !str_contains($this->getRemoteIp(), ':'); - } - - /** - * Is ipv6. - * - * return bool. - */ - public function isIpV6(): bool - { - if ($this->transport === 'unix') { - return false; - } - return str_contains($this->getRemoteIp(), ':'); - } - - /** - * Get the real socket. - * - * @return resource - */ - public function getSocket() - { - return $this->socket; - } - - /** - * Get the json_encode information. - * - * @return array - */ - public function jsonSerialize(): array - { - return [ - 'transport' => $this->transport, - 'getRemoteIp' => $this->getRemoteIp(), - 'remotePort' => $this->getRemotePort(), - 'getRemoteAddress' => $this->getRemoteAddress(), - 'getLocalIp' => $this->getLocalIp(), - 'getLocalPort' => $this->getLocalPort(), - 'getLocalAddress' => $this->getLocalAddress(), - 'isIpV4' => $this->isIpV4(), - 'isIpV6' => $this->isIpV6(), - ]; - } -} diff --git a/vendor/workerman/workerman/src/Events/Ev.php b/vendor/workerman/workerman/src/Events/Ev.php deleted file mode 100644 index 67c1652..0000000 --- a/vendor/workerman/workerman/src/Events/Ev.php +++ /dev/null @@ -1,238 +0,0 @@ - - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Events; - -/** - * Ev eventloop - */ -final class Ev implements EventInterface -{ - /** - * All listeners for read event. - * - * @var array - */ - private array $readEvents = []; - - /** - * All listeners for write event. - * - * @var array - */ - private array $writeEvents = []; - - /** - * Event listeners of signal. - * - * @var array - */ - private array $eventSignal = []; - - /** - * All timer event listeners. - * - * @var array - */ - private array $eventTimer = []; - - /** - * @var ?callable - */ - private $errorHandler = null; - - /** - * Timer id. - * - * @var int - */ - private static int $timerId = 1; - - /** - * {@inheritdoc} - */ - public function delay(float $delay, callable $func, array $args = []): int - { - $timerId = self::$timerId; - $event = new \EvTimer($delay, 0, function () use ($func, $args, $timerId) { - unset($this->eventTimer[$timerId]); - $this->safeCall($func, $args); - }); - $this->eventTimer[self::$timerId] = $event; - return self::$timerId++; - } - - /** - * {@inheritdoc} - */ - public function offDelay(int $timerId): bool - { - if (isset($this->eventTimer[$timerId])) { - $this->eventTimer[$timerId]->stop(); - unset($this->eventTimer[$timerId]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function offRepeat(int $timerId): bool - { - return $this->offDelay($timerId); - } - - /** - * {@inheritdoc} - */ - public function repeat(float $interval, callable $func, array $args = []): int - { - $event = new \EvTimer($interval, $interval, fn () => $this->safeCall($func, $args)); - $this->eventTimer[self::$timerId] = $event; - return self::$timerId++; - } - - /** - * {@inheritdoc} - */ - public function onReadable($stream, callable $func): void - { - $fdKey = (int)$stream; - $event = new \EvIo($stream, \Ev::READ, fn () => $this->safeCall($func, [$stream])); - $this->readEvents[$fdKey] = $event; - } - - /** - * {@inheritdoc} - */ - public function offReadable($stream): bool - { - $fdKey = (int)$stream; - if (isset($this->readEvents[$fdKey])) { - $this->readEvents[$fdKey]->stop(); - unset($this->readEvents[$fdKey]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function onWritable($stream, callable $func): void - { - $fdKey = (int)$stream; - $event = new \EvIo($stream, \Ev::WRITE, fn () => $this->safeCall($func, [$stream])); - $this->writeEvents[$fdKey] = $event; - } - - /** - * {@inheritdoc} - */ - public function offWritable($stream): bool - { - $fdKey = (int)$stream; - if (isset($this->writeEvents[$fdKey])) { - $this->writeEvents[$fdKey]->stop(); - unset($this->writeEvents[$fdKey]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function onSignal(int $signal, callable $func): void - { - $event = new \EvSignal($signal, fn () => $this->safeCall($func, [$signal])); - $this->eventSignal[$signal] = $event; - } - - /** - * {@inheritdoc} - */ - public function offSignal(int $signal): bool - { - if (isset($this->eventSignal[$signal])) { - $this->eventSignal[$signal]->stop(); - unset($this->eventSignal[$signal]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function deleteAllTimer(): void - { - foreach ($this->eventTimer as $event) { - $event->stop(); - } - $this->eventTimer = []; - } - - /** - * {@inheritdoc} - */ - public function run(): void - { - \Ev::run(); - } - - /** - * {@inheritdoc} - */ - public function stop(): void - { - \Ev::stop(); - } - - /** - * {@inheritdoc} - */ - public function getTimerCount(): int - { - return count($this->eventTimer); - } - - /** - * {@inheritdoc} - */ - public function setErrorHandler(callable $errorHandler): void - { - $this->errorHandler = $errorHandler; - } - - /** - * @param callable $func - * @param array $args - * @return void - */ - private function safeCall(callable $func, array $args = []): void - { - try { - $func(...$args); - } catch (\Throwable $e) { - if ($this->errorHandler === null) { - echo $e; - } else { - ($this->errorHandler)($e); - } - } - } -} diff --git a/vendor/workerman/workerman/src/Events/Event.php b/vendor/workerman/workerman/src/Events/Event.php deleted file mode 100644 index d7d908e..0000000 --- a/vendor/workerman/workerman/src/Events/Event.php +++ /dev/null @@ -1,294 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Events; - -/** - * libevent eventloop - */ -final class Event implements EventInterface -{ - /** - * Event base. - * - * @var \EventBase - */ - private \EventBase $eventBase; - - /** - * All listeners for read event. - * - * @var array - */ - private array $readEvents = []; - - /** - * All listeners for write event. - * - * @var array - */ - private array $writeEvents = []; - - /** - * Event listeners of signal. - * - * @var array - */ - private array $eventSignal = []; - - /** - * All timer event listeners. - * - * @var array - */ - private array $eventTimer = []; - - /** - * Timer id. - * - * @var int - */ - private int $timerId = 0; - - /** - * Event class name. - * - * @var string - */ - private string $eventClassName = ''; - - /** - * @var ?callable - */ - private $errorHandler = null; - - /** - * Construct. - */ - public function __construct() - { - if (\class_exists('\\\\Event', false)) { - $className = '\\\\Event'; - } else { - $className = '\Event'; - } - $this->eventClassName = $className; - if (\class_exists('\\\\EventBase', false)) { - $className = '\\\\EventBase'; - } else { - $className = '\EventBase'; - } - $this->eventBase = new $className(); - } - - /** - * {@inheritdoc} - */ - public function delay(float $delay, callable $func, array $args = []): int - { - $className = $this->eventClassName; - $timerId = $this->timerId++; - $event = new $className($this->eventBase, -1, $className::TIMEOUT, function () use ($func, $args, $timerId) { - unset($this->eventTimer[$timerId]); - $this->safeCall($func, $args); - }); - if (!$event->addTimer($delay)) { - throw new \RuntimeException("Event::addTimer($delay) failed"); - } - $this->eventTimer[$timerId] = $event; - return $timerId; - } - - /** - * {@inheritdoc} - */ - public function offDelay(int $timerId): bool - { - if (isset($this->eventTimer[$timerId])) { - $this->eventTimer[$timerId]->del(); - unset($this->eventTimer[$timerId]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function offRepeat(int $timerId): bool - { - return $this->offDelay($timerId); - } - - /** - * {@inheritdoc} - */ - public function repeat(float $interval, callable $func, array $args = []): int - { - $className = $this->eventClassName; - $timerId = $this->timerId++; - $event = new $className($this->eventBase, -1, $className::TIMEOUT | $className::PERSIST, function () use ($func, $args) { - $this->safeCall($func, $args); - }); - if (!$event->addTimer($interval)) { - throw new \RuntimeException("Event::addTimer($interval) failed"); - } - $this->eventTimer[$timerId] = $event; - return $timerId; - } - - /** - * {@inheritdoc} - */ - public function onReadable($stream, callable $func): void - { - $className = $this->eventClassName; - $fdKey = (int)$stream; - $event = new $className($this->eventBase, $stream, $className::READ | $className::PERSIST, $func); - if ($event->add()) { - $this->readEvents[$fdKey] = $event; - } - } - - /** - * {@inheritdoc} - */ - public function offReadable($stream): bool - { - $fdKey = (int)$stream; - if (isset($this->readEvents[$fdKey])) { - $this->readEvents[$fdKey]->del(); - unset($this->readEvents[$fdKey]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function onWritable($stream, callable $func): void - { - $className = $this->eventClassName; - $fdKey = (int)$stream; - $event = new $className($this->eventBase, $stream, $className::WRITE | $className::PERSIST, $func); - if ($event->add()) { - $this->writeEvents[$fdKey] = $event; - } - } - - /** - * {@inheritdoc} - */ - public function offWritable($stream): bool - { - $fdKey = (int)$stream; - if (isset($this->writeEvents[$fdKey])) { - $this->writeEvents[$fdKey]->del(); - unset($this->writeEvents[$fdKey]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function onSignal(int $signal, callable $func): void - { - $className = $this->eventClassName; - $fdKey = $signal; - $event = $className::signal($this->eventBase, $signal, fn () => $this->safeCall($func, [$signal])); - if ($event->add()) { - $this->eventSignal[$fdKey] = $event; - } - } - - /** - * {@inheritdoc} - */ - public function offSignal(int $signal): bool - { - $fdKey = $signal; - if (isset($this->eventSignal[$fdKey])) { - $this->eventSignal[$fdKey]->del(); - unset($this->eventSignal[$fdKey]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function deleteAllTimer(): void - { - foreach ($this->eventTimer as $event) { - $event->del(); - } - $this->eventTimer = []; - } - - /** - * {@inheritdoc} - */ - public function run(): void - { - $this->eventBase->loop(); - } - - /** - * {@inheritdoc} - */ - public function stop(): void - { - $this->eventBase->exit(); - } - - /** - * {@inheritdoc} - */ - public function getTimerCount(): int - { - return \count($this->eventTimer); - } - - /** - * {@inheritdoc} - */ - public function setErrorHandler(callable $errorHandler): void - { - $this->errorHandler = $errorHandler; - } - - /** - * @param callable $func - * @param array $args - * @return void - */ - private function safeCall(callable $func, array $args = []): void - { - try { - $func(...$args); - } catch (\Throwable $e) { - if ($this->errorHandler === null) { - echo $e; - } else { - ($this->errorHandler)($e); - } - } - } -} diff --git a/vendor/workerman/workerman/src/Events/EventInterface.php b/vendor/workerman/workerman/src/Events/EventInterface.php deleted file mode 100644 index 4d538c6..0000000 --- a/vendor/workerman/workerman/src/Events/EventInterface.php +++ /dev/null @@ -1,143 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Events; - -interface EventInterface -{ - /** - * Delay the execution of a callback. - * - * @param float $delay - * @param callable(mixed...): void $func - * @param array $args - * @return int - */ - public function delay(float $delay, callable $func, array $args = []): int; - - /** - * Delete a delay timer. - * - * @param int $timerId - * @return bool - */ - public function offDelay(int $timerId): bool; - - /** - * Repeatedly execute a callback. - * - * @param float $interval - * @param callable(mixed...): void $func - * @param array $args - * @return int - */ - public function repeat(float $interval, callable $func, array $args = []): int; - - /** - * Delete a repeat timer. - * - * @param int $timerId - * @return bool - */ - public function offRepeat(int $timerId): bool; - - /** - * Execute a callback when a stream resource becomes readable or is closed for reading. - * - * @param resource $stream - * @param callable(resource): void $func - * @return void - */ - public function onReadable($stream, callable $func): void; - - /** - * Cancel a callback of stream readable. - * - * @param resource $stream - * @return bool - */ - public function offReadable($stream): bool; - - /** - * Execute a callback when a stream resource becomes writable or is closed for writing. - * - * @param resource $stream - * @param callable(resource): void $func - * @return void - */ - public function onWritable($stream, callable $func): void; - - /** - * Cancel a callback of stream writable. - * - * @param resource $stream - * @return bool - */ - public function offWritable($stream): bool; - - /** - * Execute a callback when a signal is received. - * - * @param int $signal - * @param callable(int): void $func - * @return void - */ - public function onSignal(int $signal, callable $func): void; - - /** - * Cancel a callback of signal. - * - * @param int $signal - * @return bool - */ - public function offSignal(int $signal): bool; - - /** - * Delete all timer. - * - * @return void - */ - public function deleteAllTimer(): void; - - /** - * Run the event loop. - * - * @return void - */ - public function run(): void; - - /** - * Stop event loop. - * - * @return void - */ - public function stop(): void; - - /** - * Get Timer count. - * - * @return int - */ - public function getTimerCount(): int; - - /** - * Set error handler. - * - * @param callable(\Throwable): void $errorHandler - * @return void - */ - public function setErrorHandler(callable $errorHandler): void; -} diff --git a/vendor/workerman/workerman/src/Events/Fiber.php b/vendor/workerman/workerman/src/Events/Fiber.php deleted file mode 100644 index 133f2cc..0000000 --- a/vendor/workerman/workerman/src/Events/Fiber.php +++ /dev/null @@ -1,276 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Events; - -use Fiber as BaseFiber; -use Revolt\EventLoop; -use Revolt\EventLoop\Driver; -use function count; -use function function_exists; -use function pcntl_signal; - -/** - * Revolt eventloop - */ -final class Fiber implements EventInterface -{ - /** - * @var Driver - */ - private Driver $driver; - - /** - * All listeners for read event. - * - * @var array - */ - private array $readEvents = []; - - /** - * All listeners for write event. - * - * @var array - */ - private array $writeEvents = []; - - /** - * Event listeners of signal. - * - * @var array - */ - private array $eventSignal = []; - - /** - * Event listeners of timer. - * - * @var array - */ - private array $eventTimer = []; - - /** - * Timer id. - * - * @var int - */ - private int $timerId = 1; - - /** - * Construct. - */ - public function __construct() - { - $this->driver = EventLoop::getDriver(); - } - - /** - * Get driver. - * - * @return Driver - */ - public function driver(): Driver - { - return $this->driver; - } - - /** - * {@inheritdoc} - */ - public function run(): void - { - $this->driver->run(); - } - - /** - * {@inheritdoc} - */ - public function stop(): void - { - foreach ($this->eventSignal as $cbId) { - $this->driver->cancel($cbId); - } - $this->driver->stop(); - if (function_exists('pcntl_signal')) { - pcntl_signal(SIGINT, SIG_IGN); - } - } - - /** - * {@inheritdoc} - */ - public function delay(float $delay, callable $func, array $args = []): int - { - $timerId = $this->timerId++; - $closure = function () use ($func, $args, $timerId) { - unset($this->eventTimer[$timerId]); - $this->safeCall($func, ...$args); - }; - $cbId = $this->driver->delay($delay, $closure); - $this->eventTimer[$timerId] = $cbId; - return $timerId; - } - - /** - * {@inheritdoc} - */ - public function repeat(float $interval, callable $func, array $args = []): int - { - $timerId = $this->timerId++; - $cbId = $this->driver->repeat($interval, fn() => $this->safeCall($func, ...$args)); - $this->eventTimer[$timerId] = $cbId; - return $timerId; - } - - /** - * {@inheritdoc} - */ - public function onReadable($stream, callable $func): void - { - $fdKey = (int)$stream; - if (isset($this->readEvents[$fdKey])) { - $this->driver->cancel($this->readEvents[$fdKey]); - } - - $this->readEvents[$fdKey] = $this->driver->onReadable($stream, fn() => $this->safeCall($func, $stream)); - } - - /** - * {@inheritdoc} - */ - public function offReadable($stream): bool - { - $fdKey = (int)$stream; - if (isset($this->readEvents[$fdKey])) { - $this->driver->cancel($this->readEvents[$fdKey]); - unset($this->readEvents[$fdKey]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function onWritable($stream, callable $func): void - { - $fdKey = (int)$stream; - if (isset($this->writeEvents[$fdKey])) { - $this->driver->cancel($this->writeEvents[$fdKey]); - unset($this->writeEvents[$fdKey]); - } - $this->writeEvents[$fdKey] = $this->driver->onWritable($stream, fn() => $this->safeCall($func, $stream)); - } - - /** - * {@inheritdoc} - */ - public function offWritable($stream): bool - { - $fdKey = (int)$stream; - if (isset($this->writeEvents[$fdKey])) { - $this->driver->cancel($this->writeEvents[$fdKey]); - unset($this->writeEvents[$fdKey]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function onSignal(int $signal, callable $func): void - { - $fdKey = $signal; - if (isset($this->eventSignal[$fdKey])) { - $this->driver->cancel($this->eventSignal[$fdKey]); - unset($this->eventSignal[$fdKey]); - } - $this->eventSignal[$fdKey] = $this->driver->onSignal($signal, fn() => $this->safeCall($func, $signal)); - } - - /** - * {@inheritdoc} - */ - public function offSignal(int $signal): bool - { - $fdKey = $signal; - if (isset($this->eventSignal[$fdKey])) { - $this->driver->cancel($this->eventSignal[$fdKey]); - unset($this->eventSignal[$fdKey]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function offDelay(int $timerId): bool - { - if (isset($this->eventTimer[$timerId])) { - $this->driver->cancel($this->eventTimer[$timerId]); - unset($this->eventTimer[$timerId]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function offRepeat(int $timerId): bool - { - return $this->offDelay($timerId); - } - - /** - * {@inheritdoc} - */ - public function deleteAllTimer(): void - { - foreach ($this->eventTimer as $cbId) { - $this->driver->cancel($cbId); - } - $this->eventTimer = []; - } - - /** - * {@inheritdoc} - */ - public function getTimerCount(): int - { - return count($this->eventTimer); - } - - /** - * {@inheritdoc} - */ - public function setErrorHandler(callable $errorHandler): void - { - $this->driver->setErrorHandler($errorHandler); - } - - /** - * @param callable $func - * @param ...$args - * @return void - * @throws \Throwable - */ - protected function safeCall(callable $func, ...$args): void - { - (new BaseFiber(fn() => $func(...$args)))->start(); - } -} diff --git a/vendor/workerman/workerman/src/Events/Select.php b/vendor/workerman/workerman/src/Events/Select.php deleted file mode 100644 index db712b9..0000000 --- a/vendor/workerman/workerman/src/Events/Select.php +++ /dev/null @@ -1,490 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Events; - -use SplPriorityQueue; -use Throwable; -use function count; -use function max; -use function microtime; -use function pcntl_signal; -use function pcntl_signal_dispatch; -use const DIRECTORY_SEPARATOR; - -/** - * select eventloop - */ -final class Select implements EventInterface -{ - /** - * Running. - * - * @var bool - */ - private bool $running = true; - - /** - * All listeners for read/write event. - * - * @var array - */ - private array $readEvents = []; - - /** - * All listeners for read/write event. - * - * @var array - */ - private array $writeEvents = []; - - /** - * @var array - */ - private array $exceptEvents = []; - - /** - * Event listeners of signal. - * - * @var array - */ - private array $signalEvents = []; - - /** - * Fds waiting for read event. - * - * @var array - */ - private array $readFds = []; - - /** - * Fds waiting for write event. - * - * @var array - */ - private array $writeFds = []; - - /** - * Fds waiting for except event. - * - * @var array - */ - private array $exceptFds = []; - - /** - * Timer scheduler. - * {['data':timer_id, 'priority':run_timestamp], ..} - * - * @var SplPriorityQueue - */ - private SplPriorityQueue $scheduler; - - /** - * All timer event listeners. - * [[func, args, flag, timer_interval], ..] - * - * @var array - */ - private array $eventTimer = []; - - /** - * Timer id. - * - * @var int - */ - private int $timerId = 1; - - /** - * Select timeout. - * - * @var int - */ - private int $selectTimeout = self::MAX_SELECT_TIMOUT_US; - - /** - * Next run time of the timer. - * - * @var float - */ - private float $nextTickTime = 0; - - /** - * @var ?callable - */ - private $errorHandler = null; - - /** - * Select timeout. - * - * @var int - */ - const MAX_SELECT_TIMOUT_US = 800000; - - /** - * Construct. - */ - public function __construct() - { - $this->scheduler = new SplPriorityQueue(); - $this->scheduler->setExtractFlags(SplPriorityQueue::EXTR_BOTH); - } - - /** - * {@inheritdoc} - */ - public function delay(float $delay, callable $func, array $args = []): int - { - $timerId = $this->timerId++; - $runTime = microtime(true) + $delay; - $this->scheduler->insert($timerId, -$runTime); - $this->eventTimer[$timerId] = [$func, $args]; - if ($this->nextTickTime == 0 || $this->nextTickTime > $runTime) { - $this->setNextTickTime($runTime); - } - return $timerId; - } - - /** - * {@inheritdoc} - */ - public function repeat(float $interval, callable $func, array $args = []): int - { - $timerId = $this->timerId++; - $runTime = microtime(true) + $interval; - $this->scheduler->insert($timerId, -$runTime); - $this->eventTimer[$timerId] = [$func, $args, $interval]; - if ($this->nextTickTime == 0 || $this->nextTickTime > $runTime) { - $this->setNextTickTime($runTime); - } - return $timerId; - } - - /** - * {@inheritdoc} - */ - public function offDelay(int $timerId): bool - { - if (isset($this->eventTimer[$timerId])) { - unset($this->eventTimer[$timerId]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function offRepeat(int $timerId): bool - { - return $this->offDelay($timerId); - } - - /** - * {@inheritdoc} - */ - public function onReadable($stream, callable $func): void - { - $count = count($this->readFds); - if ($count >= 1024) { - trigger_error("System call select exceeded the maximum number of connections 1024, please install event extension for more connections.", E_USER_WARNING); - } else if (DIRECTORY_SEPARATOR !== '/' && $count >= 256) { - trigger_error("System call select exceeded the maximum number of connections 256.", E_USER_WARNING); - } - $fdKey = (int)$stream; - $this->readEvents[$fdKey] = $func; - $this->readFds[$fdKey] = $stream; - } - - /** - * {@inheritdoc} - */ - public function offReadable($stream): bool - { - $fdKey = (int)$stream; - if (isset($this->readEvents[$fdKey])) { - unset($this->readEvents[$fdKey], $this->readFds[$fdKey]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function onWritable($stream, callable $func): void - { - $count = count($this->writeFds); - if ($count >= 1024) { - trigger_error("System call select exceeded the maximum number of connections 1024, please install event/libevent extension for more connections.", E_USER_WARNING); - } else if (DIRECTORY_SEPARATOR !== '/' && $count >= 256) { - trigger_error("System call select exceeded the maximum number of connections 256.", E_USER_WARNING); - } - $fdKey = (int)$stream; - $this->writeEvents[$fdKey] = $func; - $this->writeFds[$fdKey] = $stream; - } - - /** - * {@inheritdoc} - */ - public function offWritable($stream): bool - { - $fdKey = (int)$stream; - if (isset($this->writeEvents[$fdKey])) { - unset($this->writeEvents[$fdKey], $this->writeFds[$fdKey]); - return true; - } - return false; - } - - /** - * On except. - * - * @param resource $stream - * @param callable $func - */ - public function onExcept($stream, callable $func): void - { - $fdKey = (int)$stream; - $this->exceptEvents[$fdKey] = $func; - $this->exceptFds[$fdKey] = $stream; - } - - /** - * Off except. - * - * @param resource $stream - * @return bool - */ - public function offExcept($stream): bool - { - $fdKey = (int)$stream; - if (isset($this->exceptEvents[$fdKey])) { - unset($this->exceptEvents[$fdKey], $this->exceptFds[$fdKey]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function onSignal(int $signal, callable $func): void - { - if (!function_exists('pcntl_signal')) { - return; - } - $this->signalEvents[$signal] = $func; - pcntl_signal($signal, fn () => $this->safeCall($this->signalEvents[$signal], [$signal])); - } - - /** - * {@inheritdoc} - */ - public function offSignal(int $signal): bool - { - if (!function_exists('pcntl_signal')) { - return false; - } - pcntl_signal($signal, SIG_IGN); - if (isset($this->signalEvents[$signal])) { - unset($this->signalEvents[$signal]); - return true; - } - return false; - } - - /** - * Tick for timer. - * - * @return void - */ - protected function tick(): void - { - $tasksToInsert = []; - while (!$this->scheduler->isEmpty()) { - $schedulerData = $this->scheduler->top(); - $timerId = $schedulerData['data']; - $nextRunTime = -$schedulerData['priority']; - $timeNow = microtime(true); - $this->selectTimeout = (int)(($nextRunTime - $timeNow) * 1000000); - - if ($this->selectTimeout <= 0) { - $this->scheduler->extract(); - - if (!isset($this->eventTimer[$timerId])) { - continue; - } - - // [func, args, timer_interval] - $taskData = $this->eventTimer[$timerId]; - if (isset($taskData[2])) { - $nextRunTime = $timeNow + $taskData[2]; - $tasksToInsert[] = [$timerId, -$nextRunTime]; - } else { - unset($this->eventTimer[$timerId]); - } - $this->safeCall($taskData[0], $taskData[1]); - } else { - break; - } - } - foreach ($tasksToInsert as $item) { - $this->scheduler->insert($item[0], $item[1]); - } - if (!$this->scheduler->isEmpty()) { - $schedulerData = $this->scheduler->top(); - $nextRunTime = -$schedulerData['priority']; - $this->setNextTickTime($nextRunTime); - return; - } - $this->setNextTickTime(0); - } - - /** - * Set next tick time. - * - * @param float $nextTickTime - * @return void - */ - protected function setNextTickTime(float $nextTickTime): void - { - $this->nextTickTime = $nextTickTime; - if ($nextTickTime == 0) { - // Swow will affect the signal interruption characteristics of stream_select, - // so a shorter timeout should be used to detect signals. - $this->selectTimeout = self::MAX_SELECT_TIMOUT_US; - return; - } - $this->selectTimeout = min(max((int)(($nextTickTime - microtime(true)) * 1000000), 0), self::MAX_SELECT_TIMOUT_US); - } - - /** - * {@inheritdoc} - */ - public function deleteAllTimer(): void - { - $this->scheduler = new SplPriorityQueue(); - $this->scheduler->setExtractFlags(SplPriorityQueue::EXTR_BOTH); - $this->eventTimer = []; - } - - /** - * {@inheritdoc} - */ - public function run(): void - { - while ($this->running) { - $read = $this->readFds; - $write = $this->writeFds; - $except = $this->exceptFds; - if ($read || $write || $except) { - // Waiting read/write/signal/timeout events. - try { - @stream_select($read, $write, $except, 0, $this->selectTimeout); - } catch (Throwable) { - // do nothing - } - } else { - $this->selectTimeout >= 1 && usleep($this->selectTimeout); - } - - foreach ($read as $fd) { - $fdKey = (int)$fd; - if (isset($this->readEvents[$fdKey])) { - $this->readEvents[$fdKey]($fd); - } - } - - foreach ($write as $fd) { - $fdKey = (int)$fd; - if (isset($this->writeEvents[$fdKey])) { - $this->writeEvents[$fdKey]($fd); - } - } - - foreach ($except as $fd) { - $fdKey = (int)$fd; - if (isset($this->exceptEvents[$fdKey])) { - $this->exceptEvents[$fdKey]($fd); - } - } - - if ($this->nextTickTime > 0 && microtime(true) >= $this->nextTickTime) { - $this->tick(); - } - - // The $this->signalEvents are empty under Windows, make sure not to call pcntl_signal_dispatch. - if ($this->signalEvents) { - // Calls signal handlers for pending signals - pcntl_signal_dispatch(); - } - } - } - - /** - * {@inheritdoc} - */ - public function stop(): void - { - $this->running = false; - $this->deleteAllTimer(); - foreach ($this->signalEvents as $signal => $item) { - $this->offsignal($signal); - } - $this->readFds = []; - $this->writeFds = []; - $this->exceptFds = []; - $this->readEvents = []; - $this->writeEvents = []; - $this->exceptEvents = []; - $this->signalEvents = []; - } - - /** - * {@inheritdoc} - */ - public function getTimerCount(): int - { - return count($this->eventTimer); - } - - /** - * {@inheritdoc} - */ - public function setErrorHandler(callable $errorHandler): void - { - $this->errorHandler = $errorHandler; - } - - /** - * @param callable $func - * @param array $args - * @return void - */ - private function safeCall(callable $func, array $args = []): void - { - try { - $func(...$args); - } catch (Throwable $e) { - if ($this->errorHandler === null) { - echo $e; - } else { - ($this->errorHandler)($e); - } - } - } -} diff --git a/vendor/workerman/workerman/src/Events/Swoole.php b/vendor/workerman/workerman/src/Events/Swoole.php deleted file mode 100644 index 329c87e..0000000 --- a/vendor/workerman/workerman/src/Events/Swoole.php +++ /dev/null @@ -1,298 +0,0 @@ - - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Events; - -use Swoole\Coroutine; -use Swoole\Event; -use Swoole\Process; -use Swoole\Timer; -use Throwable; - -final class Swoole implements EventInterface -{ - /** - * All listeners for read timer - * - * @var array - */ - private array $eventTimer = []; - - /** - * All listeners for read event. - * - * @var array - */ - private array $readEvents = []; - - /** - * All listeners for write event. - * - * @var array - */ - private array $writeEvents = []; - - /** - * @var ?callable - */ - private $errorHandler = null; - - private bool $stopping = false; - - /** - * Constructor. - */ - public function __construct() - { - Coroutine::set(['hook_flags' => SWOOLE_HOOK_ALL]); - } - - /** - * {@inheritdoc} - */ - public function delay(float $delay, callable $func, array $args = []): int - { - $t = (int)($delay * 1000); - $t = max($t, 1); - $timerId = Timer::after($t, function () use ($func, $args, &$timerId) { - unset($this->eventTimer[$timerId]); - $this->safeCall($func, $args); - }); - $this->eventTimer[$timerId] = $timerId; - return $timerId; - } - - /** - * {@inheritdoc} - */ - public function offDelay(int $timerId): bool - { - if (isset($this->eventTimer[$timerId])) { - Timer::clear($timerId); - unset($this->eventTimer[$timerId]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function offRepeat(int $timerId): bool - { - return $this->offDelay($timerId); - } - - /** - * {@inheritdoc} - */ - public function repeat(float $interval, callable $func, array $args = []): int - { - $t = (int)($interval * 1000); - $t = max($t, 1); - $timerId = Timer::tick($t, function () use ($func, $args) { - $this->safeCall($func, $args); - }); - $this->eventTimer[$timerId] = $timerId; - return $timerId; - } - - /** - * {@inheritdoc} - */ - public function onReadable($stream, callable $func): void - { - $fd = (int)$stream; - if (!isset($this->readEvents[$fd]) && !isset($this->writeEvents[$fd])) { - Event::add($stream, fn () => $this->callRead($fd), null, SWOOLE_EVENT_READ); - } elseif (isset($this->writeEvents[$fd])) { - Event::set($stream, fn () => $this->callRead($fd), null, SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE); - } else { - Event::set($stream, fn () => $this->callRead($fd), null, SWOOLE_EVENT_READ); - } - - $this->readEvents[$fd] = [$func, [$stream]]; - } - - /** - * {@inheritdoc} - */ - public function offReadable($stream): bool - { - $fd = (int)$stream; - if (!isset($this->readEvents[$fd])) { - return false; - } - unset($this->readEvents[$fd]); - if (!isset($this->writeEvents[$fd])) { - Event::del($stream); - return true; - } - Event::set($stream, null, null, SWOOLE_EVENT_WRITE); - return true; - } - - /** - * {@inheritdoc} - */ - public function onWritable($stream, callable $func): void - { - $fd = (int)$stream; - if (!isset($this->readEvents[$fd]) && !isset($this->writeEvents[$fd])) { - Event::add($stream, null, fn () => $this->callWrite($fd), SWOOLE_EVENT_WRITE); - } elseif (isset($this->readEvents[$fd])) { - Event::set($stream, null, fn () => $this->callWrite($fd), SWOOLE_EVENT_WRITE | SWOOLE_EVENT_READ); - } else { - Event::set($stream, null, fn () =>$this->callWrite($fd), SWOOLE_EVENT_WRITE); - } - - $this->writeEvents[$fd] = [$func, [$stream]]; - } - - /** - * {@inheritdoc} - */ - public function offWritable($stream): bool - { - $fd = (int)$stream; - if (!isset($this->writeEvents[$fd])) { - return false; - } - unset($this->writeEvents[$fd]); - if (!isset($this->readEvents[$fd])) { - Event::del($stream); - return true; - } - Event::set($stream, null, null, SWOOLE_EVENT_READ); - return true; - } - - /** - * {@inheritdoc} - */ - public function onSignal(int $signal, callable $func): void - { - Process::signal($signal, fn () => $this->safeCall($func, [$signal])); - } - - /** - * Please see https://wiki.swoole.com/#/process/process?id=signal - * {@inheritdoc} - */ - public function offSignal(int $signal): bool - { - return Process::signal($signal, null); - } - - /** - * {@inheritdoc} - */ - public function deleteAllTimer(): void - { - foreach ($this->eventTimer as $timerId) { - Timer::clear($timerId); - } - } - - /** - * {@inheritdoc} - */ - public function run(): void - { - // Avoid process exit due to no listening - Timer::tick(100000000, static fn() => null); - Event::wait(); - } - - /** - * Destroy loop. - * - * @return void - */ - public function stop(): void - { - if ($this->stopping) { - return; - } - $this->stopping = true; - // Cancel all coroutines before Event::exit - foreach (Coroutine::listCoroutines() as $coroutine) { - Coroutine::cancel($coroutine); - } - // Wait for coroutines to exit - usleep(200000); - Event::exit(); - } - - /** - * Get timer count. - * - * @return integer - */ - public function getTimerCount(): int - { - return count($this->eventTimer); - } - - /** - * {@inheritdoc} - */ - public function setErrorHandler(callable $errorHandler): void - { - $this->errorHandler = $errorHandler; - } - - /** - * @param $fd - * @return void - */ - private function callRead($fd) - { - if (isset($this->readEvents[$fd])) { - $this->safeCall($this->readEvents[$fd][0], $this->readEvents[$fd][1]); - } - } - - /** - * @param $fd - * @return void - */ - private function callWrite($fd) - { - if (isset($this->writeEvents[$fd])) { - $this->safeCall($this->writeEvents[$fd][0], $this->writeEvents[$fd][1]); - } - } - - /** - * @param callable $func - * @param array $args - * @return void - */ - private function safeCall(callable $func, array $args = []): void - { - Coroutine::create(function() use ($func, $args) { - try { - $func(...$args); - } catch (Throwable $e) { - if ($this->errorHandler === null) { - echo $e; - } else { - ($this->errorHandler)($e); - } - } - }); - } -} diff --git a/vendor/workerman/workerman/src/Events/Swow.php b/vendor/workerman/workerman/src/Events/Swow.php deleted file mode 100644 index c38a68b..0000000 --- a/vendor/workerman/workerman/src/Events/Swow.php +++ /dev/null @@ -1,303 +0,0 @@ - - */ - private array $eventTimer = []; - - /** - * All listeners for read event. - * - * @var array - */ - private array $readEvents = []; - - /** - * All listeners for write event. - * - * @var array - */ - private array $writeEvents = []; - - /** - * All listeners for signal. - * - * @var array - */ - private array $signalListener = []; - - /** - * @var ?callable - */ - private $errorHandler = null; - - /** - * Get timer count. - * - * @return integer - */ - public function getTimerCount(): int - { - return count($this->eventTimer); - } - - /** - * {@inheritdoc} - */ - public function delay(float $delay, callable $func, array $args = []): int - { - $t = (int)($delay * 1000); - $t = max($t, 1); - $coroutine = Coroutine::run(function () use ($t, $func, $args): void { - msleep($t); - unset($this->eventTimer[Coroutine::getCurrent()->getId()]); - $this->safeCall($func, $args); - }); - $timerId = $coroutine->getId(); - $this->eventTimer[$timerId] = $timerId; - return $timerId; - } - - /** - * {@inheritdoc} - */ - public function repeat(float $interval, callable $func, array $args = []): int - { - $t = (int)($interval * 1000); - $t = max($t, 1); - $coroutine = Coroutine::run(function () use ($t, $func, $args): void { - // @phpstan-ignore-next-line While loop condition is always true. - while (true) { - msleep($t); - $this->safeCall($func, $args); - } - }); - $timerId = $coroutine->getId(); - $this->eventTimer[$timerId] = $timerId; - return $timerId; - } - - /** - * {@inheritdoc} - */ - public function offDelay(int $timerId): bool - { - if (isset($this->eventTimer[$timerId])) { - try { - (Coroutine::getAll()[$timerId])->kill(); - return true; - } finally { - unset($this->eventTimer[$timerId]); - } - } - return false; - } - - /** - * {@inheritdoc} - */ - public function offRepeat(int $timerId): bool - { - return $this->offDelay($timerId); - } - - /** - * {@inheritdoc} - */ - public function deleteAllTimer(): void - { - foreach ($this->eventTimer as $timerId) { - $this->offDelay($timerId); - } - } - - /** - * {@inheritdoc} - */ - public function onReadable($stream, callable $func): void - { - $fd = (int)$stream; - if (isset($this->readEvents[$fd])) { - $this->offReadable($stream); - } - Coroutine::run(function () use ($stream, $func, $fd): void { - try { - $this->readEvents[$fd] = Coroutine::getCurrent(); - while (true) { - if (!is_resource($stream)) { - $this->offReadable($stream); - break; - } - // Under Windows, setting a timeout is necessary; otherwise, the accept cannot be listened to. - // Setting it to 1000ms will result in a 1-second delay for the first accept under Windows. - $rEvent = stream_poll_one($stream, STREAM_POLLIN | STREAM_POLLHUP, 1000); - if (!isset($this->readEvents[$fd]) || $this->readEvents[$fd] !== Coroutine::getCurrent()) { - break; - } - if ($rEvent !== STREAM_POLLNONE) { - $this->safeCall($func, [$stream]); - } - if ($rEvent !== STREAM_POLLIN && $rEvent !== STREAM_POLLNONE) { - $this->offReadable($stream); - break; - } - } - } catch (RuntimeException) { - $this->offReadable($stream); - } - }); - } - - /** - * {@inheritdoc} - */ - public function offReadable($stream): bool - { - // 在当前协程执行 $coroutine->kill() 会导致不可预知问题,所以没有使用$coroutine->kill() - $fd = (int)$stream; - if (isset($this->readEvents[$fd])) { - unset($this->readEvents[$fd]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function onWritable($stream, callable $func): void - { - $fd = (int)$stream; - if (isset($this->writeEvents[$fd])) { - $this->offWritable($stream); - } - Coroutine::run(function () use ($stream, $func, $fd): void { - try { - $this->writeEvents[$fd] = Coroutine::getCurrent(); - while (true) { - $rEvent = stream_poll_one($stream, STREAM_POLLOUT | STREAM_POLLHUP); - if (!isset($this->writeEvents[$fd]) || $this->writeEvents[$fd] !== Coroutine::getCurrent()) { - break; - } - if ($rEvent !== STREAM_POLLNONE) { - $this->safeCall($func, [$stream]); - } - if ($rEvent !== STREAM_POLLOUT) { - $this->offWritable($stream); - break; - } - } - } catch (RuntimeException) { - $this->offWritable($stream); - } - }); - } - - /** - * {@inheritdoc} - */ - public function offWritable($stream): bool - { - $fd = (int)$stream; - if (isset($this->writeEvents[$fd])) { - unset($this->writeEvents[$fd]); - return true; - } - return false; - } - - /** - * {@inheritdoc} - */ - public function onSignal(int $signal, callable $func): void - { - Coroutine::run(function () use ($signal, $func): void { - $this->signalListener[$signal] = Coroutine::getCurrent(); - while (1) { - try { - Signal::wait($signal); - if (!isset($this->signalListener[$signal]) || - $this->signalListener[$signal] !== Coroutine::getCurrent()) { - break; - } - $this->safeCall($func, [$signal]); - } catch (SignalException) { - // do nothing - } - } - }); - } - - /** - * {@inheritdoc} - */ - public function offSignal(int $signal): bool - { - if (!isset($this->signalListener[$signal])) { - return false; - } - unset($this->signalListener[$signal]); - return true; - } - - /** - * {@inheritdoc} - */ - public function run(): void - { - waitAll(); - } - - /** - * Destroy loop. - * - * @return void - */ - public function stop(): void - { - Coroutine::killAll(); - } - - /** - * {@inheritdoc} - */ - public function setErrorHandler(callable $errorHandler): void - { - $this->errorHandler = $errorHandler; - } - - /** - * @param callable $func - * @param array $args - * @return void - */ - private function safeCall(callable $func, array $args = []): void - { - Coroutine::run(function () use ($func, $args): void { - try { - $func(...$args); - } catch (\Throwable $e) { - if ($this->errorHandler === null) { - echo $e; - } else { - ($this->errorHandler)($e); - } - } - }); - } - -} diff --git a/vendor/workerman/workerman/src/Protocols/Frame.php b/vendor/workerman/workerman/src/Protocols/Frame.php deleted file mode 100644 index c8ce71c..0000000 --- a/vendor/workerman/workerman/src/Protocols/Frame.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols; - -use function pack; -use function strlen; -use function substr; -use function unpack; - -/** - * Frame Protocol. - */ -class Frame -{ - /** - * Check the integrity of the package. - * - * @param string $buffer - * @return int - */ - public static function input(string $buffer): int - { - if (strlen($buffer) < 4) { - return 0; - } - $unpackData = unpack('Ntotal_length', $buffer); - return $unpackData['total_length']; - } - - /** - * Decode. - * - * @param string $buffer - * @return string - */ - public static function decode(string $buffer): string - { - return substr($buffer, 4); - } - - /** - * Encode. - * - * @param string $data - * @return string - */ - public static function encode(string $data): string - { - $totalLength = 4 + strlen($data); - return pack('N', $totalLength) . $data; - } -} diff --git a/vendor/workerman/workerman/src/Protocols/Http.php b/vendor/workerman/workerman/src/Protocols/Http.php deleted file mode 100644 index 1c58b33..0000000 --- a/vendor/workerman/workerman/src/Protocols/Http.php +++ /dev/null @@ -1,306 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols; - -use Workerman\Connection\TcpConnection; -use Workerman\Protocols\Http\Request; -use Workerman\Protocols\Http\Response; -use function clearstatcache; -use function count; -use function explode; -use function filesize; -use function fopen; -use function fread; -use function fseek; -use function ftell; -use function in_array; -use function ini_get; -use function is_array; -use function is_object; -use function preg_match; -use function str_starts_with; -use function strlen; -use function strpos; -use function strstr; -use function substr; -use function sys_get_temp_dir; - -/** - * Class Http. - * @package Workerman\Protocols - */ -class Http -{ - /** - * Request class name. - * - * @var string - */ - protected static string $requestClass = Request::class; - - /** - * Upload tmp dir. - * - * @var string - */ - protected static string $uploadTmpDir = ''; - - /** - * Get or set the request class name. - * - * @param class-string|null $className - * @return string - */ - public static function requestClass(?string $className = null): string - { - if ($className !== null) { - static::$requestClass = $className; - } - return static::$requestClass; - } - - /** - * Check the integrity of the package. - * - * @param string $buffer - * @param TcpConnection $connection - * @return int - */ - public static function input(string $buffer, TcpConnection $connection): int - { - $crlfPos = strpos($buffer, "\r\n\r\n"); - if (false === $crlfPos) { - // Judge whether the package length exceeds the limit. - if (strlen($buffer) >= 16384) { - $connection->close("HTTP/1.1 413 Payload Too Large\r\n\r\n", true); - } - return 0; - } - - $length = $crlfPos + 4; - $header = substr($buffer, 0, $crlfPos); - - if ( - !str_starts_with($header, 'GET ') && - !str_starts_with($header, 'POST ') && - !str_starts_with($header, 'OPTIONS ') && - !str_starts_with($header, 'HEAD ') && - !str_starts_with($header, 'DELETE ') && - !str_starts_with($header, 'PUT ') && - !str_starts_with($header, 'PATCH ') - ) { - $connection->close("HTTP/1.1 400 Bad Request\r\nContent-Length: 0\r\n\r\n", true); - return 0; - } - - if (preg_match('/\b(?:Transfer-Encoding\b.*)|(?:Content-Length:\s*(\d+)(?!.*\bTransfer-Encoding\b))/is', $header, $matches)) { - if (!isset($matches[1])) { - $connection->close("HTTP/1.1 400 Bad Request\r\nContent-Length: 0\r\n\r\n", true); - return 0; - } - $length += (int)$matches[1]; - } - - if ($length > $connection->maxPackageSize) { - $connection->close("HTTP/1.1 413 Payload Too Large\r\n\r\n", true); - return 0; - } - - return $length; - } - - - /** - * Http decode. - * - * @param string $buffer - * @param TcpConnection $connection - * @return Request - */ - public static function decode(string $buffer, TcpConnection $connection): Request - { - static $requests = []; - if (isset($requests[$buffer])) { - $request = $requests[$buffer]; - $request->connection = $connection; - $connection->request = $request; - $request->destroy(); - return $request; - } - $request = new static::$requestClass($buffer); - if (!isset($buffer[TcpConnection::MAX_CACHE_STRING_LENGTH])) { - $requests[$buffer] = $request; - if (count($requests) > TcpConnection::MAX_CACHE_SIZE) { - unset($requests[key($requests)]); - } - $request = clone $request; - } - $request->connection = $connection; - $connection->request = $request; - return $request; - } - - /** - * Http encode. - * - * @param string|Response $response - * @param TcpConnection $connection - * @return string - */ - public static function encode(mixed $response, TcpConnection $connection): string - { - if (isset($connection->request)) { - $request = $connection->request; - $request->connection = $connection->request = null; - } - - if (!is_object($response)) { - $extHeader = ''; - $contentType = 'text/html;charset=utf-8'; - foreach ($connection->headers as $name => $value) { - if ($name === 'Content-Type') { - $contentType = $value; - continue; - } - if (is_array($value)) { - foreach ($value as $item) { - $extHeader .= "$name: $item\r\n"; - } - } else { - $extHeader .= "$name: $value\r\n"; - } - } - $connection->headers = []; - $response = (string)$response; - $bodyLen = strlen($response); - return "HTTP/1.1 200 OK\r\nServer: workerman\r\n{$extHeader}Connection: keep-alive\r\nContent-Type: $contentType\r\nContent-Length: $bodyLen\r\n\r\n$response"; - } - - if ($connection->headers) { - $response->withHeaders($connection->headers); - $connection->headers = []; - } - - if (isset($response->file)) { - $file = $response->file['file']; - $offset = $response->file['offset']; - $length = $response->file['length']; - clearstatcache(); - $fileSize = (int)filesize($file); - $bodyLen = $length > 0 ? $length : $fileSize - $offset; - $response->withHeaders([ - 'Content-Length' => $bodyLen, - 'Accept-Ranges' => 'bytes', - ]); - if ($offset || $length) { - $offsetEnd = $offset + $bodyLen - 1; - $response->header('Content-Range', "bytes $offset-$offsetEnd/$fileSize"); - } - if ($bodyLen < 2 * 1024 * 1024) { - $connection->send($response . file_get_contents($file, false, null, $offset, $bodyLen), true); - return ''; - } - $handler = fopen($file, 'r'); - if (false === $handler) { - $connection->close(new Response(403, [], '403 Forbidden')); - return ''; - } - $connection->send((string)$response, true); - static::sendStream($connection, $handler, $offset, $length); - return ''; - } - - return (string)$response; - } - - /** - * Send remainder of a stream to client. - * - * @param TcpConnection $connection - * @param resource $handler - * @param int $offset - * @param int $length - */ - protected static function sendStream(TcpConnection $connection, $handler, int $offset = 0, int $length = 0): void - { - $connection->context->bufferFull = false; - $connection->context->streamSending = true; - if ($offset !== 0) { - fseek($handler, $offset); - } - $offsetEnd = $offset + $length; - // Read file content from disk piece by piece and send to client. - $doWrite = function () use ($connection, $handler, $length, $offsetEnd) { - // Send buffer not full. - while ($connection->context->bufferFull === false) { - // Read from disk. - $size = 1024 * 1024; - if ($length !== 0) { - $tell = ftell($handler); - $remainSize = $offsetEnd - $tell; - if ($remainSize <= 0) { - fclose($handler); - $connection->onBufferDrain = null; - return; - } - $size = min($remainSize, $size); - } - - $buffer = fread($handler, $size); - // Read eof. - if ($buffer === '' || $buffer === false) { - fclose($handler); - $connection->onBufferDrain = null; - $connection->context->streamSending = false; - return; - } - $connection->send($buffer, true); - } - }; - // Send buffer full. - $connection->onBufferFull = function ($connection) { - $connection->context->bufferFull = true; - }; - // Send buffer drain. - $connection->onBufferDrain = function ($connection) use ($doWrite) { - $connection->context->bufferFull = false; - $doWrite(); - }; - $doWrite(); - } - - /** - * Set or get uploadTmpDir. - * - * @param string|null $dir - * @return string - */ - public static function uploadTmpDir(string|null $dir = null): string - { - if (null !== $dir) { - static::$uploadTmpDir = $dir; - } - if (static::$uploadTmpDir === '') { - if ($uploadTmpDir = ini_get('upload_tmp_dir')) { - static::$uploadTmpDir = $uploadTmpDir; - } else if ($uploadTmpDir = sys_get_temp_dir()) { - static::$uploadTmpDir = $uploadTmpDir; - } - } - return static::$uploadTmpDir; - } -} diff --git a/vendor/workerman/workerman/src/Protocols/Http/Chunk.php b/vendor/workerman/workerman/src/Protocols/Http/Chunk.php deleted file mode 100644 index 2c7a2a8..0000000 --- a/vendor/workerman/workerman/src/Protocols/Http/Chunk.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols\Http; - -use Stringable; - -use function dechex; -use function strlen; - -/** - * Class Chunk - * @package Workerman\Protocols\Http - */ -class Chunk implements Stringable -{ - - public function __construct(protected string $buffer) {} - - public function __toString(): string - { - return dechex(strlen($this->buffer)) . "\r\n$this->buffer\r\n"; - } -} diff --git a/vendor/workerman/workerman/src/Protocols/Http/Request.php b/vendor/workerman/workerman/src/Protocols/Http/Request.php deleted file mode 100644 index cbb0dc3..0000000 --- a/vendor/workerman/workerman/src/Protocols/Http/Request.php +++ /dev/null @@ -1,769 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols\Http; - -use Exception; -use RuntimeException; -use Stringable; -use Workerman\Connection\TcpConnection; -use Workerman\Protocols\Http; -use function array_walk_recursive; -use function bin2hex; -use function clearstatcache; -use function count; -use function explode; -use function file_put_contents; -use function is_file; -use function json_decode; -use function ltrim; -use function microtime; -use function pack; -use function parse_str; -use function parse_url; -use function preg_match; -use function preg_replace; -use function strlen; -use function strpos; -use function strstr; -use function strtolower; -use function substr; -use function tempnam; -use function trim; -use function unlink; -use function urlencode; - -/** - * Class Request - * @package Workerman\Protocols\Http - */ -class Request implements Stringable -{ - /** - * Connection. - * - * @var ?TcpConnection - */ - public ?TcpConnection $connection = null; - - /** - * @var int - */ - public static int $maxFileUploads = 1024; - - /** - * Maximum string length for cache - * - * @var int - */ - public const MAX_CACHE_STRING_LENGTH = 4096; - - /** - * Maximum cache size. - * - * @var int - */ - public const MAX_CACHE_SIZE = 256; - - /** - * Properties. - * - * @var array - */ - public array $properties = []; - - /** - * Request data. - * - * @var array - */ - protected array $data = []; - - /** - * Is safe. - * - * @var bool - */ - protected bool $isSafe = true; - - /** - * Context. - * - * @var array - */ - public array $context = []; - - /** - * Request constructor. - * - */ - public function __construct(protected string $buffer) {} - - /** - * Get query. - * - * @param string|null $name - * @param mixed $default - * @return mixed - */ - public function get(?string $name = null, mixed $default = null): mixed - { - if (!isset($this->data['get'])) { - $this->parseGet(); - } - if (null === $name) { - return $this->data['get']; - } - return $this->data['get'][$name] ?? $default; - } - - /** - * Get post. - * - * @param string|null $name - * @param mixed $default - * @return mixed - */ - public function post(?string $name = null, mixed $default = null): mixed - { - if (!isset($this->data['post'])) { - $this->parsePost(); - } - if (null === $name) { - return $this->data['post']; - } - return $this->data['post'][$name] ?? $default; - } - - /** - * Get header item by name. - * - * @param string|null $name - * @param mixed $default - * @return mixed - */ - public function header(?string $name = null, mixed $default = null): mixed - { - if (!isset($this->data['headers'])) { - $this->parseHeaders(); - } - if (null === $name) { - return $this->data['headers']; - } - $name = strtolower($name); - return $this->data['headers'][$name] ?? $default; - } - - /** - * Get cookie item by name. - * - * @param string|null $name - * @param mixed $default - * @return mixed - */ - public function cookie(?string $name = null, mixed $default = null): mixed - { - if (!isset($this->data['cookie'])) { - $cookies = explode(';', $this->header('cookie', '')); - $mapped = array(); - - foreach ($cookies as $cookie) { - $cookie = explode('=', $cookie, 2); - if (count($cookie) !== 2) { - continue; - } - $mapped[trim($cookie[0])] = $cookie[1]; - } - $this->data['cookie'] = $mapped; - } - if ($name === null) { - return $this->data['cookie']; - } - return $this->data['cookie'][$name] ?? $default; - } - - /** - * Get upload files. - * - * @param string|null $name - * @return array|null - */ - public function file(?string $name = null): mixed - { - clearstatcache(); - if (!empty($this->data['files'])) { - array_walk_recursive($this->data['files'], function ($value, $key) { - if ($key === 'tmp_name' && !is_file($value)) { - $this->data['files'] = []; - } - }); - } - if (empty($this->data['files'])) { - $this->parsePost(); - } - if (null === $name) { - return $this->data['files']; - } - return $this->data['files'][$name] ?? null; - } - - /** - * Get method. - * - * @return string - */ - public function method(): string - { - if (!isset($this->data['method'])) { - $this->parseHeadFirstLine(); - } - return $this->data['method']; - } - - /** - * Get http protocol version. - * - * @return string - */ - public function protocolVersion(): string - { - if (!isset($this->data['protocolVersion'])) { - $this->parseProtocolVersion(); - } - return $this->data['protocolVersion']; - } - - /** - * Get host. - * - * @param bool $withoutPort - * @return string|null - */ - public function host(bool $withoutPort = false): ?string - { - $host = $this->header('host'); - if ($host && $withoutPort) { - return preg_replace('/:\d{1,5}$/', '', $host); - } - return $host; - } - - /** - * Get uri. - * - * @return string - */ - public function uri(): string - { - if (!isset($this->data['uri'])) { - $this->parseHeadFirstLine(); - } - return $this->data['uri']; - } - - /** - * Get path. - * - * @return string - */ - public function path(): string - { - return $this->data['path'] ??= (string)parse_url($this->uri(), PHP_URL_PATH); - } - - /** - * Get query string. - * - * @return string - */ - public function queryString(): string - { - return $this->data['query_string'] ??= (string)parse_url($this->uri(), PHP_URL_QUERY); - } - - /** - * Get session. - * - * @return Session - * @throws Exception - */ - public function session(): Session - { - return $this->context['session'] ??= new Session($this->sessionId()); - } - - /** - * Get/Set session id. - * - * @param string|null $sessionId - * @return string - * @throws Exception - */ - public function sessionId(?string $sessionId = null): string - { - if ($sessionId) { - unset($this->context['sid']); - } - if (!isset($this->context['sid'])) { - $sessionName = Session::$name; - $sid = $sessionId ? '' : $this->cookie($sessionName); - $sid = $this->isValidSessionId($sid) ? $sid : ''; - if ($sid === '') { - if (!$this->connection) { - throw new RuntimeException('Request->session() fail, header already send'); - } - $sid = $sessionId ?: static::createSessionId(); - $cookieParams = Session::getCookieParams(); - $this->setSidCookie($sessionName, $sid, $cookieParams); - } - $this->context['sid'] = $sid; - } - return $this->context['sid']; - } - - /** - * Check if session id is valid. - * - * @param mixed $sessionId - * @return bool - */ - public function isValidSessionId(mixed $sessionId): bool - { - return is_string($sessionId) && preg_match('/^[a-zA-Z0-9"]+$/', $sessionId); - } - - /** - * Session regenerate id. - * - * @param bool $deleteOldSession - * @return string - * @throws Exception - */ - public function sessionRegenerateId(bool $deleteOldSession = false): string - { - $session = $this->session(); - $sessionData = $session->all(); - if ($deleteOldSession) { - $session->flush(); - } - $newSid = static::createSessionId(); - $session = new Session($newSid); - $session->put($sessionData); - $cookieParams = Session::getCookieParams(); - $sessionName = Session::$name; - $this->setSidCookie($sessionName, $newSid, $cookieParams); - return $newSid; - } - - /** - * Get http raw head. - * - * @return string - */ - public function rawHead(): string - { - return $this->data['head'] ??= strstr($this->buffer, "\r\n\r\n", true); - } - - /** - * Get http raw body. - * - * @return string - */ - public function rawBody(): string - { - return substr($this->buffer, strpos($this->buffer, "\r\n\r\n") + 4); - } - - /** - * Get raw buffer. - * - * @return string - */ - public function rawBuffer(): string - { - return $this->buffer; - } - - /** - * Parse first line of http header buffer. - * - * @return void - */ - protected function parseHeadFirstLine(): void - { - $firstLine = strstr($this->buffer, "\r\n", true); - $tmp = explode(' ', $firstLine, 3); - $this->data['method'] = $tmp[0]; - $this->data['uri'] = $tmp[1] ?? '/'; - } - - /** - * Parse protocol version. - * - * @return void - */ - protected function parseProtocolVersion(): void - { - $firstLine = strstr($this->buffer, "\r\n", true); - $httpStr = strstr($firstLine, 'HTTP/'); - $protocolVersion = $httpStr ? substr($httpStr, 5) : '1.0'; - $this->data['protocolVersion'] = $protocolVersion; - } - - /** - * Parse headers. - * - * @return void - */ - protected function parseHeaders(): void - { - static $cache = []; - $this->data['headers'] = []; - $rawHead = $this->rawHead(); - $endLinePosition = strpos($rawHead, "\r\n"); - if ($endLinePosition === false) { - return; - } - $headBuffer = substr($rawHead, $endLinePosition + 2); - $cacheable = !isset($headBuffer[static::MAX_CACHE_STRING_LENGTH]); - if ($cacheable && isset($cache[$headBuffer])) { - $this->data['headers'] = $cache[$headBuffer]; - return; - } - $headData = explode("\r\n", $headBuffer); - foreach ($headData as $content) { - if (str_contains($content, ':')) { - [$key, $value] = explode(':', $content, 2); - $key = strtolower($key); - $value = ltrim($value); - } else { - $key = strtolower($content); - $value = ''; - } - if (isset($this->data['headers'][$key])) { - $this->data['headers'][$key] = "{$this->data['headers'][$key]},$value"; - } else { - $this->data['headers'][$key] = $value; - } - } - if ($cacheable) { - $cache[$headBuffer] = $this->data['headers']; - if (count($cache) > static::MAX_CACHE_SIZE) { - unset($cache[key($cache)]); - } - } - } - - /** - * Parse head. - * - * @return void - */ - protected function parseGet(): void - { - static $cache = []; - $queryString = $this->queryString(); - $this->data['get'] = []; - if ($queryString === '') { - return; - } - $cacheable = !isset($queryString[static::MAX_CACHE_STRING_LENGTH]); - if ($cacheable && isset($cache[$queryString])) { - $this->data['get'] = $cache[$queryString]; - return; - } - parse_str($queryString, $this->data['get']); - if ($cacheable) { - $cache[$queryString] = $this->data['get']; - if (count($cache) > static::MAX_CACHE_SIZE) { - unset($cache[key($cache)]); - } - } - } - - /** - * Parse post. - * - * @return void - */ - protected function parsePost(): void - { - static $cache = []; - $this->data['post'] = $this->data['files'] = []; - $contentType = $this->header('content-type', ''); - if (preg_match('/boundary="?(\S+)"?/', $contentType, $match)) { - $httpPostBoundary = '--' . $match[1]; - $this->parseUploadFiles($httpPostBoundary); - return; - } - $bodyBuffer = $this->rawBody(); - if ($bodyBuffer === '') { - return; - } - $cacheable = !isset($bodyBuffer[static::MAX_CACHE_STRING_LENGTH]); - if ($cacheable && isset($cache[$bodyBuffer])) { - $this->data['post'] = $cache[$bodyBuffer]; - return; - } - if (preg_match('/\bjson\b/i', $contentType)) { - $this->data['post'] = (array)json_decode($bodyBuffer, true); - } else { - parse_str($bodyBuffer, $this->data['post']); - } - if ($cacheable) { - $cache[$bodyBuffer] = $this->data['post']; - if (count($cache) > static::MAX_CACHE_SIZE) { - unset($cache[key($cache)]); - } - } - } - - /** - * Parse upload files. - * - * @param string $httpPostBoundary - * @return void - */ - protected function parseUploadFiles(string $httpPostBoundary): void - { - $httpPostBoundary = trim($httpPostBoundary, '"'); - $buffer = $this->buffer; - $postEncodeString = ''; - $filesEncodeString = ''; - $files = []; - $bodyPosition = strpos($buffer, "\r\n\r\n") + 4; - $offset = $bodyPosition + strlen($httpPostBoundary) + 2; - $maxCount = static::$maxFileUploads; - while ($maxCount-- > 0 && $offset) { - $offset = $this->parseUploadFile($httpPostBoundary, $offset, $postEncodeString, $filesEncodeString, $files); - } - if ($postEncodeString) { - parse_str($postEncodeString, $this->data['post']); - } - - if ($filesEncodeString) { - parse_str($filesEncodeString, $this->data['files']); - array_walk_recursive($this->data['files'], function (&$value) use ($files) { - $value = $files[$value]; - }); - } - } - - /** - * Parse upload file. - * - * @param string $boundary - * @param int $sectionStartOffset - * @param string $postEncodeString - * @param string $filesEncodeStr - * @param array $files - * @return int - */ - protected function parseUploadFile(string $boundary, int $sectionStartOffset, string &$postEncodeString, string &$filesEncodeStr, array &$files): int - { - $file = []; - $boundary = "\r\n$boundary"; - if (strlen($this->buffer) < $sectionStartOffset) { - return 0; - } - $sectionEndOffset = strpos($this->buffer, $boundary, $sectionStartOffset); - if (!$sectionEndOffset) { - return 0; - } - $contentLinesEndOffset = strpos($this->buffer, "\r\n\r\n", $sectionStartOffset); - if (!$contentLinesEndOffset || $contentLinesEndOffset + 4 > $sectionEndOffset) { - return 0; - } - $contentLinesStr = substr($this->buffer, $sectionStartOffset, $contentLinesEndOffset - $sectionStartOffset); - $contentLines = explode("\r\n", trim($contentLinesStr . "\r\n")); - $boundaryValue = substr($this->buffer, $contentLinesEndOffset + 4, $sectionEndOffset - $contentLinesEndOffset - 4); - $uploadKey = false; - foreach ($contentLines as $contentLine) { - if (!strpos($contentLine, ': ')) { - return 0; - } - [$key, $value] = explode(': ', $contentLine); - switch (strtolower($key)) { - - case "content-disposition": - // Is file data. - if (preg_match('/name="(.*?)"; filename="(.*?)"/i', $value, $match)) { - $error = 0; - $tmpFile = ''; - $fileName = $match[1]; - $size = strlen($boundaryValue); - $tmpUploadDir = HTTP::uploadTmpDir(); - if (!$tmpUploadDir) { - $error = UPLOAD_ERR_NO_TMP_DIR; - } else if ($boundaryValue === '' && $fileName === '') { - $error = UPLOAD_ERR_NO_FILE; - } else { - $tmpFile = tempnam($tmpUploadDir, 'workerman.upload.'); - if ($tmpFile === false || false === file_put_contents($tmpFile, $boundaryValue)) { - $error = UPLOAD_ERR_CANT_WRITE; - } - } - $uploadKey = $fileName; - // Parse upload files. - $file = [...$file, 'name' => $match[2], 'tmp_name' => $tmpFile, 'size' => $size, 'error' => $error, 'full_path' => $match[2]]; - $file['type'] ??= ''; - break; - } - // Is post field. - // Parse $POST. - if (preg_match('/name="(.*?)"$/', $value, $match)) { - $k = $match[1]; - $postEncodeString .= urlencode($k) . "=" . urlencode($boundaryValue) . '&'; - } - return $sectionEndOffset + strlen($boundary) + 2; - - case "content-type": - $file['type'] = trim($value); - break; - - case "webkitrelativepath": - $file['full_path'] = trim($value); - break; - } - } - if ($uploadKey === false) { - return 0; - } - $filesEncodeStr .= urlencode($uploadKey) . '=' . count($files) . '&'; - $files[] = $file; - - return $sectionEndOffset + strlen($boundary) + 2; - } - - /** - * Create session id. - * - * @return string - * @throws Exception - */ - public static function createSessionId(): string - { - return bin2hex(pack('d', microtime(true)) . random_bytes(8)); - } - - /** - * @param string $sessionName - * @param string $sid - * @param array $cookieParams - * @return void - */ - protected function setSidCookie(string $sessionName, string $sid, array $cookieParams): void - { - if (!$this->connection) { - throw new RuntimeException('Request->setSidCookie() fail, header already send'); - } - $this->connection->headers['Set-Cookie'] = [$sessionName . '=' . $sid - . (empty($cookieParams['domain']) ? '' : '; Domain=' . $cookieParams['domain']) - . (empty($cookieParams['lifetime']) ? '' : '; Max-Age=' . $cookieParams['lifetime']) - . (empty($cookieParams['path']) ? '' : '; Path=' . $cookieParams['path']) - . (empty($cookieParams['samesite']) ? '' : '; SameSite=' . $cookieParams['samesite']) - . (!$cookieParams['secure'] ? '' : '; Secure') - . (!$cookieParams['httponly'] ? '' : '; HttpOnly')]; - } - - /** - * __toString. - */ - public function __toString(): string - { - return $this->buffer; - } - - /** - * Setter. - * - * @param string $name - * @param mixed $value - * @return void - */ - public function __set(string $name, mixed $value): void - { - $this->properties[$name] = $value; - } - - /** - * Getter. - * - * @param string $name - * @return mixed - */ - public function __get(string $name): mixed - { - return $this->properties[$name] ?? null; - } - - /** - * Isset. - * - * @param string $name - * @return bool - */ - public function __isset(string $name): bool - { - return isset($this->properties[$name]); - } - - /** - * Unset. - * - * @param string $name - * @return void - */ - public function __unset(string $name): void - { - unset($this->properties[$name]); - } - - /** - * __wakeup. - * - * @return void - */ - public function __wakeup(): void - { - $this->isSafe = false; - } - - /** - * Destroy. - * - * @return void - */ - public function destroy(): void - { - if ($this->context) { - $this->context = []; - } - if ($this->properties) { - $this->properties = []; - } - if (isset($this->data['files']) && $this->isSafe) { - clearstatcache(); - array_walk_recursive($this->data['files'], function ($value, $key) { - if ($key === 'tmp_name' && is_file($value)) { - unlink($value); - } - }); - } - } - -} diff --git a/vendor/workerman/workerman/src/Protocols/Http/Response.php b/vendor/workerman/workerman/src/Protocols/Http/Response.php deleted file mode 100644 index a54c184..0000000 --- a/vendor/workerman/workerman/src/Protocols/Http/Response.php +++ /dev/null @@ -1,475 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols\Http; - -use Stringable; - -use function array_merge_recursive; -use function explode; -use function file; -use function filemtime; -use function gmdate; -use function is_array; -use function is_file; -use function pathinfo; -use function preg_match; -use function rawurlencode; -use function strlen; -use function substr; -use const FILE_IGNORE_NEW_LINES; -use const FILE_SKIP_EMPTY_LINES; - -/** - * Class Response - * @package Workerman\Protocols\Http - */ -class Response implements Stringable -{ - - /** - * Http reason. - * - * @var ?string - */ - protected ?string $reason = null; - - /** - * Http version. - * - * @var string - */ - protected string $version = '1.1'; - - /** - * Send file info - * - * @var ?array - */ - public ?array $file = null; - - /** - * Mine type map. - * @var array - */ - protected static array $mimeTypeMap = []; - - /** - * Phrases. - * - * @var array - * - * @link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes - */ - public const PHRASES = [ - 100 => 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', // WebDAV; RFC 2518 - 103 => 'Early Hints', // RFC 8297 - - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', // since HTTP/1.1 - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', // RFC 7233 - 207 => 'Multi-Status', // WebDAV; RFC 4918 - 208 => 'Already Reported', // WebDAV; RFC 5842 - 226 => 'IM Used', // RFC 3229 - - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', // Previously "Moved temporarily" - 303 => 'See Other', // since HTTP/1.1 - 304 => 'Not Modified', // RFC 7232 - 305 => 'Use Proxy', // since HTTP/1.1 - 306 => 'Switch Proxy', - 307 => 'Temporary Redirect', // since HTTP/1.1 - 308 => 'Permanent Redirect', // RFC 7538 - - 400 => 'Bad Request', - 401 => 'Unauthorized', // RFC 7235 - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', // RFC 7235 - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', // RFC 7232 - 413 => 'Payload Too Large', // RFC 7231 - 414 => 'URI Too Long', // RFC 7231 - 415 => 'Unsupported Media Type', // RFC 7231 - 416 => 'Range Not Satisfiable', // RFC 7233 - 417 => 'Expectation Failed', - 418 => 'I\'m a teapot', // RFC 2324, RFC 7168 - 421 => 'Misdirected Request', // RFC 7540 - 422 => 'Unprocessable Entity', // WebDAV; RFC 4918 - 423 => 'Locked', // WebDAV; RFC 4918 - 424 => 'Failed Dependency', // WebDAV; RFC 4918 - 425 => 'Too Early', // RFC 8470 - 426 => 'Upgrade Required', - 428 => 'Precondition Required', // RFC 6585 - 429 => 'Too Many Requests', // RFC 6585 - 431 => 'Request Header Fields Too Large', // RFC 6585 - 451 => 'Unavailable For Legal Reasons', // RFC 7725 - - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 506 => 'Variant Also Negotiates', // RFC 2295 - 507 => 'Insufficient Storage', // WebDAV; RFC 4918 - 508 => 'Loop Detected', // WebDAV; RFC 5842 - 510 => 'Not Extended', // RFC 2774 - 511 => 'Network Authentication Required', // RFC 6585 - ]; - - /** - * Init. - * - * @return void - */ - public static function init(): void - { - static::initMimeTypeMap(); - } - - /** - * Response constructor. - * - * @param int $status - * @param array $headers - * @param string $body - */ - public function __construct( - protected int $status = 200, - protected array $headers = [], - protected string $body = '' - ) {} - - /** - * Set header. - * - * @param string $name - * @param string $value - * @return $this - */ - public function header(string $name, string $value): static - { - $this->headers[$name] = $value; - return $this; - } - - /** - * Set header. - * - * @param string $name - * @param string $value - * @return $this - */ - public function withHeader(string $name, string $value): static - { - return $this->header($name, $value); - } - - /** - * Set headers. - * - * @param array $headers - * @return $this - */ - public function withHeaders(array $headers): static - { - $this->headers = array_merge_recursive($this->headers, $headers); - return $this; - } - - /** - * Remove header. - * - * @param string $name - * @return $this - */ - public function withoutHeader(string $name): static - { - unset($this->headers[$name]); - return $this; - } - - /** - * Get header. - * - * @param string $name - * @return null|array|string - */ - public function getHeader(string $name): array|string|null - { - return $this->headers[$name] ?? null; - } - - /** - * Get headers. - * - * @return array - */ - public function getHeaders(): array - { - return $this->headers; - } - - /** - * Set status. - * - * @param int $code - * @param string|null $reasonPhrase - * @return $this - */ - public function withStatus(int $code, ?string $reasonPhrase = null): static - { - $this->status = $code; - $this->reason = $reasonPhrase; - return $this; - } - - /** - * Get status code. - * - * @return int - */ - public function getStatusCode(): int - { - return $this->status; - } - - /** - * Get reason phrase. - * - * @return ?string - */ - public function getReasonPhrase(): ?string - { - return $this->reason; - } - - /** - * Set protocol version. - * - * @param string $version - * @return $this - */ - public function withProtocolVersion(string $version): static - { - $this->version = $version; - return $this; - } - - /** - * Set http body. - * - * @param string $body - * @return $this - */ - public function withBody(string $body): static - { - $this->body = $body; - return $this; - } - - /** - * Get http raw body. - * - * @return string - */ - public function rawBody(): string - { - return $this->body; - } - - /** - * Send file. - * - * @param string $file - * @param int $offset - * @param int $length - * @return $this - */ - public function withFile(string $file, int $offset = 0, int $length = 0): static - { - if (!is_file($file)) { - return $this->withStatus(404)->withBody('

404 Not Found

'); - } - $this->file = ['file' => $file, 'offset' => $offset, 'length' => $length]; - return $this; - } - - /** - * Set cookie. - * - * @param string $name - * @param string $value - * @param int|null $maxAge - * @param string $path - * @param string $domain - * @param bool $secure - * @param bool $httpOnly - * @param string $sameSite - * @return $this - */ - public function cookie(string $name, string $value = '', ?int $maxAge = null, string $path = '', string $domain = '', bool $secure = false, bool $httpOnly = false, string $sameSite = ''): static - { - $this->headers['Set-Cookie'][] = $name . '=' . rawurlencode($value) - . (empty($domain) ? '' : '; Domain=' . $domain) - . ($maxAge === null ? '' : '; Max-Age=' . $maxAge) - . (empty($path) ? '' : '; Path=' . $path) - . (!$secure ? '' : '; Secure') - . (!$httpOnly ? '' : '; HttpOnly') - . (empty($sameSite) ? '' : '; SameSite=' . $sameSite); - return $this; - } - - /** - * Create header for file. - * - * @param array $fileInfo - * @return string - */ - protected function createHeadForFile(array $fileInfo): string - { - $file = $fileInfo['file']; - $reason = $this->reason ?: self::PHRASES[$this->status]; - $head = "HTTP/$this->version $this->status $reason\r\n"; - $headers = $this->headers; - if (!isset($headers['Server'])) { - $head .= "Server: workerman\r\n"; - } - foreach ($headers as $name => $value) { - if (is_array($value)) { - foreach ($value as $item) { - $head .= "$name: $item\r\n"; - } - continue; - } - $head .= "$name: $value\r\n"; - } - - if (!isset($headers['Connection'])) { - $head .= "Connection: keep-alive\r\n"; - } - - $fileInfo = pathinfo($file); - $extension = $fileInfo['extension'] ?? ''; - $baseName = $fileInfo['basename'] ?: 'unknown'; - if (!isset($headers['Content-Type'])) { - if (isset(self::$mimeTypeMap[$extension])) { - $head .= "Content-Type: " . self::$mimeTypeMap[$extension] . "\r\n"; - } else { - $head .= "Content-Type: application/octet-stream\r\n"; - } - } - - if (!isset($headers['Content-Disposition']) && !isset(self::$mimeTypeMap[$extension])) { - $head .= "Content-Disposition: attachment; filename=\"$baseName\"\r\n"; - } - - if (!isset($headers['Last-Modified']) && $mtime = filemtime($file)) { - $head .= 'Last-Modified: ' . gmdate('D, d M Y H:i:s', $mtime) . ' GMT' . "\r\n"; - } - - return "$head\r\n"; - } - - /** - * __toString. - * - * @return string - */ - public function __toString(): string - { - if ($this->file) { - return $this->createHeadForFile($this->file); - } - - $reason = $this->reason ?: self::PHRASES[$this->status] ?? ''; - $bodyLen = strlen($this->body); - if (empty($this->headers)) { - return "HTTP/$this->version $this->status $reason\r\nServer: workerman\r\nContent-Type: text/html;charset=utf-8\r\nContent-Length: $bodyLen\r\nConnection: keep-alive\r\n\r\n$this->body"; - } - - $head = "HTTP/$this->version $this->status $reason\r\n"; - $headers = $this->headers; - if (!isset($headers['Server'])) { - $head .= "Server: workerman\r\n"; - } - foreach ($headers as $name => $value) { - if (is_array($value)) { - foreach ($value as $item) { - $head .= "$name: $item\r\n"; - } - continue; - } - $head .= "$name: $value\r\n"; - } - - if (!isset($headers['Connection'])) { - $head .= "Connection: keep-alive\r\n"; - } - - if (!isset($headers['Content-Type'])) { - $head .= "Content-Type: text/html;charset=utf-8\r\n"; - } else if ($headers['Content-Type'] === 'text/event-stream') { - return $head . $this->body; - } - - if (!isset($headers['Transfer-Encoding'])) { - $head .= "Content-Length: $bodyLen\r\n\r\n"; - } else { - return $bodyLen ? "$head\r\n" . dechex($bodyLen) . "\r\n{$this->body}\r\n" : "$head\r\n"; - } - - // The whole http package - return $head . $this->body; - } - - /** - * Init mime map. - * - * @return void - */ - public static function initMimeTypeMap(): void - { - $mimeFile = __DIR__ . '/mime.types'; - $items = file($mimeFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - foreach ($items as $content) { - if (preg_match("/\s*(\S+)\s+(\S.+)/", $content, $match)) { - $mimeType = $match[1]; - $extensionVar = $match[2]; - $extensionArray = explode(' ', substr($extensionVar, 0, -1)); - foreach ($extensionArray as $fileExtension) { - static::$mimeTypeMap[$fileExtension] = $mimeType; - } - } - } - } -} - -Response::init(); diff --git a/vendor/workerman/workerman/src/Protocols/Http/ServerSentEvents.php b/vendor/workerman/workerman/src/Protocols/Http/ServerSentEvents.php deleted file mode 100644 index 6b70b10..0000000 --- a/vendor/workerman/workerman/src/Protocols/Http/ServerSentEvents.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols\Http; - -use Stringable; - -use function str_replace; - -/** - * Class ServerSentEvents - * @package Workerman\Protocols\Http - */ -class ServerSentEvents implements Stringable -{ - /** - * ServerSentEvents constructor. - * $data for example ['event'=>'ping', 'data' => 'some thing', 'id' => 1000, 'retry' => 5000] - */ - public function __construct(protected array $data) {} - - public function __toString(): string - { - $buffer = ''; - $data = $this->data; - if (isset($data[''])) { - $buffer = ": {$data['']}\n"; - } - if (isset($data['event'])) { - $buffer .= "event: {$data['event']}\n"; - } - if (isset($data['id'])) { - $buffer .= "id: {$data['id']}\n"; - } - if (isset($data['retry'])) { - $buffer .= "retry: {$data['retry']}\n"; - } - if (isset($data['data'])) { - $buffer .= 'data: ' . str_replace("\n", "\ndata: ", $data['data']) . "\n"; - } - return "$buffer\n"; - } -} diff --git a/vendor/workerman/workerman/src/Protocols/Http/Session.php b/vendor/workerman/workerman/src/Protocols/Http/Session.php deleted file mode 100644 index 7bdd533..0000000 --- a/vendor/workerman/workerman/src/Protocols/Http/Session.php +++ /dev/null @@ -1,454 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols\Http; - -use Exception; -use Random\RandomException; -use RuntimeException; -use Workerman\Protocols\Http\Session\FileSessionHandler; -use Workerman\Protocols\Http\Session\SessionHandlerInterface; -use function array_key_exists; -use function ini_get; -use function is_array; -use function is_scalar; -use function preg_match; -use function random_int; -use function serialize; -use function session_get_cookie_params; -use function unserialize; - -/** - * Class Session - * @package Workerman\Protocols\Http - */ -class Session -{ - /** - * Session andler class which implements SessionHandlerInterface. - * - * @var string - */ - protected static string $handlerClass = FileSessionHandler::class; - - /** - * Parameters of __constructor for session handler class. - * - * @var mixed - */ - protected static mixed $handlerConfig = null; - - /** - * Session name. - * - * @var string - */ - public static string $name = 'PHPSID'; - - /** - * Auto update timestamp. - * - * @var bool - */ - public static bool $autoUpdateTimestamp = false; - - /** - * Session lifetime. - * - * @var int - */ - public static int $lifetime = 1440; - - /** - * Cookie lifetime. - * - * @var int - */ - public static int $cookieLifetime = 1440; - - /** - * Session cookie path. - * - * @var string - */ - public static string $cookiePath = '/'; - - /** - * Session cookie domain. - * - * @var string - */ - public static string $domain = ''; - - /** - * HTTPS only cookies. - * - * @var bool - */ - public static bool $secure = false; - - /** - * HTTP access only. - * - * @var bool - */ - public static bool $httpOnly = true; - - /** - * Same-site cookies. - * - * @var string - */ - public static string $sameSite = ''; - - /** - * Gc probability. - * - * @var int[] - */ - public static array $gcProbability = [1, 20000]; - - /** - * Session handler instance. - * - * @var ?SessionHandlerInterface - */ - protected static ?SessionHandlerInterface $handler = null; - - /** - * Session data. - * - * @var array - */ - protected mixed $data = []; - - /** - * Session changed and need to save. - * - * @var bool - */ - protected bool $needSave = false; - - /** - * Session id. - * - * @var string - */ - protected string $sessionId; - - /** - * Is safe. - * - * @var bool - */ - protected bool $isSafe = true; - - /** - * Session constructor. - * - * @param string $sessionId - */ - public function __construct(string $sessionId) - { - if (static::$handler === null) { - static::initHandler(); - } - $this->sessionId = $sessionId; - if ($data = static::$handler->read($sessionId)) { - $this->data = unserialize($data); - } - } - - /** - * Get session id. - * - * @return string - */ - public function getId(): string - { - return $this->sessionId; - } - - /** - * Get session. - * - * @param string $name - * @param mixed $default - * @return mixed - */ - public function get(string $name, mixed $default = null): mixed - { - return $this->data[$name] ?? $default; - } - - /** - * Store data in the session. - * - * @param string $name - * @param mixed $value - */ - public function set(string $name, mixed $value): void - { - $this->data[$name] = $value; - $this->needSave = true; - } - - /** - * Delete an item from the session. - * - * @param string $name - */ - public function delete(string $name): void - { - unset($this->data[$name]); - $this->needSave = true; - } - - /** - * Retrieve and delete an item from the session. - * - * @param string $name - * @param mixed $default - * @return mixed - */ - public function pull(string $name, mixed $default = null): mixed - { - $value = $this->get($name, $default); - $this->delete($name); - return $value; - } - - /** - * Store data in the session. - * - * @param array|string $key - * @param mixed $value - */ - public function put(array|string $key, mixed $value = null): void - { - if (!is_array($key)) { - $this->set($key, $value); - return; - } - - foreach ($key as $k => $v) { - $this->data[$k] = $v; - } - $this->needSave = true; - } - - /** - * Remove a piece of data from the session. - * - * @param array|string $name - */ - public function forget(array|string $name): void - { - if (is_scalar($name)) { - $this->delete($name); - return; - } - foreach ($name as $key) { - unset($this->data[$key]); - } - $this->needSave = true; - } - - /** - * Retrieve all the data in the session. - * - * @return array - */ - public function all(): array - { - return $this->data; - } - - /** - * Remove all data from the session. - * - * @return void - */ - public function flush(): void - { - $this->needSave = true; - $this->data = []; - } - - /** - * Determining If An Item Exists In The Session. - * - * @param string $name - * @return bool - */ - public function has(string $name): bool - { - return isset($this->data[$name]); - } - - /** - * To determine if an item is present in the session, even if its value is null. - * - * @param string $name - * @return bool - */ - public function exists(string $name): bool - { - return array_key_exists($name, $this->data); - } - - /** - * Save session to store. - * - * @return void - */ - public function save(): void - { - if ($this->needSave) { - if (empty($this->data)) { - static::$handler->destroy($this->sessionId); - } else { - static::$handler->write($this->sessionId, serialize($this->data)); - } - } elseif (static::$autoUpdateTimestamp) { - $this->refresh(); - } - $this->needSave = false; - } - - /** - * Refresh session expire time. - * - * @return bool - */ - public function refresh(): bool - { - return static::$handler->updateTimestamp($this->getId()); - } - - /** - * Init. - * - * @return void - */ - public static function init(): void - { - if (($gcProbability = (int)ini_get('session.gc_probability')) && ($gcDivisor = (int)ini_get('session.gc_divisor'))) { - static::$gcProbability = [$gcProbability, $gcDivisor]; - } - - if ($gcMaxLifeTime = ini_get('session.gc_maxlifetime')) { - self::$lifetime = (int)$gcMaxLifeTime; - } - - $sessionCookieParams = session_get_cookie_params(); - static::$cookieLifetime = $sessionCookieParams['lifetime']; - static::$cookiePath = $sessionCookieParams['path']; - static::$domain = $sessionCookieParams['domain']; - static::$secure = $sessionCookieParams['secure']; - static::$httpOnly = $sessionCookieParams['httponly']; - } - - /** - * Set session handler class. - * - * @param mixed $className - * @param mixed $config - * @return string - */ - public static function handlerClass(mixed $className = null, mixed $config = null): string - { - if ($className) { - static::$handlerClass = $className; - } - if ($config) { - static::$handlerConfig = $config; - } - return static::$handlerClass; - } - - /** - * Get cookie params. - * - * @return array - */ - public static function getCookieParams(): array - { - return [ - 'lifetime' => static::$cookieLifetime, - 'path' => static::$cookiePath, - 'domain' => static::$domain, - 'secure' => static::$secure, - 'httponly' => static::$httpOnly, - 'samesite' => static::$sameSite, - ]; - } - - /** - * Init handler. - * - * @return void - */ - protected static function initHandler(): void - { - if (static::$handlerConfig === null) { - static::$handler = new static::$handlerClass(); - } else { - static::$handler = new static::$handlerClass(static::$handlerConfig); - } - } - - /** - * GC sessions. - * - * @return void - */ - public function gc(): void - { - static::$handler->gc(static::$lifetime); - } - - /** - * __wakeup. - * - * @return void - */ - public function __wakeup() - { - $this->isSafe = false; - } - - /** - * __destruct. - * - * @return void - * @throws RandomException - */ - public function __destruct() - { - if (!$this->isSafe) { - return; - } - $this->save(); - if (random_int(1, static::$gcProbability[1]) <= static::$gcProbability[0]) { - $this->gc(); - } - } - -} - -// Init session. -Session::init(); diff --git a/vendor/workerman/workerman/src/Protocols/Http/Session/FileSessionHandler.php b/vendor/workerman/workerman/src/Protocols/Http/Session/FileSessionHandler.php deleted file mode 100644 index 219171c..0000000 --- a/vendor/workerman/workerman/src/Protocols/Http/Session/FileSessionHandler.php +++ /dev/null @@ -1,209 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols\Http\Session; - -use Exception; -use Workerman\Protocols\Http\Session; -use function clearstatcache; -use function file_get_contents; -use function file_put_contents; -use function filemtime; -use function glob; -use function is_dir; -use function is_file; -use function mkdir; -use function rename; -use function session_save_path; -use function strlen; -use function sys_get_temp_dir; -use function time; -use function touch; -use function unlink; - -/** - * Class FileSessionHandler - * @package Workerman\Protocols\Http\Session - */ -class FileSessionHandler implements SessionHandlerInterface -{ - /** - * Session save path. - * - * @var string - */ - protected static string $sessionSavePath; - - /** - * Session file prefix. - * - * @var string - */ - protected static string $sessionFilePrefix = 'session_'; - - /** - * Init. - */ - public static function init() - { - $savePath = @session_save_path(); - if (!$savePath || str_starts_with($savePath, 'tcp://')) { - $savePath = sys_get_temp_dir(); - } - static::sessionSavePath($savePath); - } - - /** - * FileSessionHandler constructor. - * @param array $config - */ - public function __construct(array $config = []) - { - if (isset($config['save_path'])) { - static::sessionSavePath($config['save_path']); - } - } - - /** - * {@inheritdoc} - */ - public function open(string $savePath, string $name): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function read(string $sessionId): string|false - { - $sessionFile = static::sessionFile($sessionId); - clearstatcache(); - if (is_file($sessionFile)) { - if (time() - filemtime($sessionFile) > Session::$lifetime) { - unlink($sessionFile); - return false; - } - $data = file_get_contents($sessionFile); - return $data ?: false; - } - return false; - } - - /** - * {@inheritdoc} - * @throws Exception - */ - public function write(string $sessionId, string $sessionData): bool - { - $tempFile = static::$sessionSavePath . uniqid(bin2hex(random_bytes(8)), true); - if (!file_put_contents($tempFile, $sessionData)) { - return false; - } - return rename($tempFile, static::sessionFile($sessionId)); - } - - /** - * Update session modify time. - * - * @see https://www.php.net/manual/en/class.sessionupdatetimestamphandlerinterface.php - * @see https://www.php.net/manual/zh/function.touch.php - * - * @param string $sessionId Session id. - * @param string $data Session Data. - * - * @return bool - */ - public function updateTimestamp(string $sessionId, string $data = ""): bool - { - $sessionFile = static::sessionFile($sessionId); - if (!file_exists($sessionFile)) { - return false; - } - // set file modify time to current time - $setModifyTime = touch($sessionFile); - // clear file stat cache - clearstatcache(); - return $setModifyTime; - } - - /** - * {@inheritdoc} - */ - public function close(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function destroy(string $sessionId): bool - { - $sessionFile = static::sessionFile($sessionId); - if (is_file($sessionFile)) { - unlink($sessionFile); - } - return true; - } - - /** - * {@inheritdoc} - */ - public function gc(int $maxLifetime): bool - { - $timeNow = time(); - foreach (glob(static::$sessionSavePath . static::$sessionFilePrefix . '*') as $file) { - if (is_file($file) && $timeNow - filemtime($file) > $maxLifetime) { - unlink($file); - } - } - return true; - } - - /** - * Get session file path. - * - * @param string $sessionId - * @return string - */ - protected static function sessionFile(string $sessionId): string - { - return static::$sessionSavePath . static::$sessionFilePrefix . $sessionId; - } - - /** - * Get or set session file path. - * - * @param string $path - * @return string - */ - public static function sessionSavePath(string $path): string - { - if ($path) { - if ($path[strlen($path) - 1] !== DIRECTORY_SEPARATOR) { - $path .= DIRECTORY_SEPARATOR; - } - static::$sessionSavePath = $path; - if (!is_dir($path)) { - mkdir($path, 0777, true); - } - } - return $path; - } -} - -FileSessionHandler::init(); \ No newline at end of file diff --git a/vendor/workerman/workerman/src/Protocols/Http/Session/RedisClusterSessionHandler.php b/vendor/workerman/workerman/src/Protocols/Http/Session/RedisClusterSessionHandler.php deleted file mode 100644 index d1f93d9..0000000 --- a/vendor/workerman/workerman/src/Protocols/Http/Session/RedisClusterSessionHandler.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols\Http\Session; - -use Redis; -use RedisCluster; -use RedisClusterException; -use RedisException; - -class RedisClusterSessionHandler extends RedisSessionHandler -{ - /** - * @param $config - * @throws RedisClusterException - * @throws RedisException - */ - public function __construct($config) - { - $timeout = $config['timeout'] ?? 2; - $readTimeout = $config['read_timeout'] ?? $timeout; - $persistent = $config['persistent'] ?? false; - $auth = $config['auth'] ?? ''; - $args = [null, $config['host'], $timeout, $readTimeout, $persistent]; - if ($auth) { - $args[] = $auth; - } - $this->redis = new RedisCluster(...$args); - if (empty($config['prefix'])) { - $config['prefix'] = 'redis_session_'; - } - $this->redis->setOption(Redis::OPT_PREFIX, $config['prefix']); - } - - /** - * {@inheritdoc} - */ - public function read(string $sessionId): string|false - { - return $this->redis->get($sessionId); - } -} diff --git a/vendor/workerman/workerman/src/Protocols/Http/Session/RedisSessionHandler.php b/vendor/workerman/workerman/src/Protocols/Http/Session/RedisSessionHandler.php deleted file mode 100644 index 8733e06..0000000 --- a/vendor/workerman/workerman/src/Protocols/Http/Session/RedisSessionHandler.php +++ /dev/null @@ -1,166 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols\Http\Session; - -use Redis; -use RedisCluster; -use RedisException; -use RuntimeException; -use Throwable; -use Workerman\Protocols\Http\Session; -use Workerman\Timer; - -/** - * Class RedisSessionHandler - * @package Workerman\Protocols\Http\Session - */ -class RedisSessionHandler implements SessionHandlerInterface -{ - /** - * @var Redis|RedisCluster - */ - protected Redis|RedisCluster $redis; - - /** - * @var array - */ - protected array $config; - - /** - * RedisSessionHandler constructor. - * @param array $config = [ - * 'host' => '127.0.0.1', - * 'port' => 6379, - * 'timeout' => 2, - * 'auth' => '******', - * 'database' => 2, - * 'prefix' => 'redis_session_', - * 'ping' => 55, - * ] - * @throws RedisException - */ - public function __construct(array $config) - { - if (false === extension_loaded('redis')) { - throw new RuntimeException('Please install redis extension.'); - } - - $config['timeout'] ??= 2; - $this->config = $config; - $this->connect(); - - Timer::add($config['ping'] ?? 55, function () { - $this->redis->get('ping'); - }); - } - - /** - * @throws RedisException - */ - public function connect() - { - $config = $this->config; - - $this->redis = new Redis(); - if (false === $this->redis->connect($config['host'], $config['port'], $config['timeout'])) { - throw new RuntimeException("Redis connect {$config['host']}:{$config['port']} fail."); - } - if (!empty($config['auth'])) { - $this->redis->auth($config['auth']); - } - if (!empty($config['database'])) { - $this->redis->select($config['database']); - } - if (empty($config['prefix'])) { - $config['prefix'] = 'redis_session_'; - } - $this->redis->setOption(Redis::OPT_PREFIX, $config['prefix']); - } - - /** - * {@inheritdoc} - */ - public function open(string $savePath, string $name): bool - { - return true; - } - - /** - * {@inheritdoc} - * @param string $sessionId - * @return string|false - * @throws RedisException - * @throws Throwable - */ - public function read(string $sessionId): string|false - { - try { - return $this->redis->get($sessionId); - } catch (Throwable $e) { - $msg = strtolower($e->getMessage()); - if ($msg === 'connection lost' || strpos($msg, 'went away')) { - $this->connect(); - return $this->redis->get($sessionId); - } - throw $e; - } - } - - /** - * {@inheritdoc} - * @throws RedisException - */ - public function write(string $sessionId, string $sessionData): bool - { - return true === $this->redis->setex($sessionId, Session::$lifetime, $sessionData); - } - - /** - * {@inheritdoc} - * @throws RedisException - */ - public function updateTimestamp(string $sessionId, string $data = ""): bool - { - return true === $this->redis->expire($sessionId, Session::$lifetime); - } - - /** - * {@inheritdoc} - * @throws RedisException - */ - public function destroy(string $sessionId): bool - { - $this->redis->del($sessionId); - return true; - } - - /** - * {@inheritdoc} - */ - public function close(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function gc(int $maxLifetime): bool - { - return true; - } -} diff --git a/vendor/workerman/workerman/src/Protocols/Http/Session/SessionHandlerInterface.php b/vendor/workerman/workerman/src/Protocols/Http/Session/SessionHandlerInterface.php deleted file mode 100644 index 03f6b35..0000000 --- a/vendor/workerman/workerman/src/Protocols/Http/Session/SessionHandlerInterface.php +++ /dev/null @@ -1,117 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols\Http\Session; - -interface SessionHandlerInterface -{ - /** - * Close the session - * @link http://php.net/manual/en/sessionhandlerinterface.close.php - * @return bool

- * The return value (usually TRUE on success, FALSE on failure). - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function close(): bool; - - /** - * Destroy a session - * @link http://php.net/manual/en/sessionhandlerinterface.destroy.php - * @param string $sessionId The session ID being destroyed. - * @return bool

- * The return value (usually TRUE on success, FALSE on failure). - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function destroy(string $sessionId): bool; - - /** - * Cleanup old sessions - * @link http://php.net/manual/en/sessionhandlerinterface.gc.php - * @param int $maxLifetime

- * Sessions that have not updated for - * the last maxlifetime seconds will be removed. - *

- * @return bool

- * The return value (usually TRUE on success, FALSE on failure). - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function gc(int $maxLifetime): bool; - - /** - * Initialize session - * @link http://php.net/manual/en/sessionhandlerinterface.open.php - * @param string $savePath The path where to store/retrieve the session. - * @param string $name The session name. - * @return bool

- * The return value (usually TRUE on success, FALSE on failure). - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function open(string $savePath, string $name): bool; - - - /** - * Read session data - * @link http://php.net/manual/en/sessionhandlerinterface.read.php - * @param string $sessionId The session id to read data for. - * @return string|false

- * Returns an encoded string of the read data. - * If nothing was read, it must return false. - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function read(string $sessionId): string|false; - - /** - * Write session data - * @link http://php.net/manual/en/sessionhandlerinterface.write.php - * @param string $sessionId The session id. - * @param string $sessionData

- * The encoded session data. This data is the - * result of the PHP internally encoding - * the $SESSION superglobal to a serialized - * string and passing it as this parameter. - * Please note sessions use an alternative serialization method. - *

- * @return bool

- * The return value (usually TRUE on success, FALSE on failure). - * Note this value is returned internally to PHP for processing. - *

- * @since 5.4.0 - */ - public function write(string $sessionId, string $sessionData): bool; - - /** - * Update session modify time. - * - * @see https://www.php.net/manual/en/class.sessionupdatetimestamphandlerinterface.php - * - * @param string $sessionId - * @param string $data Session Data. - * - * @return bool - */ - public function updateTimestamp(string $sessionId, string $data = ""): bool; - -} diff --git a/vendor/workerman/workerman/src/Protocols/Http/mime.types b/vendor/workerman/workerman/src/Protocols/Http/mime.types deleted file mode 100644 index 5769914..0000000 --- a/vendor/workerman/workerman/src/Protocols/Http/mime.types +++ /dev/null @@ -1,91 +0,0 @@ - -types { - text/html html htm shtml; - text/css css; - text/xml xml; - image/gif gif; - image/jpeg jpeg jpg; - application/javascript js; - application/atom+xml atom; - application/rss+xml rss; - application/wasm wasm; - - text/mathml mml; - text/plain txt; - text/vnd.sun.j2me.app-descriptor jad; - text/vnd.wap.wml wml; - text/x-component htc; - - image/png png; - image/tiff tif tiff; - image/vnd.wap.wbmp wbmp; - image/x-icon ico; - image/x-jng jng; - image/x-ms-bmp bmp; - image/svg+xml svg svgz; - image/webp webp; - - application/font-woff woff; - application/java-archive jar war ear; - application/json json; - application/mac-binhex40 hqx; - application/msword doc; - application/pdf pdf; - application/postscript ps eps ai; - application/rtf rtf; - application/vnd.apple.mpegurl m3u8; - application/vnd.ms-excel xls; - application/vnd.ms-fontobject eot; - application/vnd.ms-powerpoint ppt; - application/vnd.wap.wmlc wmlc; - application/vnd.google-earth.kml+xml kml; - application/vnd.google-earth.kmz kmz; - application/x-7z-compressed 7z; - application/x-cocoa cco; - application/x-java-archive-diff jardiff; - application/x-java-jnlp-file jnlp; - application/x-makeself run; - application/x-perl pl pm; - application/x-pilot prc pdb; - application/x-rar-compressed rar; - application/x-redhat-package-manager rpm; - application/x-sea sea; - application/x-shockwave-flash swf; - application/x-stuffit sit; - application/x-tcl tcl tk; - application/x-x509-ca-cert der pem crt; - application/x-xpinstall xpi; - application/xhtml+xml xhtml; - application/xspf+xml xspf; - application/zip zip; - - application/octet-stream bin exe dll; - application/octet-stream deb; - application/octet-stream dmg; - application/octet-stream iso img; - application/octet-stream msi msp msm; - - application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; - application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; - - audio/midi mid midi kar; - audio/mpeg mp3; - audio/ogg ogg; - audio/x-m4a m4a; - audio/x-realaudio ra; - - video/3gpp 3gpp 3gp; - video/mp2t ts; - video/mp4 mp4; - video/mpeg mpeg mpg; - video/quicktime mov; - video/webm webm; - video/x-flv flv; - video/x-m4v m4v; - video/x-mng mng; - video/x-ms-asf asx asf; - video/x-ms-wmv wmv; - video/x-msvideo avi; - font/ttf ttf; -} diff --git a/vendor/workerman/workerman/src/Protocols/ProtocolInterface.php b/vendor/workerman/workerman/src/Protocols/ProtocolInterface.php deleted file mode 100644 index f60aa95..0000000 --- a/vendor/workerman/workerman/src/Protocols/ProtocolInterface.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols; - -use Workerman\Connection\ConnectionInterface; - -/** - * Protocol interface - */ -interface ProtocolInterface -{ - /** - * Check the integrity of the package. - * Please return the length of package. - * If length is unknown please return 0 that means waiting for more data. - * If the package has something wrong please return -1 the connection will be closed. - * - * @param string $buffer - * @param ConnectionInterface $connection - * @return int - */ - public static function input(string $buffer, ConnectionInterface $connection): int; - - /** - * Decode package and emit onMessage($message) callback, $message is the result that decode returned. - * - * @param string $buffer - * @param ConnectionInterface $connection - * @return mixed - */ - public static function decode(string $buffer, ConnectionInterface $connection): mixed; - - /** - * Encode package before sending to client. - * - * @param mixed $data - * @param ConnectionInterface $connection - * @return string - */ - public static function encode(mixed $data, ConnectionInterface $connection): string; -} diff --git a/vendor/workerman/workerman/src/Protocols/Text.php b/vendor/workerman/workerman/src/Protocols/Text.php deleted file mode 100644 index df32ebe..0000000 --- a/vendor/workerman/workerman/src/Protocols/Text.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols; - -use Workerman\Connection\ConnectionInterface; -use function rtrim; -use function strlen; -use function strpos; - -/** - * Text Protocol. - */ -class Text -{ - /** - * Check the integrity of the package. - * - * @param string $buffer - * @param ConnectionInterface $connection - * @return int - */ - public static function input(string $buffer, ConnectionInterface $connection): int - { - // Judge whether the package length exceeds the limit. - if (isset($connection->maxPackageSize) && strlen($buffer) >= $connection->maxPackageSize) { - $connection->close(); - return 0; - } - // Find the position of "\n". - $pos = strpos($buffer, "\n"); - // No "\n", packet length is unknown, continue to wait for the data so return 0. - if ($pos === false) { - return 0; - } - // Return the current package length. - return $pos + 1; - } - - /** - * Encode. - * - * @param string $buffer - * @return string - */ - public static function encode(string $buffer): string - { - // Add "\n" - return $buffer . "\n"; - } - - /** - * Decode. - * - * @param string $buffer - * @return string - */ - public static function decode(string $buffer): string - { - // Remove "\n" - return rtrim($buffer, "\r\n"); - } -} \ No newline at end of file diff --git a/vendor/workerman/workerman/src/Protocols/Websocket.php b/vendor/workerman/workerman/src/Protocols/Websocket.php deleted file mode 100644 index 89b44d4..0000000 --- a/vendor/workerman/workerman/src/Protocols/Websocket.php +++ /dev/null @@ -1,524 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols; - -use Throwable; -use Workerman\Connection\ConnectionInterface; -use Workerman\Connection\TcpConnection; -use Workerman\Protocols\Http\Request; -use Workerman\Worker; -use function base64_encode; -use function chr; -use function deflate_add; -use function deflate_init; -use function floor; -use function inflate_add; -use function inflate_init; -use function is_scalar; -use function ord; -use function pack; -use function preg_match; -use function sha1; -use function str_repeat; -use function stripos; -use function strlen; -use function strpos; -use function substr; -use function unpack; -use const ZLIB_DEFAULT_STRATEGY; -use const ZLIB_ENCODING_RAW; - -/** - * WebSocket protocol. - */ -class Websocket -{ - /** - * Websocket blob type. - * - * @var string - */ - public const BINARY_TYPE_BLOB = "\x81"; - - /** - * Websocket blob type. - * - * @var string - */ - const BINARY_TYPE_BLOB_DEFLATE = "\xc1"; - - /** - * Websocket arraybuffer type. - * - * @var string - */ - public const BINARY_TYPE_ARRAYBUFFER = "\x82"; - - /** - * Websocket arraybuffer type. - * - * @var string - */ - const BINARY_TYPE_ARRAYBUFFER_DEFLATE = "\xc2"; - - /** - * Check the integrity of the package. - * - * @param string $buffer - * @param TcpConnection $connection - * @return int - */ - public static function input(string $buffer, TcpConnection $connection): int - { - // Receive length. - $recvLen = strlen($buffer); - // We need more data. - if ($recvLen < 6) { - return 0; - } - - // Has not yet completed the handshake. - if (empty($connection->context->websocketHandshake)) { - return static::dealHandshake($buffer, $connection); - } - - // Buffer websocket frame data. - if ($connection->context->websocketCurrentFrameLength) { - // We need more frame data. - if ($connection->context->websocketCurrentFrameLength > $recvLen) { - // Return 0, because it is not clear the full packet length, waiting for the frame of fin=1. - return 0; - } - } else { - $firstByte = ord($buffer[0]); - $secondByte = ord($buffer[1]); - $dataLen = $secondByte & 127; - $isFinFrame = $firstByte >> 7; - $masked = $secondByte >> 7; - - if (!$masked) { - Worker::safeEcho("frame not masked so close the connection\n"); - $connection->close(); - return 0; - } - - $opcode = $firstByte & 0xf; - switch ($opcode) { - case 0x0: - // Blob type. - case 0x1: - // Arraybuffer type. - case 0x2: - // Ping package. - case 0x9: - // Pong package. - case 0xa: - break; - // Close package. - case 0x8: - // Try to emit onWebSocketClose callback. - $closeCb = $connection->onWebSocketClose ?? $connection->worker->onWebSocketClose ?? false; - if ($closeCb) { - try { - $closeCb($connection); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } // Close connection. - else { - $connection->close("\x88\x02\x03\xe8", true); - } - return 0; - // Wrong opcode. - default : - Worker::safeEcho("error opcode $opcode and close websocket connection. Buffer:" . bin2hex($buffer) . "\n"); - $connection->close(); - return 0; - } - - // Calculate packet length. - $headLen = 6; - if ($dataLen === 126) { - $headLen = 8; - if ($headLen > $recvLen) { - return 0; - } - $pack = unpack('nn/ntotal_len', $buffer); - $dataLen = $pack['total_len']; - } else { - if ($dataLen === 127) { - $headLen = 14; - if ($headLen > $recvLen) { - return 0; - } - $arr = unpack('n/N2c', $buffer); - $dataLen = $arr['c1'] * 4294967296 + $arr['c2']; - } - } - $currentFrameLength = $headLen + $dataLen; - - $totalPackageSize = strlen($connection->context->websocketDataBuffer) + $currentFrameLength; - if ($totalPackageSize > $connection->maxPackageSize) { - Worker::safeEcho("error package. package_length=$totalPackageSize\n"); - $connection->close(); - return 0; - } - - if ($isFinFrame) { - if ($opcode === 0x9) { - if ($recvLen >= $currentFrameLength) { - $pingData = static::decode(substr($buffer, 0, $currentFrameLength), $connection); - $connection->consumeRecvBuffer($currentFrameLength); - $tmpConnectionType = $connection->websocketType ?? static::BINARY_TYPE_BLOB; - $connection->websocketType = "\x8a"; - $pingCb = $connection->onWebSocketPing ?? $connection->worker->onWebSocketPing ?? false; - if ($pingCb) { - try { - $pingCb($connection, $pingData); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } else { - $connection->send($pingData); - } - $connection->websocketType = $tmpConnectionType; - if ($recvLen > $currentFrameLength) { - return static::input(substr($buffer, $currentFrameLength), $connection); - } - } - return 0; - } - - if ($opcode === 0xa) { - if ($recvLen >= $currentFrameLength) { - $pongData = static::decode(substr($buffer, 0, $currentFrameLength), $connection); - $connection->consumeRecvBuffer($currentFrameLength); - $tmpConnectionType = $connection->websocketType ?? static::BINARY_TYPE_BLOB; - $connection->websocketType = "\x8a"; - // Try to emit onWebSocketPong callback. - $pongCb = $connection->onWebSocketPong ?? $connection->worker->onWebSocketPong ?? false; - if ($pongCb) { - try { - $pongCb($connection, $pongData); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } - $connection->websocketType = $tmpConnectionType; - if ($recvLen > $currentFrameLength) { - return static::input(substr($buffer, $currentFrameLength), $connection); - } - } - return 0; - } - return $currentFrameLength; - } - - $connection->context->websocketCurrentFrameLength = $currentFrameLength; - } - - // Received just a frame length data. - if ($connection->context->websocketCurrentFrameLength === $recvLen) { - static::decode($buffer, $connection); - $connection->consumeRecvBuffer($connection->context->websocketCurrentFrameLength); - $connection->context->websocketCurrentFrameLength = 0; - return 0; - } - - // The length of the received data is greater than the length of a frame. - if ($connection->context->websocketCurrentFrameLength < $recvLen) { - static::decode(substr($buffer, 0, $connection->context->websocketCurrentFrameLength), $connection); - $connection->consumeRecvBuffer($connection->context->websocketCurrentFrameLength); - $currentFrameLength = $connection->context->websocketCurrentFrameLength; - $connection->context->websocketCurrentFrameLength = 0; - // Continue to read next frame. - return static::input(substr($buffer, $currentFrameLength), $connection); - } - - // The length of the received data is less than the length of a frame. - return 0; - } - - /** - * Websocket encode. - * - * @param mixed $buffer - * @param TcpConnection $connection - * @return string - */ - public static function encode(mixed $buffer, TcpConnection $connection): string - { - if (!is_scalar($buffer)) { - $buffer = json_encode($buffer, JSON_UNESCAPED_UNICODE); - } - - if (empty($connection->websocketType)) { - $connection->websocketType = static::BINARY_TYPE_BLOB; - } - - if (ord($connection->websocketType) & 64) { - $buffer = static::deflate($connection, $buffer); - } - - $firstByte = $connection->websocketType; - $len = strlen($buffer); - - if ($len <= 125) { - $encodeBuffer = $firstByte . chr($len) . $buffer; - } else { - if ($len <= 65535) { - $encodeBuffer = $firstByte . chr(126) . pack("n", $len) . $buffer; - } else { - $encodeBuffer = $firstByte . chr(127) . pack("xxxxN", $len) . $buffer; - } - } - - // Handshake not completed so temporary buffer websocket data waiting for send. - if (empty($connection->context->websocketHandshake)) { - if (empty($connection->context->tmpWebsocketData)) { - $connection->context->tmpWebsocketData = ''; - } - // If buffer has already full then discard the current package. - if (strlen($connection->context->tmpWebsocketData) > $connection->maxSendBufferSize) { - if ($connection->onError) { - try { - ($connection->onError)($connection, ConnectionInterface::SEND_FAIL, 'send buffer full and drop package'); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } - return ''; - } - $connection->context->tmpWebsocketData .= $encodeBuffer; - // Check buffer is full. - if ($connection->onBufferFull && $connection->maxSendBufferSize <= strlen($connection->context->tmpWebsocketData)) { - try { - ($connection->onBufferFull)($connection); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } - // Return empty string. - return ''; - } - - return $encodeBuffer; - } - - /** - * Websocket decode. - * - * @param string $buffer - * @param TcpConnection $connection - * @return string - */ - public static function decode(string $buffer, TcpConnection $connection): string - { - $firstByte = ord($buffer[0]); - $secondByte = ord($buffer[1]); - $len = $secondByte & 127; - $isFinFrame = (bool)($firstByte >> 7); - $rsv1 = 64 === ($firstByte & 64); - - if ($len === 126) { - $masks = substr($buffer, 4, 4); - $data = substr($buffer, 8); - } else { - if ($len === 127) { - $masks = substr($buffer, 10, 4); - $data = substr($buffer, 14); - } else { - $masks = substr($buffer, 2, 4); - $data = substr($buffer, 6); - } - } - $dataLength = strlen($data); - $masks = str_repeat($masks, (int)floor($dataLength / 4)) . substr($masks, 0, $dataLength % 4); - $decoded = $data ^ $masks; - if ($connection->context->websocketCurrentFrameLength) { - $connection->context->websocketDataBuffer .= $decoded; - if ($rsv1) { - return static::inflate($connection, $connection->context->websocketDataBuffer, $isFinFrame); - } - return $connection->context->websocketDataBuffer; - } - if ($connection->context->websocketDataBuffer !== '') { - $decoded = $connection->context->websocketDataBuffer . $decoded; - $connection->context->websocketDataBuffer = ''; - } - if ($rsv1) { - return static::inflate($connection, $decoded, $isFinFrame); - } - return $decoded; - } - - /** - * Inflate. - * - * @param TcpConnection $connection - * @param string $buffer - * @param bool $isFinFrame - * @return false|string - */ - protected static function inflate(TcpConnection $connection, string $buffer, bool $isFinFrame): bool|string - { - if (!isset($connection->context->inflator)) { - $connection->context->inflator = inflate_init( - ZLIB_ENCODING_RAW, - [ - 'level' => -1, - 'memory' => 8, - 'window' => 15, - 'strategy' => ZLIB_DEFAULT_STRATEGY - ] - ); - } - if ($isFinFrame) { - $buffer .= "\x00\x00\xff\xff"; - } - return inflate_add($connection->context->inflator, $buffer); - } - - /** - * Deflate. - * - * @param TcpConnection $connection - * @param string $buffer - * @return false|string - */ - protected static function deflate(TcpConnection $connection, string $buffer): bool|string - { - if (!isset($connection->context->deflator)) { - $connection->context->deflator = deflate_init( - ZLIB_ENCODING_RAW, - [ - 'level' => -1, - 'memory' => 8, - 'window' => 15, - 'strategy' => ZLIB_DEFAULT_STRATEGY - ] - ); - } - return substr(deflate_add($connection->context->deflator, $buffer), 0, -4); - } - - /** - * Websocket handshake. - * - * @param string $buffer - * @param TcpConnection $connection - * @return int - */ - public static function dealHandshake(string $buffer, TcpConnection $connection): int - { - // HTTP protocol. - if (str_starts_with($buffer, 'GET')) { - // Find \r\n\r\n. - $headerEndPos = strpos($buffer, "\r\n\r\n"); - if (!$headerEndPos) { - return 0; - } - $headerLength = $headerEndPos + 4; - - // Get Sec-WebSocket-Key. - if (preg_match("/Sec-WebSocket-Key: *(.*?)\r\n/i", $buffer, $match)) { - $SecWebSocketKey = $match[1]; - } else { - $connection->close( - "HTTP/1.0 400 Bad Request\r\nServer: workerman\r\n\r\n

WebSocket


workerman
", true); - return 0; - } - // Calculation websocket key. - $newKey = base64_encode(sha1($SecWebSocketKey . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true)); - // Handshake response data. - $handshakeMessage = "HTTP/1.1 101 Switching Protocol\r\n" - . "Upgrade: websocket\r\n" - . "Sec-WebSocket-Version: 13\r\n" - . "Connection: Upgrade\r\n" - . "Sec-WebSocket-Accept: " . $newKey . "\r\n"; - - // Websocket data buffer. - $connection->context->websocketDataBuffer = ''; - // Current websocket frame length. - $connection->context->websocketCurrentFrameLength = 0; - // Current websocket frame data. - $connection->context->websocketCurrentFrameBuffer = ''; - // Consume handshake data. - $connection->consumeRecvBuffer($headerLength); - // Request from buffer - $request = new Request($buffer); - - // Try to emit onWebSocketConnect callback. - $onWebsocketConnect = $connection->onWebSocketConnect ?? $connection->worker->onWebSocketConnect ?? false; - if ($onWebsocketConnect) { - try { - $onWebsocketConnect($connection, $request); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } - - // blob or arraybuffer - if (empty($connection->websocketType)) { - $connection->websocketType = static::BINARY_TYPE_BLOB; - } - - $hasServerHeader = false; - - if ($connection->headers) { - foreach ($connection->headers as $header) { - if (stripos($header, 'Server:') === 0) { - $hasServerHeader = true; - } - $handshakeMessage .= "$header\r\n"; - } - } - if (!$hasServerHeader) { - $handshakeMessage .= "Server: workerman\r\n"; - } - $handshakeMessage .= "\r\n"; - // Send handshake response. - $connection->send($handshakeMessage, true); - // Mark handshake complete. - $connection->context->websocketHandshake = true; - - // Try to emit onWebSocketConnected callback. - $onWebsocketConnected = $connection->onWebSocketConnected ?? $connection->worker->onWebSocketConnected ?? false; - if ($onWebsocketConnected) { - try { - $onWebsocketConnected($connection, $request); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } - - // There are data waiting to be sent. - if (!empty($connection->context->tmpWebsocketData)) { - $connection->send($connection->context->tmpWebsocketData, true); - $connection->context->tmpWebsocketData = ''; - } - if (strlen($buffer) > $headerLength) { - return static::input(substr($buffer, $headerLength), $connection); - } - return 0; - } - // Bad websocket handshake request. - $connection->close( - "HTTP/1.0 400 Bad Request\r\nServer: workerman\r\n\r\n

400 Bad Request


workerman
", true); - return 0; - } -} diff --git a/vendor/workerman/workerman/src/Protocols/Ws.php b/vendor/workerman/workerman/src/Protocols/Ws.php deleted file mode 100644 index e958b70..0000000 --- a/vendor/workerman/workerman/src/Protocols/Ws.php +++ /dev/null @@ -1,470 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman\Protocols; - -use Throwable; -use Workerman\Connection\AsyncTcpConnection; -use Workerman\Connection\ConnectionInterface; -use Workerman\Protocols\Http\Response; -use Workerman\Timer; -use Workerman\Worker; -use function base64_encode; -use function bin2hex; -use function explode; -use function floor; -use function ord; -use function pack; -use function preg_match; -use function sha1; -use function str_repeat; -use function strlen; -use function strpos; -use function substr; -use function trim; -use function unpack; - -/** - * Websocket protocol for client. - */ -class Ws -{ - /** - * Websocket blob type. - * - * @var string - */ - public const BINARY_TYPE_BLOB = "\x81"; - - /** - * Websocket arraybuffer type. - * - * @var string - */ - public const BINARY_TYPE_ARRAYBUFFER = "\x82"; - - /** - * Check the integrity of the package. - * - * @param string $buffer - * @param AsyncTcpConnection $connection - * @return int - */ - public static function input(string $buffer, AsyncTcpConnection $connection): int - { - if (empty($connection->context->handshakeStep)) { - Worker::safeEcho("recv data before handshake. Buffer:" . bin2hex($buffer) . "\n"); - return -1; - } - // Recv handshake response - if ($connection->context->handshakeStep === 1) { - return self::dealHandshake($buffer, $connection); - } - $recvLen = strlen($buffer); - if ($recvLen < 2) { - return 0; - } - // Buffer websocket frame data. - if ($connection->context->websocketCurrentFrameLength) { - // We need more frame data. - if ($connection->context->websocketCurrentFrameLength > $recvLen) { - // Return 0, because it is not clear the full packet length, waiting for the frame of fin=1. - return 0; - } - } else { - - $firstByte = ord($buffer[0]); - $secondByte = ord($buffer[1]); - $dataLen = $secondByte & 127; - $isFinFrame = $firstByte >> 7; - $masked = $secondByte >> 7; - - if ($masked) { - Worker::safeEcho("frame masked so close the connection\n"); - $connection->close(); - return 0; - } - - $opcode = $firstByte & 0xf; - - switch ($opcode) { - case 0x0: - // Blob type. - case 0x1: - // Arraybuffer type. - case 0x2: - // Ping package. - case 0x9: - // Pong package. - case 0xa: - break; - // Close package. - case 0x8: - // Try to emit onWebSocketClose callback. - if (isset($connection->onWebSocketClose)) { - try { - ($connection->onWebSocketClose)($connection); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } // Close connection. - else { - $connection->close(); - } - return 0; - // Wrong opcode. - default : - Worker::safeEcho("error opcode $opcode and close websocket connection. Buffer:" . $buffer . "\n"); - $connection->close(); - return 0; - } - // Calculate packet length. - if ($dataLen === 126) { - if (strlen($buffer) < 4) { - return 0; - } - $pack = unpack('nn/ntotal_len', $buffer); - $currentFrameLength = $pack['total_len'] + 4; - } else if ($dataLen === 127) { - if (strlen($buffer) < 10) { - return 0; - } - $arr = unpack('n/N2c', $buffer); - $currentFrameLength = $arr['c1'] * 4294967296 + $arr['c2'] + 10; - } else { - $currentFrameLength = $dataLen + 2; - } - - $totalPackageSize = strlen($connection->context->websocketDataBuffer) + $currentFrameLength; - if ($totalPackageSize > $connection->maxPackageSize) { - Worker::safeEcho("error package. package_length=$totalPackageSize\n"); - $connection->close(); - return 0; - } - - if ($isFinFrame) { - if ($opcode === 0x9) { - if ($recvLen >= $currentFrameLength) { - $pingData = static::decode(substr($buffer, 0, $currentFrameLength), $connection); - $connection->consumeRecvBuffer($currentFrameLength); - $tmpConnectionType = $connection->websocketType ?? static::BINARY_TYPE_BLOB; - $connection->websocketType = "\x8a"; - if (isset($connection->onWebSocketPing)) { - try { - ($connection->onWebSocketPing)($connection, $pingData); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } else { - $connection->send($pingData); - } - $connection->websocketType = $tmpConnectionType; - if ($recvLen > $currentFrameLength) { - return static::input(substr($buffer, $currentFrameLength), $connection); - } - } - return 0; - - } - - if ($opcode === 0xa) { - if ($recvLen >= $currentFrameLength) { - $pongData = static::decode(substr($buffer, 0, $currentFrameLength), $connection); - $connection->consumeRecvBuffer($currentFrameLength); - $tmpConnectionType = $connection->websocketType ?? static::BINARY_TYPE_BLOB; - $connection->websocketType = "\x8a"; - // Try to emit onWebSocketPong callback. - if (isset($connection->onWebSocketPong)) { - try { - ($connection->onWebSocketPong)($connection, $pongData); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } - $connection->websocketType = $tmpConnectionType; - if ($recvLen > $currentFrameLength) { - return static::input(substr($buffer, $currentFrameLength), $connection); - } - } - return 0; - } - return $currentFrameLength; - } - - $connection->context->websocketCurrentFrameLength = $currentFrameLength; - } - // Received just a frame length data. - if ($connection->context->websocketCurrentFrameLength === $recvLen) { - self::decode($buffer, $connection); - $connection->consumeRecvBuffer($connection->context->websocketCurrentFrameLength); - $connection->context->websocketCurrentFrameLength = 0; - return 0; - } // The length of the received data is greater than the length of a frame. - elseif ($connection->context->websocketCurrentFrameLength < $recvLen) { - self::decode(substr($buffer, 0, $connection->context->websocketCurrentFrameLength), $connection); - $connection->consumeRecvBuffer($connection->context->websocketCurrentFrameLength); - $currentFrameLength = $connection->context->websocketCurrentFrameLength; - $connection->context->websocketCurrentFrameLength = 0; - // Continue to read next frame. - return self::input(substr($buffer, $currentFrameLength), $connection); - } // The length of the received data is less than the length of a frame. - else { - return 0; - } - } - - /** - * Websocket encode. - * - * @param string $payload - * @param AsyncTcpConnection $connection - * @return string - * @throws Throwable - */ - public static function encode(string $payload, AsyncTcpConnection $connection): string - { - if (empty($connection->websocketType)) { - $connection->websocketType = self::BINARY_TYPE_BLOB; - } - if (empty($connection->context->handshakeStep)) { - static::sendHandshake($connection); - } - - $maskKey = "\x00\x00\x00\x00"; - $length = strlen($payload); - - if (strlen($payload) < 126) { - $head = chr(0x80 | $length); - } elseif ($length < 0xFFFF) { - $head = chr(0x80 | 126) . pack("n", $length); - } else { - $head = chr(0x80 | 127) . pack("N", 0) . pack("N", $length); - } - - $frame = $connection->websocketType . $head . $maskKey; - // append payload to frame: - $maskKey = str_repeat($maskKey, (int)floor($length / 4)) . substr($maskKey, 0, $length % 4); - $frame .= $payload ^ $maskKey; - if ($connection->context->handshakeStep === 1) { - // If buffer has already full then discard the current package. - if (strlen($connection->context->tmpWebsocketData) > $connection->maxSendBufferSize) { - if ($connection->onError) { - try { - ($connection->onError)($connection, ConnectionInterface::SEND_FAIL, 'send buffer full and drop package'); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } - return ''; - } - $connection->context->tmpWebsocketData .= $frame; - // Check buffer is full. - if ($connection->onBufferFull && $connection->maxSendBufferSize <= strlen($connection->context->tmpWebsocketData)) { - try { - ($connection->onBufferFull)($connection); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } - return ''; - } - return $frame; - } - - /** - * Websocket decode. - * - * @param string $bytes - * @param AsyncTcpConnection $connection - * @return string - */ - public static function decode(string $bytes, AsyncTcpConnection $connection): string - { - $dataLength = ord($bytes[1]); - - if ($dataLength === 126) { - $decodedData = substr($bytes, 4); - } else if ($dataLength === 127) { - $decodedData = substr($bytes, 10); - } else { - $decodedData = substr($bytes, 2); - } - if ($connection->context->websocketCurrentFrameLength) { - $connection->context->websocketDataBuffer .= $decodedData; - return $connection->context->websocketDataBuffer; - } - - if ($connection->context->websocketDataBuffer !== '') { - $decodedData = $connection->context->websocketDataBuffer . $decodedData; - $connection->context->websocketDataBuffer = ''; - } - return $decodedData; - } - - /** - * Send websocket handshake data. - * - * @param AsyncTcpConnection $connection - * @return void - * @throws Throwable - */ - public static function onConnect(AsyncTcpConnection $connection): void - { - static::sendHandshake($connection); - } - - /** - * Clean - * - * @param AsyncTcpConnection $connection - */ - public static function onClose(AsyncTcpConnection $connection): void - { - $connection->context->handshakeStep = null; - $connection->context->websocketCurrentFrameLength = 0; - $connection->context->tmpWebsocketData = ''; - $connection->context->websocketDataBuffer = ''; - if (!empty($connection->context->websocketPingTimer)) { - Timer::del($connection->context->websocketPingTimer); - $connection->context->websocketPingTimer = null; - } - } - - /** - * Send websocket handshake. - * - * @param AsyncTcpConnection $connection - * @return void - * @throws Throwable - */ - public static function sendHandshake(AsyncTcpConnection $connection): void - { - if (!empty($connection->context->handshakeStep)) { - return; - } - // Get Host. - $port = $connection->getRemotePort(); - $host = $port === 80 || $port === 443 ? $connection->getRemoteHost() : $connection->getRemoteHost() . ':' . $port; - // Handshake header. - $connection->context->websocketSecKey = base64_encode(random_bytes(16)); - $userHeader = $connection->headers ?? null; - $userHeaderStr = ''; - if (!empty($userHeader)) { - foreach ($userHeader as $k => $v) { - $userHeaderStr .= "$k: $v\r\n"; - } - $userHeaderStr = "\r\n" . trim($userHeaderStr); - } - $header = 'GET ' . $connection->getRemoteURI() . " HTTP/1.1\r\n" . - (!preg_match("/\nHost:/i", $userHeaderStr) ? "Host: $host\r\n" : '') . - "Connection: Upgrade\r\n" . - "Upgrade: websocket\r\n" . - (isset($connection->websocketOrigin) ? "Origin: " . $connection->websocketOrigin . "\r\n" : '') . - (isset($connection->websocketClientProtocol) ? "Sec-WebSocket-Protocol: " . $connection->websocketClientProtocol . "\r\n" : '') . - "Sec-WebSocket-Version: 13\r\n" . - "Sec-WebSocket-Key: " . $connection->context->websocketSecKey . $userHeaderStr . "\r\n\r\n"; - $connection->send($header, true); - $connection->context->handshakeStep = 1; - $connection->context->websocketCurrentFrameLength = 0; - $connection->context->websocketDataBuffer = ''; - $connection->context->tmpWebsocketData = ''; - } - - /** - * Websocket handshake. - * - * @param string $buffer - * @param AsyncTcpConnection $connection - * @return bool|int - */ - public static function dealHandshake(string $buffer, AsyncTcpConnection $connection): bool|int - { - $pos = strpos($buffer, "\r\n\r\n"); - if ($pos) { - //checking Sec-WebSocket-Accept - if (preg_match("/Sec-WebSocket-Accept: *(.*?)\r\n/i", $buffer, $match)) { - if ($match[1] !== base64_encode(sha1($connection->context->websocketSecKey . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true))) { - Worker::safeEcho("Sec-WebSocket-Accept not match. Header:\n" . substr($buffer, 0, $pos) . "\n"); - $connection->close(); - return 0; - } - } else { - Worker::safeEcho("Sec-WebSocket-Accept not found. Header:\n" . substr($buffer, 0, $pos) . "\n"); - $connection->close(); - return 0; - } - - // handshake complete - $connection->context->handshakeStep = 2; - $handshakeResponseLength = $pos + 4; - $buffer = substr($buffer, 0, $handshakeResponseLength); - $response = static::parseResponse($buffer); - // Try to emit onWebSocketConnect callback. - if (isset($connection->onWebSocketConnect)) { - try { - ($connection->onWebSocketConnect)($connection, $response); - } catch (Throwable $e) { - Worker::stopAll(250, $e); - } - } - // Headbeat. - if (!empty($connection->websocketPingInterval)) { - $connection->context->websocketPingTimer = Timer::add($connection->websocketPingInterval, function () use ($connection) { - if (false === $connection->send(pack('H*', '898000000000'), true)) { - Timer::del($connection->context->websocketPingTimer); - $connection->context->websocketPingTimer = null; - } - }); - } - - $connection->consumeRecvBuffer($handshakeResponseLength); - if (!empty($connection->context->tmpWebsocketData)) { - $connection->send($connection->context->tmpWebsocketData, true); - $connection->context->tmpWebsocketData = ''; - } - if (strlen($buffer) > $handshakeResponseLength) { - return self::input(substr($buffer, $handshakeResponseLength), $connection); - } - } - return 0; - } - - /** - * Parse response. - * - * @param string $buffer - * @return Response - */ - protected static function parseResponse(string $buffer): Response - { - [$http_header, ] = explode("\r\n\r\n", $buffer, 2); - $header_data = explode("\r\n", $http_header); - [$protocol, $status, $phrase] = explode(' ', $header_data[0], 3); - $protocolVersion = substr($protocol, 5); - unset($header_data[0]); - $headers = []; - foreach ($header_data as $content) { - // \r\n\r\n - if (empty($content)) { - continue; - } - list($key, $value) = explode(':', $content, 2); - $value = trim($value); - $headers[$key] = $value; - } - return (new Response())->withStatus((int)$status, $phrase)->withHeaders($headers)->withProtocolVersion($protocolVersion); - } -} diff --git a/vendor/workerman/workerman/src/Timer.php b/vendor/workerman/workerman/src/Timer.php deleted file mode 100644 index 3a29fee..0000000 --- a/vendor/workerman/workerman/src/Timer.php +++ /dev/null @@ -1,273 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman; - -use RuntimeException; -use Throwable; -use Workerman\Events\EventInterface; -use Workerman\Events\Fiber; -use Workerman\Events\Swoole; -use Revolt\EventLoop; -use Swoole\Coroutine\System; -use function function_exists; -use function pcntl_alarm; -use function pcntl_signal; -use function time; -use const PHP_INT_MAX; -use const SIGALRM; - -/** - * Timer. - */ -class Timer -{ - /** - * Tasks that based on ALARM signal. - * [ - * run_time => [[$func, $args, $persistent, time_interval],[$func, $args, $persistent, time_interval],..]], - * run_time => [[$func, $args, $persistent, time_interval],[$func, $args, $persistent, time_interval],..]], - * .. - * ] - * - * @var array - */ - protected static array $tasks = []; - - /** - * Event - * - * @var ?EventInterface - */ - protected static ?EventInterface $event = null; - - /** - * Timer id - * - * @var int - */ - protected static int $timerId = 0; - - /** - * Timer status - * [ - * timer_id1 => bool, - * timer_id2 => bool, - * ...................., - * ] - * - * @var array - */ - protected static array $status = []; - - /** - * Init. - * - * @param EventInterface|null $event - * @return void - */ - public static function init(?EventInterface $event = null): void - { - if ($event) { - self::$event = $event; - return; - } - if (function_exists('pcntl_signal')) { - pcntl_signal(SIGALRM, self::signalHandle(...), false); - } - } - - /** - * Repeat. - * - * @param float $timeInterval - * @param callable $func - * @param array $args - * @return int - */ - public static function repeat(float $timeInterval, callable $func, array $args = []): int - { - return self::$event->repeat($timeInterval, $func, $args); - } - - /** - * Delay. - * - * @param float $timeInterval - * @param callable $func - * @param array $args - * @return int - */ - public static function delay(float $timeInterval, callable $func, array $args = []): int - { - return self::$event->delay($timeInterval, $func, $args); - } - - /** - * ALARM signal handler. - * - * @return void - */ - public static function signalHandle(): void - { - if (!self::$event) { - pcntl_alarm(1); - self::tick(); - } - } - - /** - * Add a timer. - * - * @param float $timeInterval - * @param callable $func - * @param null|array $args - * @param bool $persistent - * @return int - */ - public static function add(float $timeInterval, callable $func, ?array $args = [], bool $persistent = true): int - { - if ($timeInterval < 0) { - throw new RuntimeException('$timeInterval can not less than 0'); - } - - if ($args === null) { - $args = []; - } - - if (self::$event) { - return $persistent ? self::$event->repeat($timeInterval, $func, $args) : self::$event->delay($timeInterval, $func, $args); - } - - // If not workerman runtime just return. - if (!Worker::getAllWorkers()) { - throw new RuntimeException('Timer can only be used in workerman running environment'); - } - - if (empty(self::$tasks)) { - pcntl_alarm(1); - } - - $runTime = time() + $timeInterval; - if (!isset(self::$tasks[$runTime])) { - self::$tasks[$runTime] = []; - } - - self::$timerId = self::$timerId == PHP_INT_MAX ? 1 : ++self::$timerId; - self::$status[self::$timerId] = true; - self::$tasks[$runTime][self::$timerId] = [$func, (array)$args, $persistent, $timeInterval]; - - return self::$timerId; - } - - /** - * Coroutine sleep. - * - * @param float $delay - * @return void - */ - public static function sleep(float $delay): void - { - switch (Worker::$eventLoopClass) { - // Fiber - case Fiber::class: - $suspension = EventLoop::getSuspension(); - static::add($delay, function () use ($suspension) { - $suspension->resume(); - }, null, false); - $suspension->suspend(); - return; - // Swoole - case Swoole::class: - System::sleep($delay); - return; - } - usleep((int)($delay * 1000 * 1000)); - } - - /** - * Tick. - * - * @return void - */ - protected static function tick(): void - { - if (empty(self::$tasks)) { - pcntl_alarm(0); - return; - } - $timeNow = time(); - foreach (self::$tasks as $runTime => $taskData) { - if ($timeNow >= $runTime) { - foreach ($taskData as $index => $oneTask) { - $taskFunc = $oneTask[0]; - $taskArgs = $oneTask[1]; - $persistent = $oneTask[2]; - $timeInterval = $oneTask[3]; - try { - $taskFunc(...$taskArgs); - } catch (Throwable $e) { - Worker::safeEcho((string)$e); - } - if ($persistent && !empty(self::$status[$index])) { - $newRunTime = time() + $timeInterval; - if (!isset(self::$tasks[$newRunTime])) { - self::$tasks[$newRunTime] = []; - } - self::$tasks[$newRunTime][$index] = [$taskFunc, (array)$taskArgs, $persistent, $timeInterval]; - } - } - unset(self::$tasks[$runTime]); - } - } - } - - /** - * Remove a timer. - * - * @param int $timerId - * @return bool - */ - public static function del(int $timerId): bool - { - if (self::$event) { - return self::$event->offDelay($timerId); - } - foreach (self::$tasks as $runTime => $taskData) { - if (array_key_exists($timerId, $taskData)) { - unset(self::$tasks[$runTime][$timerId]); - } - } - if (array_key_exists($timerId, self::$status)) { - unset(self::$status[$timerId]); - } - return true; - } - - /** - * Remove all timers. - * - * @return void - */ - public static function delAll(): void - { - self::$tasks = self::$status = []; - if (function_exists('pcntl_alarm')) { - pcntl_alarm(0); - } - self::$event?->deleteAllTimer(); - } -} diff --git a/vendor/workerman/workerman/src/Worker.php b/vendor/workerman/workerman/src/Worker.php deleted file mode 100644 index c3e4957..0000000 --- a/vendor/workerman/workerman/src/Worker.php +++ /dev/null @@ -1,2758 +0,0 @@ - - * @copyright walkor - * @link http://www.workerman.net/ - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ - -declare(strict_types=1); - -namespace Workerman; - -use AllowDynamicProperties; -use Exception; -use RuntimeException; -use stdClass; -use Stringable; -use Throwable; -use Workerman\Connection\ConnectionInterface; -use Workerman\Connection\TcpConnection; -use Workerman\Connection\UdpConnection; -use Workerman\Coroutine; -use Workerman\Events\Event; -use Workerman\Events\EventInterface; -use Workerman\Events\Fiber; -use Workerman\Events\Select; -use Workerman\Events\Swoole; -use Workerman\Events\Swow; -use function defined; -use function function_exists; -use function is_resource; -use function method_exists; -use function restore_error_handler; -use function set_error_handler; -use function stream_socket_accept; -use function stream_socket_recvfrom; -use function substr; -use function array_walk; -use function get_class; -use const DIRECTORY_SEPARATOR; -use const PHP_SAPI; -use const PHP_VERSION; -use const STDOUT; - -/** - * Worker class - * A container for listening ports - */ -#[AllowDynamicProperties] -class Worker -{ - /** - * Version. - * - * @var string - */ - final public const VERSION = '5.1.0'; - - /** - * Status initial. - * - * @var int - */ - public const STATUS_INITIAL = 0; - - /** - * Status starting. - * - * @var int - */ - public const STATUS_STARTING = 1; - - /** - * Status running. - * - * @var int - */ - public const STATUS_RUNNING = 2; - - /** - * Status shutdown. - * - * @var int - */ - public const STATUS_SHUTDOWN = 4; - - /** - * Status reloading. - * - * @var int - */ - public const STATUS_RELOADING = 8; - - /** - * Default backlog. Backlog is the maximum length of the queue of pending connections. - * - * @var int - */ - public const DEFAULT_BACKLOG = 102400; - - /** - * The safe distance for columns adjacent - * - * @var int - */ - public const UI_SAFE_LENGTH = 4; - - /** - * Worker id. - * - * @var int - */ - public int $id = 0; - - /** - * Name of the worker processes. - * - * @var string - */ - public string $name = 'none'; - - /** - * Number of worker processes. - * - * @var int - */ - public int $count = 1; - - /** - * Unix user of processes, needs appropriate privileges (usually root). - * - * @var string - */ - public string $user = ''; - - /** - * Unix group of processes, needs appropriate privileges (usually root). - * - * @var string - */ - public string $group = ''; - - /** - * reloadable. - * - * @var bool - */ - public bool $reloadable = true; - - /** - * reuse port. - * - * @var bool - */ - public bool $reusePort = false; - - /** - * Emitted when worker processes is starting. - * - * @var ?callable - */ - public $onWorkerStart = null; - - /** - * Emitted when a socket connection is successfully established. - * - * @var ?callable - */ - public $onConnect = null; - - /** - * Emitted before websocket handshake (Only works when protocol is ws). - * - * @var ?callable - */ - public $onWebSocketConnect = null; - - /** - * Emitted after websocket handshake (Only works when protocol is ws). - * - * @var ?callable - */ - public $onWebSocketConnected = null; - - /** - * Emitted when data is received. - * - * @var ?callable - */ - public $onMessage = null; - - /** - * Emitted when the other end of the socket sends a FIN packet. - * - * @var ?callable - */ - public $onClose = null; - - /** - * Emitted when an error occurs with connection. - * - * @var ?callable - */ - public $onError = null; - - /** - * Emitted when the send buffer becomes full. - * - * @var ?callable - */ - public $onBufferFull = null; - - /** - * Emitted when the send buffer becomes empty. - * - * @var ?callable - */ - public $onBufferDrain = null; - - /** - * Emitted when worker processes has stopped. - * - * @var ?callable - */ - public $onWorkerStop = null; - - /** - * Emitted when worker processes receives reload signal. - * - * @var ?callable - */ - public $onWorkerReload = null; - - /** - * Transport layer protocol. - * - * @var string - */ - public string $transport = 'tcp'; - - /** - * Store all connections of clients. - * - * @var TcpConnection[] - */ - public array $connections = []; - - /** - * Application layer protocol. - * - * @var ?string - */ - public ?string $protocol = null; - - /** - * Pause accept new connections or not. - * - * @var bool - */ - protected bool $pauseAccept = true; - - /** - * Is worker stopping ? - * - * @var bool - */ - public bool $stopping = false; - - /** - * EventLoop class. - * - * @var ?string - */ - public ?string $eventLoop = null; - - /** - * Daemonize. - * - * @var bool - */ - public static bool $daemonize = false; - - /** - * Standard output stream - * - * @var resource - */ - public static $outputStream; - - /** - * Stdout file. - * - * @var string - */ - public static string $stdoutFile = '/dev/null'; - - /** - * The file to store master process PID. - * - * @var string - */ - public static string $pidFile = ''; - - /** - * The file used to store the master process status. - * - * @var string - */ - public static string $statusFile = ''; - - /** - * Log file. - * - * @var string - */ - public static string $logFile = ''; - - /** - * Global event loop. - * - * @var ?EventInterface - */ - public static ?EventInterface $globalEvent = null; - - /** - * Emitted when the master process get reload signal. - * - * @var ?callable - */ - public static $onMasterReload = null; - - /** - * Emitted when the master process terminated. - * - * @var ?callable - */ - public static $onMasterStop = null; - - /** - * Emitted when worker processes exited. - * - * @var ?callable - */ - public static $onWorkerExit = null; - - /** - * EventLoopClass - * - * @var ?class-string - */ - public static ?string $eventLoopClass = null; - - /** - * After sending the stop command to the child process stopTimeout seconds, - * if the process is still living then forced to kill. - * - * @var int - */ - public static int $stopTimeout = 2; - - /** - * Command - * - * @var string - */ - public static string $command = ''; - - /** - * The PID of master process. - * - * @var int - */ - protected static int $masterPid = 0; - - /** - * Listening socket. - * - * @var ?resource - */ - protected $mainSocket = null; - - /** - * Socket name. The format is like this http://0.0.0.0:80 . - * - * @var string - */ - protected string $socketName = ''; - - /** - * Context of socket. - * - * @var resource - */ - protected $socketContext = null; - - /** - * @var stdClass - */ - protected stdClass $context; - - /** - * All worker instances. - * - * @var Worker[] - */ - protected static array $workers = []; - - /** - * All worker processes pid. - * The format is like this [worker_id=>[pid=>pid, pid=>pid, ..], ..] - * - * @var array - */ - protected static array $pidMap = []; - - /** - * All worker processes waiting for restart. - * The format is like this [pid=>pid, pid=>pid]. - * - * @var array - */ - protected static array $pidsToRestart = []; - - /** - * Mapping from PID to worker process ID. - * The format is like this [worker_id=>[0=>$pid, 1=>$pid, ..], ..]. - * - * @var array - */ - protected static array $idMap = []; - - /** - * Current status. - * - * @var int - */ - protected static int $status = self::STATUS_INITIAL; - - /** - * UI data. - * - * @var array|int[] - */ - protected static array $uiLengthData = []; - - /** - * The file to store status info of current worker process. - * - * @var string - */ - protected static string $statisticsFile = ''; - - /** - * The file to store status info of connections. - * - * @var string - */ - protected static string $connectionsFile = ''; - - /** - * Start file. - * - * @var string - */ - protected static string $startFile = ''; - - /** - * Processes for windows. - * - * @var array - */ - protected static array $processForWindows = []; - - /** - * Status info of current worker process. - * - * @var array - */ - protected static array $globalStatistics = [ - 'start_timestamp' => 0, - 'worker_exit_info' => [] - ]; - - /** - * PHP built-in protocols. - * - * @var array - */ - public const BUILD_IN_TRANSPORTS = [ - 'tcp' => 'tcp', - 'udp' => 'udp', - 'unix' => 'unix', - 'ssl' => 'tcp' - ]; - - /** - * PHP built-in error types. - * - * @var array - */ - public const ERROR_TYPE = [ - E_ERROR => 'E_ERROR', - E_WARNING => 'E_WARNING', - E_PARSE => 'E_PARSE', - E_NOTICE => 'E_NOTICE', - E_CORE_ERROR => 'E_CORE_ERROR', - E_CORE_WARNING => 'E_CORE_WARNING', - E_COMPILE_ERROR => 'E_COMPILE_ERROR', - E_COMPILE_WARNING => 'E_COMPILE_WARNING', - E_USER_ERROR => 'E_USER_ERROR', - E_USER_WARNING => 'E_USER_WARNING', - E_USER_NOTICE => 'E_USER_NOTICE', - E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR', - E_DEPRECATED => 'E_DEPRECATED', - E_USER_DEPRECATED => 'E_USER_DEPRECATED' - ]; - - /** - * Graceful stop or not. - * - * @var bool - */ - protected static bool $gracefulStop = false; - - /** - * If $outputStream support decorated - * - * @var bool - */ - protected static bool $outputDecorated; - - /** - * Worker object's hash id(unique identifier). - * - * @var ?string - */ - protected ?string $workerId = null; - - /** - * Constructor. - * - * @param string|null $socketName - * @param array $socketContext - */ - public function __construct(?string $socketName = null, array $socketContext = []) - { - // Save all worker instances. - $this->workerId = spl_object_hash($this); - $this->context = new stdClass(); - static::$workers[$this->workerId] = $this; - static::$pidMap[$this->workerId] = []; - - // Context for socket. - if ($socketName) { - $this->socketName = $socketName; - $socketContext['socket']['backlog'] ??= static::DEFAULT_BACKLOG; - $this->socketContext = stream_context_create($socketContext); - } - - // Set an empty onMessage callback. - $this->onMessage = function () { - // Empty. - }; - - } - - /** - * Run all worker instances. - * - * @return void - */ - public static function runAll(): void - { - try { - static::checkSapiEnv(); - static::initStdOut(); - static::init(); - static::parseCommand(); - static::checkPortAvailable(); - static::lock(); - static::daemonize(); - static::initWorkers(); - static::installSignal(); - static::saveMasterPid(); - static::lock(LOCK_UN); - static::displayUI(); - static::forkWorkers(); - static::resetStd(); - static::monitorWorkers(); - } catch (Throwable $e) { - static::log($e); - } - } - - /** - * Check sapi. - * - * @return void - */ - protected static function checkSapiEnv(): void - { - // Only for cli and micro. - if (!in_array(PHP_SAPI, ['cli', 'micro'])) { - exit("Only run in command line mode" . PHP_EOL); - } - // Check pcntl and posix extension for unix. - if (DIRECTORY_SEPARATOR === '/') { - foreach (['pcntl', 'posix'] as $name) { - if (!extension_loaded($name)) { - exit("Please install $name extension" . PHP_EOL); - } - } - } - // Check disable functions. - $disabledFunctions = explode(',', ini_get('disable_functions')); - $disabledFunctions = array_map('trim', $disabledFunctions); - $functionsToCheck = [ - 'stream_socket_server', - 'stream_socket_accept', - 'stream_socket_client', - 'pcntl_signal_dispatch', - 'pcntl_signal', - 'pcntl_alarm', - 'pcntl_fork', - 'pcntl_wait', - 'posix_getuid', - 'posix_getpwuid', - 'posix_kill', - 'posix_setsid', - 'posix_getpid', - 'posix_getpwnam', - 'posix_getgrnam', - 'posix_getgid', - 'posix_setgid', - 'posix_initgroups', - 'posix_setuid', - 'posix_isatty', - 'proc_open', - 'proc_get_status', - 'proc_close', - 'shell_exec', - 'exec', - 'putenv', - 'getenv', - ]; - $disabled = array_intersect($functionsToCheck, $disabledFunctions); - if (!empty($disabled)) { - $iniFilePath = (string)php_ini_loaded_file(); - exit('Notice: '. implode(',', $disabled) . " are disabled by disable_functions. " . PHP_EOL - . "Please remove them from disable_functions in $iniFilePath" . PHP_EOL); - } - } - - /** - * Init stdout. - * - * @return void - */ - protected static function initStdOut(): void - { - $defaultStream = fn () => defined('STDOUT') ? STDOUT : (@fopen('php://stdout', 'w') ?: fopen('php://output', 'w')); - static::$outputStream ??= $defaultStream(); //@phpstan-ignore-line - if (!is_resource(self::$outputStream) || get_resource_type(self::$outputStream) !== 'stream') { - $type = get_debug_type(self::$outputStream); - static::$outputStream = $defaultStream(); - throw new RuntimeException(sprintf('The $outputStream must to be a stream, %s given', $type)); - } - - static::$outputDecorated ??= self::hasColorSupport(); - } - - /** - * Borrowed from the symfony console - * @link https://github.com/symfony/console/blob/0d14a9f6d04d4ac38a8cea1171f4554e325dae92/Output/StreamOutput.php#L92 - */ - private static function hasColorSupport(): bool - { - // Follow https://no-color.org/ - if (getenv('NO_COLOR') !== false) { - return false; - } - - if (getenv('TERM_PROGRAM') === 'Hyper') { - return true; - } - - if (DIRECTORY_SEPARATOR === '\\') { - return (function_exists('sapi_windows_vt100_support') && @sapi_windows_vt100_support(self::$outputStream)) - || getenv('ANSICON') !== false - || getenv('ConEmuANSI') === 'ON' - || getenv('TERM') === 'xterm'; - } - - return stream_isatty(self::$outputStream); - } - - /** - * Init. - * - * @return void - */ - protected static function init(): void - { - set_error_handler(static function (int $code, string $msg, string $file, int $line): bool { - static::safeEcho(sprintf("%s \"%s\" in file %s on line %d\n", static::getErrorType($code), $msg, $file, $line)); - return true; - }); - - // $_SERVER. - $_SERVER['SERVER_SOFTWARE'] = 'Workerman/' . static::VERSION; - $_SERVER['SERVER_START_TIME'] = time(); - - // Start file. - $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - static::$startFile = static::$startFile ?: end($backtrace)['file']; - $startFilePrefix = basename(static::$startFile); - $startFileDir = dirname(static::$startFile); - - // Compatible with older workerman versions for pid file. - if (empty(static::$pidFile)) { - $unique_prefix = \str_replace('/', '_', static::$startFile); - $file = __DIR__ . "/../../$unique_prefix.pid"; - if (is_file($file)) { - static::$pidFile = $file; - } - } - - // Pid file. - static::$pidFile = static::$pidFile ?: sprintf('%s/workerman.%s.pid', $startFileDir, $startFilePrefix); - - // Status file. - static::$statusFile = static::$statusFile ?: sprintf('%s/workerman.%s.status', $startFileDir, $startFilePrefix); - static::$statisticsFile = static::$statisticsFile ?: static::$statusFile; - static::$connectionsFile = static::$connectionsFile ?: static::$statusFile . '.connection'; - - // Log file. - static::$logFile = static::$logFile ?: sprintf('%s/workerman.log', $startFileDir); - - if (static::$logFile !== '/dev/null' && !is_file(static::$logFile)) { - // if /runtime/logs default folder not exists - if (!is_dir(dirname(static::$logFile))) { - mkdir(dirname(static::$logFile), 0777, true); - } - touch(static::$logFile); - chmod(static::$logFile, 0644); - } - - // State. - static::$status = static::STATUS_STARTING; - - // Init global event. - static::initGlobalEvent(); - - // For statistics. - static::$globalStatistics['start_timestamp'] = time(); - - // Process title. - static::setProcessTitle('WorkerMan: master process start_file=' . static::$startFile); - - // Init data for worker id. - static::initId(); - - // Timer init. - Timer::init(); - - restore_error_handler(); - } - - /** - * Init global event. - * - * @return void - */ - protected static function initGlobalEvent(): void - { - if (static::$globalEvent !== null) { - static::$eventLoopClass = get_class(static::$globalEvent); - static::$globalEvent = null; - return; - } - - if (!empty(static::$eventLoopClass)) { - if (!is_subclass_of(static::$eventLoopClass, EventInterface::class)) { - throw new RuntimeException(sprintf('%s::$eventLoopClass must implement %s', static::class, EventInterface::class)); - } - return; - } - - static::$eventLoopClass = match (true) { - extension_loaded('event') => Event::class, - default => Select::class, - }; - } - - /** - * Lock. - * - * @param int $flag - * @return void - */ - protected static function lock(int $flag = LOCK_EX): void - { - static $fd; - if (DIRECTORY_SEPARATOR !== '/') { - return; - } - $lockFile = static::$pidFile . '.lock'; - $fd = $fd ?: fopen($lockFile, 'a+'); - if ($fd) { - flock($fd, $flag); - if ($flag === LOCK_UN) { - fclose($fd); - $fd = null; - clearstatcache(); - if (is_file($lockFile)) { - unlink($lockFile); - } - } - } - } - - /** - * Init All worker instances. - * - * @return void - */ - protected static function initWorkers(): void - { - if (DIRECTORY_SEPARATOR !== '/') { - return; - } - - foreach (static::$workers as $worker) { - // Worker name. - if (empty($worker->name)) { - $worker->name = 'none'; - } - - // Get unix user of the worker process. - if (empty($worker->user)) { - $worker->user = static::getCurrentUser(); - } else { - if (posix_getuid() !== 0 && $worker->user !== static::getCurrentUser()) { - static::log('Warning: You must have the root privileges to change uid and gid.'); - } - } - - // Socket name. - $worker->context->statusSocket = $worker->getSocketName(); - - // Event-loop name. - $eventLoopName = $worker->eventLoop ?: static::$eventLoopClass; - $worker->context->eventLoopName = strtolower(substr($eventLoopName, strrpos($eventLoopName, '\\') + 1)); - - // Status name. - $worker->context->statusState = ' [OK] '; - - // Get column mapping for UI - foreach (static::getUiColumns() as $columnName => $prop) { - !isset($worker->$prop) && !isset($worker->context->$prop) && $worker->context->$prop = 'NNNN'; - $propLength = strlen((string)($worker->$prop ?? $worker->context->$prop)); - $key = 'max' . ucfirst(strtolower($columnName)) . 'NameLength'; - static::$uiLengthData[$key] = max(static::$uiLengthData[$key] ?? 2 * static::UI_SAFE_LENGTH, $propLength); - } - - // Listen. - if (!$worker->reusePort) { - $worker->listen(); - } - } - } - - /** - * Get all worker instances. - * - * @return Worker[] - */ - public static function getAllWorkers(): array - { - return static::$workers; - } - - /** - * Get global event-loop instance. - * - * @return EventInterface - */ - public static function getEventLoop(): EventInterface - { - return static::$globalEvent; - } - - /** - * Get main socket resource - * - * @return resource - */ - public function getMainSocket(): mixed - { - return $this->mainSocket; - } - - /** - * Init idMap. - * - * @return void - */ - protected static function initId(): void - { - foreach (static::$workers as $workerId => $worker) { - $newIdMap = []; - $worker->count = max($worker->count, 1); - for ($key = 0; $key < $worker->count; $key++) { - $newIdMap[$key] = static::$idMap[$workerId][$key] ?? 0; - } - static::$idMap[$workerId] = $newIdMap; - } - } - - /** - * Get unix user of current process. - * - * @return string - */ - protected static function getCurrentUser(): string - { - $userInfo = posix_getpwuid(posix_getuid()); - return $userInfo['name'] ?? 'unknown'; - } - - /** - * Display staring UI. - * - * @return void - */ - protected static function displayUI(): void - { - $tmpArgv = static::getArgv(); - if (in_array('-q', $tmpArgv)) { - return; - } - - - $lineVersion = static::getVersionLine(); - // For windows - if (DIRECTORY_SEPARATOR !== '/') { - static::safeEcho("---------------------------------------------- WORKERMAN -----------------------------------------------\r\n"); - static::safeEcho($lineVersion); - static::safeEcho("----------------------------------------------- WORKERS ------------------------------------------------\r\n"); - static::safeEcho("worker listen processes status\r\n"); - return; - } - - // For unix - !defined('LINE_VERSION_LENGTH') && define('LINE_VERSION_LENGTH', strlen($lineVersion)); - $totalLength = static::getSingleLineTotalLength(); - $lineOne = '' . str_pad(' WORKERMAN ', $totalLength + strlen(''), '-', STR_PAD_BOTH) . '' . PHP_EOL; - $lineTwo = str_pad(' WORKERS ', $totalLength + strlen(''), '-', STR_PAD_BOTH) . PHP_EOL; - static::safeEcho($lineOne . $lineVersion . $lineTwo); - - //Show title - $title = ''; - foreach (static::getUiColumns() as $columnName => $prop) { - $key = 'max' . ucfirst(strtolower($columnName)) . 'NameLength'; - //just keep compatible with listen name - $columnName === 'socket' && $columnName = 'listen'; - $title .= "$columnName" . str_pad('', static::getUiColumnLength($key) + static::UI_SAFE_LENGTH - strlen($columnName)); - } - $title && static::safeEcho($title . PHP_EOL); - - //Show content - foreach (static::$workers as $worker) { - $content = ''; - foreach (static::getUiColumns() as $columnName => $prop) { - $propValue = (string)($worker->$prop ?? $worker->context->$prop); - $key = 'max' . ucfirst(strtolower($columnName)) . 'NameLength'; - preg_match_all("/(|<\/n>||<\/w>||<\/g>)/i", $propValue, $matches); - $placeHolderLength = !empty($matches[0]) ? strlen(implode('', $matches[0])) : 0; - $content .= str_pad($propValue, static::getUiColumnLength($key) + static::UI_SAFE_LENGTH + $placeHolderLength); - } - $content && static::safeEcho($content . PHP_EOL); - } - - //Show last line - $lineLast = str_pad('', static::getSingleLineTotalLength(), '-') . PHP_EOL; - !empty($content) && static::safeEcho($lineLast); - - if (static::$daemonize) { - static::safeEcho('Input "php ' . basename(static::$startFile) . ' stop" to stop. Start success.' . "\n\n"); - } else if (!empty(static::$command)) { - static::safeEcho("Start success.\n"); // Workerman used as library - } else { - static::safeEcho("Press Ctrl+C to stop. Start success.\n"); - } - } - - /** - * @return string - */ - protected static function getVersionLine(): string - { - //Show version - $jitStatus = function_exists('opcache_get_status') && (opcache_get_status()['jit']['on'] ?? false) === true ? 'on' : 'off'; - $version = str_pad('Workerman/' . static::VERSION, 24); - $version .= str_pad('PHP/' . PHP_VERSION . ' (Jit ' . $jitStatus . ')', 30); - $version .= php_uname('s') . '/' . php_uname('r') . PHP_EOL; - return $version; - } - - /** - * Get UI columns to be shown in terminal - * - * 1. $columnMap: ['ui_column_name' => 'clas_property_name'] - * 2. Consider move into configuration in future - * - * @return array - */ - public static function getUiColumns(): array - { - return [ - 'event-loop' => 'eventLoopName', - 'proto' => 'transport', - 'user' => 'user', - 'worker' => 'name', - 'socket' => 'statusSocket', - 'count' => 'count', - 'state' => 'statusState', - ]; - } - - /** - * Get single line total length for ui - * - * @return int - */ - public static function getSingleLineTotalLength(): int - { - $totalLength = 0; - - foreach (static::getUiColumns() as $columnName => $prop) { - $key = 'max' . ucfirst(strtolower($columnName)) . 'NameLength'; - $totalLength += static::getUiColumnLength($key) + static::UI_SAFE_LENGTH; - } - - //Keep beauty when show less columns - !defined('LINE_VERSION_LENGTH') && define('LINE_VERSION_LENGTH', 0); - $totalLength <= LINE_VERSION_LENGTH && $totalLength = LINE_VERSION_LENGTH; - - return $totalLength; - } - - /** - * Parse command. - * - * @return void - */ - protected static function parseCommand(): void - { - if (DIRECTORY_SEPARATOR !== '/') { - return; - } - - // Check argv; - $startFile = basename(static::$startFile); - $usage = "Usage: php yourfile [mode]\nCommands: \nstart\t\tStart worker in DEBUG mode.\n\t\tUse mode -d to start in DAEMON mode.\nstop\t\tStop worker.\n\t\tUse mode -g to stop gracefully.\nrestart\t\tRestart workers.\n\t\tUse mode -d to start in DAEMON mode.\n\t\tUse mode -g to stop gracefully.\nreload\t\tReload codes.\n\t\tUse mode -g to reload gracefully.\nstatus\t\tGet worker status.\n\t\tUse mode -d to show live status.\nconnections\tGet worker connections.\n"; - $availableCommands = [ - 'start', - 'stop', - 'restart', - 'reload', - 'status', - 'connections', - ]; - $availableMode = [ - '-d', - '-g' - ]; - $command = $mode = ''; - foreach (static::getArgv() as $value) { - if (!$command && in_array($value, $availableCommands)) { - $command = $value; - } - if (!$mode && in_array($value, $availableMode)) { - $mode = $value; - } - } - - if (!$command) { - exit($usage); - } - - // Start command. - $modeStr = ''; - if ($command === 'start') { - if ($mode === '-d' || static::$daemonize) { - $modeStr = 'in DAEMON mode'; - } else { - $modeStr = 'in DEBUG mode'; - } - } - static::log("Workerman[$startFile] $command $modeStr"); - - // Get master process PID. - $masterPid = is_file(static::$pidFile) ? (int)file_get_contents(static::$pidFile) : 0; - // Master is still alive? - if (static::checkMasterIsAlive($masterPid)) { - if ($command === 'start') { - static::log("Workerman[$startFile] already running"); - exit; - } - } elseif ($command !== 'start' && $command !== 'restart') { - static::log("Workerman[$startFile] not run"); - exit; - } - - // execute command. - switch ($command) { - case 'start': - if ($mode === '-d') { - static::$daemonize = true; - } - break; - case 'status': - // Delete status file on shutdown - register_shutdown_function(unlink(...), static::$statisticsFile); - while (1) { - // Master process will send SIGIOT signal to all child processes. - posix_kill($masterPid, SIGIOT); - // Waiting a moment. - sleep(1); - // Clear terminal. - if ($mode === '-d') { - static::safeEcho("\33[H\33[2J\33(B\33[m", true); - } - // Echo status data. - static::safeEcho(static::formatProcessStatusData()); - if ($mode !== '-d') { - exit(0); - } - static::safeEcho("\nPress Ctrl+C to quit.\n\n"); - } - case 'connections': - // Delete status file on shutdown - register_shutdown_function(unlink(...), static::$connectionsFile); - // Master process will send SIGIO signal to all child processes. - posix_kill($masterPid, SIGIO); - // Waiting a moment. - usleep(500000); - // Display statistics data from a disk file. - static::safeEcho(static::formatConnectionStatusData()); - exit(0); - case 'restart': - case 'stop': - if ($mode === '-g') { - static::$gracefulStop = true; - $sig = SIGQUIT; - static::log("Workerman[$startFile] is gracefully stopping ..."); - } else { - static::$gracefulStop = false; - $sig = SIGINT; - static::log("Workerman[$startFile] is stopping ..."); - } - // Send stop signal to master process. - $masterPid && posix_kill($masterPid, $sig); - // Timeout. - $timeout = static::$stopTimeout + 3; - $startTime = time(); - // Check master process is still alive? - while (1) { - $masterIsAlive = $masterPid && posix_kill($masterPid, 0); - if ($masterIsAlive) { - // Timeout? - if (!static::getGracefulStop() && time() - $startTime >= $timeout) { - static::log("Workerman[$startFile] stop fail"); - exit; - } - // Waiting a moment. - usleep(10000); - continue; - } - // Stop success. - static::log("Workerman[$startFile] stop success"); - if ($command === 'stop') { - exit(0); - } - if ($mode === '-d') { - static::$daemonize = true; - } - break; - } - break; - case 'reload': - if ($mode === '-g') { - $sig = SIGUSR2; - } else { - $sig = SIGUSR1; - } - posix_kill($masterPid, $sig); - exit; - default : - static::safeEcho('Unknown command: ' . $command . "\n"); - exit($usage); - } - } - - /** - * Get argv. - * - * @return array - */ - public static function getArgv(): array - { - global $argv; - return static::$command ? [...$argv, ...explode(' ', static::$command)] : $argv; - } - - /** - * Format status data. - * - * @return string - */ - protected static function formatProcessStatusData(): string - { - static $totalRequestCache = []; - if (!is_readable(static::$statisticsFile)) { - return ''; - } - $info = file(static::$statisticsFile, FILE_IGNORE_NEW_LINES); - if (!$info) { - return ''; - } - $statusStr = ''; - $currentTotalRequest = []; - $workerInfo = []; - try { - $workerInfo = unserialize($info[0], ['allowed_classes' => false]); - } catch (Throwable) { - // do nothing - } - if (!is_array($workerInfo)) { - $workerInfo = []; - } - ksort($workerInfo, SORT_NUMERIC); - unset($info[0]); - $dataWaitingSort = []; - $readProcessStatus = false; - $totalRequests = 0; - $totalQps = 0; - $totalConnections = 0; - $totalFails = 0; - $totalMemory = 0; - $totalTimers = 0; - $maxLen1 = max(static::getUiColumnLength('maxSocketNameLength'), 2 * static::UI_SAFE_LENGTH); - $maxLen2 = max(static::getUiColumnLength('maxWorkerNameLength'), 2 * static::UI_SAFE_LENGTH); - foreach ($info as $value) { - if (!$readProcessStatus) { - $statusStr .= $value . "\n"; - if (preg_match('/^pid.*?memory.*?listening/', $value)) { - $readProcessStatus = true; - } - continue; - } - if (preg_match('/^[0-9]+/', $value, $pidMath)) { - $pid = $pidMath[0]; - $dataWaitingSort[$pid] = $value; - if (preg_match('/^\S+?\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?/', $value, $match)) { - $totalMemory += (float)str_ireplace('M', '', $match[1]); - $maxLen1 = max($maxLen1, strlen($match[2])); - $maxLen2 = max($maxLen2, strlen($match[3])); - $totalConnections += (int)$match[4]; - $totalFails += (int)$match[5]; - $totalTimers += (int)$match[6]; - $currentTotalRequest[$pid] = $match[7]; - $totalRequests += (int)$match[7]; - } - } - } - foreach ($workerInfo as $pid => $info) { - if (!isset($dataWaitingSort[$pid])) { - $statusStr .= "$pid\t" . str_pad('N/A', 7) . " " - . str_pad($info['listen'], $maxLen1) . " " - . str_pad((string)$info['name'], $maxLen2) . " " - . str_pad('N/A', 11) . " " . str_pad('N/A', 9) . " " - . str_pad('N/A', 7) . " " . str_pad('N/A', 13) . " N/A [busy] \n"; - continue; - } - //$qps = isset($totalRequestCache[$pid]) ? $currentTotalRequest[$pid] - if (!isset($totalRequestCache[$pid], $currentTotalRequest[$pid])) { - $qps = 0; - } else { - $qps = $currentTotalRequest[$pid] - $totalRequestCache[$pid]; - $totalQps += $qps; - } - $statusStr .= $dataWaitingSort[$pid] . " " . str_pad((string)$qps, 6) . " [idle]\n"; - } - $totalRequestCache = $currentTotalRequest; - $statusStr .= "---------------------------------------------------PROCESS STATUS--------------------------------------------------------\n"; - $statusStr .= "Summary\t" . str_pad($totalMemory . 'M', 7) . " " - . str_pad('-', $maxLen1) . " " - . str_pad('-', $maxLen2) . " " - . str_pad((string)$totalConnections, 11) . " " . str_pad((string)$totalFails, 9) . " " - . str_pad((string)$totalTimers, 7) . " " . str_pad((string)$totalRequests, 13) . " " - . str_pad((string)$totalQps, 6) . " [Summary] \n"; - return $statusStr; - } - - protected static function formatConnectionStatusData(): string - { - return file_get_contents(static::$connectionsFile); - } - - /** - * Install signal handler. - * - * @return void - */ - protected static function installSignal(): void - { - if (DIRECTORY_SEPARATOR !== '/') { - return; - } - $signals = [SIGINT, SIGTERM, SIGHUP, SIGTSTP, SIGQUIT, SIGUSR1, SIGUSR2, SIGIOT, SIGIO]; - foreach ($signals as $signal) { - pcntl_signal($signal, static::signalHandler(...), false); - } - // ignore - pcntl_signal(SIGPIPE, SIG_IGN, false); - } - - /** - * Reinstall signal handler. - * - * @return void - */ - protected static function reinstallSignal(): void - { - if (DIRECTORY_SEPARATOR !== '/') { - return; - } - $signals = [SIGINT, SIGTERM, SIGHUP, SIGTSTP, SIGQUIT, SIGUSR1, SIGUSR2, SIGIOT, SIGIO]; - foreach ($signals as $signal) { - // Rewrite master process signal. - static::$globalEvent->onSignal($signal, static::signalHandler(...)); - } - } - - /** - * Signal handler. - * - * @param int $signal - */ - protected static function signalHandler(int $signal): void - { - switch ($signal) { - // Stop. - case SIGINT: - case SIGTERM: - case SIGHUP: - case SIGTSTP: - static::$gracefulStop = false; - static::stopAll(0, 'received signal ' . static::getSignalName($signal)); - break; - // Graceful stop. - case SIGQUIT: - static::$gracefulStop = true; - static::stopAll(0, 'received signal ' . static::getSignalName($signal)); - break; - // Reload. - case SIGUSR2: - case SIGUSR1: - if (static::$status === static::STATUS_RELOADING || static::$status === static::STATUS_SHUTDOWN) { - return; - } - static::$gracefulStop = $signal === SIGUSR2; - static::$pidsToRestart = static::getAllWorkerPids(); - static::reload(); - break; - // Show status. - case SIGIOT: - static::writeStatisticsToStatusFile(); - break; - // Show connection status. - case SIGIO: - static::writeConnectionsStatisticsToStatusFile(); - break; - } - } - - /** - * Get signal name. - * - * @param int $signal - * @return string - */ - protected static function getSignalName(int $signal): string - { - return match ($signal) { - SIGINT => 'SIGINT', - SIGTERM => 'SIGTERM', - SIGHUP => 'SIGHUP', - SIGTSTP => 'SIGTSTP', - SIGQUIT => 'SIGQUIT', - SIGUSR1 => 'SIGUSR1', - SIGUSR2 => 'SIGUSR2', - SIGIOT => 'SIGIOT', - SIGIO => 'SIGIO', - default => $signal, - }; - } - - /** - * Run as daemon mode. - */ - protected static function daemonize(): void - { - if (!static::$daemonize || DIRECTORY_SEPARATOR !== '/') { - return; - } - umask(0); - $pid = pcntl_fork(); - if (-1 === $pid) { - throw new RuntimeException('Fork fail'); - } elseif ($pid > 0) { - exit(0); - } - if (-1 === posix_setsid()) { - throw new RuntimeException("Setsid fail"); - } - // Fork again avoid SVR4 system regain the control of terminal. - $pid = pcntl_fork(); - if (-1 === $pid) { - throw new RuntimeException("Fork fail"); - } elseif (0 !== $pid) { - exit(0); - } - } - - /** - * Redirect standard output to stdoutFile. - * - * @return void - */ - public static function resetStd(): void - { - if (!static::$daemonize || DIRECTORY_SEPARATOR !== '/') { - return; - } - - if (is_resource(STDOUT)) { - fclose(STDOUT); - } - - if (is_resource(STDERR)) { - fclose(STDERR); - } - - if (is_resource(static::$outputStream)) { - fclose(static::$outputStream); - } - - set_error_handler(static fn (): bool => true); - $stdOutStream = fopen(static::$stdoutFile, 'a'); - restore_error_handler(); - - if ($stdOutStream === false) { - return; - } - - static::$outputStream = $stdOutStream; - - // Fix standard output cannot redirect of PHP 8.1.8's bug - if (function_exists('posix_isatty') && posix_isatty(2)) { - ob_start(function (string $string) { - file_put_contents(static::$stdoutFile, $string, FILE_APPEND); - }, 1); - } - } - - /** - * Save pid. - */ - protected static function saveMasterPid(): void - { - if (DIRECTORY_SEPARATOR !== '/') { - return; - } - - static::$masterPid = posix_getpid(); - if (false === file_put_contents(static::$pidFile, static::$masterPid)) { - throw new RuntimeException('can not save pid to ' . static::$pidFile); - } - } - - /** - * Get all pids of worker processes. - * - * @return array - */ - protected static function getAllWorkerPids(): array - { - $pidArray = []; - foreach (static::$pidMap as $workerPidArray) { - foreach ($workerPidArray as $workerPid) { - $pidArray[$workerPid] = $workerPid; - } - } - return $pidArray; - } - - /** - * Fork some worker processes. - * - * @return void - */ - protected static function forkWorkers(): void - { - if (DIRECTORY_SEPARATOR === '/') { - static::forkWorkersForLinux(); - } else { - static::forkWorkersForWindows(); - } - } - - /** - * Fork some worker processes. - * - * @return void - */ - protected static function forkWorkersForLinux(): void - { - foreach (static::$workers as $worker) { - if (static::$status === static::STATUS_STARTING) { - if (empty($worker->name)) { - $worker->name = $worker->getSocketName(); - } - } - while (count(static::$pidMap[$worker->workerId]) < $worker->count) { - static::forkOneWorkerForLinux($worker); - } - } - } - - /** - * Fork some worker processes. - * - * @return void - */ - protected static function forkWorkersForWindows(): void - { - $files = static::getStartFilesForWindows(); - if (count($files) === 1 || in_array('-q', static::getArgv())) { - if (count(static::$workers) > 1) { - static::safeEcho("@@@ Error: multi workers init in one php file are not support @@@\r\n"); - static::safeEcho("@@@ See https://www.workerman.net/doc/workerman/faq/multi-woker-for-windows.html @@@\r\n"); - } elseif (count(static::$workers) <= 0) { - exit("@@@no worker inited@@@\r\n\r\n"); - } - - reset(static::$workers); - /** @var Worker $worker */ - $worker = current(static::$workers); - - Timer::delAll(); - - //Update process state. - static::$status = static::STATUS_RUNNING; - - // Register shutdown function for checking errors. - register_shutdown_function(static::checkErrors(...)); - - // Create a global event loop. - if (static::$globalEvent === null) { - static::$eventLoopClass = $worker->eventLoop ?: static::$eventLoopClass; - static::$globalEvent = new static::$eventLoopClass(); - static::$globalEvent->setErrorHandler(function ($exception) { - static::stopAll(250, $exception); - }); - } - - // Reinstall signal. - static::reinstallSignal(); - - // Init Timer. - Timer::init(static::$globalEvent); - - restore_error_handler(); - - // Add an empty timer to prevent the event-loop from exiting. - Timer::add(1000000, function (){}); - - // Display UI. - static::safeEcho(str_pad($worker->name, 48) . str_pad($worker->getSocketName(), 36) . str_pad('1', 10) . " [ok]\n"); - $worker->listen(); - $worker->run(); - static::$globalEvent->run(); - if (static::$status !== self::STATUS_SHUTDOWN) { - $err = new RuntimeException('event-loop exited'); - static::log($err); - exit(250); - } - exit(0); - } - - static::$globalEvent = new Select(); - static::$globalEvent->setErrorHandler(function ($exception) { - static::stopAll(250, $exception); - }); - Timer::init(static::$globalEvent); - foreach ($files as $startFile) { - static::forkOneWorkerForWindows($startFile); - } - } - - /** - * Get start files for windows. - * - * @return array - */ - public static function getStartFilesForWindows(): array - { - $files = []; - foreach (static::getArgv() as $file) { - if (is_file($file)) { - $files[$file] = $file; - } - } - return $files; - } - - /** - * Fork one worker process. - * - * @param string $startFile - */ - public static function forkOneWorkerForWindows(string $startFile): void - { - $startFile = realpath($startFile); - $descriptorSpec = [STDIN, STDOUT, STDOUT]; - $pipes = []; - $process = proc_open('"' . PHP_BINARY . '" ' . " \"$startFile\" -q", $descriptorSpec, $pipes, null, null, ['bypass_shell' => true]); - - if (static::$globalEvent === null) { - static::$globalEvent = new Select(); - static::$globalEvent->setErrorHandler(function ($exception) { - static::stopAll(250, $exception); - }); - Timer::init(static::$globalEvent); - } - - // 保存子进程句柄 - static::$processForWindows[$startFile] = [$process, $startFile]; - } - - /** - * check worker status for windows. - * - * @return void - */ - protected static function checkWorkerStatusForWindows(): void - { - foreach (static::$processForWindows as $processData) { - $process = $processData[0]; - $startFile = $processData[1]; - $status = proc_get_status($process); - if (!$status['running']) { - static::safeEcho("process $startFile terminated and try to restart\n"); - proc_close($process); - static::forkOneWorkerForWindows($startFile); - } - } - } - - /** - * Fork one worker process. - * - * @param self $worker - */ - protected static function forkOneWorkerForLinux(self $worker): void - { - // Get available worker id. - $id = static::getId($worker->workerId, 0); - $pid = pcntl_fork(); - // For master process. - if ($pid > 0) { - static::$pidMap[$worker->workerId][$pid] = $pid; - static::$idMap[$worker->workerId][$id] = $pid; - } // For child processes. - elseif (0 === $pid) { - srand(); - mt_srand(); - static::$gracefulStop = false; - if (static::$status === static::STATUS_STARTING) { - static::resetStd(); - } - static::$pidsToRestart = static::$pidMap = []; - // Remove other listener. - foreach (static::$workers as $key => $oneWorker) { - if ($oneWorker->workerId !== $worker->workerId) { - $oneWorker->unlisten(); - unset(static::$workers[$key]); - } - } - Timer::delAll(); - - //Update process state. - static::$status = static::STATUS_RUNNING; - - // Register shutdown function for checking errors. - register_shutdown_function(static::checkErrors(...)); - - // Create a global event loop. - if (static::$globalEvent === null) { - static::$eventLoopClass = $worker->eventLoop ?: static::$eventLoopClass; - static::$globalEvent = new static::$eventLoopClass(); - static::$globalEvent->setErrorHandler(function ($exception) { - static::stopAll(250, $exception); - }); - } - - // Reinstall signal. - static::reinstallSignal(); - - // Init Timer. - Timer::init(static::$globalEvent); - - // Init TcpConnection. - TcpConnection::init(); - - restore_error_handler(); - - static::setProcessTitle('WorkerMan: worker process ' . $worker->name . ' ' . $worker->getSocketName()); - $worker->setUserAndGroup(); - $worker->id = $id; - $worker->run(); - // Main loop. - static::$globalEvent->run(); - if (static::$status !== self::STATUS_SHUTDOWN) { - $err = new Exception('event-loop exited'); - static::log($err); - exit(250); - } - exit(0); - } else { - throw new RuntimeException("forkOneWorker fail"); - } - } - - /** - * Get worker id. - * - * @param string $workerId - * @param int $pid - * @return false|int|string - */ - protected static function getId(string $workerId, int $pid): false|int|string - { - return array_search($pid, static::$idMap[$workerId]); - } - - /** - * Set unix user and group for current process. - * - * @return void - */ - public function setUserAndGroup(): void - { - // Get uid. - $userInfo = posix_getpwnam($this->user); - if (!$userInfo) { - static::log("Warning: User $this->user not exists"); - return; - } - $uid = $userInfo['uid']; - // Get gid. - if ($this->group) { - $groupInfo = posix_getgrnam($this->group); - if (!$groupInfo) { - static::log("Warning: Group $this->group not exists"); - return; - } - $gid = $groupInfo['gid']; - } else { - $gid = $userInfo['gid']; - } - - // Set uid and gid. - if ($uid !== posix_getuid() || $gid !== posix_getgid()) { - if (!posix_setgid($gid) || !posix_initgroups($userInfo['name'], $gid) || !posix_setuid($uid)) { - static::log("Warning: change gid or uid fail."); - } - } - } - - /** - * Set process name. - * - * @param string $title - * @return void - */ - protected static function setProcessTitle(string $title): void - { - set_error_handler(static fn (): bool => true); - cli_set_process_title($title); - restore_error_handler(); - } - - /** - * Monitor all child processes. - * - * @return void - * @throws Throwable - */ - protected static function monitorWorkers(): void - { - if (DIRECTORY_SEPARATOR === '/') { - static::monitorWorkersForLinux(); - } else { - static::monitorWorkersForWindows(); - } - } - - /** - * Monitor all child processes. - * - * @return void - */ - protected static function monitorWorkersForLinux(): void - { - static::$status = static::STATUS_RUNNING; - // @phpstan-ignore-next-line While loop condition is always true. - while (1) { - // Calls signal handlers for pending signals. - pcntl_signal_dispatch(); - // Suspends execution of the current process until a child has exited, or until a signal is delivered - $status = 0; - $pid = pcntl_wait($status, WUNTRACED); - // Calls signal handlers for pending signals again. - pcntl_signal_dispatch(); - // If a child has already exited. - if ($pid > 0) { - // Find out which worker process exited. - foreach (static::$pidMap as $workerId => $workerPidArray) { - if (isset($workerPidArray[$pid])) { - $worker = static::$workers[$workerId]; - // Fix exit with status 2 for php8.2 - if ($status === SIGINT && static::$status === static::STATUS_SHUTDOWN) { - $status = 0; - } - // Exit status. - if ($status !== 0) { - static::log("worker[$worker->name:$pid] exit with status $status"); - } - - // onWorkerExit - if (static::$onWorkerExit) { - try { - (static::$onWorkerExit)($worker, $status, $pid); - } catch (Throwable $exception) { - static::log("worker[$worker->name] onWorkerExit $exception"); - } - } - - // For Statistics. - static::$globalStatistics['worker_exit_info'][$workerId][$status] ??= 0; - static::$globalStatistics['worker_exit_info'][$workerId][$status]++; - - // Clear process data. - unset(static::$pidMap[$workerId][$pid]); - - // Mark id is available. - $id = static::getId($workerId, $pid); - static::$idMap[$workerId][$id] = 0; - - break; - } - } - // Is still running state then fork a new worker process. - if (static::$status !== static::STATUS_SHUTDOWN) { - static::forkWorkers(); - // If reloading continue. - if (isset(static::$pidsToRestart[$pid])) { - unset(static::$pidsToRestart[$pid]); - static::reload(); - } - } - } - - // If shutdown state and all child processes exited, then master process exit. - if (static::$status === static::STATUS_SHUTDOWN && empty(static::getAllWorkerPids())) { - static::exitAndClearAll(); - } - } - } - - /** - * Monitor all child processes. - * - * @return void - */ - protected static function monitorWorkersForWindows(): void - { - Timer::add(1, static::checkWorkerStatusForWindows(...)); - - static::$globalEvent->run(); - } - - /** - * Exit current process. - */ - protected static function exitAndClearAll(): void - { - clearstatcache(); - foreach (static::$workers as $worker) { - $socketName = $worker->getSocketName(); - if ($worker->transport === 'unix' && $socketName) { - [, $address] = explode(':', $socketName, 2); - $address = substr($address, strpos($address, '/') + 2); - if (file_exists($address)) { - @unlink($address); - } - } - } - if (file_exists(static::$pidFile)) { - @unlink(static::$pidFile); - } - static::log("Workerman[" . basename(static::$startFile) . "] has been stopped"); - if (static::$onMasterStop) { - (static::$onMasterStop)(); - } - exit(0); - } - - /** - * Execute reload. - * - * @return void - */ - protected static function reload(): void - { - // For master process. - if (static::$masterPid === posix_getpid()) { - $sig = static::getGracefulStop() ? SIGUSR2 : SIGUSR1; - // Set reloading state. - if (static::$status === static::STATUS_RUNNING) { - static::log("Workerman[" . basename(static::$startFile) . "] reloading"); - static::$status = static::STATUS_RELOADING; - - static::resetStd(); - // Try to emit onMasterReload callback. - if (static::$onMasterReload) { - try { - (static::$onMasterReload)(); - } catch (Throwable $e) { - static::stopAll(250, $e); - } - static::initId(); - } - - // Send reload signal to all child processes. - $reloadablePidArray = []; - foreach (static::$pidMap as $workerId => $workerPidArray) { - $worker = static::$workers[$workerId]; - if ($worker->reloadable) { - $reloadablePidArray += $workerPidArray; - continue; - } - // Send reload signal to a worker process which reloadable is false. - array_walk($workerPidArray, static fn ($pid) => posix_kill($pid, $sig)); - } - // Get all pids that are waiting reload. - static::$pidsToRestart = array_intersect(static::$pidsToRestart, $reloadablePidArray); - } - - // Reload complete. - if (empty(static::$pidsToRestart)) { - if (static::$status !== static::STATUS_SHUTDOWN) { - static::$status = static::STATUS_RUNNING; - } - return; - } - // Continue reload. - $oneWorkerPid = current(static::$pidsToRestart); - // Send reload signal to a worker process. - posix_kill($oneWorkerPid, $sig); - // If the process does not exit after stopTimeout seconds try to kill it. - if (!static::getGracefulStop()) { - Timer::add(static::$stopTimeout, posix_kill(...), [$oneWorkerPid, SIGKILL], false); - } - } // For child processes. - else { - reset(static::$workers); - $worker = current(static::$workers); - // Try to emit onWorkerReload callback. - if ($worker->onWorkerReload) { - try { - ($worker->onWorkerReload)($worker); - } catch (Throwable $e) { - static::stopAll(250, $e); - } - } - - if ($worker->reloadable) { - static::stopAll(); - } else { - static::resetStd(); - } - } - } - - /** - * Stop all. - * - * @param int $code - * @param mixed $log - */ - public static function stopAll(int $code = 0, mixed $log = ''): void - { - static::$status = static::STATUS_SHUTDOWN; - // For master process. - if (DIRECTORY_SEPARATOR === '/' && static::$masterPid === posix_getpid()) { - if ($log) { - static::log("Workerman[" . basename(static::$startFile) . "] $log"); - } - static::log("Workerman[" . basename(static::$startFile) . "] stopping" . ($code ? ", code [$code]" : '')); - $workerPidArray = static::getAllWorkerPids(); - // Send stop signal to all child processes. - $sig = static::getGracefulStop() ? SIGQUIT : SIGINT; - foreach ($workerPidArray as $workerPid) { - // Fix exit with status 2 for php8.2 - if ($sig === SIGINT && !static::$daemonize) { - Timer::add(1, posix_kill(...), [$workerPid, SIGINT], false); - } else { - posix_kill($workerPid, $sig); - } - if (!static::getGracefulStop()) { - Timer::add(ceil(static::$stopTimeout), posix_kill(...), [$workerPid, SIGKILL], false); - } - } - Timer::add(1, static::checkIfChildRunning(...)); - } // For child processes. - else { - if ($code && $log) { - static::log($log); - } - // Execute exit. - $workers = array_reverse(static::$workers); - array_walk($workers, static fn (Worker $worker) => $worker->stop(false)); - - $callback = function () use ($code, $workers) { - $allWorkerConnectionClosed = true; - if (!static::getGracefulStop()) { - foreach ($workers as $worker) { - foreach ($worker->connections as $connection) { - // Delay closing, waiting for data to be sent. - if (!$connection->getRecvBufferQueueSize() && !isset($connection->context->closeTimer)) { - $connection->context->closeTimer = Timer::delay(0.01, static fn () => $connection->close()); - } - $allWorkerConnectionClosed = false; - } - } - } - if ((!static::getGracefulStop() && $allWorkerConnectionClosed) || ConnectionInterface::$statistics['connection_count'] <= 0) { - static::$globalEvent?->stop(); - try { - // Ignore Swoole ExitException: Swoole exit. - exit($code); - /** @phpstan-ignore-next-line */ - } catch (Throwable) { - // do nothing - } - } - }; - Timer::repeat(0.01, $callback); - } - } - - /** - * check if child processes is really running - */ - protected static function checkIfChildRunning(): void - { - foreach (static::$pidMap as $workerId => $workerPidArray) { - foreach ($workerPidArray as $pid => $workerPid) { - if (!posix_kill($pid, 0)) { - unset(static::$pidMap[$workerId][$pid]); - } - } - } - } - - /** - * Get process status. - * - * @return int - */ - public static function getStatus(): int - { - return static::$status; - } - - /** - * If stop gracefully. - * - * @return bool - */ - public static function getGracefulStop(): bool - { - return static::$gracefulStop; - } - - /** - * - * Write statistics data to disk. - * - * @return void - */ - protected static function writeStatisticsToStatusFile(): void - { - // For master process. - if (static::$masterPid === posix_getpid()) { - $allWorkerInfo = []; - foreach (static::$pidMap as $workerId => $pidArray) { - $worker = static::$workers[$workerId]; - foreach ($pidArray as $pid) { - $allWorkerInfo[$pid] = ['name' => $worker->name, 'listen' => $worker->getSocketName()]; - } - } - file_put_contents(static::$statisticsFile, ''); - chmod(static::$statisticsFile, 0722); - file_put_contents(static::$statisticsFile, serialize($allWorkerInfo) . "\n", FILE_APPEND); - $loadavg = function_exists('sys_getloadavg') ? array_map(round(...), sys_getloadavg(), [2, 2, 2]) : ['-', '-', '-']; - file_put_contents(static::$statisticsFile, - (static::$daemonize ? "Start worker in DAEMON mode." : "Start worker in DEBUG mode.") . "\n", FILE_APPEND); - file_put_contents(static::$statisticsFile, - "---------------------------------------------------GLOBAL STATUS---------------------------------------------------------\n", FILE_APPEND); - file_put_contents(static::$statisticsFile, static::getVersionLine(), FILE_APPEND); - file_put_contents(static::$statisticsFile, 'start time:' . date('Y-m-d H:i:s', - static::$globalStatistics['start_timestamp']) - . ' run ' . floor((time() - static::$globalStatistics['start_timestamp']) / (24 * 60 * 60)) - . ' days ' . floor(((time() - static::$globalStatistics['start_timestamp']) % (24 * 60 * 60)) / (60 * 60)) - . " hours " . 'load average: ' . implode(", ", $loadavg) . "\n", FILE_APPEND); - file_put_contents(static::$statisticsFile, - count(static::$pidMap) . ' workers ' . count(static::getAllWorkerPids()) . " processes\n", - FILE_APPEND); - file_put_contents(static::$statisticsFile, - str_pad('name', static::getUiColumnLength('maxWorkerNameLength')) . " event-loop exit_status exit_count\n", FILE_APPEND); - foreach (static::$pidMap as $workerId => $workerPidArray) { - $worker = static::$workers[$workerId]; - if (isset(static::$globalStatistics['worker_exit_info'][$workerId])) { - foreach (static::$globalStatistics['worker_exit_info'][$workerId] as $workerExitStatus => $workerExitCount) { - file_put_contents(static::$statisticsFile, - str_pad($worker->name, static::getUiColumnLength('maxWorkerNameLength')) . " " . - str_pad($worker->context->eventLoopName, 14) . " " . - str_pad((string)$workerExitStatus, 16) . str_pad((string)$workerExitCount, 16) . "\n", FILE_APPEND); - } - } else { - file_put_contents(static::$statisticsFile, - str_pad($worker->name, static::getUiColumnLength('maxWorkerNameLength')) . " " . - str_pad($worker->context->eventLoopName, 14) . " " . - str_pad('0', 16) . str_pad('0', 16) . "\n", FILE_APPEND); - } - } - file_put_contents(static::$statisticsFile, - "---------------------------------------------------PROCESS STATUS--------------------------------------------------------\n", - FILE_APPEND); - file_put_contents(static::$statisticsFile, - "pid\tmemory " . str_pad('listening', static::getUiColumnLength('maxSocketNameLength')) . " " . str_pad('name', - static::getUiColumnLength('maxWorkerNameLength')) . " connections " . str_pad('send_fail', 9) . " " - . str_pad('timers', 8) . str_pad('total_request', 13) . " qps status\n", FILE_APPEND); - - foreach (static::getAllWorkerPids() as $workerPid) { - posix_kill($workerPid, SIGIOT); - } - return; - } - - // For child processes. - gc_collect_cycles(); - gc_mem_caches(); - reset(static::$workers); - /** @var static $worker */ - $worker = current(static::$workers); - $workerStatusStr = posix_getpid() . "\t" . str_pad(round(memory_get_usage() / (1024 * 1024), 2) . "M", 7) - . " " . str_pad($worker->getSocketName(), static::getUiColumnLength('maxSocketNameLength')) . " " - . str_pad(($worker->name === $worker->getSocketName() ? 'none' : $worker->name), static::getUiColumnLength('maxWorkerNameLength')) - . " "; - $workerStatusStr .= str_pad((string)ConnectionInterface::$statistics['connection_count'], 11) - . " " . str_pad((string)ConnectionInterface::$statistics['send_fail'], 9) - . " " . str_pad((string)static::$globalEvent->getTimerCount(), 7) - . " " . str_pad((string)ConnectionInterface::$statistics['total_request'], 13) . "\n"; - file_put_contents(static::$statisticsFile, $workerStatusStr, FILE_APPEND); - } - - /** - * Get UI column length - * - * @param $name - * @return int - */ - protected static function getUiColumnLength($name): int - { - return static::$uiLengthData[$name] ?? 0; - } - - /** - * Write statistics data to disk. - * - * @return void - */ - protected static function writeConnectionsStatisticsToStatusFile(): void - { - // For master process. - if (static::$masterPid === posix_getpid()) { - file_put_contents(static::$connectionsFile, ''); - chmod(static::$connectionsFile, 0722); - file_put_contents(static::$connectionsFile, "--------------------------------------------------------------------- WORKERMAN CONNECTION STATUS --------------------------------------------------------------------------------\n", FILE_APPEND); - file_put_contents(static::$connectionsFile, "PID Worker CID Trans Protocol ipv4 ipv6 Recv-Q Send-Q Bytes-R Bytes-W Status Local Address Foreign Address\n", FILE_APPEND); - foreach (static::getAllWorkerPids() as $workerPid) { - posix_kill($workerPid, SIGIO); - } - return; - } - - // For child processes. - $bytesFormat = function ($bytes) { - if ($bytes > 1024 * 1024 * 1024 * 1024) { - return round($bytes / (1024 * 1024 * 1024 * 1024), 1) . "TB"; - } - if ($bytes > 1024 * 1024 * 1024) { - return round($bytes / (1024 * 1024 * 1024), 1) . "GB"; - } - if ($bytes > 1024 * 1024) { - return round($bytes / (1024 * 1024), 1) . "MB"; - } - if ($bytes > 1024) { - return round($bytes / (1024), 1) . "KB"; - } - return $bytes . "B"; - }; - - $pid = posix_getpid(); - $str = ''; - reset(static::$workers); - $currentWorker = current(static::$workers); - $defaultWorkerName = $currentWorker->name; - - foreach (TcpConnection::$connections as $connection) { - /** @var TcpConnection $connection */ - $transport = $connection->transport; - $ipv4 = $connection->isIpV4() ? ' 1' : ' 0'; - $ipv6 = $connection->isIpV6() ? ' 1' : ' 0'; - $recvQ = $bytesFormat($connection->getRecvBufferQueueSize()); - $sendQ = $bytesFormat($connection->getSendBufferQueueSize()); - $localAddress = trim($connection->getLocalAddress()); - $remoteAddress = trim($connection->getRemoteAddress()); - $state = $connection->getStatus(false); - $bytesRead = $bytesFormat($connection->bytesRead); - $bytesWritten = $bytesFormat($connection->bytesWritten); - $id = $connection->id; - $protocol = $connection->protocol ?: $connection->transport; - $pos = strrpos($protocol, '\\'); - if ($pos) { - $protocol = substr($protocol, $pos + 1); - } - if (strlen($protocol) > 15) { - $protocol = substr($protocol, 0, 13) . '..'; - } - $workerName = isset($connection->worker) ? $connection->worker->name : $defaultWorkerName; - if (strlen($workerName) > 14) { - $workerName = substr($workerName, 0, 12) . '..'; - } - $str .= str_pad((string)$pid, 9) . str_pad($workerName, 16) . str_pad((string)$id, 10) . str_pad($transport, 8) - . str_pad($protocol, 16) . str_pad($ipv4, 7) . str_pad($ipv6, 7) . str_pad($recvQ, 13) - . str_pad($sendQ, 13) . str_pad($bytesRead, 13) . str_pad($bytesWritten, 13) . ' ' - . str_pad($state, 14) . ' ' . str_pad($localAddress, 22) . ' ' . str_pad($remoteAddress, 22) . "\n"; - } - if ($str) { - file_put_contents(static::$connectionsFile, $str, FILE_APPEND); - } - } - - /** - * Check errors when current process exited. - * - * @return void - */ - protected static function checkErrors(): void - { - if (static::STATUS_SHUTDOWN !== static::$status) { - $errorMsg = DIRECTORY_SEPARATOR === '/' ? 'Worker[' . posix_getpid() . '] process terminated' : 'Worker process terminated'; - $errors = error_get_last(); - if ($errors && ($errors['type'] === E_ERROR || - $errors['type'] === E_PARSE || - $errors['type'] === E_CORE_ERROR || - $errors['type'] === E_COMPILE_ERROR || - $errors['type'] === E_RECOVERABLE_ERROR) - ) { - $errorMsg .= ' with ERROR: ' . static::getErrorType($errors['type']) . " \"{$errors['message']} in {$errors['file']} on line {$errors['line']}\""; - } - static::log($errorMsg); - } - } - - /** - * Get error message by error code. - * - * @param int $type - * @return string - */ - protected static function getErrorType(int $type): string - { - return self::ERROR_TYPE[$type] ?? ''; - } - - /** - * Log. - * - * @param Stringable|string $msg - * @param bool $decorated - * @return void - */ - public static function log(Stringable|string $msg, bool $decorated = false): void - { - $msg = trim((string)$msg); - - if (!static::$daemonize) { - static::safeEcho("$msg\n", $decorated); - } - - if (isset(static::$logFile)) { - $pid = DIRECTORY_SEPARATOR === '/' ? posix_getpid() : 1; - file_put_contents(static::$logFile, sprintf("%s pid:%d %s\n", date('Y-m-d H:i:s'), $pid, $msg), FILE_APPEND | LOCK_EX); - } - } - - /** - * Safe Echo. - * - * @param string $msg - * @param bool $decorated - * @return void - */ - public static function safeEcho(string $msg, bool $decorated = false): void - { - if ((static::$outputDecorated ?? false) && $decorated) { - $line = "\033[1A\n\033[K"; - $white = "\033[47;30m"; - $green = "\033[32;40m"; - $end = "\033[0m"; - } else { - $line = ''; - $white = ''; - $green = ''; - $end = ''; - } - - $msg = str_replace(['', '', ''], [$line, $white, $green], $msg); - $msg = str_replace(['', '', ''], $end, $msg); - set_error_handler(static fn (): bool => true); - if (!feof(self::$outputStream)) { - fwrite(self::$outputStream, $msg); - fflush(self::$outputStream); - } - restore_error_handler(); - } - - /** - * Listen. - */ - public function listen(): void - { - if (!$this->socketName) { - return; - } - - if (!$this->mainSocket) { - - $localSocket = $this->parseSocketAddress(); - - // Flag. - $flags = $this->transport === 'udp' ? STREAM_SERVER_BIND : STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; - $errNo = 0; - $errMsg = ''; - // SO_REUSEPORT. - if ($this->reusePort) { - stream_context_set_option($this->socketContext, 'socket', 'so_reuseport', 1); - } - - // Create an Internet or Unix domain server socket. - $this->mainSocket = stream_socket_server($localSocket, $errNo, $errMsg, $flags, $this->socketContext); - if (!$this->mainSocket) { - throw new RuntimeException($errMsg); - } - - if ($this->transport === 'ssl') { - stream_socket_enable_crypto($this->mainSocket, false); - } elseif ($this->transport === 'unix') { - $socketFile = substr($localSocket, 7); - if ($this->user) { - chown($socketFile, $this->user); - } - if ($this->group) { - chgrp($socketFile, $this->group); - } - } - - // Try to open keepalive for tcp and disable Nagle algorithm. - if (function_exists('socket_import_stream') && self::BUILD_IN_TRANSPORTS[$this->transport] === 'tcp') { - set_error_handler(static fn (): bool => true); - $socket = socket_import_stream($this->mainSocket); - socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1); - socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1); - if (defined('TCP_KEEPIDLE') && defined('TCP_KEEPINTVL') && defined('TCP_KEEPCNT')) { - socket_set_option($socket, SOL_TCP, TCP_KEEPIDLE, TcpConnection::TCP_KEEPALIVE_INTERVAL); - socket_set_option($socket, SOL_TCP, TCP_KEEPINTVL, TcpConnection::TCP_KEEPALIVE_INTERVAL); - socket_set_option($socket, SOL_TCP, TCP_KEEPCNT, 1); - } - restore_error_handler(); - } - - // Non blocking. - stream_set_blocking($this->mainSocket, false); - } - - $this->resumeAccept(); - } - - /** - * Unlisten. - * - * @return void - */ - public function unlisten(): void - { - $this->pauseAccept(); - if ($this->mainSocket) { - set_error_handler(static fn (): bool => true); - fclose($this->mainSocket); - restore_error_handler(); - $this->mainSocket = null; - } - } - - /** - * Check port available. - * - * @return void - */ - protected static function checkPortAvailable(): void - { - foreach (static::$workers as $worker) { - $socketName = $worker->getSocketName(); - if (DIRECTORY_SEPARATOR === '/' // if linux - && static::$status === static::STATUS_STARTING // only for starting status - && $worker->transport === 'tcp' // if tcp socket - && !str_starts_with($socketName, 'unix') // if not unix socket - && !str_starts_with($socketName, 'udp')) { // if not udp socket - - $address = parse_url($socketName); - if (isset($address['host']) && isset($address['port'])) { - $address = "tcp://{$address['host']}:{$address['port']}"; - $server = null; - set_error_handler(function ($code, $msg) { - throw new RuntimeException($msg); - }); - $server = stream_socket_server($address, $code, $msg); - if ($server) { - fclose($server); - } - restore_error_handler(); - } - } - } - } - - /** - * Parse local socket address. - */ - protected function parseSocketAddress(): ?string - { - if (!$this->socketName) { - return null; - } - // Get the application layer communication protocol and listening address. - [$scheme, $address] = explode(':', $this->socketName, 2); - // Check application layer protocol class. - if (!isset(self::BUILD_IN_TRANSPORTS[$scheme])) { - $scheme = ucfirst($scheme); - $this->protocol = $scheme[0] === '\\' ? $scheme : 'Protocols\\' . $scheme; - if (!class_exists($this->protocol)) { - $this->protocol = "Workerman\\Protocols\\$scheme"; - if (!class_exists($this->protocol)) { - throw new RuntimeException("class \\Protocols\\$scheme not exist"); - } - } - - if (!isset(self::BUILD_IN_TRANSPORTS[$this->transport])) { - throw new RuntimeException('Bad worker->transport ' . var_export($this->transport, true)); - } - } else if ($this->transport === 'tcp') { - $this->transport = $scheme; - } - //local socket - return self::BUILD_IN_TRANSPORTS[$this->transport] . ":" . $address; - } - - /** - * Pause accept new connections. - * - * @return void - */ - public function pauseAccept(): void - { - if (static::$globalEvent !== null && $this->pauseAccept === false && $this->mainSocket !== null) { - static::$globalEvent->offReadable($this->mainSocket); - $this->pauseAccept = true; - } - } - - /** - * Resume accept new connections. - * - * @return void - */ - public function resumeAccept(): void - { - // Register a listener to be notified when server socket is ready to read. - if (static::$globalEvent !== null && $this->pauseAccept === true && $this->mainSocket !== null) { - if ($this->transport !== 'udp') { - static::$globalEvent->onReadable($this->mainSocket, $this->acceptTcpConnection(...)); - } else { - static::$globalEvent->onReadable($this->mainSocket, $this->acceptUdpConnection(...)); - } - $this->pauseAccept = false; - } - } - - /** - * Get socket name. - * - * @return string - */ - public function getSocketName(): string - { - return $this->socketName ? lcfirst($this->socketName) : 'none'; - } - - /** - * Run worker instance. - * - * @return void - * @throws Throwable - */ - public function run(): void - { - $this->listen(); - - if (!$this->onWorkerStart) { - return; - } - - // Try to emit onWorkerStart callback. - $callback = function() { - try { - ($this->onWorkerStart)($this); - } catch (Throwable $e) { - // Avoid rapid infinite loop exit. - sleep(1); - static::stopAll(250, $e); - } - }; - - switch (Worker::$eventLoopClass) { - case Swoole::class: - case Swow::class: - case Fiber::class: - Coroutine::create($callback); - break; - default: - (new \Fiber($callback))->start(); - } - } - - /** - * Stop current worker instance. - * - * @param bool $force - * @return void - */ - public function stop(bool $force = true): void - { - if ($this->stopping === true) { - return; - } - // Try to emit onWorkerStop callback. - if ($this->onWorkerStop) { - try { - ($this->onWorkerStop)($this); - } catch (Throwable $e) { - static::log($e); - } - } - // Remove listener for server socket. - $this->unlisten(); - // Close all connections for the worker. - if (!static::getGracefulStop()) { - foreach ($this->connections as $connection) { - if ($force || !$connection->getRecvBufferQueueSize()) { - $connection->close(); - } - } - } - // Clear callback. - $this->onMessage = $this->onClose = $this->onError = $this->onBufferDrain = $this->onBufferFull = null; - $this->stopping = true; - } - - /** - * Accept a connection. - * - * @param resource $socket - * @return void - */ - protected function acceptTcpConnection(mixed $socket): void - { - // Accept a connection on server socket. - set_error_handler(static fn (): bool => true); - $newSocket = stream_socket_accept($socket, 0, $remoteAddress); - restore_error_handler(); - - // Thundering herd. - if (!$newSocket) { - return; - } - - // TcpConnection. - $connection = new TcpConnection(static::$globalEvent, $newSocket, $remoteAddress); - $this->connections[$connection->id] = $connection; - $connection->worker = $this; - $connection->protocol = $this->protocol; - $connection->transport = $this->transport; - $connection->onMessage = $this->onMessage; - $connection->onClose = $this->onClose; - $connection->onError = $this->onError; - $connection->onBufferDrain = $this->onBufferDrain; - $connection->onBufferFull = $this->onBufferFull; - - // Try to emit onConnect callback. - if ($this->onConnect) { - try { - ($this->onConnect)($connection); - } catch (Throwable $e) { - static::stopAll(250, $e); - } - } - } - - /** - * For udp package. - * - * @param resource $socket - * @return void - */ - protected function acceptUdpConnection(mixed $socket): void - { - set_error_handler(static fn (): bool => true); - $recvBuffer = stream_socket_recvfrom($socket, UdpConnection::MAX_UDP_PACKAGE_SIZE, 0, $remoteAddress); - restore_error_handler(); - if (false === $recvBuffer || empty($remoteAddress)) { - return; - } - // UdpConnection. - $connection = new UdpConnection($socket, $remoteAddress); - $connection->protocol = $this->protocol; - $messageCallback = $this->onMessage; - if ($messageCallback) { - try { - if ($this->protocol !== null) { - $parser = $this->protocol; - if ($parser && method_exists($parser, 'input')) { - while ($recvBuffer !== '') { - $len = $parser::input($recvBuffer, $connection); - if ($len === 0) { - return; - } - $package = substr($recvBuffer, 0, $len); - $recvBuffer = substr($recvBuffer, $len); - $data = $parser::decode($package, $connection); - if ($data === false) { - continue; - } - $messageCallback($connection, $data); - } - } else { - $data = $parser::decode($recvBuffer, $connection); - // Discard bad packets. - if ($data === false) { - return; - } - $messageCallback($connection, $data); - } - } else { - $messageCallback($connection, $recvBuffer); - } - ConnectionInterface::$statistics['total_request']++; - } catch (Throwable $e) { - static::stopAll(250, $e); - } - } - } - - /** - * Check master process is alive - * - * @param int $masterPid - * @return bool - */ - protected static function checkMasterIsAlive(int $masterPid): bool - { - if (empty($masterPid)) { - return false; - } - - $masterIsAlive = posix_kill($masterPid, 0) && posix_getpid() !== $masterPid; - if (!$masterIsAlive) { - static::log("Master pid:$masterPid is not alive"); - return false; - } - - $cmdline = "/proc/$masterPid/cmdline"; - if (!is_readable($cmdline)) { - return true; - } - - $content = file_get_contents($cmdline); - if (empty($content)) { - return true; - } - - return str_contains($content, 'WorkerMan') || str_contains($content, 'php'); - } - - /** - * If worker is running. - * - * @return bool - */ - public static function isRunning(): bool - { - return Worker::$status !== Worker::STATUS_INITIAL; - } -} diff --git a/webman.zip b/webman.zip deleted file mode 100644 index e3818abcdf9f3254f2a85b2e90cad6f32018d01e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2064018 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
<002KrDi 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∨kUO<~sescB7@@!Ue(}@3|}N&)8hR#4-TV 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

$>Yn}j^C5p!~x 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

f^WFecYxxn* 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̝K?|fnRlG&U$slLC^`mC8EtzAqWpRe|E*r{^nJg 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


2C`=YjUtww*c)SNy3M2$Sp5n7zU-i}jUyz5p= zfJkS^X?}7@vVvFx&~hI6o`8P4vI%I zM2gs${d(NqKgJK&#Dt9p)0(>!ZCiW|s|oo06DltzB*$0|vI+#&9Q2FQa=>*{qM1^L zM)anV%+pa~c|unR(#1LUrMgaZ0f{(9SIhFh`mUGG3xGPflFnFBSMmtMvvh2E%E0VV z^7cJs=dxznlW2lMUGBFxI}lrbWLET)8;I2lF2|3n1Ayc!Q%RH!iC_=(+fhSJjw}!Q z@(?}_ZR}KA`vW#q$E2f&8$&9EZbmagX;dE&^3bQ{#}|SAm>z+p>Yl~A;XR#$N3Kw2 zcncFN>9MiCgIqzh6FQX7BRz1gAwQDRuA;Zq`;o zYa?=jaGn~{&rDeHall^A%6l|#sg@Ti%=hR(UAm=)*nxPXyC0y<>6TG{k)gB9nJVYw zR$5xWulP%|H{3kIzkuJuFAB8ydoxj8NEMR(m0qbM1J0l+Zb=s}Eod&CdCYTTXJp*i z=~vrws`B0oKwzvBpl`7rx5Am!Dp!4Rw2U`C?754+#Azkp_S9%7m!6MYtAJgCr*7@s z@MZYNF+UJ2vgB1zAOR~fZ#0|}8Iw+fw$qbd0aN$^(!?odBzgk(x!JzB)zJnVA^uOv z{;NDAu%l^c%n~@ZpKbl*a_mY5px9Px@(MLVHifckESlulnsXQ1IE>~0rLP8jGQ$_U>Ved=5Zf+|)uiEtzI9MPrHS?*QqFV*ROnOT0^-Zpx zesN*ffz1tQYHkTxa7KTxtBGCQxi(slcb|0(!b9&2Y8@=fwynZYD47lZ7zxavuU)L! zUKnY|$$B6C``}~5;9QlEt;oHI4O!eh*zJ_GB&C|k%8CkFx&~kowY#I@fL6#n1803I z=0=_9l}&BKR^s!_ZPtx$OmB)8BoL~Cq@yuJ#$KFzEROZ*)wa=Dlxfb_dLo>Jco(xv zR)Qo|^mD;b#9&sevb+nmn`4>P&#lCkgFcgrY!xk-#Qsu73>F651K5iQ4sYH`W>=D2 zB@=?uEr0~2%TBV`OQa|s>KRc-w>V*U@Cze7XXZNh5<>ejHxB+*dgAx$tNSp*bf!M= z{Stao-S^o8;NAy#J4D-+9t@&C?GEraO8{QU+y>(P{+PNWbi)LwU~9Xc@)OOiZuN&a z++S=HE8v)=0~}9LA4@C`I}dumy_vc&*5j~lqbs{;V+Dl5E_11WboE#<{IpJ+7Z6?- z9V}RgcS@;F+NaE>&$_+QnLl%cclu)0qb}Ob*4Bo6OEKCLa20n8kwPaOs zg2OEvoOV#$bHm2&wD@P44-eSLq9ud-LiVNsiy7Ce$Jx=Cf>&_o0DyW+?`02{7h;wz z!gl|H=opB6(Y|VE2c0fb0a!$9pZLb_*J#P2fgPH*iOKF(X{1*agx5N@$UDI~cDXKP zFJfc2JASyL50$kyj|$kCpUr0unt(o$-I zDHDEXZ9uXcsA?vf3y?}1zgG58JKZEpy?yy@$lqi=ULx<6TOp96EYW(q=RpIB&{;WC zbJOY7wfBKmSsZXNO$AmP=11ho55f*;(@Zu@Yqg#hBE zjyYf-ULpsY*X}s;n#b-j!*4agihrP;Cmqx$X?5r@4+6bSH~4GsKU~QUKhmjSYpVZTD%>c<_H137cm#Evli zW2~dI%^G426-(qyN1iz$^-4Fyu|rfCQSPb`Op!<`yTS|_^#js##7O{u^yz>q#**)U zY9a0Wo}sM4U#6y%dr+eqf(pnMfNlLkfW&)?G~)C?Uw_{-Ow=-`8RdL>WaAl-P6>X>9jC;vA#qhO zA>(*`U+@ug+g>7dp20~($RWaKaBfG!_%lP2@{tQCF_LEmMh4kB0>bcSaL(PYTb-@e z!kn%^In#WU9RxjUG3~sov>b{zvtR|XxB9-t(2r+DE}3py_>`@!JBcGjxo?#&B?@-T zVv>gE#%snfughNd$wFsvT-3a$9Tv8+AE%TF(V2>ygDfR&YsQukUlxufHE&7ylOquz z8Mwzr6TWHU4Y<3BF=|2XN?3*^;X4U}tRlL5Z*UH@Lt{0uAgU?Pk{@P~uJ zq-_vR?5nyeiXxSbG?$?QeqdO6JWJhLU(~YJY;ieAfbL4Z=Yx@tE~7B)YLCLss4#lk zqc^{vt1W=OQo%U0A=FQIgw(lX4dx!F(lyD~(wPmVgtAAj7WE?k5=Jf5(V$^kcVbnc);!JUy2IXXaB$WtIXxXon0ec+j_VlNws+5UJRKgg>0@ zaPT5|=8Y;WgQ#QSqke1(W08wMj?Z(|*`jp$JPhrM;9n7*xce%v!vbTq54E}(czptv zg`>d7RTh7ompMc{!f=&!=xnfHT06N@8@5;oE4RYNJ0KbJT%e}CBc<0Zm9Bn7Z6oVK z%owon;bnHDdU4|6!T!*XcMO@((Q)NDRcr5P>jgi$#$lPE)PdnKHtIB?i6ajYKWEVX zh00-DdBy3QdYJ;EC3(qfbN3wr0Em*(LESRr*&f~v#sz=8W=$9{sDW1;VJgcAW_T)F zw8aoAK&f)G>$mzkB-LeT)}Rq}eqBYovFU@f0#r^EvJ+$mm2)OPmFd%-s_MZ2XD1~i zZO1~sAV%C6yj<R@konxV*AWY|_hEG6y&OwAw8oTJZ-0g}mADbBApJJmEY zk!Aob4c)HTyk0ilRFV9E%mME%?^pF2Yn%3<;5QFSD+Gt0`QE4j-h`G$9pEHFj|H=O zU$uCna>f4NQ;Plux1I1eRe|-Js_?H)hN4b}R(}ta7b;TUZTBy|FGdNHnxcSaQd1%* zA)v1zDI5wRdkPyEJ6xkM`pm~wc$R5wAw7uZbwLU9)yrYs-L|cgqJ;b`XmO~KfVQ1B zy{ZJO^yZQhX?`Y85$1&8#?M&w29V5OGDV6#`{`lUtnqHQ>igYS+%26sQgW#Y_AJk+ z^ZW1IX30NTJf0RS{MU(oqGdzJAQzMvVZP9*%5o@RjXKOO+ozh{Rt93-GSey2>L&b} zJc;iMm6Z5X9-nv|8s0q`Ib!=-R(qHpt_edhBCN+I%hu0@>Ko@JPxnegj#B*R6j5zBHblWs6}U>ID@Y_jnnt_Y&tz2{&WsATIyEHG*TGt_Ct`i zGdj%y{T#|pJ}K4q%H-f)cwJV{xtooCDLtLg#!>m)+UC5JkBVZcnK4hZCmWdw+*3z^ z3{T#`XB)27bQyNIb`jeoAUhEcg0K1ljtMgOh*?&tKLh@TqYn;TNN>^|s0Xr3bYCFT zDteX0dCFtRCKJVkI{-Z!;|0IlORq1 ztLQF74FFr@87m|^6O&vU3mxW~StuQD4UiJy>qsu=xbbSb8u#Eo{W_JwZIq<^$i8En zrZzc#(EQ!40OPfE_8`Dya=VMMC%$q_!gbE+F7s~kza-H8>jz6ysF5X560*(J@Dlx% zI?Vr+xs9r!g>scit!ZH^t=eJ88fYdL{3bS7O}%A>@;a8u$Ye5{mlozavqce1bPQ-i z5Go>X!ap$II4Peatay`%e`uJlmy}YCO}1SPvtO?~9BG!|#hnGOq)6Henf)$A=FV!+kG)P1+H)jm+e z>kmW-oF6{_L(g-(ea$hitI!xR!Ql1J==nWbq9J2F%p=n^^vCmF9ZQ3@S zd%8bsmT&d;&MkAV`dRrK*ef?e8pCTtAbBcd>qKE_tm*{<#Cu_^o#fL00dT!f_`*zh zx9na4e5LK@TwF$WUfjS3-V_6Ri{f8fL*I@hg0#0UOM2e1;?oUIUb&E_q574(f!C-x z@qRN87J#zqMSgFCxc0y@CP3Lg*v)7+*KleS{L1z6zqPjiIcW}2{n(ND-fu~NyMO#& zLw*0bIQifD;J-;!4JuOh-$IDaH?>YDj?d+0b5sxx|Fb0ZTPX3B*^h5N@$%9) z2&^&?Psj~hWuI?-;}ka*qIxE=LH`I=$e`I#@QVv!ttRIS`mwDWV1~wdFaA)bdS*q^ zRAuUrMZx)`>Ek$xOvyPDQqO~TWm4<@3>FiVuxUnohut&~d@qs4Q$rc0 z1@1@wC$h}XH-&*7PtOc_6mOBMRl`7m5^WizP7?}&td)(-`UOY-hiH%--c2>CdQK?R z7Y!RX&!yKaG59)(l1o(5Q*Z+11-Ld-+3;CV;;u8$?zU_yo}Hn6CR6>iM%rs5bqL8P zwiS<_qPbjwez3WG`K|R2e?l_TUPX-Zurw>iH%j|!>wup|)PS4NJdz2O)L!Bau!ZlKonhG- zu{m_{L|CxZZzUx(d>E{$_~7BhVd8!=)u=>2S#IEawmAtnLdh}U9D)z_;#+)yQksv& zsj6LoMDONF{9`Hg{ydyEEQrdYPC!tuzDZC;3k4j}XI_xQW=&3NvsFYt2FMXpGbo3^ zFJ%jG(sj0E=$w@lGc@>eUJzwPJRx;vf4*O!9ja3CpFSAn{gj&b;$N7oBK~cjzBIx6$}3Ir4N zJgU4n&}slvpQxmkl@!`2U+&dKV3^Qve*F)AV;c4Lvh%mf?w$Bw-dg@6Xa8$h+fe@> zQ&R>LUzCWOO-7yYH3WiVZ}d0hHFBO`q4^V3t+{q{7& z=dPojNhC>iO*Dih0}U;Bc6c7n{j>4?v9&x9uC%^Yn+YrF{wZ0**KJWE;;HmK`^-f5 zTLkyWMTZ+2XjzDzl^f%m(WH?}rF4Gny|Sx7jgfK%kw{1c^y-1l&ZAoI_e84iaiT3gVFMMpLS-8m zj$Af~M{Ri;(^u`H?nFvtL2{u<*yFG9kf@alAvvH1IJ802S&Yl4teCNI2}Z^m$*3A3 z+8}-Dlu1-xmxr@a(Xs(~>RuZfC>Vw?g_wr~A*JUyBd4e!$ZPjGxr|v#&eSIfy=7-a zQ_5EML`4$|jyM+k2u9AW!G{pYdN{bMHOb;gW5_V!FWOAX!`b)`E`|w}#Mb{PN|Yr> z%=Gx&EUJ#&@>hw^$Fdnpi|uLEkKll`#i(cpw7Rr=r?4$>b^BjSp1b`K;r6|@$BNU+ zZy{nO&67;3j`h-1z?S;mPzy-5%DH353~EA$*;^@2@T*)4js=**xGlRkTZHEb+r=;MP}pEfRVR?)x$(dx|&F;|Ye$Y1B|dba$ML zQfdz>dbhUUqj_?fx@>aS#i{^lz$$=j&g^!sz_VdX8;RVjum_@ zG})1-3kRv0e=dK(-L#e5DIg)c$$m0VEm^LuttlvH`N9?@)9adjy3a89_WwZxH(zih zvH=mQ|3a6HjP$*dK?^^_pdl=8F$Hu7o}m)I$SgpO@Gjuvx=7V_j>TFiULQsJ-MVJD zMu1f&#+w5_7q3OJSZ&bdJlaKSH-Ll)t6}_wd$kDlIgzMTChg9t5GK%5CCO zeDr(4)o6-#{*5%ZX~>pN)>E3FRtB4>kLy5Y@k#ImZqY`S#fDs5x3#u2EyfMsw03q_ z-!NKiRv5vs2VSpQm8__sg$;9vlv&x6KCy8UdMH6%vbvTTuI*c4G8EB%lKBHYGc?Rz z<`0>L#6ZxSzDB_wO*+j zU;mC`x8TTCqsAY{P`}O&d-Z}Y-a(A$J~7XXKEK#{Hf&&X8^hR!VHgg)Xudt|z2R6W zajayU?ex;qAsT8`IAiBEbEUfiO2lXb*7o!TSd$lFXaUX^6WlCO=LxxZhT%^f zA+b6lQq1M)!!V`|mGceQS7S4t3u4Q=?kD7Q!$qZ*eue{=>~uAi6;lR+pT3tTk)1|s zN>AXE*_W?d++l2?zn)2k@2t9-j7{L|fKeSJZhBKgT@O~%*ZN+=&VEVG|1xxpU)10Y z>i=`Bjz+zsK<(;&KIS2}{?wF~Qdo(`0d~Q>&TkeT3|2Lb@J#=^Nx5+l(p3npS(;Q; zv@K2nUjCjAr)NtPJPJXR9C^d{f(;67_Wg^b_* zQzO9Tx(~|&tec=hUL;W~A$`Umy&qOrZ!bv_5fB2UOeJ+L_U$Uk*qK0OdrwP9$@hmw zh%^8$VWy>sp~r#k`muBttTWRS;2Xl@LqA~I4A{?kd0KUNW(1s(z3mED(Ie^|*ss5R zHIZ>;9Q_Irn%P)Rj&2{A2M85|HOvZqkQ)V{w~J6o8Z3zUt# zARo`>eldY&6399o4T#~g0=h8^m~DVVA7SwQ+tz)7B0pI?^8jsN0XP-_nw^08`h>vo z9a0b#H$c1NHBHiqgb>c$MC%EDyE|iIo8LH20*~9hwBc8{KWbt7t(`fxX~Cqp&9XH# zF}FABivMwFH(eubl~#tqHd;Cl&^Aw7sj|t;uRc*1R*=}!B3JOF3m^t7)YN;L?6{~| ziDT7H`vdFUbZXFHf9FugYtj@X`!ive{MFO|b(OUio9}jrDJQOBk^EM}OWJa7uC9W& z{DNOa)!M2oF5L{;ymxL`lm6zD*gW!8Qy0dLumkJkA9^`dmhSELZ=@~o%@=0;H!LwR zQ;YwsTvaCiq6l?fDLf;T04jBZ+5&(S*ULfri^Omsz(w+=u|7=g-UNd6wlP0m7D}Xj zNVx0JhYa0$GUH8!U!Yfw=8iLs!Rm~FR@+xl=h473v=xuezA$j_eUpTa)E=LA`oeh) zs$l(lB?5iGNtf3-C$=SZyD7n{&V6Mh@j}71TEz%s7qjh{yS%IO+%)T?>yeYrNyl2m zmcfrU?@-@-CO5sQv6o4fJbXa@FeO&*bo;tTUlG8xTF;{nAAcA>t5L$YX|r6)kie&p zd%bPS?3llkQ(yKnuGJObKVL0`%wdVhO)^!`z+7qZcF6+jfe!5kGG7Fr1>8}g1Zr|I z-JZ;qvsZ0I+Q@!>V(k>MNOz?s<*w8Eh)2sz$^Kl-n|hxLHlb2bw~? zwibwNYe$D@nfeioeF)05sK&CXwk#dF*|$Zv;{ZfPXl0n>GFT;Dc#D$?BeD3iy`G`O zr9!l|`Di#L}T@c3*dH&f(93X3#q9l=zo}TMf?Km3>O^m6?kw@&ppK8<0`QOwL^%m zmD$laDADEmli^UCaGxzJgQ?6r-6*oq%LQ+(6)Xd`rguU338Q)2f~Rer_mz-(>*8s4 zjUF$2)%503$wT&3S%>p|#SE{-8?$u_6M4c}g1$Ihg9E#MJPhf0if>a*SzlQ=?@yUk zGrO&0HY9ys5iQC4uup5V-cqZN+(?t7pzLYv>53w(d|2_cTp%>{fwIxuEx;2sRQtu% z;8xUhWlUL~*7&)|erDY8Vgx+tIpWCuxc7QXo@#Q+9t68e{y;MRT1k#of5E zwac7SV&yBh9sjVPFTYEYov0hZT4Daa@#hZ}F~~@6f*EzD#_x1;5Et ze<^2&duV+hHmy{{tZ3~h15tb6?%+bl`_&Cc5K0c3$IWPrA_^Y32C_us;X#qw75fI}ZmYEkcR`L^I^VU88JdQ~QmtZp+_=#(R0+1_Nq?a*A7 z^)~y#xWvHRcK~J5*pDJ$9Z_ql$RTh5<=CdQD6=4KEBm+=}`UW|D59-14j z0%3_Z8clqNf(hd{=ZnvgE(|tOfO&DQt`Y!=R*73Ky_Wv|gJmn%y2FO1vigB8vp_or zPM49`4>0ELEqiZ1x{!DbGGRw@>yK) zD$}%@YBNob)x@>lzl8*c6xOK0Lw!EM{QSgpby6+XbsVp5>%TYNYW9RKt=|+XlkZ#O zzp8X`UHiWsHVWeZuJpjaiP0?3p`gbN*o)-@i+D~e-dcyaC@GBr!?A+1qG1(Rd=gHx zG-t8(3j;(GU&y5LZcjPpTm|h`G2E62R_SLNXAL?x6<4hS@*cBdNyA5y6UNM-%*`gh zQsscc(9E-!XEn{O%B#Yn0x!8G(2y{CpRH}QVmd@qJ2_+PvbmnS7*_6(MptBB=#R$} z-BnY?xBMQIl56Eidh#WLZ`+)B`3f-l)H`}3_SrzQBC92i`@yEJ@x0zWLaSkVd`zdy zodCHhd9qFsr9ML?_&r(2Zygi)j9j;+&El!c9j+c91kA6h{p}zy{JT7_aHPS0k5i@$ zq49ZknN*z>_j3z&$vRJP2kg#*UP9{X)!R#1Dt}%0w+GPd`BgY$wnww|x)xUaa7!nh zHsQ$&Yhv$P^WIy^NPf5{4O8}Uk|hwvxQTYKUe_DpJTN$#ZefyT7PbpF)W^^!e2@~v zc_9oX*5l9fW`Xc;Fcb{Eh|^|{Y$A*bU>wG=yV(s^i_p){%y)OR%iMrJ75w-IWAv(WoEYYNi(yLoZwtY};XiJC z|0hLDvydkcnz=oveN>JD)+PrB#XT-~^qZoUDDZMsj@O7xUYWr~n6zAbe_^(z&g+&s zQQIRhjp87tPY{%TM2S4#eL^wCR5E^Ijx`5z-`7L1B!#?*6_g zXYj=YX_RW6PFf5kp7F#{>^KUgMP-I{>7WMq&znLQPKuE9i0Qw#e@6aN=v!w~Gh9}^zGO5irfvrwq+||wm_UXr(B#luOQthy(M^M@YDJe~-UBLt3 zvEL5=f*sN2E9$@cX@~rRuLEHg3^)Np1`|KqV9|D`Zn>Ie%OBvIJxs(D<_k5$Rvv5eU4_#?y zSP8$aMaSq7Xim(*tvn&iWncg4WH?)f@xCE%<^** zo^~Jt@BG&X9HKhxi=_XOd_f07c+L&Y@LJJLuSFk*m_kY!hU703>LBb(_XK3}Z=?I# z?emQ}+aGKXzb0XYvCW;|sdX%1bxFl!Om&f;R)OcRR*G=u-MW<}C9m_S2r=p%}SaZ$zl0L*4fVSdf3;SbdDr7$Ca)}&eTz~kQq47^mltV=% zx1r-Mq^2#RCkMF4x{VY*KmRfDOf)8tWE$*LVv!DRp$AZ?JViF8Eun7?I#PI71>w$; zzhhWu2hmwHg8|Th@J{Uai8qFkyk727zLhkPOgR=LDd>_V(1oftyL}*zyzj1)9$QCA zelGZ#4QcXQux6y4Jke;EMqR>2?9rQr2Gn3`^un%}v;kbP+a&qk_G1}ekpBuu!{^tX z&8*YtAg-!C75u|z^aNln@gV0NN(JejX&Z%+@M~AH4~0UPGYzxCZLd;khi~bE+l%ieK*8N43%Ob*xU{;Yf1K{EhhFd>e_)6TI3{Md$r}_!zJU{+)MUZwSbz~zG zKF{8KzfU3#JW?mXtbNl(@6rQH2nAcnGdIw-?g{4}OCTJns0p8sbeM~lqQ0bb6PD?OM!}3Ks#<6BO*bNgbmq+G zqvAcJEme4o9|q9&w=6nJ%%>NwdI7C-}SEObbxj>{TG5W+7YWu${o9p>OE89f-<@--OZkF zk7#Bv5x&PK0@O0mEy2WDChPXamFffQHWR-Z1^a>`X2m?4bj;wCCI%+#7q9#Su6v3l zV-oRf438Ggo$9C~3|Esnxpk=5Z#&1LI9~!91=ZfQ)uzk6e(DI-)Hy~NG$oF$E0KN$ z{2VF;Gik%@b#(?~9P$FJ`3?Ebq!WesN#uNOEO32PX?hcsY~8J_`bcLp%A!tnIm(K5 z&<{JrG?4H6-1OmVx53OawJ+)4jwE)~{3R{nS42T!$Tbqs)>w_U`{IH(M8R>QhxQp= zb`4#u%M6d#oWbLe^#ym@o&}N#>3I1Y3X!v@(cp&!)0tC$X&`z<3|i;6#MjxoXlZGoV6pi#{4uWdofePl{Ti7S=h znQ6UCME8W>gjbx+rz+dW&>)V~R=jG5hSpcQExT9R;1?h*%IMV~$dPqbl-xsk=Sgu- zjjMelxq`Q%AG=V=`uq)L<7Z3VS^@ZnDy&+ftB)gAo5j?9kYPNVa@dx$Rgi6!uad&3 zebDJ_rAKlkk4B^%(5M)c(?4;Hv9S5qxkC8eA$!RLUHNd&#*(`U@xov#nz61X^#***yYIgXZCOjbi<*QX%*XnQa zS%uQtU*V6QQ!39n^1@0p@Tv%5%2Yt=^|QUm2R#i%GO9z77T}hmPg|J3WAD+dReI?k znwf`;2aUQd^Z*D-XYYcn-@l z3mOd!D&h%1S?vqZLw^Cb)U?KbTMhYd#DnP5V-pUGyMW(ja@@%PovVkN24h$jBbblk z-7KGi(FrsWD4MqtYg7-Z`0vF8s>>Zt|M`5adO}hzj?I`iaxB6!JyGxOjCbln3|;j! zAWAcXeO>6MV|>n&l%+TdllL7V&bAQ?oA_D0`>yz_w^xw_@A2ZQHhO z+cqm!#TDDOZQD-8c5<`UKKtJ9tfyP=^KpzZd+)9Fzrpnpnq>b5d0^M7On<#kmohI0 zI`vsr#tayiboDA!Kuds9PZ`2rQd>#GvrQz*vuBAq)W4BXOnzQMlu@9&mQloiT0qtD zjustz`KfSQ=6}u2vIt5)DAWnv=TwtJyC*Nfg30tVkx^H^oD=EEyK zfX%K0#m(sOgxJnSQdu;SPSgVO2adb5W*mtIec;#iHT@PvywUM(U6I#d?G^Ig z>nS5P^8AsGnwQlK-w!U8d!2dRAz&7Ec-c0J`^=bm5|M)~i4?HOY&cc26X4otbLm-v z)LllEBny{?My0%^ZUuoi-Rmt2^gM4$6WqX=WetN&Hziity9F>yk0GM0j3+n`4?ZCK z!4aWljU&8JYI0p*IaFdcV(-NIZj9bTzVYwKA|!P~D16MO!rt5;ne3LrHt!5dDwV|I zZ>+%14$YX>`6dfu+*vQ%npEElr?kZ~L}~e_#yIZY#?Tp@(4g8QlvUxJO*(@6SYO9Z zkC`9;Il?5@o_jIhM;QORA^t0dhqT?lC%E(f>xaQ-8o-y}PC^^SmvZ|-p+_9H1mZ2U zQVB7Vk{Z-sukwl4CEAH)K#c$a$C+P*c^M0~{H*_wjx*~8+O+(5%t_LdoWwbB+GYmT z@tp>t>)A41eOOc(s#>`~)V6^%#c@-td2b(lFE8z@2K1hRt$|jDqElfw3V)A?4xTNn zpq;KQzS>i>({rj6ScQmC_+y#hso0t7qrdw>{k-JNjjS8s2=a_bI~tQ~198RQ?J!Bj zSjQrkirMGq%ma1mf~UA3E-GT?aui`D5xMn|?^4=Pd2E;6JuU}g3rg}dHc6=91*0lD z_t|I~Xpk@8X2vO*9YCuYOe=#2lEyj)zWIyK=wHovri3yYb; ze{6oUfD=ExpGb%7A>pSXbtAnpzLt~k_s$JIijso`E1Ofmqt;IVnAf|zvxLn;01Z|G zV`IS1T`I+dtqB0dr(ZLsykF=Y92kvU!7sA{KQru!+tOa7pct1oyRS1jqZ9{acIUP4 zf`D?1W5T*8Yg~}r*jpTY;4o5=Wv*7^Mr(|9yJPEt)&R(LpLYRb>&<0FlHs9a#<-%W?8s=vzp_8k9~ihtow5YOE7|j?=l#FOuB+z^FXCta{y%lj!;_d*KNp+3E!@1NpcxV#>wTJ5X zQle7x+;d-3=CxToO<2z2#2!Z(i}~?-ofLPBk?geLln#P3WJA&d981Jq3?>u>F=Xt$ z6bfbv#tX86T6xTeO!)6I%HAOq^-MW_H}@97*?G+%v#sLsbL#WJgH-TnfmRVn7pog^ z@g??tLWLwfw5IRb?4qGnvHcBmqx z&wv$FlD!bi0Qg=cqbdj<_J19wwkoD+uqloqCO|2snxAT`Mm=QvYueGnA zbu<{$TUuQv#vIxIl$B~8UlDuxkJr`rNQ=*`7Duh&iB253=aMQSH=;SDOXe-0yFkoC zuCP$7?x|+N%VCXn8)n%F;u?5Yz-oPdK#qcLxW+V~quys1nEwEg$wuUm_(Z$CZ6auNvYw;7;jJ7#_R*Q7(7XTMYIc*Hc_msd8pv1OI(81 zgoXO8iM7|qY`t+cI%`M91vQU`mOT8z()U0hfd-5?S8XYyI^Y8q@goB6_gN1BxL(e^ z{*#$g+6hK9)(Z)%av&EqlopxQQWK-P(U4E3a!PO(u(WoHuFF3&FUh~p37 z8Oq?lKdRs4Im`=}NvEgC0>O>7FCzmO*4X@^30}fFt&5gy$2K(XLv5xYgEg_#g6+sC zmh8}PLn5|6^ev2Nvet>RmjBL0n zHln-<9wj>PU@MxtWBssTB5WkvB7x9m4c>s1vm;Y=aVa)+>p*_^^SFj==^l#zlP_P z3tG=uF1`;Wu5tHD{1`HqMfx%R6BB4n*S|sU5F@F9re7!j^C-r#(VlCnItn@ysnfw*z%hl5`9k4|M=TQ%P49{Z}#L|t)h{1&3=p^VE& zr>M|3NI*7}N8gd+vJ_XioaWJ?Rv0|yOYXXTs5kr0V@U`_d8hAynpz9!-_NP(N6OcF z_LO&a=4H&ryqV6!&_((#FrAglP>qrdGd7ZA4Sy_Uq$ZRm{c`r)qWy^fhlX@qSc?eK1IT|xDo$!xK4708`=BvX3|WmJpzJS@ap z)JeOM0%N-ec7vR^^Wd9)NVleN*b+}j?9H$=gX9_qoX`b%oIU7%V_UqHGjVrEzN-JU z?o`a$D@b)`apxn!<3+LY#?OAQlG@9#I*?^~rEvNK9k27mA3U#U6A9L^TfkiIzxmXa zPJ^jCcK13>KrF_U?`evZ40O9=#3uS$>{TQ>N0^lnPue(24MkdNCbV$0X&t9bz`eku z=hvt<4$A)V;98RzZO7ebja2eEb`!Je?m^|(5U4{%(6WJ&+v*@GCAyTXpS;_vY&J(A z?KP=X9UV$nfABkEd_=CWXtA-)xXTqAUip$?X(m2f<=2qIfqNA1t~@2H@r|}xSW=%! zt^K-Ifa04_)}V-h=`QvVMp#B#7<)~0XA*N;hNU@AVxSj2?EAD*Q#^Yho3hVSv%)a&2~yDea) zwGs3^Be6F22!ku0@$`5P@zo~_yUc`7^w7=#{QaDH;OoBKR;s$_h%@R900J4$K4gB*b--n|!|X&Zogx(N>Jod1tEF@(SWS6geXOmVP{h!moo_2NBleR;mF+ zL&1||i(~n02j1WF)VAth2X$2`%7Io|##Y4{pP*OpWWGYf3%2^db5iviAI;FYQhcKk4Q3K~@w zyPC^YRaZjC%t1~c1B0a<{Z)*_9z&YeUbo#`0V$Fc6({KchMzXS5xZuGcfYImz%*+--cZClkHC1WR zjn-E~;@`b44k)$aPcERbi|2VAoz?!l0U1=f2Z|aph{!0CyFvF;nP}VA5@&-K4iUC) z3;5FFF@T&YxDl%AhdtbPB68a6{=qKssJ+Bi`{X=~d3`}93vU&8%@GwfKgj$uXXm&KkEM$7BhVhV^!kWV+3wKgps0vW4of}&HtdCWVZXWaDeA{9- z9?S->8;^T}x=)e8Cft4!qG@NW{`DjM>$jq9Opmg5aLKGOVPH?@Z+reea;u~ORv<&) zzyW7S7=|UhF#B|*BCB%Ma92K>;OK(f2kK?kR<&vKJmx0M+DB*MB0kg%jN#z5Pq=Ps z7S8)##+j>~T_ANei!dY`MoQgM5c?6cSxX-xYC>Rm-3+k1O#fBBA!)x~Zn z<-Lj7wv9JR6Y29COer86^NLm>+U9!iczL{niiv?gm)cn^;@e{tstQ`CqtF*BOO7y*wRy3fM@f3wcd$vqAf7-iR}` zbP90%m}Z5~lR{Gl@CU?BUI}fH@XfxM;%`2`XdmUVGXM(9Ao~k#+=}I>$t!Fl@eS`~ z(PnY1!lm-$Koo7*5g+pa^?H_>%z^g?gscZKAaEZoxJOW}l04EmtuQ>)eEZ*mTMv!0 z65CrmJrTcBjFM~E0M@j0kjT#5%UFvw(fgCPcvhx(8*=hU?!N59-{+?`iKvLxbJ3e{E<|?F$>*qvLGVfXC@0 z*1i_=FO?W+1bSX*Spi4)xE}Tj2twM@9cs{ZUW*oOhn;J#(?GOQGOX;2KMn1gf}XfR^F;!V#DElv&h6=&z!!}fAQ5>i z;k=qb$hkrwNAqGDCCyMk$e=No<1tx+=3sj`XzILK?)C7WLKc0BI->WxkX3^JOSY1{ zqn(k7)4$6Jli$k;|Jy)gV3T%K(M(eS-T!cgWa|^CWm8v9iE5C{=zVunt+QUXnIq0- z41#MSspR!}OS*qo`QDn!bBAc!!>CcB(4jyUOZ9V5DTJBYzKJ^4k4+rV&?i&WGTTYT z1UhBPXR29}%4fAo@V&h@=)E z9S;0aiv}GX6ffT+qM)w(Ol< zXqA)$2uC|Lf8m|_YkF77exwxGI`mEkRJM*a*0jNB7WV=d76vCt>CLwN{Z>0)+=~ZVGbb!N7;$A*UC%nfS~^?M)iv~EVC0I)k-30RdF7&oX(^jkFo_qd zd5Y|VZlxQgwa>}zs%4-FAKkE{xp*qD`!u-;#la7;9k2xv#kt0X9Eaz5_w5Aq^lw?96@b} zWY$FSrDjtC2cOXrVjX)|68GMVVJ+^as^+9AQ~}?5U0<}A$gDU>9CIR+W^O+`hRn7- z3X&alf1Zi;$gN}m;ydC|Vlp#lvkxj_^zrlzom(!0``|N79^e<;I0FFXVLx!G25~Su z(4t>m>)X?mmE=*lY)EY$)i60skt~)&TV%UZF1VuXZ4Y-wc0{V<`p zhA6+oF&{WMA;+-8cKJqSE{lzSM@{fcd*q8O>c$z0)P%S)79WYQfj*{C_L4=pxRAG$ zNks9Q*pmDH!U|oohoY#}-8O>+fp!81XN+C>2~xT>kwb zRI2~K55i6wCTS1PE)FgbQ->r5Y;cfuHI|YHVuG}$`4?At*hL36myD0Nwa4%6Dpxh% zcj+k;WQVpNG!~!-I7W+k2MaytRwRY;rjMbf%wRkbd6Lx#-laK#t8Tfp{4($3HkV8@ zMF+>^hky-cwaw%gvmb8=t#a9PJrg3b4Y@@VBX|l$#@;;4rt2gFn4Mii5@moD-1 zeg2rzFuyRwl^{PU#wiQ&@g_!t<4(r)UjtLl;XQ4FvCHsL0^_CaVbcWA8Wcv{C#i+t&s0Pr*65i8J_T!Hpu^tPqLXJ}pK!sjz z>rXpYvh$a3PC{y#>g@;&RGsK>JeOd*KTB%Vy}I><}OZgc@&gX zHND&_)9{e?Jg6MH1v!CO3S?YDnqI66Z{at$By;mpc_FWSR^Dq}xM zSkV-a!R$M_k_vB03QYb~l%)YWKh$rNZ#UT3G!@S#1q3zQI0((;k$^33Y5eRHk~6U@ z^%TzIdAN`b3Y}&%7`uk>zA!qudzS717E5tsEV*IMYCabzCZT;9yQmy(;cfT@&t*rcg%Amg2JzIXjbtR8;Ac}lA2d|ELR6mUsth~AdKn0c*x{f=yL zo;#6-d*vRqgRatwd$?ffpPkzfTjA>$J~?tnK89X|<6yPRofpA3B>F`d_>0SHF9cF{ zw_^d+ijPDlH5$M4Fu0-*xH-0Nz(lJH&$BD^qqQKCR-6Yc&i!<%zsbcej`>A$E!a{V zIaSi3*`#lc=!vczdH9;sRb)`82=a9OG_q}0lWh=62j&-Fe(bQ1HPWyHl8wE))pS>k#Agu%xEO%vMOtCgadFnxfT}{ z4@BP3zM__Bdn{{}84QFh0dJ#h2>oa$n4AvLrXji;gLGaf>vzn(G&{A#zIEMTn=3kY zr6K3qAwmLk332Vr)+=dIK^rH~<=avv$!`L+!Pgv79{B zPB)XwTp2$Fhyg{NN%zxHG}*r2*IAkBSbn~8K50u$lfw{^lEeCfOSpDs?oh&9fMSrZ zo&a79wgZZ!c$76WGF2wh0tyOST?gY7y$E_(ixPHzSMluv+hu9XUFaR91G6t+r^hu9 zxvaIg4DpFYgDY|H=2LA-3E8$f6zlMcs9#nJlM*FB+UR0OJ^%K+HC&Y02}dUEdVj-| zZWyJ+{&|Y?wMn4R^P87Wi2^t(d$84geaO*KxRo+v5o2|Q?_ee4cF>vX02OL4vT@!2-tnO#39*w~$SAv#J-qqZRE0{->k^Y?YxbkrHvUOk>gu|Ip z2}>a{-IT3qc)4vuSq9VQ_Ou1A@m#&9>VJ~+y5ReX#lM?+)xT}(6-|sS98HY=RtdmM_gMBM;mUREMv*?p>oA;TvT zae%*zFQGwIrwmI#jk1Uqs|9=^QVSg*4+W;vjX;~umIGl2(_$!#ztL&%{a{6jUel)# zMKQv%V;T)}r~vXDq@8A#nci`{frBd1rzLXlcI+~y`3?0{YrtdE>n%qSW09+G%uADr7%TIb2pDq2t&b zfxya*)ob(X*o2)tF^q#LE}qNflD0Rn15TheN?Oy~;T00b5v2mjs-WM;7y4k0@-wzU z_$vQdXvUZ-1v`qmZW~wVROvE?pl)iO+2rwE`>-@!q4^8TU>m;oG!cUtfAhBm2Hjz4 zP5D(+bD}p+pQICD*1QFHqXOww&+1k43juFN zQ)kSnc#z$4ZE#-qf|Tn3+otMX7F9^A24sM`T$AzXI#u(~GhZN+iwt)wKn@%0`|WaJ ze{*;&xOUd}qBBIy4q73w(S3s81!S)Fi0mLLY{8`}_)b{uJCpQ`&Go#&sDDMF-Ej>^ z_s}WW{qSlsR4lwW31HoMty{=msC?^8R;>a6vF2I%qwt(Yjyj~k5069=O;PyDAt^yX z|ENPQk!!1@r^MmrC9NV=Ri0~9!c_b8CypbY!bP4$dV2i0-nIcunou49p`z`|<|>dC z#jF)FUf{QhS{+pFF94H?3xt~LSr5A%V(0wko<_!W5QeHSp+9Iz_S#fmP?g7*>7uX& zb1xIG?MxOVj(=)ZH~Q_i#WXNvDq7wK#^{IXCAYK?U?d>2Y9x%h^ zHm@CR51JYT+_zTdt5{lW8hCE9(#MS1R%!C~kW&l>0uEC`BC;k zluMf_32ac83{-KF$SL7*wG zd4xd(Df`Pr!9G_uRzeyv&W$uti_KO#4{J6Edm)r8URl`0!Fg?uL!pe_2Wnd?jxtgr zR}!H9%qW#H6q$N!JVcMs=xl@)c25<_ovy9~ISo$1zKZ)}MAm21LgMrdKOr`4t%E|q z+DsU{F1l#@K?og>PUYuAAA)puud3${$UIiwUc_(@z)>r{RS+Q#LWnc$)N~VRk@+YR zd*6lA-=uK~31ug`1;3wqF;=PYTipgwj+w^}sHdk0B5b!hI0iY$;iVrHp%!4MMQhmy zL76yQY+CL$$3UZBjQvH2uts(Xq+}`gbSXyF9JjW$p1nW{a`t5SLW0q8ob6ZZ4VT)J zRw%##zO}ktOf>HqGp<^Eu-ecu1xD2*OYS#9pLmIg1nd~1oE&0Y)Pc2G%!P`>bg?Fm z0T$U`>)eOdUYy4sy%=TVBMuW%Dfj?p#ZWx=M0H&?sd^-4^(ont{XlL}Z4zwCM<5WD zBo7g$ksDywg$8Y88VQ>xv)u^u`jW{+B3^Mot4YiQZpPieos*3uFy*fr6apZJQwO)Q z+UJCe1lfqCba%4vWu0lw-0q-&gwt-@K^q|s$a6$v>oa1}wHsL7C0Id=$=uB5dIPnf z$IC0PEQa|0Lm}MSnp;eSr#}v5XGA6EXA$Sn1&*<7D|HA%+fzwTGd_pN6FQATSgUB( zUcxL&L^n*d&4TasPN>(xi7S@kd+z6@TjJWL4!4!y>Mu%qhhoRg~d=lI;rC_CUuDc^NJ>Fr>@HX`;MOqhebyux$MBL@cpa#+*pq57x!Xo{m~OHo23p5`X;L7q z^dVd64_dE7;G$om8M{#PFKvt^YPJfVawnPtLC@F7*P1;VLsG5KEAlWh^2V3z@15)A z8t6Q~I40qp5aJjc!g(5wMi72h$kQn>0R?jo>eM8`#hum{k;35jzdOjYXZ?9ddmEgJ z(lcr$6lU_AhRpSnDR}P{K@==!0BUeTjN7g{3qnrO4MYxZwa34vCsf3C%2lh0xdq{c z9+j#+gcfC5ezgJt)l)IzNOH8It^}*@UUR2Ev(@IEh%~WZ1;-(-D1Ij#-`#97cb!)j z8||&kF-+|Beh429t-*440y~~xHtDjQ@f52fw*Fz_&p$Oqx8FQHzsyQmybO37Gfq$B z%+zcKPSe^CF`^!*lsqQt%I;%?4QQ+34U263it|b$0VIzGvC~xC$S%!AhTdwghe!MS zl%Kj~kD(Zk|NdgIoveQ;p-nh@q`B(q>elU-b}NsA6o-WAmd@KKSKVWZrJiGDG`|dg zWEh$_tVIO6yKq8b@@+hAQk<9M?Hc!eizL}&Qd!b*MJCE+zi z66DwPDs5)?%ok%TxWjxeQXh7EUHt%K{}V6+A>sk*)Qa=viMFZzKv%eSdLx9jAU@;u zlt$<=Oy*pq`*vT#d-Z##)zy0j0vZULI`fdMu0IOvS7NQ+<)~v8b6U@r2cNMJoG94~ za=+z2I~RJdLAG3Hf3g~1ZziuUD@q=i9$onkmb4evCwqEH93Oi)Rz2`VmJ18?-J3|k ze^7FX!cNs2EZy@X3 zfXMhz$u+WwmA*IvUdAw26s6e8xLj{ji~cO_nK+6BE1j^n9dp>9oJqN*_S?Ye&S{hUM9`9)T}Lg+?2duzBPOs5608P>zUESy;2@+Lc= z>G^meeQDin3LI-HrnqnGnI;gE)(N%F$J!%%elkg8uaaY9`6i=Pqmo-<3h@n`Ix3nz z{^L%KW}r3hm zrIy8VANMrVL=9--*)@#K2mak{Kq_!;W--Hp9R7DNKLO&wa?rtQfA3Gjd8v%db{b_3 ziPXM$^t28@4hBt6r{IcaW&v?`cZFYIzf6H=H)fu2$!-e+Er0zIFo@MA>30f#r%On) zCL*idX-qyv6OAQ&suMs$f>EFYj?Ao0GZEDMPzHg1i%iZ2+M)`y`{nB(0qYlNeByKL zrL0?o)1}nHJ_m;Abwd@V@i3kiD~_aIi#rIyiY;P9Uyk8BQ!;KHo#GFrv-qj{9K&C_ zhRFzzn6vB{x3fgNbcxrB>Wo~0O3YYybua5HL-@{A{ji6(#{+^=3bR9HXT@zBz~4Vl z8RKr5zF$`0KF_$|4F{Z4GXa9T>^bg@rv5qr5=QF&YXTTT=dsT5WbaqfhPK5np5);t z_8*p~^u9)}qT{E7r-T3KTC;JDQJdeDcJH_0^{;d-MH44`J6orJ$C#5TQgT=f@WWSc z6yD)UG?D4|E&yw{=0c^)Dul_NCyzVsWEH(u)$c#@La(-J-IgH;;uQfYy#lguzK)O6 zZU)})%JU=`8tt2(mh=6gEtTCe30`=q9i`4ezQ;lvC7`aw$zYdSqwi zMkauUnyYw9mJmo4xx$n^xVa+M3BgL%gp5VhE;x$Th5XQ~sLUg!I3+0{=?=(rMj!KU zIN&*T^$Oni!|C3_Xz0L&_6)X^DK1d@k!NN1@$fdtCzAN5B_^J>yxRx(feLoHv=%dw z)oP%Fg7SD_4*#trjKk!t$NNjbL+apK-;uN2Zhebql^G1U!3$|YVTF; zTJ@IAaLd4xgpO3Mc^9LZTiJ0K+0YXmRm86irx*w5r&^!V(#9kdl0crCC9xGFPtF6t zJ=oh69xRnUKaON17Av_mV3=uNC|pOL&m$U7Kfq&cpn8TlTWCIIY!Q^kK}W7Gj1Jwz zv|7cy(VqZE&KV;%4)1o9MLXbFuwkLjCKLXTdg&ae7A%A0G&4mz>w7qiPGupR?r27+1OPrrPhES{^7r*EbPoYz+#7_Jaly7)_0y{kZq9}vI2 zI}N(QU7wYpy`sUA@<#*}t~G+Wk5nZuuCYco9TE0L;Gd)qvc1zks7bvyLy&ylAdnW& z8NVL7Zd%z2x`s&o5Ci2}yuJyHWcm>_-i=eOy}E-#F#GZ{foY9GXC|HaRa`UrSt*mo z))gPu&EL68P58Ffd&cY-2iVq=4kPI3`3>8IyyA=8jepv#?k;UtHg)a0Wo#3>|8E_5 zbW@^X8%y#ys{who1fb64O`bq|P!pZ9x8>`Wto=18Oj8 zt~rB$Wfc$BB`(QkMr&h^&pmCCb*h}!qa8M2L$g!xCld!91T!ef%Q8bx%VXFNmYmU zNfJ`NPH>T7&loPpEb!3%WgmRx+felIJe$w%0*M}5;8_25s;J%#X{KVayIl6o!+vz6 zFpnWC3694oVJ^V|BSg4D_z2GgoW8lz_`wwfAwsj+Dje_7ZlhftVG?LXfezH#1R4WD zak{!Ys$TlGn{Uq|%9E*98$raC>!h2zIaHp~Wu)4ocl?!{s-pk2p_!#YibNr;!9ap( z5@nB_1{<3uFWTolJMX~R)g==?OwKR6gS9vhCw%HAV{Z$zC=TxYsVErHeq$OsfbgK) zmpUcyMFX<|dJ(d&NS^n~VnNpgG3xYWA~sw8+y0=t>pE}>|0>DJS0@Uj8yELy9y03# z^tP2w7fR^yR8pw9-m{b2)O&*PT*woUTah@EtY!nAesZQC*=gAspCjixos=S(ogty zPuXRSwidD3se<8^CCrAEcE-x$f(h`Th@tB0Qm6*Yd?FW%oFPsMNl~Wnv>0o+Zk%t_ z%9=!ZOOOGd@~DmETO0K4&gR{NDroEv9WA@=R7#{ia)pQ6ri#JvHX57fD0&;hmgg=; zagoVisAXNRXcvK2-O-7!xc1^MjR|@KdFa3V%YD{F;}qsUq~hhnO-sC}L~8LQj6#E# zIJL|^h@3M@`srGDC2gMrvH^?rE_jC_iGv`s^&-J zB8Fskaj@iHF`ALU>C~vJq_(a%PHQfOry5OWOFf@D;O{BimIc{d;JmW>Q_+i-JM_#^ zfmK6{h)7Ix=;!G8-9aqjxmK7&J;Nue<=P(`Ah&GqG>x|VmW*K}kLlN0h^2rr6z86BCnbw;x53B(W%knmd1Ea9v_&fM_rlKV+By2YMvxdg+b6juaj zHwNmMH$CP zVXh9zScc^=jVX15AFmacaSR0p?0%n|GwQU8@Z^w$QxE-7~QJ{>pQ{u&k;sC`Ss}2ufSH$A)bSq`#{OShw4g`Qumvg z+M=$V-Fr)Y`(+T4Nr=WuMC)}Ab|}|j=EP~Lx}2icmW8kkkMi)5H9ADMLpN?#2B#J@ z@;FD^@K@Qxn0J${Cd$Wf2|h+b-B~TKyy5obW-Wr=UE>P7?J67YVzCTMrIQwEWTstx zdUej`e&Dh4&Qf)t4aUcgyVje4c?tEjnq<+kkWve${35Xd<*vwk$%8Fp)IeT+MluQ)Oi(V*r~Gq}!YM$?oE4XG`8<#@Hxv zhqJb*h2vjLD;8SmhogXjWXLE7Oa+2O@R2aigGbKyFQvn}8 zSD^--80W`SHb-mahb-=q+|8Ym-HiqFBB4&a(v>tg+8C6*=O&o$A^XM;kqP7(D_Ejd;V9B1lnrX*f|cmZuI$4dVF2Pl7iDdRV(H^}q8* zrDc;6IUe#7eN`Z)`t0U%Ra~6prhVRpbBZ>Aa!2)~AB-ZSNr9tOFq=3%Wz$rnE9l60 z5ck~^3kA%%fccIYLHWjBRjXZ1#e_&Y(6Zsns~tQgCU@9)nr>10(ilhdIFxkp!b4xM zZTN#0R7z`xox1_j_T8?vwh4O|H0X^-5&BmNLTh@&`6FoIZaj1yV2bPK@Q#+V52p%G|3_8KDBHHn!SGnjc(=7Xw7oK8RJ13TYw zE5eS`FPC$H$goKtY#7kkM@*6$r~_!t4lljV@U-Z=8A2E1rcUK{?5voBG5rO^q|aF; z+M_(T0a3DFSQhZ4Sy(N^y9;Fw;R#(wa)6|(ZVuzqF)*c~wL`L8835Pf%z7wT58H*w z-rBXV2-FZ9t!1)_%BScOi(G!-?}ODGkkS3~`Q|Hxvy2>? zcw;H_6yxZ{iuf~{dF}<~Rl!hlLQ~EHcI@=-Wv7C79!{2X?>OvWf6NRo#7Z%!n>Gfj+vm~VLu-Rrcg zXklOwajtTh41Nwr>upc)m)Za_R`FmPsYrs25z#GboX#V!fDc-?WZZWTntm#XZIdoD zVAd={Rbe~^JIp_fhu2Y(x)T|oorIQj+_z0X`egpBFP&?NUPGW2J>!2;)wJLP%+l|J z_JiNrJ4z_;w)YRFC7AbKyoMZgnqk`e#LZ&VKFK~;HPpGU0!|8}$Sy6bGSxKV`V3uP z%Y-Odc*~bRFO+m|-SB#&S9l^1beV0}|Ht$u(i#<+`E7dJ|AzAZRiNZQubPd)|G0if z6~BAK&S|xi9ZKxTV6PETe5mBY1b)W|4s&K6ToOzP5{szPp6=qtD4U-8IC`|Wjp~P2 zm-5AF-9M6MX$36mG8l141nKEgfAn3~%qycZIt!yv_2KHiS@3K`?FT9_Rf-_BF`QE) zf;WN4@^hjsN@gvYe!v`Vi%C*qq=fHZ=0Dtqtey@19mbRId#F~y1xVXAu^g`@Fm!zU z$LpnFl(5v}BKk$hY97O{P+_{+I%?(_Li5Jy)g<9ff4FcJ#T+eEX}CLZF@z|ziDV|( zrEG9=g%=FXNHK!BjZv0Zz!gTWF{S^6k$5kgeg_Ntnfw5V)(ISVmvXK0es{-BG7ai_ zz;QEfz=p@*8XW7;bbMOH+Rdtbogfs@%{hNBb+qsGqwm-2cE4>QucG_%!Q{euyz6LR zb-%mUxB&6$o{gD?o-%&W<<&65Dp5UAuC>t*w-R^`lkTuAJgShICCWc7R5m>T+eC zjf{qj+!`Y;94C$~N+56ATC7-blBA#Q>-j?|fy2X7Z+x)cSh%B$8AY-@tlV%Ci!-^e zBV1=VIFRvemvL!!F8!*Xm-p%z*VQwTt`^FjU0Sj(DHwfm2W`kPNy5m3#hu5klr5cj zWk*syw*3y(4(kT{Wjms9aLvsO=$@Vi>sU+C8!>O^g=bw<>6lQnxALfLc$PpUIYdoW z2-Wg!5xhJ5%nmS}to70HRawlYbItFzV^OHtiMs1=c^JAS`JlP6G;oG}IBzPS52;uc7vteNQmB7|l**5p@yO z03;F!WBu__p|tf;{pllVf07}zI$m1}$bd81oQHLu z_Z=``_mT9GP-;^Kb=Rr1ZWsih$XGe<%L-?yp@M1~9k8RY5m`9)YG8@3j@W;KCR=34 zzRPdj56&Z=pUy)pz8=fQUuE+7I)J@C4_fBQLKnrt1{R;$FcvaT*0T5uNOZ#G2|mWD zRwfUy&Oka-y%WpZRV@h+R;sgwMFljDNptlLjARciTr><+*Z-%rbwI>|iTS?lgRp<8 zXeoW$TP^Ht|GDj1YFcvZ^vM4zS_KTjp^pU21%AqUa)5wWB`Mf1QN&fc$ zDC2k!S%-m3NK_yHd!HVYFHbx0QcQMcemtinn9o#W=(S9038s00OTm)_w)|mdXw5Vs zh!(#yGEx?Vr5?%Bg4E8TpRrsr@-2&=`q*lR~Olh)`iTqWg*t);Ede`=3PA#1#-aa`rn1cp*2=s@#?KE&0=?MT z(J#a)G&1}Hr74W^BmDWJ$G4Y$ASaxc_D~SD%9qlY>k#6tp9oUv*=+6?7qx^~`&%iW znHDZ>@K}};m2=769e+6Ebu;Br77$SmK>mw#90aa783I}I_V6dZK5Lg z*lB!V?RiQr^?Kjgl=a{tM_enAIeDAp`P5^J{fc`Se?qyVPu#iN@^dnIemYMOC`Hl}qeUZhF|L2`2HZEz?|TFP-m$Bi7g zzl9hU3Lb=!S|B4^s$;#46oict2dEniiL!UBNF-<2#EEcA5lPWkz~|GV z8j8dLFC_~4+?ioqggb#2DHbkju9amFs9K$pC~zkdIAF)!%@&4U8PnveNE*99?7YTG z!fspAgdPi1*l*A5c1p3tGk^-9JZT7?T@SYZ2HBsPBYa!XN~W^1f+wt2QDE0bccT(7 zD?dZ=jbKn3D6!EGx=5 z<(P*42}!IKe-=N!cnhWCER3;O?>btIsWC>&Lj#^}C5{+RXZZ6+O~H<+Ds|Ig6gW}( z0xA0N_XjyhDXK#WWQF9DSgnY>Bv=l!%0wc535^W&!O&DbQ$(0bh?OSxs_6~N54Ok( z5`vS5)YFp1o@ke*iULvrZ{I{Jh1|)^N-*1_X$p!LqP9*;sBLU9Zz0E|lm`PR>-f^7 zRuv`Qh?<$1q*_JcKg(5Av_}rzYY;zu{~yZUu}!lE+tv)*wr$(Ctqd!}wr$(CZ6m|B zZDg1oRr{RouKM)u=O;YZT60Z|agX|mNkw!os4JhE=kzEL$>V-8#dU>yPF1KNx_Wo` zUC|~z@`5X_G>+hP#LRooEt@3D(;0R|1>+SmC8&~?0;A40h@fBb*9EaIb!PGvVjpa*gOhYMy4(f9$Vl5|ReT**93^gL zL1c#uGF3P6U+!dUT1xzpx0Jz-Me-mzwJDKgdT#^+FbA9A~>Lm$ZIT2WtR(moJW z)(BeIHsey9Hs>Ek^C35ocxH7f4Qm5ZuYw2y2S}#FUhmzMLE2Wd0lhF-)@&lBPi2JW z>pw>NcPsTO7f-#xBe_~j!flWOYw>o+!q2OqBG87;6Kcx{O|_IH#BlLRYY}PKj2!VN zb0d7%t&8+xyI-HEvepVnI8uDB6hq=Wd9+(cer3PIu?PiBGJY1b=2N{62#7GDBVe@5 z^BUjCRnzDX=1J&{GO{$E_pAeLv)C?BWGHzt6=jnCq#@dMaW(UmyQZ7C)hxAAPZ))$ zpN7?Fz_Xrdcrg5dJId_5bf*e!>_j4m#Cn5z!*Wci)@*EFuT7sWiz0(pF{$QhJCw09 zmM3XPN^KAsxpioAntrxGjcyTfkE*BeYkqrW$V_QMbEFah+Fy3^gwHmGe=7rbjdryA zz;EfjFZ-PZ8Sqy;(pJ5~!{cV{$sDd-_jzg)VvleFol)!qfRh#~DWlfQ$D9VJ z5@L0B(IfH{+$N_Sj=r7!M4$gx7dxCQOlbE(!k+t0-GB}8Z!%&#AtC|}RM+>5_i58+ zQvK?ZKUHMkw&}@iS=Op{ovBMZa$6zI`}!tq+}#;J;XiX^CRG6MHo$jnllf?8jJcR{ zWxg8lm4{erKuEMAEtZN`pi6xRlfg`>d+XEcg=`{|lO(M=+c>YAd`t-E5K}*c)Wavr3Cz61dHU*9L#)F~&s(?#JRK z1$K4#3Q{9o-}{M#MtRYHB7DG_|petx|9y`Pc`Yb5IR@G~&sJYe;uXN)j1@bYVlSkME0W zt7N)${=QG!{^wq>MB&LO^{1(h`r#k^uYf|TN;3aysGHR{9DXEXKk4MBgv@Djp*{c% zI#9(h3IxSn2zdWPo1FWTk2&va=3KwgRG%$<7kTw~y|$zmQ)Nc~M>Cxy0^N^v#;-fI zfhuSpP3%Nf)6z(soacaZcY%bHi$h`+&{NYd`z$N}NX^)ZSx9!RD1pg)^NY7K3ecoe zMGDw4pIQd`$4rGS)0SkEquX#2g@?$-@Hud01@2h6@WMg?xfdr2(bf=>_!*lUYE{*& zL#0KEO)zWecX-_l{NxI1Y7d@{J&10#%kO>|>VWpJ?CwY(l8A`$@PbQ$gLnxwhS%TK z0ls|lI&@mV$e^_$+~P`uYz<{I(};-@cdZ|5SV4e){zr(*LlzeFRa+Hxf{THjR~FHh z374AFLwN8(7Ufni-bqNf#i`(y>%@UFDH^a}l@i8%nF{PERT}>VqnYHHq^0EC%9z63 zyj?TP7UhAge=DZ4I==;Ck$RfL=S1m{PRd4iBgTetro8#c9D;>NVq4Zt<7S|GPs5TV z%mgNypxM86%Igt~5kzu;(+YKxPcN2L(ZICz{&_ZXbp4fbl-YWx14(!rUsC)g9hcnr zVA*19z4cM5N=|6!1D8Uhqx!GgiY7YlPeVzJzH|mV0Im@+8aeq;EGT)i_cXt*aDg2n zI%Cgj;-Lmfvo7xdSe@vh{a2UUVdg4F$U!8n9h%tlIk+8-bHZSN+JZ3}wQOf2kqh*F zgnCQP3cE+!70lkYExCm&b<4#@hyhmAH9+Ier4nkd5m7mR-jnpa4)Xn!E#yK4=j6X&WKT`8bI^)sinID6;aGi}NiY+V4JkgL?E^ zd;_y@@HLPFc_3Zn97OQLe42bpTO3qZR?Ajg5l+yV_E9a(151nP^Fd|X!I~Lc>TM`Y z_W9*&IyY0Nj*g@AJ9^8Oqp65)CGMa$q7X>2qKoZw-YEe}_m=V4tx|4#r}(leyW>Y- zVNYI=(diJ zE}@7WlA=)kAW5E=>Qj%`V>Yz3>*yQcHo?6+Vby`jYH z=?%vc~pkF(7oT0|GWP=jSb9Z^NQ)!P1ud!+-7jx9SDOd?qeM*dyVyeIKMADP zyd{B)-KANgf^rp+lhoyheB>^5z6|U#GKkD(;?iN_VzLpIn6$Y?+GcKh5jeoB%)wU{r{pV)@HmyM=_UAmbi2A=|Z>d?B zxc=+mn9}$kG~&&_(1_3#yTAZ|R5VpXvPl!b6M;W@i>A2T4cWn{M?09Y*+sOnS;3%l zq1OA^oQ`+tcWux3YND*^6hE;mZeW)xe>zYixH+_!REwjzx%V(<`nNM>uD5%54O-U< zk#v5H!nm$PMrPbx($!ge>5XRiAYMPID)}d!?hXV!BpUmjQ}lu zYMPA~WGZzy@|OZW|EgTQKIlo-J^B7Ur<{oZhPx7Q-G&4Y;kNETrJ!~V7Bda;-I|WU zEKu0Xted`0ZzHSBsfbqSW7{2A2%kH`uIld&;0e);u=S${Wk+~vvu2^&wM6{tR&7o? zMN4JXXZX6pSS&{4M5ba^2yn2abpET?k24>Tl%+#WfO(_VtI=;A7x2;iry~R1y%w63 z9X+=Q25n)4B_+mh2gTKUx#>^s&Qx)7%) z?Z@urPP0E53D8zhw5fWIk7M4YjZ41fTDb%j{3W4uxwSQc!-n6|J(5hs_HWG%!(eCz zd_u<#p9B(m(G%!a=bdSB6DE|7=p9=l06Ys{6P%21N20F6QmBnpEcQO(;NmY0YicGa z`;L;}y+zPsQZ`+Qx9#Ts($u`$i*SK^4wYgV7TZ9=%kXH>+yT<4T`y=sd7Rc^7Ww|c zmjt`IL@ao|sfTu^zG{t> zkdK0Hr9m0sq)Csqk+aXG^@(|f(~AsFd|e;Iu?9p5U00EjIj}aenij!2Y2+b2SGTM8 zo5@Mx)*Ie^Vj(BLfGxz);1);}(D5kzQERi`ifZ>urXjvr#!pom#gMY7=tNlRO9K2yHELp`}>COB{$F z%S;1Wc}C=i|3KwKbUvAz)#%yuVRUbFkNlt2?L9-_JnKh9DE8wd`(MHJ)qZS*|L$_t z#(!cY5V|j@-53zq88STQ3+&NX1mg$7I&seN%q>akizWPVIuJ8HJVTR=xx;AtY-{UpV>S1}_7eQIyK-QPKF&FzvG7~XBVXQBRK zC_OUdmYuM4I?Nu9AW+L9WJ9`~n|JNUT!T~BZ(9Zr`axX(k~g=^Ow3AYdu;@Oy^tS9 zx{8y7o}lu}k(SwxBOXeqU;D@^t~o@QF&LC-)MJJN?YfehlSrFV`MfuDZ&j0@b9v8a!)E62$nWKsx@6z)h+bQsDyxY>@HjDd`g0=FRt=9 z=TF=h@mE#)Q4h>i7Y`{sZ4`_Gim>HLi#kYjb1Pa?*~T7TeGOV&!8Q4Xq`r%TITO-j z_9YuJVj~-4|Mj%@hau((=VNCg^{SME%rDnH$EL&h75J6h-_?bt&tmuKli|;?xu4@~ z+TIbx8SHt~#L8lgG`C<(`@bHpjPXXic?s_8ZrDe9-L}Z@$C9+?GO~)1{_fB|Ny*Nk~ z<~6uL5f>HNqQujKI_I%UU9x-qh8WxZ%5@!$yH{VC077OtQohPHueQ{Gi> zH03IC&u-wfUkZXd@D4Fn2XNk}!k2*iS89djI z{tpuq0D$@*wR%?0|0go}2cP+G;orMDPa2*T8O;fZ78mV1KxiG#4{(P=irB6wiWD5^ z%J;5w3ifw@GHBHV&Q9Y`4OpNk^CNS zIFh2qvQG(%0f}kvmHN$HAUGb6-$_KxGNYEC{LLxa5Kvgm_a1ylHH*Ou9 zu3`;|4y@5Zc?-XTsoZZdDV!A&d{0H0qM+25Y1E`ehl@go1TnDMR~_N&&pQBoS*hqn z#KR`Qh<0)qVx&<4lB$PO&>oq|-E1=-nD`fh0>>m_u%!ebMJj_v6-CGdDuhihT@DZ( zssZA+F{G5&X;@XCjnnlA~VL9x15o2WCIpF}YwJW8^*V}-m8lIWyg(Oe8zpgZK2a@2vx+2OljYo8#B8sy#7=N!TKW?pUL$mf5eI(~k<&oE6Xs za|1EiYV)P4^Pv1$_dZ;(_#7>By{auR5pn^>VsVWMd&5XX+K`kF4^WQsYwp<6^!9M< z^Y_TqaQ9}*9h4oxqr`L*K86*MRZ^2e`hejn3Mu_k<`Vv9rI@s0g>IHKJ`49Nx0B=Y z4riU8FF0L`8xliEL4WJr6RKC~xomY4UD^_50= zd2A^g<5NVJx|WJ?id*z2$x3UH@@e{a~5QopmE%BjT`yIY9s@y0q>D}-G`KACFi zhy}&0x+}oi-JVSs7eOz1Rb?4kLvpoYNAA^i57eq632l! zJ!ZIUGsCq??YFZ@REX>~J(X&yWkSIGZ!U8+#TnS{E@YubZHw@YRZEcqY~DwVbUU&u zs|+^)vxSkfKe0e`D~TItleMjX->7^I0x=9uUHytTNMy3!G;uo>qL6*?-{4cSyX|U` zd*9gbaCFS^{M#9iV$clO2mB|5tioPdjc6w!7PSlMSi@nlZupWr+G!P|7KJ*3&Ca1a z+vfwIf#Vb>`unCBILXGK+Fy=`^PJG`T$4dVYl9#u7`cAAUNtgb+ng73j$DYp(GU7i z(#V14Htt?x(qb81tqtSIzlo^3XtiZ;FAa#=w$QMCwp6I|?)hO*tp&=NOk@*sv7+0q zI@lX}q+Jh}J~0~imc7(-OB+R|Gf$d34mS;auTfd~#!Fb=5CT+8n}yq~406fB3Eu%q zf2ivNxIr*9eY>!Um5UbOBs9@JUuV~5%4{yCwf}qa$R2VPo~VOffGtq^)nECEbnb=nwsdpRyZ}*{S;cpFWJ+fv{`$ z!=5I};kZ_cSi)J@EzZeH9D?Vzh}A~AV1s2fP+_Y06l@?!NiL|2gT(@d%XZCig^mJM zM7$slt@%^%I^Ci+O+nvRL3K~tOoOoZ-Mq#qTgf5Vy~#%fk2V8xByKptVBhakF-Afg#xP1flu z<+*qZt$$}_QZW^F|7Nn5|3xodxK|*Ga7_3HoJau-BAp9~>7@iX5)!7i02wJh0>wqN zI*8XHQ*R3W+ssGxPEi{-y0K2foE%2yg5#W#ZbQ(1M=gL(CT-H=q;&^Q$xSt(%^(mrBRZ}~IKN6?@jo+quPMP$)CT!t<} zYL+kGWrk;QgR2U`1k%XFfKuJhIbE9GK)jpos@HD7ayuDh5Jr{W*zO9=>qgxij>5J| zO6BXVMlS^g*g;lL?kt#%I*X%uv-b(^nRO5#QiWiNw+b@2<%uXRj=uKr6V@oTr8%QvQ>@n+jj zV+}e`(B!YltklBrE`A2qTCHWQEAQ9L=85C{9sP&V(<5;B$g-XG(|P*5LzikE9{Z|BXlPj^*|DvBgcdO3qp9nwIG4pIGM zb2U}51)k_KgIlOa;bF&`T0+`(ewyck=Ls**>*U07lU*BJ5Q_tlZvbXGeO61e^aC?c zE8X<;2b`JRFogMpz`DaAOBoQ%MA9UzhNO<$2JH?bW(}vU5b!`I6l)5=1z_yEbM7T? zDu`VIv%f2$8gqkI0CTfAx=(ErQ3~QjejO8Wjj{Mei76^OMfkHbWpgEGurx7eoMK0-`;f^*{+-^Cj#AfTq?Z53_(-_l9fa+CIhprxJlbW}kD z9kQ0@@+Oo1<2-54s`g1Nsjc!TCC6&uz6x(fvXeva?__}MAe z-a@+5V*Sm3r2X&Kt2^GW*qL8K^fV|OkY!Ne(tC@~g?{!0XS&o-!i0}{`3U8VgZaB! zNa~e~M>SNWuYz2BTiTb}EB@bNE6k*B$ChfeRG4>bGndxV(j)i{kE~`LBZUAHF5U$w zHo#~>e6SQNQ1h3`@zKGlK)Yt1MuR?sU`@O-;%`MqQfQV6%g)p-aM?Xi;W9GgmDcaL zQu*bT7U;|POL_)OPxbP6DCV*HI`Seu=v*j7!PoM5M*{8C9T-SWevN7e+BRwhk(=w3VsR%d2nu4o>dQTjr$~F5PQw_P6=V zR%{syCtOJ=njk<~e1b5%gIW--XN#CZM3Mjqb!Ie}%bg;LkeQtOe&Ri`$2o#Dqc$${ z3ZBA=MO+CuZvoEa%$D*IfDF+7a1cs5)jw5toh3Eav{pZyUMg}uHJ6UmB4iwd#& z6q79IQ)J!kY>+zf;AHK7db+V+F|a-)nNjdn&W6w=pM+0Hj9`M>_Q$K4r-^A&vrK9b zjc<8Hp8Ke4Em+%+OPisjmev<_Ufu}bJ@r5Y0!DSYyVD*^)4F7o6J%+*y2cZiFTpP8 zX^mUkS8Mc_9nV0hBh%s>6YKN^^2B!xxgltt;RjZKuMVlw}gH$f@Jc_n4;c{2q_t^pbq z)o2j|B4a0N7bIKQs;e52H0gHyo>`_RJdJ8xGFP~88#2sISl_)#=6KHA#d?!> zzM)T!@Kq7&AEzX5c92z1i~-)A^Kb`NT8`IkLwrhB-S0B{@aQy;=m!1h78sd>L$_L3 zJ7qqCyf{k$*)O?69MzcJyPP<(hh}+VWn?)NxXkufGq&f+zm_@B<@Q+dvBJZuY8yR4 zZ3UQ-IH>gmStt7D>e66-TD}Al12L^0^B9e_D+k<>4SLYq+x{9NU|LQ*avEZ~g;n=u zIkI}f3n%J=*j(0+ZyGNXF7uh7aQ6T^~3gD()LG9yxV-`W?ggBuzOkB?31*c-xD>I+rLfUyZN+AC!SoR*N}OU|j)95%M{8 zAZkqm9;p2}l`5AgyFo?4Tz;znv~ah9=#n6pW|W$${&7JkCL@?nZir@`LFn2V2YQ6J z{F8Sxk$F-8NPPJml|UNP##x4vD?A712=TD$qJ5hXkSJ1AsIjh?$qLuTlvE)PkOOF4 zs}jZroYafp4TkWmfqY@2?r~n3R1%^o3|2LmRD~B&pcTU^S&BL0 zakE)AYYn6bqDVNNWr5y*gs5*7KZYVAfvgF<@<~zkjMr#W7?Mss&H{ntm4iZ>BlHAVu7tp9j|+9RT2m^8(;% zVrXq(L+@f@V{Gd{Z((KSY;9rl14N^Dbhfjzb#S7Wv32_Cp#D8x9BKStsT@ZJnZzo_ zZHFQhmW<3kSqR8{8Wp><+V65*E3+$*_Zu8?m#p8)YC&Z2sdVFauRmhBiNAA(Ef_Ey z>B`Lnh`|dak|$Bfvc0**k->3q<_r?3!84RAR&qO4L>;p-c3wE7B9w0AO(plHw~hdA zyzUPa@4@1?CSv}je<70z4D%{Mqgk>C66~GhCQu6KYr{cC9&0%eMK((18+L+GxcJ+! zryyd>gbte}pn3dS5a^is3l{O--7M(Gcza|`sG13JnvSd7~4OX81>Afiq$qt=9HQaT^vpkY6cEJSSYl1 zmG|PPK9lD0F^~`EozH4a6I?*RB>PO};BMGFG~IJYh_X<=&f?PUFgRRcfdkWtV=u<~ zmLsIM7JXiQM;!tF$~lKM%ma7PuwV!p3?^NQC;5ARRyesp7fgGC_D1GA0!zrc52m<< zC?q%;c>=jLaxSa7F17#XM;D)3F+%3KwIYVmi>A(EN41VTGnYWg-xBl@PRnVG9B8lX zP?EaoFT#R+dQHH;z4Za*pO0E!`(EDCLc`7tv;Qhe*;5}EHhg=xK-{-;l9JZGw&7Uj zOnZXPu!+Onx`cZzORQ}!v`l4!PqL@XD1V({a6#S;uNXcTQf|uD)ED;h8$__#K1vM1 z5kd%~2LLCSrRwx)#lRlnY-M_wM3Lok=6D4q5hGP8qFhDp_bOw`HO9_0#+7C1o|Lo| zk;wc>X_oT>qfY}4o|;+;fzx7yyZ#Nea=!0M2A5C803Env(ig+WW4L;KSFEWsYa`?D zsBW5&=IW9R7PjHhRl|VN_uI3p(z~-z`h(}%p5WUeFX)-iWkuQCh6ppfwFy_W-S9X> zTJA-fdJ@e9Y?E$(Xix;?=brMT7C80J%$lfX0*!~-sCUBUIc8MZ{Xt>T#}lc|3Q|`V zif4`5#?q-4m*#yt1to0~k@);}PW+&(LXP9PmT7jAciZl7IK)<$-ZP!&^=}t$VIqE| z2-O7k3{vTY`(7tG>+X}Xnm7c?aagR2#iw8^&cY8~V-z;%0lUl@7)RhzY?LouAI6SjfSrx)p*#^A#jb(R%tVm{ed#FMx>2_cWEN0 zcLt*(OnqPH2o1|C#?>%AmuY9Rp6sHPtJm=ExmQ*h48@-u(e}Qgvu? z@RinC+iNUfWue=E|2Ozbx?&jI^rt2^ApXOeC~IKzqaOaZ#GzST^Ix<;pPO0?gfdF4 z0ndD#b08rgJdPZVCI{qJ){E7Cm-TAD@981&8Zusv`}v|LFGp`?Jbw3-+P`xWaZ%@4 zBq-Zn2FXxIaqZ$i}( zQBZ&H+49>Bln9tK&8cA_$+ZT#iN+!-=3)_d|DN^(zeB_CE@TKHDfmNLhe?=Urc~#R+C!j_3u> z2B9v5P;I87tdGGc4YOgCh$sf+b*vB+pkS(;*d6QPncg1#uC)mTa^GX*&K}CE0P!mio4w6DrT_AY53ljU}HoS=*h~T>=JUN?9ze zWQXkLzoaKxbwSh7KU8sKQ#QxjtG=kibtnyuBa8Q(AyBoCJb#q*jRJat@G{HFVARTT z^(V7AK^sNRCm z7*2$1bT-Z8@aWv^Lo*JvRG)+mi1syP;C;q+CnS!(IDr27amCHce{VP^S*EmQrNxgd zM+g>cjfXFQU3wx9H6YxtoeV38r7rI!m)`3`K=lEr1*Ij*@!OYDr&yQWe?`TB75Y+> zgz_0<7Ag2n*-zT}H8-zS!XQOaV3_+wukJA9#?UrJs2z=BuZ(p|HL9|DLomHE;ca<@ zQR@XZGfO=>k#`>y??BX!c>n*o}7x?}?F!sFm38e8Z=)wfPL zN8SCq@l+_c_M(O!PIYaG(|b6HjkQ)OLR>dQw@wD`jQ`GWdq2EP`u?WA^-u>GPf;qT zI6+HJ-7+q5JQ|b$)lzIqs|0ZAV3?tmEJ#=OGRUrnU_2VkD_*&yDd(e7W3kxr&o8CdZfG8G_ z1ENd?AvYrz5>DDuLhQTeP5x^INmx_q93*oc@D_fcr#Lk@67F=Hy0aC~W-qsaE940g z?B55!?$X$~QLhR%yt@h}*Rk4I-;i=c* zA;^Ss$Z+H+uLB)n=yQZP@SuQGBTLvTkW)md~GuVi~CE!v{E` zC1jAMkRMl$RjL)zXX1(B$U8kp?0%ZGa<}Rjs3aD|!a%j!bjNA`a1)EPVWU<$b z6#-dGQ)$-iI^~_vO#j-%n?6m&b{ z92t|1p!;^94wciZQR**WqdFCN+Tu7+X?J645d>S5yg!kvwtFErV26T@l?&VvtUo{$LEsRt;Wh7+SOIiWtmwy&F>GD{Kn(eXjZeR09c ztL12V#&l558BW!n+goJgGrI4>ON|8!_!rQbt%$I8a>r;&Wgp>!ujw z*608{v|m!DNWOH84C$4Q$UlPt66lddXV1QYj~+;+JpvKmDYQhOp&}@Xp_E?KNYti+ zeZVwsP_fDR$z3?I0LI)-%r*Et$Z@1S6TadRjT)oD%Y-f@)Piz*NJNWdg(1~KYaBiv zK!iYs`tvD`uaH1f$|kjg>;5g-raU%=*%DUIp<}IXFw&OdYX|VSxd?Nuu3K;|p-2>a zd5Jszl-eD5wU76VWMZRA@rB55QIv}5vvxze>fz-cCA|ot6>LcC4r|VI^zCso8rLi! z;{N>|f@|hj(CoS=#8A^omD)LT+^8yc;1QsFOjWgLN;1l$3q1K+Z7RfDvJfWP1@Ifv zz>!$y`?`XGs=r<(RxlCG5Q;JR@KB&rVC~!!Y1GlW6xe=Wi-v_Qvy-LgZ1Jd)po2)# zk4j|e9c{^kdyJO5&Hpd<=~njImtz*AD}HXPO+Gp5uv7kqU0GHkbO4=@ALyg{K#&HC zgC+;H25J6LJNumUOR{cI6bjJ?>>YomBlIo^*l;lHDF9KeASj-w0#GUm6dV;uAN(v7 z%U|}TF=B+XN`!Fufr^&ZDXHDo(Y0bF&9zEBtw&?;-%#>!=e!77uk!%0B&;s2WyA`i zvsKM3fc%InL^z@0{(RkhS3%n4GzM4C1}HBa&^hte-nK3zQ46u&_OoSGt%JdO$MiQ4 z&nT=a@5hOyV}~U*n<+1qin44gWsC$23F$v}orIUTqZflULoqbgT+trElgMuCeX(y+var5! z)iO=NwAxrWZ>*4%oY<8smfw$@l?QCTNJILWHh9QVE9mO%vXEufpLm^(6IFJqvlZSv zQ(J1AYIjDCG5LA1cRX|W5O(jOXt>F~VoEsDHM9SANxyeFpTL?v^tay@b5YNQnk>-w zsFkKAJFlQMEZ>a7oLV^wC=cV6RG_*v_9}q1K!C|8Mtt&TrX10L4i^hxV+qKl*GR8a zC72gAMMUI21(mUi)2h6p;35VH2=>z{htUyk1VR%?3OAQ(pbWgBnXGc`unOmrBqZCm z=)b~o3;ARWj<{T0Z7^JlU3SmnVJB#Yw6=rN%P`G%vn(MIwA0T6lZ66ulD8eh@ELM+ z72_0jUg0ps##wXBv^-U29Yjy*BJ}sQQ&gTTQWq6|4^(Rw zI?CAeCgMlnk7B`!lEMLV&dZU%2I>zQ(_p<}zx>vC@RJdNb^PFx>ZPW}`8+8go~a8I?qJ@M%qj2iUd_h6CJ zMas&7d;bE{z@mGF1iLq`ORf}cln>V7_XzR4w|Fi=W5m{q1nPGnCm$ zI2z}p!(XWuBI#%%cgv{LdqtRf!Lxb(n(FozX<8hLg!di9U5gjogoTU%OlWE$F_j*H zx;wv#`&z!(H5=kKzr=|uUlq3)pbwriu}?6=hfkv_2ajB4|Na-_E98If zFBN^xnTmeKo&2BF+yqYsQ_6rmuhf+6 zI-;iVN*uK7-@l+GtLI={P3lsY-C%jy=~$oLCcDp8z3bmqRO9X1`|dk^Vc#r>5c zifQ%5Rp2Hmg=LvUu3YI*I^Hs+^fsJY)*a>-MJaS#;3#1K$x$Twv8-O)jWhwvj569n z0n8zJ4#xSJ_RKh956g`X6l{G+5RbS4dLSK2{jOsR zMbR)JA$o)b;mW8$28P~(Eo&kI7IhOgLUKY)cp5Pp={zc4ZCn{0#j%%yf~*wX_*9iL z!5>YAV!{2_HU%x?W&tGWys}Zm0NT><;vLdYyyYU81tp{Ci$swI)G=fre&~?7FoV_G zc!vHJNXWqWJ5h+lqYq3_y#(b>4(mXsv^m(ILHdL>061`AInt>yK|(1RmSr50Qz3^2 zB$_oay-h;UbaWmzmDW~sFqOJ6XB8%l4COS#VbG$+!LJ@SaWq($rpk88nql4 zWxnp_wf%t*s@VB^8vRz<6NAc}Lsl`HEru@?ePlatgn9z7OUp&sew5E{H_N;W1;)k)vhd$rc{NU$<8Y;+;ptl#Tvx-Y@d=8t^AwgZ)iQb zohzRolp=mb$Ot=%UFbU=uA0%*T5jm8Zaga1QOj-)9+McJx4_Je&B2F;l={MGEYJyg zh>|DcIQ%s?=9z*}4uaNIV;LdD%;uO`-2RE`T-)p&)^mr3U#(I-WGT~L$6Sk@#&l$_ z5b^6jqWbZU>=`MqDg#(88TMvuRwHb&jGNKE8wOXitmEO>uyIUVE_E;iI5K8iDXGJ4 z3`r5F)=h!gXQX_CJ}8kKS?RBo782z!mm_3=Ggf_DSsoRR{7%74(dOgcKvTa!S-!B3 z+%3;feiq`-u4(pqlsY4lT=_2413%K@wqu+PR6J8wTEkXirUVXl46qkBH+O+UkL3xnx1sj^KH>5MxoOy>w zKe#iQDF@O7W^+f<1ct{2uJ{0*IE+J{tFgYq)BUtUWBW$wf;VB-{HT@d4gGkEp?shT zZJTiC_#hc0MW*I{f5`QW5`UlGfeqc)qWh}Bua*P`R(4}>cs{U;>5QcShm%@bnnOHr zNuPCP>EY*j*%Jhoud1J>;>a-=w997ggCEbi{y2}hJM1iz>T-vrhl`|jbcXi2A$-xL z?3WgI&+D-I?&N;*;WqTLvODvf;TyxbSvEIS({i(>dO2=x`5v?8wks=7Bh{a*z>6+^ z%+41<<%BfLoP667DA;>VE{qW?oFnr#Ni6Nh|Ig|NWMa#Z@KgPae@?F4|6~C!XJGvU z1~o7;F_v^PvHpRC+FH5%&+aE%{r@@`V3dkmC^q$=kDmORgn)*K?iAF%pL+@{mhFB8okOYowb%4U~{#M_iA%8StO_;uNxt*d-_u#TiS zz->G7_Wu|?;$?GU6P@oZTd;Gz*&M0esFz0ICz8whGp zKV2n)@9AkDFg`a~Zr14a-5=kbx|O* zKVs?2V0>~%_SC=O)SDI?!E3wvI!% zYfjKwmgLw+DIvHXxf1%Lh@Ck%!FJ>OJ!xRqi*n@^qR#irAq5qR&vMw62u&NtOwZk2 z4~k!kQUXG{@(aMcZZu2HX}x6^uzFb=`&2&RGM@RjL2Q?3a(=AmJw3!+Pd7GPkxHjY zoy^LQ%3N+QxE+(0o|>{9fD~5_@*%&q#lCZLO;VOp*wMjo&5j7$G@&Pq%@HR+ocS|x z8T~-UUQ{g%&9b%34N>WkYFhn%H%SW@JzB%3c4O^wQ-fHt;u_ zGQtK76biK}4S3()D|EE>ifA>@H^ICS=%rx<3iVq6#uVQzis4}Ccg3IdWO#;X+fZ#| zoKKUsUv{mkt8!UA4EqhDQj_N+n?* zk_6F~QL?SWd%)13LA!|26*&7Ai(Vas`Sv3VvV2bQ;fAEm1^v z*?jeEJMCY7PsI$Pj(2yf)9A*kPRs8tLtRkd6Fy&v;uwDZ#4}4 ze%KT3Rb@~eI|N9IB#MO)bZTXcrYdVHER9bpGp|szQG${m@#D5D*op5YnLjmwh1wI{ zz}OduZ)p4^BZ<;qd;NT3VQUd$bu%8m_^Zs^bD5A7@fu856W|Zu#rAM)OLpEL(rBgs ztnAzJg1XKs2VSsk94cd)O5+*r!%(olW`s@f_&r`B-bf6Dhwc8`_-;eq^o_v_UCkwT zN)z1Kc<(zitXAcK&1?5TUP7mD^h)|~u4XFC#$T5OX`KaMYTW+Z!v9j2&_1eg(ffgjsK=Z zmi6X#w$W(J0*CBEjf8-2QM9+i^oe8ZLaFwiW?Rd#QS1<53*>o+%|0hz$>D+`Qiz}k z`^s`co7KKD{{UPxe|NtN%5Jm2?^%WUq_t$G_e?8 zs*vlu8wMzfdP>Yel9HHco1&RQIHoY$MdbADjhz&9Do%#_QSnYv2jxdXsD1ft$9>}5 z3rK?vxB^BA0hZlH%F1*P2>T%3Ae`KmnOh#4Y1Md|wNWD9?!#A=MBWo40eOs@mTbns1E;M$|e)&uHsOcf}Rvtmj) z9?MmJ)Jh}RI(!_4Z-@x%*88K9A{~6r)zVPxedXA$-f1qnOl;VbZu^c#MBO=eBHE?N{$e@o69QYwRoBcRtU5DX%oqx_Qqp)NDHvJ? zY+Lo>_gq@vJapQ^hjear+kBUWm!#X8R{0VFu~7p+s{09vBcz0@|B=wOkP5Iv-ox3i z|E1-G8w}#bEFlFndAGEh99Y4G^pH1ztc96I6WVbUuRT6+EGy}|j7a^3Jg=U~90OPV z`Pn-9IdV+3Z%lqWBUvO4NzK;DHDSkZmm<9$Y3EmEeN<7wPP)qk^D&j$bI`NzudeKB^<9&ev`0S41W2V+(>VqdY3 z$K`{PFcwmRoQovVLpIInvS;J&3mDPcbfp4K`M7p3d2%% znDCt-d>m|f`Dc8#S?0x#cMuomtbNJ`;MMW8@>4J^aqMW>x~FVz(bgm#t}NMP&tU@) z>YTLM=)BDOIU1W#B{_FnTGQ7Oh2e47|A(=62oNMdq6N#gZQHhOcG)(&Y}>ZGY}>YN z+uWM}cMm(KIpr-+5t$J$9?TRbhDx$8Xzprz@DO=Ij0Qw`FJqlagqRBn?0uJCn0c^7 z4>$WB&!B*Ft3B z=we~XII=jGqmgF@5J@WkEKfb`2$3sG?gF0k1a=y;l#1a$%&`a0k$XLg8aN;D;a{VN z;@|DLwe0~~rb>a^K_y^(94MiTI%%UXD?))qFBZi>dbN4ID{_6Y_8DdG|41kVz=$J$ zlR+zf#mINh%x39%Y%d{eDC;Y;I_CX)sA*U%Bp_L2Cwrv8&$wA{wViOkT9dEf>ijZJ zKv}!(%e+HmQj8-b>liP6TE+TY>S1}#odsguv}|N+848p*tUzYf>Nr{|&Y47t=9t)6 zan3c+EE1lY^}Q=773c!Q9hzgtVMwR601q)6DUA>2ycqnB=8I|fOEU@FBl#`lJR{6#muo|37BfAuKc%vY?2<-on?ZP%5km3b+_zAFm zcK36d<+Nbk*Q&3kKPS)Ak2OPS{a&Rk#+ zPVGRocQ;Tf1Omq1o@KMQzsDl8J{Q@EY3l>!)Hy7ch2nOWmk>@d*L}kw=Mz1za&P7RaX3~$88e$(>2#k=;^Ri93c?v_%LJnKEi?gad zs2|9=A%U7*M$h}lbjPGGxmfvKYbaJ)Vp(+<#b~M{((Ze2a(kT9mr3IWFW@qff2`p*JQSBQ-0HQfw<`YQx;BUmoYMFgMk@ z47-IQ|EXv)o`py{@mH4K@@rzjGtE~1r)+!o@7glOt$s+IWx?09it4Ad`SPVQ`D&?Q zpZ!_I`KAl)wNpgM?RZgT+4jb+Feqdl19O* zmj2H%edOj1C2&!=-Ez${SAt*`Z&u20Fux;0+iX3}C3`gXTCH{mcf>V8c3uE6Q(DOr zujglSRi`qtGK@$Nt_(^D(UyZ9oGfg(qo#zyvHV2Q7^UBh1U^^Nz*kW&DL_k*@g39O zySk=&6T5m>D?}hViGtOZ_xbUd*@S0(?|z#ynYKyVNcK=Po-Xm8=+IQ zik6!lpjEIJcp()AP5xuLxK0dqJd>p;g+BKz8Wnw&6?+K)=$fO<%)a%*=M2s?kQiY| z@$9^Q?tYiZ1ONyKUo)hK1vJqZ;4WR#-*`LU)gWX7rGy0`i?Kl;An@m)GfPkgE+kup zrE8?7c%T?gY4Bb*F@-5dKuIAd17NI*15@t9Dxlcx7P}hcqXFKZSdkeFs?`z}t!eYs za>)w`htv{O3pT4^gD%|^0t52q+~nFjFM(e2MO%R^+tIJa%QeK{L?djT)yj=pyA8#3 z*TMIYrzSQc@9kEoC6RM;x)Tl`W$9`$I~*FWmFdl*^I2d204hyP0lM<#Wm}GPs2l&C*SDe8oJvt-|jwr<#sMVXw=Efu(2Y7<0={%gRh}3>;UClHLgSY z?w>jJiNRw06w(%&CO1`kvE_V~A*!}funDB0^bol}@N_n}GE)yPG6rMJka@?$q)CG+s4sDW>NnC$s4d4iHy zu7x3rki>IRp%IE%Vj?Q2@akH9*5cB|HddInsokk`q@)*>i(-b8fEq4Kzpe_pUlrsb zm@{TtXfab>Ky7lyE(+*txA6kuh42q*ySzp^JA0yS_+&Wt7I&FjzaD+F$lIG;g7HpW z9vM-*V3($w{TH+M{&m&c#6JBK%~(o%lbF2qVMBK)Eb>KPnn1#2Q$_;CA~zlzN_BM6 z!CLiFuQByscefU9-xt29CQKo_r_b40dm?&rN1{?>NOPjX+u5i&F{eF3v!8piP8ilq z`_-btO`NdiIgC(6zW(@ceh5KVUol?j!eiw-jL-jy{nNgLk}3RclPIYFwN31uf4xx+ ztpCp!TTRw!{a5Dxp?*o2=r1F5JxexKlr0CJjgycg6{0x^WNAD`JjMdE*Q1Uwzf|(!+bbVK5LepBej|qbT z1!zw2)bMg$j82v+`P$Ll8fHbmYatakfoQ>a;s``_xDnoPR6x(X7_I_k) zTswnLG45k5)lWkyJV-7guRs#y<^zeZj0j)q{Vd#!4qY9V+1|g9wkW`2f3(@|j)$M5 zGvGB063p+RLEwSS{ zx!(=Wq^tGWYl430mAY*$IWAwx%>~64s_GBOV(=%sBHFln3=S!EC_z=2{98D?G>q(- zIQ%d8_vmjJw#KjGMjQHn3*Mks>UfKbomc^Ow@B}c{Ik9d?T01Kgo}+l= zx_V>LzRGaGu9OsdeK|nlfg4=91*GW(iuqIZnY>%u;n@*ArOuuSTk}3w{X-Wu6 z51=25)?`aS>2gDz7hf{PG)_cVt{G{t&C=qV#JL|^&ZV!JwvX?o(F373<;kb-S=*A> zzy_yjBK-8Hw1r(;1rmH4QDV#y6`Iq6ttvVv!_WCf$$oT8rsc#+wfbH`I)4cJ(FSwu za)~e^MvhT{D%ic0Ww&$&tpb#`4Y_HkMT$((T@zGRHAu5Ffm3OiEe1-Qc?P#Nm*cpo zm28=dKJb|o1SZ~xpx`$1(!}wk!p1mn=<@i~HPBd@5EwWANf$!MgF6h}KG%ypxX@%8 z&a7-_ZbfI-$nfxGgN`3+9^SJ}uk$aGt`EVRtHYN8{ae%8i@igj5!?0i4Oet17iY#Y z;F)qKBKdurw#FD<7T@-Mxf}0&tRV5T^Fo&EC#F?1kwWw8qx_>7H&1G5BVAhZbN;2} z$cy6J8^cO<$$zUm;!1TtN*PdHX5n0=Ar%;z;3?|Es}VM3ekzcuEGiXeH?0}cWAHAM z36&K!yk4A{GL!X%xCK_kZJotAyVYie^VQFxKVukJ5l}f{u6|k1mF=-NckZn6-VwU_%j)CuX6`yW7#jTdsB}Rt=6*?nGBHarNuZ z?C}4oLq@M69RgH|52J&4~MbH?ji*yaf`phwFde zXwrNioA7^|6zF$y`=8ubeihJ0zZ^GJXAA59Balm0wfWCk`a4I@fePEAG=VA2T@$lV zz+b9U#RgFbg^In64Xqs4y0j4Jo7;@tBIPo8k6v>6g~#pX@Y2&UW4QbTvRNp*9>E}v zWGw>P)Shd4UWIDmsdKu|9~_)Pg-N7}A1lXv7Yk#O8F82ZJuW^v6Si`8kZB&UO>2;Z ztcAhg&j98E0jeI7TY@z~66FX4npCxZrzUODYOgo+h5K|5(&WbxAZ;obEz$KwT(P%aMfbxWOa6gFFCfqlTNkmm1z<};vtCNB`6RBh9=DNcSOC~u_ z5w7WJ9RVmzD$uOS;>6z!?%@<*8)$n`=UvnvNa%9?S5pZny1nJOuh7^SN3c{5f5APe z>hi&_DhcWCVWQlNF+6-+-m*kdq^4WgEXgNaiVb;fk$ah3a*q;3LN>Cck!(1|GrvE? z2%;S-NPifqNW5%hUy@}+!PSy{akePus}_XdxD*{E(VSBXJJ`Ys+UYgfMx&r2rT>sJWGg-v3q0!8(R_#`;kCt6!miHgYlrFx? z_AFR8a`|*z7O`z|S`XMS`toAK@4%5Yyx^ODxebh&y?SrI*Z;WQ+CCSsXL;c~X*IjO zl(EYy>gj-Yq+89Fh1uKq1GdSR2GgKg0F(<%R5EJf;5+e7CncnZF?e)4?3E$;?%3%- zs67kV(f$RYSk{)@1FBBnx6UEhok@a}JvlfI_t~&}^`AaoJQw{GrZ%O%#ol?YsoXn% zY!>XL7)JJ7KcV@oK8p!=>J?3b-ATd{y06+-<&BkgTGSu9flEF8ay zLeFY_rL5(N+zb(CPx3C$KU^Z1f5ZbQ4&RN+$13(k)qru+664rK!Bg9 za8wS(!Xb~q)gQXQiMrChDx%#&U9wzQcj9DrGR5K7J>1}d0Ff-8l$6N%2OPQyDTDX8R^^i_cEHwLfNs&zqg&`L}{yI=DXpvM9Ps%kxbr3r(C zxJyhK9FAbXQ=<^HJ|nq8Hc3dRJwJ-k>-P^{nxHcum_SsJE=m_A{p;DtAdN!&O1wer zNPbr{RRuG-!Skf7xM!0;cK04B%BmcStUF|hiw2EAYFb=>l|ih_MY#KKLn%I2^|dBM zYerQMA!5eT=-eY?jDfN!Cyb3DB|H8t81$>u(l|t8WNh9$*9C?o?9rSQ=x() zo(xr^i4Sh7*hRVBSrHh6DHFArg~{nR z;ube53$odNVHPPcxKteUm08t&4G9iIA{ND(etrFEBCJFjo)dLfOEsh4n-0acS6aS)9Ob{5J|m%~ z2ya2as+DD7it>|4v(LhFJ^-*0wg!PKvZTI3UVa-)@9lbjbqu@*=H?E4^TBHYcu!wX z{*FoPqSb$^R_08$;n(&SV7>P-q*jBQsrNxgNf$C{zr!*x+wqjmBknhDiDLAav)MeMG(Y{I z*@ewL7>BRmB}?(gi#5H{DyiArs0J+Zj!_eSth)T*MiOO-8tS@*gE9l9acvmkeR44} zhZZ*&-gdR%xb_QmUFnJ2Kx2%gQtPHHQD_!;W8TH%Hu^yR_P?aFpAOKpVZW1iHP`=W z*spBj=xSkP^80^xwfHqV`OnI^rS<9;~*!ui)1m;^l@UL z;t+f>8jg(G45CM^_@LRNAtQHNU@0M-rj$lFKDA9zj!7iD=NT}VmdC3j3Mcs*^Tw%$ z3@stmK}~mOFFU|iI}B=hVMxj1A&^cmaYsyC!Q7Y+GuABy=NN&W92*-*^QMwW$mIb- zqv1vt>(WOIe{!oi@s#2VoRpO^O1Mk(WQ+-WgW~J-IU0x15p>r9{<$F}{zdQu3aVk*xJKLPe3tF0x+7w6g?MI&kDSFzW`TGrj8oNQ&HNKX6y&r|&9IPA z>N;j0=OJEF+)UU%mSCmq()9&}2`4r@Kl8x|j}3L+NyDKY6v?QKs@1=>ABVF0tV(diqsrEY7KtZB0pluBeH-dDb>gt_e|!yiKE}xN@I$ zi1b)}YM6d-DJPjrb!Vk$u+h0JHae@*Ol>2SIob>vI?z;N%j2HxCb%;T7T_)Rt}?m! zDbnq4<6DhHyqw)>T+5A=A`47m10>B9cX%+`?{5*OYyxnd4+tc66?q#XYndKzu*8~^ zz0e1sOlh|S-nn2XBTiJu!e{-GTE7e5156bk=V!sIFHkTU9gRO`ViiBIak~PGid7Z) z$+E4yQ>8%c>Okc*fsRC~OR%H*15T`gf8 zaV2~RzMA*E!V-vLO2I<^EPi1iVPFVC67JPysai=Q)yXUuw-4mA%KD&3d`D=%Oyz@_K%p z7l&@)*~1R*VVX%Yqj_>~!wS4?#|ZIHt?*K+Civ_S(~F&Z4gDL$!e=XKy+M_~&OQ_o zY`z`@JhP@zdG@B*UgllRX#=vD711P0Om+HuRhLzRTfDq+BFTF!0c|tLiT0-=uoCS@ z9K=y4EEt)8mP3tP0J}N(24!4z*I#=vA_rJTOTRgonf`Vp*H00*SFs*H;)uDkgj3S< zXr-_mQ;!>o?GpA_>sB?QmJ-8sm<|OxYA?*5iY&fZqh(<#L<9vPYDPcUl#RAsI@Ts~ zG~r3izKnwoQ_belz`9p7BGYvl@8}Pzn{yXu#bxZcPV`fKVhflHPr$pbnp;{5%2{0% zi_r|X`*^zBXL8LIw3BhY6Gys(iWP{Wo&-qrJ%>$=qG{}d_OMEPHK`oz!l*uFfl*uN9_(X?EUXiD^xxKyWL{1$q3M8mEMvBz3cF)Xl zP!+tW>_k3LaAeFM6`o6EP!hyYs2bGBj)I?spkoxYWxXK=l@@SQH1azgurTnvrF{(- zq!GA|TE`%dbn><4BYP{DqShjh0^j-05}3LsAqtY+Pcsyp1;b{% zNG%K=^jRMQOB#NTM*4J-W!lK{*s~Wn`KW%e@*TJy>=6jf-AVR&7ZfAZ7^=~5SC4sz zb9QmC_BYd`XIC0qV}Gj#>o?jWE;StPaCy$RYIyF!Bv_W$>8hx+M@Z0j+dj+QFmGLN zd|?;4%ai0-DY)q~F?f0@sf7%>n63!Jd!2FxhO-r z^jeo(DN^{_V~7ygiLRMBbW^}UWdl`d(hGoGr9^?y0`TL6)V2@+^TYPNrF; zYGU^E)bmXnYJ#nJ}HOpIk)ygZgzCiSQ@Tb30*)KXbx3C+@^&~q-Vm<(M70( zX8i2C{6@*9W&*Omb0D-~kFIaiE@dcK{GXV>xe55VjO7$V^Q8Vf5^h6Q_T*vM$J^hM z9I)Ym5&zhR7@WHjb-QsbTy47%&lo6~&@Y*)$MR~Y+8{mg8zsOrdJ`z&c1*ZaH3Z?` zMMSmni8H-iO^MYN=2$idWwei2HoF>(I>XRJws$oHPHl!47mBq=ql6~h;WU2=wCoF7 z%$dPumF46vpez&4*|9kW=!*(YpUtmsdb^~V`e2obKk)Xw= zf`p|!=S-VB!R958fW*>4uuD~k40gCFmniDO8Gj6jzH^)LLx$;wmZBB%{E3P+8It)N zIfYS+ic8O2mbYVkPR+#TYqL52fzApaI^Iy+RO?SVby+(nG*xWZ`KIrk(KSw{!|$MQb&;YZ!Z9b zP0Q%sCn)L(^Pf9)o?><4d8yM=a^135Qie{p>NZ4e&=-N>l?Phg%ejVA$0keA^Z2$q z;4HKsfSTua@=n8C1D2CYf0g0c5VXonA`%1ZM%GFh+3|KmF^f12^c)R%A0jA|FPyez zN+O7haiy~b@WmGOoFIH}NX@kc*dC2{Sv1ByqC2%2(d_oX)I1p2z;m}3CD<)sz>E4W z$ZJmE^?210+PE`0jb#~JDt*~3nN}fM|ES|ciI=jER2K@d(%!e3_BI*Ojs${PL^M5i zVS4e4@&6ZyP>wl}t@&$~Oz`WVNAkmVyTJMx zaexQxVUqUzO(P7c2X`fg6O^Hjb~JTTtS4d;`vLx%V_7x5RJ*EoJJIVMfrF#eK+ZVG z%r?+auTTyJ;PlWwWTEaq_X&A|~K}atPeU`{4mTT@Ek(JIB@$6{ikJd4(3#z7}Mht_O|jxxK*33+U+S1ML^} zpP5X=KIf)K*Tf>GtM#i94wppqHNVTld}pvr^oC;)OC^q>Q+D;hEJnFw#wuJu&CkeA z@`1Xq)2I2@pvWL-D3}m|9De3arIrDf;U9;26Q{@E&zzJ5n(`+oH^U?D(P0))h>Nok zB2a`{mbk7Th!h0D-wh#V-h`BApIXfnG6EALBZXu#{;q=nzVu(?#5rd^<_5SAHe-&lH4HguyT<2%F!3zqL@I%42?)!?E{eJB8lA6>yAO8KW6<3d52(P;Xp z)3OmiJTZFWQcOTteV+NiJPC@xM8Yr?hn$?@ExdvnO##$|hQCk_Yp!se)LT=B>l$!p zmA+4N(1Myqy%6P_a=ZVc8M}+5dg57ULX#HPfn9d^MmQzs8JfINqASA(7&HZZ#U!#K zo|d0s_RF|Ch=SBKDbCo557?hXqUaibP68IeYpAX70BShm&~m~Km_Ujn@{mS&4mE}A zgOu4x9ESyq%B)w(zGZROr2$4k$jTfNG||Jm zL1&I<4Q+|g0cp@mqabZ^`Odo_S^Rrjd(WO(H7ak`|9(UT!9n7^bqjfqw&>37qMD({ zJ5tM3T?OqVas>4qg3d6DOzI^uHFjbAv4sc|KK*%$?u}kq?4>NsW)x_29aSn0047fw zjDZ`7xz*<^_DYp!{0lPkmS&$T1|4AB0V5!?3}oARQD`sZRwF8rmuYo7{#h=e=M)xl zpOz#$Q>Zqmj%#eZJm^REXN?l}dOWQpHa~{wbS}$FG@=wi%>vS?@sH64m{06^U(v}W zm>cJbCrU{mTs5Jo93Oj&20q$yw3U%4a@c72u+GLv8hY~KOcseTsBB@q&y;B$beEBI zoo_Rfe{5%)oCUj7*It&mHyz1a>LIq4L82rGx+=t>vw;<@?dZew*8gMFpU7nnF+JOF z1|R{pVJxEaj3a?4k|%Y{Dn}EHCZRb%ryOgR4z#Fms)5G&^3)WBN2`5qu|zON=w*>< zK1}5vtQzL+P2OtjXp9IP)prczI$Zvo#@Vb^Iw6ruHG^Oe(Y4(d?v8IwQYFw8idLEm z;&RTL9d#(#k87;#lIw~8w$+uTp+So-5`LDCB4zn%M4ETVjEn{hY1EQt#qw;~;0K+V z2pi|OzQeTK`yITrWwAc@J!AcYhmc?qui%+i=pJyN6#n8X-M(?Q8~=SV)tK5>f0!-f z!#x(G(aSiqZ1M*cp<6AtuF+C{Hh+xq@h97Gp(+cC|9qNjO)Rn9E>UL9vR0~(Tw=K$ zz?rJds^VD?TgPw-^#JT5y6|xTS@s;0yI277zGRVz`N#|;1zs4W9uYTxjct?00vz5n zOmvTYRzSu_GmciSn0Nkgj@I;1gEw}f0kj7JA6wn9^QdaU>fJHAH{j*n&g9yO>1P8w zjBwz*PHr>+?X`I!5$5WmQKupIgLoL zv6!Vk_dv?0=IuYL$U)O%%HLP;c;790PH6KQUh>aQ07+P%6AeiBJJr_2+tC#PGH4PLgG|N{TWau9OXjqq~hj2hj%Flr0Jz8CfRHHqlD+P zHH$R@oEcwYbRH?WvShmO_p_0P-HN6K{trO3R+(iNd5xPuGp7~LS$%l-PBoQbXNsGB z*kAN~nwW`#IM4!@=~Y(CcP;~gKAG+#s?UC4>tGW-X#>&#DwTqWX%XV&_x2^KenZkj znOHacdKzLV<;D6)oF}>k7$~DqOuX_hpRkQo;1cBlm`*+f&}uTWCFT+FuQijuvX+wR zaF;04_oRMgrvva^CnwsJx_Tpm>0l{wR_ALoZ%-4b;|@Jr8*0rt42y&7J}G-U`a&*} z2aPt?EC0;RoX!3`;WC_p==fCT7qk7#=0Ev^ibE?kr}X?Zq4jubiZN`Qg11`j+OU-` zrsF{1M(ZsoibWGYw31%%Cqg~Tf=TavqqfmF zaqrv%CZp>3EnQBku*eLQI(~yb0kovU6E7$pW8*KIwn^xl8hr%>8ZTCO=0} zN+-o~OHnWQ=cUdAyP|T%L=RZSs(+wbDXmc%qH!1wTTq^-MiTX~LA^cf{ulHL4=YppAICSQi{DhI z|7k#T{y%W*mCl9hMl0fXZmIr!V}hY%bK+&Q%f5RdJY0jln29|6NtS*+S+21)-;~rvi?vkN-pxv4kawn}}G$(eOY#OATyqT5Dxi@w- z3v?!%Ap+1~vO6`=Y5l%JJFS{IzXsglS64?>k#)h|Y!+&I8A=RPwLK2GBUAOU;dT>~ z!`;jsuIo;5kD{a`H5zbUGb0O~cfxb8&zJeWoiz*AE&k~vJ*J)hc1!a}-}ER@B2X&f z+j={bIG26}=E~vWb$d7j4N-cOp=g{p&F<4_u!~O@=5^rUsiELwIifKqbGr-F6 zrkq8xAHe?s&Wo}Ln;$IeD|a&RBoZvw@W;$x79PYJw)xI05ayN>n!!+oAqR&t>Lwdo zb)nIWw%FHP91v{m0CJ5b6_zLXc0j2_!YY#b^egt%t9Zjsi981fU|zT*bCtLnNm6Aj zJ%!TzO!6=vXsINDv6-pYWD-Pu91ZVEqktr~@b0t;S=RJ7Cu)av(9rBalGOvMEJ=!D zb#-%#mK#}BK4Nxt@3BW(U!>g7`Jl3Aq;e6315l&5e)bU88d(w0S@}c?>xfmNBdcX* zZU1}zEMn~siiA{}Ta^Fm#(hg1n!jCa7~(#acMa92X5wy79IAI@N}85oYh0rQ5f3Km zM<1vgxRcl4*1VDoT5e+%dKyWz68@Lp49gBa7v5*6O`4Yg`xw1GowO#}MfQe;QT~c` z6-P5>;mG_QD-V!vUAMHI@~+_Ka_}2+raDbIU_m^kH`vq#iO}CFSHsK{Bl~q$)Quzc zPh#u=!MGqUJB|6(EXiL*2uX8sg$|jDMWKTG&~tOPQ3BchY|mNq$nfFrn{kq)z6kYF z@2v9t^Y#xY);s;0g;aMK!e!{c^#GMXWt4h&c$)aZcM;?17k$IeD9nNM#(ulOU*@ zS8l(U@iZE~o0@g$T`_FPaH>yA)7*L|=~pWo)2|&L7j<1V|Hu+~nW~Igol>T>vQ%>j z0E&Bjyue#|nGMq?uUcm?PK0S%|ExWztJw7F*SPy|6lX5-!LnfngCS_|n}iAa2v36l{i=lS)U{c?b~H-BcAiaFqR5_F%{V6W zKP;q7qTG(AJXYxl`2Sp#GDVcJtSt1HyJCoOH!Xum6 z-=hA$PG)*hz!mIY+{0I_?*`u9mPcPZggjwWRiz&k8oZ_5a_JUz1FK1U78~2c9;_ZB zT8;~Ue@omkRAj&_>v^90Kgv&*jhdw7p~i}uv{zVr2RG)5D&&A$*_tMxww3l)@Nqrs z{LI6#_Uq;oFWK8+$vG2+&nFL2NrpuML<9hcY0jEBsA5h@9LLpasnG{^s|en8ktCD8 zBK68vXMXLYgR#bfO|vv2vJKemz+p(QSb)wwh-4KO9yzP^5Xwf{tQ|%H+hCGs%p&$ZM7#FRB<6OPFzA& zA9T!kgZW22wXD8c{0X_eGK=ZHS013FNMQk0tW+z6z^Lcrdw+P>*N}Kp^PKw}&6^{F z?iW=%X*k_7tLijFz)L?q=wR-JvANY{YrQTs2O;Q z9d-`OjhzWOd9rrn_}4kPI{WjLjApG=!QdyVUX9g9a3eN<*FJIxlJz_)qv=uG zbuC{uePaSjR&M9V84H%pFkYsBXczUFIoN;mufE=p*UaE#l!0~lqf+E0iU>bWR z+w*hORaF%@R~>(#4NSP>*pYZnJ~Iv+_d3=<2eO!%GnwxV+|A`v`x>7pWCBgorKX3( zMn~6~!cW2cC=}E%>J;BIP1uPJrq&8XSj7@G%H*^F8+%?RC5QON2v)qDsHc#tYptiq zhOfH{zN5>MsuKsgxRN9J^yIs@#z2QR+ z_ymlax@bwviHMnF4=}LWxr@dEIpL@?NKzd8H#j>Q1?g5-_Ot?kpnRP}rUfDHCuGBG zoZk}S<4iuLLTYZYg=DD~Pm2v1p%#f|o`2>-lXJK9qHuyH(Is>l0WINgdV}#k;SA4Z z1dpd@2UCR_){aN29^@O69VpN|1+kfLr2{i+EkqH^{jGcNB)!Ol*EzFZ)F~B16ISjd zL9zmWfCrG9cvl9Rhcd3~JVC6OkPqRGkOrb^o9n{TUG4N14fG$@xHJf)G ztqtP%iO5NiClED)PXvQv&Y*MgWOzY(sqwObDdsvA0XHl0aG@-b45L$yyGHXJl)l&4 z7o3*=j1Tgsjw9Bham8@sKm9m0FOr~Oju4+S3yo}!Q$il%@9bO`50g6g$~DCG2w7`N ztR!!<(C=P&aAy2?fQ(jC2!BAY5=%ro@|18VaM9XPZswW3l(ftu9`Fs6Gindi3vGMp zyEwOvV1s`UN^0~{mCTlCE!t){8GBw2(^Y(gM%>X|Z2(jV7KZ~^hKe3lBT?6J%S=TI zbr*u^Gi#KKGvC{o;@) zjIR61&Bt_G`25SZ1A3f*8lZrr1@g0JvwHAvJ-wro?a#M~dpH~6^8L;y z^vGETgM1N5ksosu{~>ObAdkT`peE6+CB*Fm@s-&3I0iVF)vh#H%l{s%f<7CJyhR5; zBk9%S7|4wcU6m$BKUmD!aF3GM-tfr6w)OCMxxM9imd+_X(~Af48fkL; zF6tJC0oZypd7G=-S)R+~1JkeR4#D#Y`YNnO-gtVW1$8>L*JsYrd?moso_aI5psHU^ zE`|4oXbfR~pqcbNfD?O#!2ddM(Z&leBT!m(m>0y&2n^-7&_p=Jm$aw6Fo5muY2i`s zxi@?^$@66W?w}n;l`?r6f9NEJX=V2{^mE_AIpHQXX8#{@6k1nYKY<88!eXvcXkoSGsx|MkYb( z;wS6nr~sFQ6EMoRT6T^y_b4>tc9x0(M0*;=4=!m9cG+>EbrO%d9!L0B${nCm`6S8E zjBOpLq#0pstv7v^eEDu4*NpR6pWA~m)BAZOM%prC1ZoJHz#gO-zm+B#f$v!&!o`m- zu&eHyJ%D9i+MF40%?+G~%qy+gMzHAPpy=;^P!Pw>M z{1n2Qc`q+Cjb-=p0YIQUgKbQJ&hU~fuMcZcYB{X|A;erc`HtI+5}f4ZMO_?fjRe{Wc_ zOY#_In;_Kfa8Y2H*_<*mbO9)WM@Sz;^Azll)8EYUetuCnX`k>MrNd61fm5bu#*y(J z*hJWos1F| zp~B>O@V5#3e21U7)xpwL{ubWO4PASz&0H`8EPYx;e{Nv`toaT%xSZoML3>-#jSWh3 z)PZJycNldRPmx`5j6Yr;tr?|#q_bdin^M47a6TBN0%+3b%@QiR-JeFA{* z!XwfH=GU4Q7&9e+!6+g;VH#;gb6rX7LM!R(lsB8F?1tWEBEo;1Bf#0vMB#>Af>;6y zB=r>rp}oOcPrdL6Y}tnOg7~H6KtwqPh#P?!Cr?KpX6VXt#r&B`F9E}Ec%m7y#2DXs zgThCENMwhZ!6o}jS9xS9v5c8!?hfa3jn=1w@XRH`%QqR7vf~xz3}ys$Jz#Lnwa}*rLpZdH z(Q|^)KO70t>@5N$Q=eCX(k1{vJELy#eHD!6C)$p*r{x!@XLCU-SqbKr76n&)Se*uX z_lw56MBJfoDV^uvXt-b(++KWmv3wdxeV0PZ5*Jk5VD@oj<+&_MYnC=Q=MTwNUY6#( z$(5c#dE~6Ic*r+fRb3tL$TPShe6e+dQm*q3um$7Q5yf6I_m*!{yQ1a@Lu;*`qE3!i z`?3yMDb6+FUU4r+AKot%@o;Ys%LP^8mbbo>(G&%g4)hY)BJ)a^5K1$9|K69GS7^ zM;<6oMG%~8@(=Pzm=49u*Gt#7+|7vH&P&FEitkl%u(n%|V1!-F*~8rP?#jp++xDFk zI{!-ta=Xy;GZyvVpNUFi6P@PwjT`m+zOI@G zFgNvrzOCQqONNEQ^dqb4w~x(HPlcsVLv2P|+OuDe4M3Fd5#WPH^bGorTFmSlj}91S z`^a{|+?w%7el*=qvswFJ4vKv;P^B|W7G8_R zBeZ8JDf`mg7QYM7o=K!FVk4_5P_S1)EsJ14<%rPLr@MdR7T{Xw+>U{;ruHl*I!0}P zbW4XGfk5Q0%U)&4U;%}SSB}O@3Q(EKv0})hU?hjHBYIu<#@p8|J{#R1-_OSja^a;% zPjQrPS*DjvFNT_Cp-&eET-e3pYHwWbB8ek`Gn1ZZ$&78=wr$(CZQHhO%@}WN+qUf)?ySA)+g1BiovL-t^K;Zw z{jYnBy1VmcE)78n~oBL;5nk31u6r(_NM)?^L-nZk18xg%&2<4ZTGf0HQ{XnVI% zUaXvBU%(v1?VAJ|j4PE)-+?@QSGV|1?rca}`9zQlkdi?9pu-V91srNGF-h%rFbOK6B3+|zx%-W%j%0v6* zApQo<3U!lfHRM|BwetRQ!k>M0!iVSsQwF6$dx{}osKrFU) zpign5?LaaC`~k-+LNZCmsC1+U118XX_^I)LS*sbiQsy~!-v!MF`Dl%Y%dC7<+Zf@&DAGCY{o{GMY(I;HG`NuPz=nsQvB{-`f-M^Qa+A-iw4Ugq}cylnzLEVk}?K zZ?b`+^pXmi{vI3rySOg$MOM-fdMoHJBcATiGfnio_iKTJcTow^#Y;g>uBuCA-KXhK7LnFoqm3AQt z)hT)md%PFWP2ALQoMeMDvt4cdHkc5&n*WrF#CF<3Sz7Ah%qi0m@{H5lNobtB zP*UxY_w0W-AKIJd!RX|!_vs-?o_V0|)puTk6o7d<_$8qa--tx~bg(RyT$b5~?Orbm>qd-NU3n&c#IT zs|%e2N!fP+CzCj?rX&A{v_`M+FCr)(oxzsh^T#b`u#3gsxMMfjM?UjIE`a#eF+=YD zGsEF~Dr)EBIq0vRGvtJX0MGkCIIWncpqmJ;j~jR60aKpsKo;N)me=;VF+LcOxf_8R z88o@wiOyADX1b56LSviY^=I(Y`c3TW5ZJ|&Fy2jt;SEv^>V<9nU&XZV1sC&gJKl#R z^ClN532_zI=?pUGSSqN32b@cUILxJ^ahandD-lWkcb9*UET~rvIBadhvnAE}mQ_~x z#5z*SYfOhV9`2y>I6kdrmy7t?&UGjgbe;2OnLbpRT6pEZC=<-l*RGZ875V_Q zvfZpi%sF)aNy@V(>;9LD4UV%dC?BHRxK@$xM(<$lvaoYz`tcLbuoLA>#!`j}3^Ha` zh8Eizcu@-$_9OCW6SjnUMl#Z>wN+OiFW1j15qIMsap8jJa1Gk$LDZ5pD|8VM5Rj=s z+6Qx0_FIAtAMC3LB$x3Uk~*6@y4Xf_hO3w9%rbaN`U>;~y`}n+eH5T($n3};L4gml zJtD z*(hEyKwBwZIY9l&cF~YG3-YA|;sOOwDCEdZ#Rc*L!;rZP_2U9%AVrBF{fc*aK*dz- zV<|{W^uq$dX)a`@jSb`o$l+VA zq>4WiadjOvks<~Fc%_Esk*Px98ip6;YFFqt=-m#oElbD6<%;@72} zdzIV-dUKmP=F4Obbm5pg)v^#Wgda@nbYNs(n2y$A-9(BeaNIffb6&wf0Xast?|4E< zU(a6^d~=13P6@VWva zpuSNk^vlCf0@;Pty1hjbSQ5>G>*^1rL|$_ne+=B@2o=dKHC>8;E{Hgy!jaebi1p{5 z;3aHjllajP?(Qd_bvY4KJ~|*g@FRO~W@kmtPyVXTr^W!ORXZ)w5TwPltI@u|3$qrz zL!|=LoE)QcZXjl5E|Ju=95X59M-!wn1X6GCye9U>miWz+ zh`WYy(r0sv8FbM&+%W2g(eI9sx37fFV3+k#(#N|-Fe5N1q8lhddyC^84$3>l4^>vD z^5>rjOH@%+cppO%y$AY(g_pjH<2x6$>Jr`xewQlA9L;CQ&BQ`2>^q()MKmi*xV2)rg7mR zD6PGC&ws_*OLjC3Q6!}~jF+2cXSb6qqkUb~Gc<#8d6iUiQCBUH-UOk_)Xwv(*oN1r zrDSSm-`x!#oG8}}1uspaNiboV9+iQ!Rcgu{oPmUtc%r8cGvFh!(q!ny*??Aa&P?gl z6DtK_#y2#S5LjW7>)&g7Yz5<0JNzu0)Kfm+?nipOl7QK|jBs<2_%G_^PvYdC=2cBD zZGI@H0x)+O?Jka8bOH}E^^9Jc?0hM@7FO1HXi_UHyCKBlx+inbGT8n}m(=Vga3agMQkE`*qtYsrMTOYv9n;T=p_p%69WPIg1|;`y!v zo~c`MoaLWP-akIfs;^8PVH(?I%T|Y4awc3jYfK%K9lRu{#@`h? zm-J^z0EDb%aue-=?uk4ke}t>t#CT^2ISH60qOwn*Cxy+kA=%4ys0%W0y=?giWf(o* zIGr)@8Ch7pA07^%1v05?+rQ7ZB0W?2-9M$^q|`Q6q^Lx zP~X`UAjhrRSG{Ra8$m2d^Zd4^hRI(F)U_=+fB*V)0L(`^_(x$)7S`HpL?112FBf{# zY+xSlj{b3ALFSp2J%qe(Zef?XZ;k1=-xSGfDJQ+9rSUz86~lXZ##^65xDS)tCy|I2 zgQk>u!t1Gn$LVh@%_kZvD@PXYMzOUha%@t%?=1Y;NQUC+9U87EZ-^6@sfW5h&bUXo zK6aG8#qa|)e|MJ0Pt$RL7nC(B4&#wH|F)kY%AZ4(&me*umr=QPOfV~~niMH31OnUoJcg{FE9zwQIL zI@#PVZ=ctd{!9`MTLUc<=nr0G9H_9JB0DTBlA6T!b0PziFhR&xq^M4@)|`XN344hv z1+wD%__mA1aUK`52Outb^SIw6ldj3tcw+;=>#Xq3Ze^O_H}XTv$lwdFHn0%jPlN4$7TAXvp_La zGQu697i~>5jfLviw8kGZ5fDS6vCzLVO9cgl$25(u?7gjq-!|r=fByZTZ z)(}u_IgEQ&%O7eMBZ0=jC({)nz{|8`qVF{@eK$N+oJ69f2XuM_SttD$W4@kMy&gh> z%wQw_uO8wdicJM`;l-d>@;$rSLIHbhU61i&w_{9WDSnp*(|Bq**^(<5JD!S~)0L(e zU}0~A(&2%LRVuPu6iFVt;DU*b{SsK($jz`pNjQq*>4m!r+5A>&QyCGW+lAB9cQ6HC zAx!f5PLtez?Tw#j8hH+VCM8F#Oi%kZ)KRR4Scch`6^ESdEX1jzdcgM>%MS%gh#}Qf zmZ@R0c230P^U*52I*ya#Z3bSZbiEbhA**^OpT5^xkHwBx4AZqnuTnJwi@QmSffkKt z%yWv?z%VcB7vV94qBRoLL98aEHHNT2XCu&r*kpUzeL-y)qsiksyS#aE`0=PAo^}UG zeL*^)vXF(9oZu=htGUf4K$CtkgC&)MiRq?0aOH4FsDxrGA?YFDJNZ4qy|4q_ztbe1 z=~IEb!#@tL??$vtpKs4H$K3hp;K6JruV;j=*5_0AgV$>ZLzSpdfJTR5=PJ*!MXTi> zi&P;PLnXn{K1)SI=U-qG=@vIQ?T-)R;ZJzM17GF}2dg!`A)i*7_pOT~zK*DwxQD&4 zU2k`vY&%o$Hf;dhh9j?b&O@s`Dmk+qhS4PMGz`rzJRb{&H-f$xGXTGa*q?hUwX=)=&)14lCI*-V?%gYH~tY>IU8T1JTr6<(KsnZO=W1 zwaa{2pGl3RhBYN)U}?>LyRHg|xTReO^u$hXiKz=@BgUAbGEM?jE+m^RqZY5Up|#^M zgp;F&Ovd)eopTi_)Onl4GSLDhQ|J+v)^fo#=Q&?c5y~U&ftF$&oJngy|hVE+P3j}0wV zOVrIr)Oujyo!NM<546?Ppa~GN^y7<|9phi|ZUgm_>&)!5)qV>Z5@0V%y5sU!%zha}F8r}yGowzgl*fKjgi@Jj=v za#iA}j!xxp*$>d?w*1z!HnGb2!J!KLHvZ*r|t2j*|GiANbzQu1{Ue`~=3t>%cr$%|<*C z>4DAjX!oW~Cs9ChNn#oKmV^@S;zN-{mCc-sMk}gqknOtDBhN#J(cgM2&_Fsll{};5 zqq-te@N758rrXHMGFFm>r^%)1+-fpqW*FoImzwIXR@%(V6NtIA{1lK;(MV}^6{!p? z+Z)bSmBw@7PK7Q%vRs2vql@NUV ziD1-$pQ{6z=e5vzclGeyo_l2w{Ow>AXB(9;?~xlSvFO?m`ug7da99BG75AgWXxq>#WhRJZi8)RTC9e2G4YhV zHZF2(^n%!;osh>yPVH$gdFXe13MLw&WE{(`O<5 zz}mDPW&K+cK%ykF#Xe55+42OHrRw^+$K6wg^19EPb!bY5h#V~7rjO|GlqRBOqqY)a z-od6}Xvm-y$<5?S=A_z1oos@@xMNRKtx~7x;#W>&U=9ukI@C~m$;Ni;dtMNF$JOAh z4OQq5F6A9hC&g(+;b;@CV*JW4wKDr1w8HV)P-R-De7xO5CH4vIs<)G&?l5fX~2W^yU9%Y64p} z_+KLd0R>0@5AkVA&W;wgX8)mTZs~a09WujzfAflz$7dFH-NVz}(RQImYO>GW$CGPz z0=8M1vw{cDKw@vECs$+HrY9s^E%u55R!CmBd>aRM?w8*89*#NOUa0jbGl;Aw+Y;!< zRrrR1dbuYOh-Lc+W;6HEUf>qvxUk1gxh8lEK?C&D_sJ7_l}og7YuPmJuK#}FvZ8i~ zYv4Cb46tkdCJZNHh2nzh8C8prYG-1VGfE3Yqt+mLl|dCd;f7I1|FFo-jbaY3y>*K- z*-oQAIEKJyhSNx`L4#D47**p&)Ck!%#+ir^xmeSi;eHLGhLSfXQP%nrjvT{_IaR)z zV%yID?qchVvbsK+3oP3MiGOC?-`#4UKY4GER(OokO0E2LK9}|AmpB|a1FGj^I0qvI?4>7uO&Jby6h^rmUQH1R55-$bhJB*7O8jjK`f zBP&ppmY7Nb%iVr5iZksEJ$U4nVmqe|)dp(eN>p<_&9FV-D$p=|yM|6FER$g%kLF@g#DDFX7(AU$cTT$&GNpRHBg7 z4Gq&vRrB=q^>xwk3_m0RyEA*L>aDZj!>oK4_znOd$tj#FYsS9Nhqq;Q2oUGnoH*b@ zXbB~j$Oss_KxTVu;ECRCz+h4~Bje-GF&{y!l6@bo(3Oepr-OB~GEx&&+UeB97I6n;+&j*zZt!qSm7gdIyf2(T5f8?j{V#oA~5s(tms2MV@ z+t;#f3KLhPQco86N5H#zXFU%-8LcKcBppsC9_77**3l@5N|KOCJPUxyLcV^=d zD7;uJH>bqv1C1U%C~!ok0n`80{6<(98i*TUa#F*59%ddW+`Smoq=i7qSA(?#i|H>G zCoPpb7EO1M%-2#zT5@`pJ}T+cg(yakJ0q7Q2yMS;JVcPI$wj&!8??MntGm+Uwbmeg zpmHFE04EqK{L}UL9l=f{ghHbZondR-@bkjWh43ez2-JAh>pMpudDQPMe+F9A*YTY& z7&jhf$_{FW+}nwct4|dl?2}A{RbHJF?B3noub$O{i*%^P0!p0=>>JkWDTF0@;FGqy!#cME6}O%JebYq>pZ+7cN9j;DPkl-q@%E>$_SiNXDK(jI6^zLt*> zxV50&KN_X?n?ji7;L$*hv+XK}_OO*38!;W2^>Bz1620woSyi@ol)?_pmKBRi;OR8C7dzb_!m46FzT>A%N zFTcXF1zn~WgxycsJOXzP#El?Lb2C!XQuQ+44>?UVUKoW?8}%+wT(j|mQ>M*JgIQ0Z z=6uFPZ1JTbD{n98dRm?oRkqHHBhw2SSE30)b)|4ve(5C!Xn@;g8(;o5?;Fq$IcVB; zpOb>hTZi>g|NHUVQWiOAhVwQl!H8&3*x~mj{jul$)zIVR?g?s@+3K6iBDMLMM(5A>?e5rLG#CNk@$xk{2}BRJjRoQj(KL&_jRDFi&ZBXIkpB}PM)wbrXy zd0m}}*1*@l4WuDVUyrKkQtBZ1b7_MeyPB`Nv9qDMmjygHSvg&7ZES;wD~~##N*y7Q z!Y&lGMhdX)67!?uh3IEX83fvcI{O}E6WRQ!Qj@21uApTk@%60>mbf~^yInNrm(Cd) zic@QZ@oW+h>}V5s(6#2cW&jQpqeesM60N#lx>-TA_nkV+ zlCNEzpvvY)KiOy`?4nm!(YY#D-UeeCD*Hja_wLj$g>41Q{4Lt zP&Zi*H{Cb{jHW_OlGIVr@adKD3uVM#d+!SfzrN!`Ywi^z5cW}DF+Kd)Js3oHxz+#c zH*3|y1qZ^gEyA!M;ab}#V@E@Df-8jOm3`N@c>o{?G{%rYbJfmhj`GGz)38R(Y_~N1 zt5>6IkBJov>y?PSLgVO%0UhdE9wjneO+8PGBUcR7{5m_~Wee`4nPr*Sq(m)f@gYm3G|)M&Sjw-RP3J*)w;FjN zc^W4$g0ShR7Yt_9%TzMlY()RasdU}^t|vhuj+pW^fY{q-wCt{*U)9{${9(k&K3(>@ zfmUtXmtM0#3LBe24~?D6D^(h>07Rg%Efq!Vp0M47*fQyL9+Al7bd$G#*hD)DGOCD* zBDp#k>DGSTf+S^t+K&qVdpfEhiriCJ-@kO-cnhWhBZqD7{=MDJ&~RJ4;#*dzk8zLK zrE0#IXh!iTmn>|WLYx&Ar^E0k>ox|8B|9tak|&Uqk=995*@|n7lU!XWmptR&vN5?7Lza(*NVcB zMAC(DxMe0M{s0Kzf|Nc|3q5Nk9%o1(L>WVII|#&UE5%SnH?e|3(NEhOI*5nl5L{w| z+EJOfPNLPPKa8u=VMmS={2nB50Bzj;HK-bfFK%HS#C~j0k1{O{;vhf9utxeUvBPX*^vI~{E*xjw258UqgTf$2=o^-xSq|96 zwZACoiM#(U1^kb##~21!<)yaPo1C9I^-5(E(v|q+h9*pghjw2}2MkbaQeQi)GJkjGl4-p?K!aRdXY>+p#z*^m#ums1VDLM)D5*yl_)@ zebVb0&wdXTr;mMb!ZqO9hUEZCD#RS}h=>q@e}m6{cY%3dZ(4R}B5$=N-t3QOY)*06kc9%%)PuohShqV#}*1!&E{z7^j>*X|b|rw|h=A7KN}2Q`2I&TGHj zV^@s>^gX$Eh^V%xPlOQb7n|{SMYqTJu-lYUOGWM)jIK`W@145{7fE&_Zd7IbdJJim zYObn{;_}kZ4xQn-qa7sUX6hyu|7IfvPo}`p0h@d7zD6TieMk6gxH|75`Yv7z*IjJy zL}9ma7l>l1uG)LvV|9V%4;-trNMTz#iF3cJ&HjN z->+9)MfHrjq+i2A(#4wE^woq^gT$%&I=(mwP%h6xgDd3}(6A7NrU-D#Xz`%H4qm;f z@%MA%KtsGvjF!Y>)9Qc=>MK$R;R~FKfuR7y7}z3WfO7}dG{A2nIR-e^P|g0^j+LFtV!?v99k zz&a9U#~;;nxI5>;j>~S-5U$+38(HS9+_hYi%v6;*Y{>PkEIoQaJlk34=TU7J;gz+X zvWFVd14>-v#$-2NNIT&!g00$>v4L-MQFbvd6L<~%Ed+MH?FHlUdA+8a){uQ`2p70-v{onX(PQ7Rt+W0NQH0rwb_2({KD z4ZKE;LEGNxw(R(nGLo>I88X)6UXlV<7a7Lo%ee6@2T;W+>5 zc1f7}uz6ex6a6@?pio|!t1OpFE!Z6C-ke(5BNp#_!@;JwcKs2{1s}WI$d5*~LIaw{ zmDYy;wDAcH_QZMKtM)Mqq2!fJt;c5QPS#IqA4>eYG)9u;i!oG*GajZgDb8lV7&cMz zX6LPjS#XnqOYuWzShRDu>WAIfvTEvZ>m*sao<*m=9Sa9b7^`t>Hx=uqA=IuZs8PE` zi!?vOluFLWbu`Kr7C$Qu(hLG>eRqmz2=NV(>nkz|@Et+SxJ~F~+zaK~oZ~2wYzkC_ zih9ur6HyI<4Ku@!;{B+1N1Z9;{jvR{jnc&&jRO4SNU+JbK!xZpe^mEaBozd@7B zZ67zIz#y=hAt1za0eOC?uI+omQ|zCMV0EdQwzLMMLN?Fqg1avn!K{4dmXT#aIHb89P~Jt!x?P^{I<1x&PkK9OU6A@~9Vu zzD_lh7d_$1_rmYM7sa_{jBLi2bW^uMU zpD|$<;CRm9C{kv?W54}qnJPUYJG9f$>0}#IC(QUA*rws`oei&s=JqmE*@P?R*JJB8 z?OR6-!3ciKuiDN-LnQihD5jP_IN5@phPQn#gjvGyqc&)RHQT=b)MM<6X-7Bz)-S)< zeqo6k42EPMVX@)$Fi5hw+m@3^GPkZm>+64s$p9}K7uDQlzSOmhEZd^FS3k2ecvul> z3Cf{|?zUhSc(d&!Ww^;5^7vw9x<)K7A8TJw0?2|1w!K;j{v<5+1n!AbCg zP!yj@&9k7rwO?~8`FI&c;z~Mht!c4RPQqfgAN6L)o9)0D8B1w(UJE=4KCRan2$d-O z%Tr8EUf4O(XEJBMBpaPpNVd8rV0wkWm02hl)y^KCTblJEK=`dZ+>=Eej`l5MHH6ZZSoiJK1}&JjeYFFyK9!&(%mWO$y*{1s?qklanoq_?VMyF?o+nLb>sQ=)!z zXf9U?k4jHzq3^4O?U{`T7Q z6AO~dF36}ki0<~AJ_F-{jg6I`CrPKM} zJ#k_B90LUZ4A)Fv>}nR0Bmf<#Y`z@d|;7%bM=dcp4v-hU-%1 zL-N4)2>pgc3^QN3osyFygJH+zA7$EQk;S#MC{oXJTmvP)u$k2C0h3B+s?463gvtd= z{j!B?jr=_(gyhspKFw`T6f}vBuCStNS7B=J!V-xqA7e|kD;qEpNtv&x%4e$+cjY2E zWoDexLLtCdWN%M(ffh(=v(;q&daPrs!(V&(t4&p#!qdvD>NrS2(J9Z*NIEE1y0Zo` z6_nSF@#U&Cu}{G11ar6FEh^k?i0m%4Tze#t9bV{BddKf(uX@jcD-hdaPk^h^WXfZ` zEnwgo4fP*jqeyyft5kdJtZ5=c8P9L4>WT8(_ZjX#(jgGgKOHO0ALhXS`Tj?)P|7Aw z&Oh2A-T!--AJ!C*n~9-~fi0b@iLJ4nBb|k{wTq2~t%0)%os)~by`7^o-G9P}8d#Y) z{hwfefK)`aHErpmX!3tR^M$bgLo4+EJD8w>vyu6K#r-di)s&h<-4AoV`$TOrKxpme zrk)Qq1<8;@AvoJz5T+Jq4YuS5HgCigvB6Gpl@xzU5_5tz^O`l~aoeWBCQ`5pW-~w; zT#|exN`7qrRBMB2vw6;=Nw%1_B=rn)Wunl8x)+(DSf%1k&6c%XueeV#2HWDkyuQSA zT=`UdC^T?J2j{=i(K%n^$V%wM#;NsSNJFA3>n^S!VM-Gm)3xHyhfTR%gUkn&zw@cp z+K*)0_s-I*)u-g2RO9cH$Ws;F#F zWP1zG>)Sy+ESeS>6)CGPus8;!(K^R27BM(oJfvvFVL?w0n#7WX>Qto$HbzP>-*!a} zX@aAKVw#F+x(e3IDYOUPM(|oaN;WGl{?3`mewFSmb0`~y6$xd-09T$7KT39(@a!{~ zIAiF1z(j;pSNf2ST-l4{cP^{^uSAogE7weM+{%1e5CXs}&wQ#`vrd)Ta66_y1 znL)vs&S-Ir`V-8{%4_K+YQ>=aX-UjEbf)j~N1jxolT2XbML>MGp8(auXVRCD&j9x% ze~`HZK<0qE)tD7v*FPh07ODm1^^%Z(epjs%3!2MJcRwS|K6`>NAO&`@dKqxW5+(}k zW$ZZ-5OMiO=7xhk5zqe44i;neC4Y}32_yQG_?G;ROr26?$c6ckF2BU zcREam&s=mNcIeiKTvI)`NI#*)!;m9apbzK2vmX2dv$-FGEgSdjjmbthEdlrDG)kY2 z0GlevnwpANH@8zsf0dt+Z(~bvl%xjZr5`^e6i;j>K#%NTUH9m;?FuRTXRX@^Q+>FW zD_1Ot>-X2>T^`ZWN$5C!cIyQx0ff)#S8m7%Tm$D(x9ekZ=gWN`8@tjNDM zoc#jB06GM1<^wl^H&iYW$@_4m)cU^J?cVL~|Ix_6-5q*X`pJCOpUfBi|6WG^cjhaa z*xNZ-{BZC+{!;^%)c)HJ>4ECGx6e3no{3rFVQw-$W7_%N;TLQ}mp`V)y*Q&p*_7Xn z<`+I|3&9z4&fBll<(n(7%i75wSpwz7Gf~9c5EWlKSe%eHV`$9=aYS-s4F_}L$kBBO zcQ)FqYY<}VCI(Q<8 z1#*25-yKT3tN9O&GGX~JVdHE^Q$_+j5CeqeO&Q^q92K2FV6oMU&x?QMcDL83ANa@E z{)71s3_4^VeA{oSst)gSAyjSN2ahS{$xQF`>4)@!_vq#ZboKsAH0%-joH(y1YTH@M zSgYS)fml$M3dGGrI80N7`NTB*dbi;lZ>ocN;R)mp0-ispRMt7io=zmaTOia3XlgaY zRP(Ori@*LjZTt;PJ&upvIu1_GiDZ1P8#6VI5}*bmlL_>CB&g}Xz4vRmnV{C8>3<6_ zv^OT%)8+IS6AG6tf~FOu8Klj6S>&M3IkEGEB$vs2(kv;zNlAGJr*j&WEoz8yp@3bI z^hkNAer`)$Vt3H?%m`5)Y!(BL%@rlg6DZznl5szRS@@W(q>5!7ZEGB|~8q zv9dH@scB)z80T*#J1vY;PWS zceUFsgQh@ec1&5c=8=B~>b{B2d9*Rz)YltgSKHEClq9&3Q6g~@y5Ht~-#*j|MGArp z$bPr71&#gE(HSRyxjRM#)%-Bq4vzIrV~eMW3C;VU3cS6M<(hpab@#L zI0g|?6P5?R7*l!(Naj>lWttM1DK%>FsOdIockD@zo9}JQ$HT*@&Bqpwg)lg)CvJyq z6GrrtO9cV;q&qSoDC0L=~ zz&2Y>7~5`Un!}qw1H>M;dcU#A`*4z>@S%M-Y5i;1r4+2G_ZhjS&jom53iES0e50(7 zjIcu*ofv@Zx!i)1RWW!a$p1=dBhG6vPAS^jY<6tT7NLL{qHS`W9U)1~fu#O{P}nJ> z4xlYQ&6R`!NdM!V4D?r)W-CjSPbDE}kND8YiOV%3fb%)r;-Z5L$eA>fb)g)}h^Cr$ zmWGwmR(TC@9X$NZCUM?bAyF+u-N&7brd?>3%}^*W{1S)3JD!U=|h>VoWZqu zL{2XAYYf5?4&|{krs8C#k0h$RUa{9)C|FTIBG1sa2C{^E%3jhL6ImWsA~3^EDpOmj ztYu0)s)rHm6dx~t)Gmo$q&qlv;E3RLStjaNb_c}=UWh%~?HDQ-v~`xdExa@VI%|Z| zpL<`z1){|FSw$h)(HyWx+y+<^nMij#CdYru-4hvZi{(Z#P1~sUZypz$aKPq=zePJM zzO(0I9x7aW6 zoWgAxjekXlICg0=UR#X49+5jE(;>BBTLLzs z_`9o~PT^g_*$+ORMsy|45XfU>n7v!*Q@~c_`)Rc?x6KK&D|xo@8UJrj51j3LapIa*<^qsC zfpQ@3$v}EoOn!y(j_FfC0RCOC$A#gTmqajbL* zr$Nus{ohiGD_DuwKUE{hBBhZ|4pP0KWL^?HN%BQZW(K8d9{_(^0H~|Ua*Hx}LtY#{ znI=k;fTLTQTGCNW)z3(A@XbCII(v+>X4;UTj?c^ z+2+`LOy)^GP^D=<)tUI+F3cXcjZ#Wd-*ZU%8y`hkcJ4W59g+&n|MDwDa8(I-n8 zi~5Jk)R;^uHMhr|Q^p2p$2o9q7dtDv`@^rcf3h?|U&~cS=Gw@C41KgQ^s69kLz=te z6P(kmqOcso*XbxWlfY%kb?W`(#_!Dx=NDHDy7M1nV$CZXk-HaH{U9MB5Liqrl1`9D z+z4-v5BU{u-tJOica^Wit1+QunL50#9T#2Al0-pnj zd8SwLvOUhRP{uqLqm&QlDb7p0V%QVKqKeg$MQ)|cDabXfCDO|GwIB)^Xl)8z0nEER z>47pMJjMi(pT(lM^`|#&75i|Z%1gem>j}Oa%M4~L z{k3n6PJe?*AiE96ux?qT?o>J>3o%bgWN`QgOCX0lb{R#5Mml2;KjfG3*HbYdOQ}>s zCFh@)LT6`N=Kt0>J5h6E`9|!@w7XP3Q`>j-L0QPq!~vE!e1n%*?eX*n-f*f&ocpIg zwM)e1RQ1v_n!35RDQDJZ3oq3q-EZH_WlY?ZY630HVZ1s$oj*VA)9euQS;jsJk)b9; zwP^uelWOjwZwcrUl^5cgaOHF_zXX-`rlt7*(Ag(q*MLxq-(Y}%t$8`lHYMkE{{DmU zzHu>_DDa9AG`{;VH-|D%85jF0G>|MJ+VhLObXkMfGH2mU0`sj9|)N)Y- zP>Ivhi##^uw}+E30z)3WOGtitvfdL=2As?E++xi@<@?BAb$TJ>Hc(UwCxK`MQF+^q z;6dVAld0v?f8S?MFD|+|Co8*pFEToQ>lhSlD*rbrcWy{DI#CBc-h5(3(uaM2G{ymr z=gxt`0(b=^)A=%~YL5DO9LvxsDOrBRvUDFFTw6czsPhbWo!Ow@iY$o(v`Br@eEjkS9psjfjAbQ?JZJCf57pJroBg4f(zW& zKz|EPlbKv+8`E3uuA7!>B?%iKFzA+#M@nv=TXzT?-~q2@mVVb0oK~XxWbW`0%;5v~ z8Hmmk+*0beEePS7Z1MVO`0w+cm;hWj#>5`3<7!C&!X_p<7z5nkLr-(+4stSSKHnz7 z%2`5Vl`|nPmC4`|O+1QUKv^(Mv_T)lvMSAbNIJ|@eS?+qbaYAe>QYHT@! zbxQ}ecmbUZen};y6qYmun6cs^e6Uj0$L`MPndRr&7B)+bg->?p>yjgJ1zH|0XYoPa zWyxHhsv|_O7d1RJt=|-7EW+8T1ODw#Y_E^&u+7e%xOQ)<3j6^mR5}dWsChGrei;H0 zk!@dT+`(?Ai4u7);g-kd79vBEQy*DFsOuazwtw&$a0kZ0&k2=+j51Q-JMjKkiOhoK z3ArqY_UccZdod-Z|1Z+sImohaSr;wawr$(Cjjpa*W!tuG+w8J!+v>7iUG7)EbMC(J z_Idx@ecy_h5i4e_HDkog962(-{4#UR;c-9ut!4K)y=18D>L?evNQ#P8t}eN2d>) z_vc~{(HAnk*IfH&U`KlCGN9mxbb~uqG507U?q8sPj~OoyRSdP zBo>2%q6LUPrYlU0A^lXBme*n+ud+NK)s#0?=KYzS1aV)jX-V_2BADX zfOY`xSzZubsc=qvaCO^Zp&3D;kik)vYSs;Jn3(`L0--=5@}tk8X(bNea#MD14T>Yz z9%6<|#^&a?bl`EI!4{!=i>p-A3+K|x5=YSFx;ksNbheNkE!043^6+(K`wcqHs>AZ^ zxa+FgxIyU|?yd`$)g9YbS&`XGnIzfI!yPKNb{jGR#sn0^uaH!&YTfY4l(ekAq=j33 z6d>6E@A$d^ZpGP&6ZubPv{#9qeD)f@u}Oq0{1 zv-|vT*bps+b8;4Z*w4etF7WfoHh@Y1I z`m|25>t|U|qLMNC$?e3_Ka%&+oIOR>xlN({!W*M+bU!kyi=}M&%vX9npU-U)B41G< z61d7P7e9bcf}w-keM&Jw+UH-SwXvop9YVP!Cq!AKsHQow$4h$SAFj~G&5CYF!3f7I z3!c$lBP&ukYk#Qs&Z|3jP=x<_1YJuZCMhW>HuBT2tHjv-8;G5W2-{iEUhr*nO;Sfr z69L;55z0c=oWZ0GBOngo@J(Rvu>Rt59D!uFIk17KVwwu;#j4sXA`=St>lBS)1=Dm*h8k$V z(LBbWh=9MJ;B-)l{-XK{irK(u8)PV$U%({dGS}p8UgM_6BxO>LJ!?r#T4)UZCbC!z zn@HPuFlU6k2%?qJ5T5oJKC1}Lb zJwMsv8_CJC0{WDh3arBRulNgj7DY`cOo$h&DMM0Y>b7?OIRJ6JV^=;EIH}MoHL&C}TA+g^L=YIy)>IvI{JeipB31! zJpnc(8VQsxA6g}EjguezGE_~$;LA2?)&1wQ1t5FkojDJmCo&P>7XzvHGC}zo6A0zn zC+VwR!Q{ucsu)nz!qs)qT-1eY*0WzYEm>Jmo23QKat#TuZjc&Rkt~xx3ru{B!M)Tf zY%SlH8iGF=LYipOns%z6ZZFdcS>rCeG9={YbxWdQMPFq$r1H-MLMS$&(${kDJ|iII z(h~b|m4|mWF-8a_j5f~~(G*^L&XSUfI7B*ADe<%Gwqq=yaTMqDog1Ooqwd>`3nFKF ztbP;T(3V$hs|Ysgf8eJNBOQB7r}H35`(4^Kcg#T>`b$RkGX^yvV+^9%J564=r!ekI zk3Gz6Q}%Q9^n0+zO6)Dw3vx-Z@A|IN`I?We#3AiABRv>Pkr9q>14|0r|3RI*krrS) z`m5|WO^ft;82X|+5sm~g1(A6H|QiL+he>o~MG)knu*^wt4z2)kWBH&LhIcAm3@ z`T2sX08aQ9C3MD7Z`#jx8WZ>Fa3;x^a$C%G#ByB-Ep)^%Plnl@@A4mAS>x9$jgR^; z{U@w{_^)}I9}fdz36L{&KT+6m-zJZ7Q#3nlv^UsIpFfVX(#T*{F4ONx+7#Wo(LNL<<(xD>6RxKN2q!q@Nh-R8%g z(_cN$8W{~k3+`NxCz#@CB@BlH+$1hkbJprRSU@h^$`}Sk*v3^P41;5LA~v> zzY@h!S6AL$i#g{;Hao`PVup16w0f;&e_N1g(mXlSOzc~{Tnk92s79$dFm4&xk-ll} z6vh}t3gYk5dJBNBnF5UF4^N-t<=OT*Yvcd42jcn36v*M8rA((dQB&X&YIw!;zNtuW z1a}ie+(7-hQ92SSd$RU-B&L7l-fjkiKLR@MU2j-5HEd@uKd%JCZmQkjxO~HEf(M2pB<_#(2kzdM{mpR8*H=Ei6Z?oEtarjoE}RmT(SLY zh_G~Jyhwa{_SM-RvK8u#EYfsJA5{>(eR8wAZ2ifHYY17_UhpZn+pYE=FmFx8zYfZ{6aG_ZOUJH25)C z+Nv3e{sU!X<15Uhk#A|*nT`b?+$l7svVW65itpXoCdfjPf+ywX03XT+-1~CSC{$;? zWl`2=elPfQYQxz%$QTrAO;`#ZBO-;=j{G_jLf}bXty(qirROa1g%njbOfXU?IOeem ziS0xUiRJp%;ZR4=(kSh5FM$#|)y_Swr?8Ma($XQnCQr;x47961R0ELg+Fs5y0;F13 zq+j;kBG2JC%E%PVwSWw{k7@fkjT4lj$0sovC2m1>Y7cgqLI3*t!}^}_LM5CWQAvd- z&qXK4atvLt69ACF~~-5F|NK!D(A*JZ2Ai#Mv59mX(V9fzq6!pZrCBQYcT2}%~A zNJ!|_eHXd5^7A{7HWaQZi_)v~^ImJdw}j7u{2pbjmLZW|*1JKd!jtqyCq_H-zXYpQ zn`?sBsUCQKvcKpOhu3T0!duo&Z#J=*685WVgB5sB1&@fH^XK(F5bJKX%@=yHnQ}Hb z@j2g`)I4`uc2ukBmj@jf#n89pWo<;?Qn^v5zM*NDc9hzoDFPh%($Nzkt=HL0o}-q~QSkg@g(0FSRbt-z9 z&}AuC!c*Zt^sFa3QcVoh14d}uy6I0kH|kjeFygWfW8Xp4?2pU#!M8hu;K3^ru40lm zd>~M;0c#8$wP9V%g^Lq!9ihPHT+lr7*+y$x)6+@Z3`e(@koh^}UfbtROl(f@{jhA= zQqMbiF3mhX7`0Da{8Emev+Lfzv5_W`7RwhfzvU{>>}GsT)XtUF*6ap!HJiVVwfwku#HA>&z$}JreCG+ZadLOML$`hw9?_8j1Uo6a`}U$#jU8o7UjLrMx9rIa*%5w#UX(kC%gZtogq0`I zc}2v+VE9e$8hYrkqdA?>vSt3L&f;s!{?yxba+$-FNJBY%(Uq~K55q(c1xb;x z47!i8JDV?W75VvHt7lMu!aodsEi#^~I!7|OsntUIU?s~2?Cl{W>QgQE5G3>9xEg=i zy)FLEN6Wf;5&BShxLw2fixKs)Gno6&xw`^P1-l1#xLc9nKW7!p_o)Q*Uz9zc)PV+t z@9+OyoZr`f$p8D-*~BOKjo`q**c#fHIN2KlOo*iaH*-)=^}m^edjE^;r}xi)oOoei zENq=k98LfE@jrK9ykLmFKa7kpJ~01&oNB&h5FmVG8N~uXK)nC?66FmotpBylZCz>A z&F>@hfmSUvgC}S12!>w&)bkXEA30Rnn%m(*s)8)Z6zXrcVpOa9EJ!jQQN&TJx1HwU z31iv8*$l!kDoN=Y`Kc>1qLNj&6Z2E8I zfo7;#s~;ZlSfRuYCVl2diK?-nNT>V;u>1CYfrlZzVFhY-0rje znXDszh(BP3+r+enR{K0{!$X8*m`xPX}omfKl%Qj3% zZ%T@LJWf!?5uE)!MdrarWt#_6777_!B9EJHHXg5%ol=IdfB!`N^uvK4>=XAwb*f1X zz;!@?32|a0+iR8ii6|WkRzNTS#itJxqw*}`*hV^=!3y009KkQEHLgW5aKR)tC8;89 zgs;;_NjHyWfPxhIogt$;isl}Dpc$cV$2`6CW}op(hVH)Zn)b=VCF42<`#_s3F)lR` z68O>|a*yoiR9=~&YOwefj*9IN$)LTL^6F2hjIVt9d%y&Z4x@cxTuBb<`B8tb>A9J5 zG+<5em!@#SQr6PZMW70YHwfWAm?qnxh%PdG!#%CUKFJu-=sU_inIkbt=-Q`#LB~`5 za9=2lOiX8!it@rPW0MEQ^N9Zhc+3EjZM3!v1cFt!f)F(2{*K}qFiYehi?^AH)vRH| zu*(Frl!B3>hkQ4nvpiW=kvqYIIygs2Z_ZrAeUIlXGxs>JCpwgQR4r~1sIVha-uuC2 z!d_9V2pJg$Ua8LnS;#Pg;nfSVTMTi2vrp6sL-@K6O(kL`AoSg>d+Y41NuvJGJu#0E zA|Xb~qQ+EtCDVj}LM=1i%8I79(~ zr-Sj9?O*fgVQME7l!mo4+FCqFNQqrl0%XcobLuX!6y2xiIJh}}=iuCDS&Pd`Hia(* z`D^Y@nNz*I6ViB=iXtWKL72MK&DPbE@9BGH)_QyBUgGE2;*68r3RY|@!Uc`b=sM3D zvgTOAKnT#QC1T)eJ_uFP`tikkm8J99*}qkij?2#5TEzOZ^3Z>EhN9Od>kx%})-R+} zx+ij$9<8)CX|kn`JWs^8arBLhixB&mq_5G&xn+Jj)x6M%gdT>< zu9(s+VN&!;I1c%HrHPo}6BRh9U`K_i|5+!;E(USzfSGb#_cNb9pH z{;%R4uLiT;kI&raELA`G=_vCHH5KhU4$Y&MwR3jT4gB#~sFv}DQk6{X$X`=x?4;Rh zW@}u&nuztxL(++lm8`lQT9U>$^{z3~rdH;i*u%-y;w46|2KCfev6;k+IZ18IipA$o zOJNo>R&xH|UFYKC!n@|O@H1|bbp3}I{nys<=X{!U5Ats)RJj?$=QssUg5s?qB2$D@ z@5bzXnezKAq*sBruUu@Gqi45O@YlB2s!?k0@F+t|zZTU$5LwG~!$M zJG6Te81z4HDKdr(b-2^~!f6#$hIO#hYSE{m7gL_hMN5Aw(Hl(yTcyBQ&=egt;*q!@ zS^RYN*2~DMV`XQqNX;oM%@K}9w4NoSXj);8bUEK-jX~byhz7W6x7ZfDcbed{nix?+ z*8ak9aajJQuMTqpbWE4!nRmk-1d(3AD-Q8Mx{_*XSaomsa5JZcuU@lt1d;LGx?9)! z%UhlU3W_$zK0>{hL&aw-WIJoK70%w%AUj;E5^Jg@jigl;CV_94XXSN#kp{efqv7}` zOCG~Y=}`OVgvfD;dje__Yk@hq-`8TxCgn=r_SeqNF*HGLD+MgM z1egyyupPYtFxo{M>eaSYQl=}3+(jjT)fI}ZPX|I(_)yYe(tcKQ!Wl)=G-QDJML^z* z&oM>eXu)Ca?x``=E8kclCrmM;U1X1!?R*LX_Bt+p?sfbD4%+u5g3D6o z3hNT)w__QJFG{dGIxRy-?REj5xrRDOp;lGjcSZ z^c*QMkp9L()JU@pF^!n0H9ZxFoS#S1Do4?CY#336WckV)`rIT=s&x(wCONslxdrd! zQ{2=3KFui*nYzGHTK3l@O5u1tl_8hncnRN0LYr*hwPgw!@*YEeVFJrwjjm?5YOVNZ zbaJ}XU6=-8SYZ-&3z)Yw-f1ZwgUO-I#m=y=)i|w_+B__%=sKbcV&oTY6;P1oCSfdF z%qQt)XYv!}B&mT!Pq6ZIzTpy$;GFWvjHmoWQ$4GF>4>I$^8|O3wa3j|PBRm_>EuiT zVvAtP&OF~4B}0Lrw()f&qcclx4x|Pv@wz5SiZ+U&0f=VU^B(RR`?FYy&2FIjazMBu z+V$;z!*s~ogm>4_{=j8~7unE5=OrewhG=p^W8B7zBm-6wuBFu$+NQYEJzeQ*0GyG>AO^`^^i71^oGiAIrxx)ERF$So*C zvHqL9MHxqu0`SC?`Ice=7h|xMOrud)-9Xbh^^&qLA_xL${cWQA5jiLgptRUps^c)>}xl(WymWlDdmsB=h_~85xrK zVvpu#QL1hEwtjwR1WIdts2{tpVbuW^F74-^p44g(O7=zs2JDcCt% zm|6e~{{b%k0}BgTSaUJ&MGUChTv7B9hUDy+%@sL=zMMcl7KvMSW(tCYfY< z(J|{oG3T1kOUw~2X2nN4=&`skjFQuEq;tX7HI`Q*U_up~&nx^D72_b8Z+1NKFnDA~ zPI727d0u`5rq*xdp(%TR5#FklI^w8ng?N<2&Wi$EUTCL`YbHa_Y_l)Tm^$sCM7*8g z@5lawCL40&JGc7?^`zjGt&@TyFq!6TAL?&3r?f{zF!FUCa_oXY(pR4aqdn;{Juibl zNZ!S8DKJ2LuoV*eJ@&$%aSZvJ7LjWx5$M8A()=HR;5z$?VAIeA;XztykHwzXHHugt zOtW{TA4k95{Bl@k3X*iYe%4xts27>O`SVZkneXG@~%K@9qL1F4S%CghQl z?Ps($Bow;)Y&zU4<^u}J6+DEDuOw7{SW8DMFl&woM=M~GB^Ayv+e7afmXEC3f36ze7HK2R)Gf)CuS!G?)jYb##|k9~Wdc0Z86;t< zIKUysc+N;e$x!s_=B9|&wEC5*B*8gZ=gQo9NC~j*HclzR7*lMQoVOu4Wd@ClJ4(Bx zr*RzQgjb!0a^Njb+~M7t-4?XkB2`LX8=5{EN(b9C-r&lmxU*`b(v?uqyJVbksFw^h zTVjSHe4jL(xi%StpR@C#f&*C~4$;6C8@-{zX0V8qMG2j3|Jmh?mslWkv07)fl+;Bu z|D!LM1?^GK%rpPfIT~RuB?8>_8SEbZwQGg@@JSQ);2oC{WSr3XUO@NYLyW2_DH>1N z*eS8z+U98+^nqvCAguYpj8Y~v1@}=kSh2~T15CSSWWl%Wfs~O z)OI(ABJah-=)CXjry<91%u2UgG^^K5%B14NaCVJzoewT_sjLvvZPmz2tW3EFarAzV z<=(wv9>1&R2(LNy*x$(hrwY>NUh|hH@j>Kw15WGlb+_aI`ixpR&yf-eivTtKIsL?^ z*a)5HQ=s2X^=0-=Mo$-@qI@soFnGsW=Qp-2vPq=XqFobdrnKVZ0jbV_2xEc8Ah^0B z^5%~ZYTfwcK?+`b;%;U19gV3Pdw(|m7a#^0& zjJi?s@zD{_3FJ^i3IXRFq8wdR+j@D*?S*y$*!=HF2t~836Hv=g+Mp;ib&Bu{n4gcg zf^T*)U+}-XzKJK^bE7rm#9@A)vEi-fkBcOa(-$MHXTWftavbw7@H~9Mq@ui)v9X?) z39?1w2*Sz!yRg|L+0v@3?C!cQ&#*W-GAb$V5TRxk3ra-?`CbXQGf}YFm1d#uMvV$zCmIyjsD3Pt)@_2_X z1K&6O$!b41qgw_ZO~9Up`@~y{MB7ft^f9S*?ddL)`pZ5UJY~zicd~?C_dGsF6U$`9{Qe)Js?Nn1KvTd%FfEy6F&r z#sC>KEQ0&A2L@Y}!OU92G0G~m;Q7`;uHdVh?E7#vxG8TQyuocXxq7Gp+Br;g%mr{5 zQs6a1*k>DO`6cC_;ryU^MmtJX&vR45R6@4>S=|Y#jp|&!!cyf-(Ltfo1}T0rD@q6R zRKF$bI~{gkUH!T(@Opku*KSEa{YMGYdt}AaGoB8lyG#(OI8c{!wGLDKSG*)eAbu4; zfk%#6mXRA=P3Z5zi))oUl&vM`J%0SXG5cW*yYZ7?*g7kmvn;}eVM+GcP4R_{){I84 zDOT~StV3FOlSnsqHjoX&wJGjKgB`-VTm2Rv$BDxeSX?qvQzRM-VZF6|N+4aMUjA92 z0aO>6OKI~}ZXq*rg}sfKEytR$l^8Eu;YNH{AkJADy!IfiSWQLmno4{k_VW`RQr58? zG_2}6xfqb^vb_939fOA;8onYPO9_ArBE2Ovb?r%W_QY!|I6qo1Vtuz+jp;x^FoYu@ z)fv-WnN&6O3P?63NOK2lGGtl{ECfG2gtrwPKS@>F)_I!JH)_qF0^6%pPNMHA3WS)$eFPa&u6_O(TV z3<4RV%Op*6*u1j4jAi?Z^9CEp)rr_Oox)_tV<(K^QxC(TgAw*6@6ibN|!{fdVT}VP10jW*38JWXDIo=&0C*V z`($qz^uDaMaG$`ngmPpBc$*H!ChD`1Gx|u`Z@*8Iz{b1vQC7JcY9T=MsQ+Tg>}jQd zzk9gT^U;a*iOkpS687I^*a6+l`t>ctOz{6dGW;(B+P^&17*$!j?C&b$2ioI!(CWl# z{>@_b3X^KG9E#UaQ$K!SJr1rc}>KBB|DA&NB zj+U7Csh`iIuKHDSu3;Nc?UT0a{O9s$+A;AfH7zil&RhdqEgBe8;Tom}H8Z{ibWoWZ za$_Mkc2O9O$;-{V=%i*tR;BD+V7xYclA@ZUp{IUekNUM5z9Hya>QE(4yE^b9mV;!Y zE_V1iJ(n4Qm)*wt2)3w7X}(u#R`IxWd(mhd^Lm2nQo(&fzd@aS%KP-I?IahOhjCuq zh4z|HZYB7PgiCv`Ty2eH8Yo#_xg?5204c#fw2=pBS1lNLGPLbhu5CBDHoQ)(gxTWuVAf0{G1pf2T_=;VC*Ye8M?1n4Y3<>!`gegqVh^0q)4 zz6~l|DywYpZsxOjmcQ^lU2d=AlPO@7Ln+*KK@BGW2Wo++2>T28a_A!%Thf%#zDy3-uwY3HIVwcD-Jt96Dbef9xQ6sEs_8Ck@sUPRscYOv49ns)CR2R5c_?Wqolnm-` zw+#c=%KAC@`MF}X@^~4+zr}8$H=}{{-oo+rE^~zWax`eS=K^~MrC{*b7=$eE^qp8ql1zWIFOV*+2D-qqMa<%l#JkB za5%q5KQ+e)%I)$nzrm=?+qJ|cpP6{}_y0jfRfykp8ifS{`Xl&%#d1`3F>x{ZmnAsD zU3Xk$y6raj#$WL%^y>Dhl&-ODu?VEXl<_jK@Fulb3WWaVq-gYzlo}RYK+e)$gRqeEtwrEqnTVVl_pLbm`D$(a{EmO!yO<#yg#C%uDZIi^pD|pcn=&# zG9sFzZNHy4iiPs^ltDq@%ycRwB9UhU$st(6N<+Osu+hk$mZ^QAI`Y z5#C4@Sf=-&*5~xyTKdcD4wW}E(d8wD-i`pYXOh=fEQBZ%Swxn1YZmO65fgg2P`xY<2SeVH2%-W=nvRuVj9v86k<6VmP zrjI6{eu?yjbChQ6Tc%rtuYpv#FeI94C=I{0o5)}#2DE;uSrF+CG{;9XKqCSbYxSd! z8}f+;dO^FemnxV{kn=&5n+4$9Wr8w}s%#2j6x<~a>1k*>o)_;JnkzE2w-!m=$&xIG z?xBAU`0HU<1!kQIcVCLg+Qz$u%%!89zo$sX#fvCgr?>@FbTJOoF-O&h(1XcDbukf|5{ElTn$|Emn+$1$;& z?Qe=-i#WvrbK*n3{z0?TM38(NDCIu}oaCEKSDL_9s^2Z!J&pItg+$@{QTeMsx*LfI zXf|1@5eL+ySZ~^Ou!HPNy6PYVgp>HhRxmFasiB77xj?l;do=y?4qv_r{L#zJJqW~- z&6s=^1F4iIjo34OIi^!pM&tdIF>+ur5B-cXb|SWkw2K=<`skbMt6-mhI&Un`?+j~Y zXu?mFtyv0DhG>o+*`lctMJWnyXF?(o9Pf`N(!5qc7?#Y+s@b8j&Zvj zUUgZXbgHs{%)96-KrAl-5s8`vAwHR;V^*{`>0h%WGsB|c-cvzZpL4l(!oppx00lg zOhc(9u-#I&tQUtqxg?r(%(3>Z^_?<0n)PFB!{rI94e`o8n@rzhU4-t+p5Zrf@<3ZMnb|$9o%jGdaGdcj<-uAwQ)aUMVl`V!lj)wL$(mXVxy^7Tu zEChw6;#f?U3A==#iYQP7=LGvRwGom;yu;FbWmFWWQ$uB2U7cj7vaG=$g=D)g#Y&DP z#m&l=(glNx+Y@I$n$$ChwZJY>piy@&YOpwKL!gUsqY*gF8CT%6F>|as=*Qb?53O017 zm4|jg0N(RGwv?|&%C+p2Yge>4s63)5=ONut4N_5g78HqY7YKjmo`wPmfBKj?zgC4k z&P^BlkH4^3bL`ARv>7g@JIgF*DSKa{8p{fL?l}K+WMm|v4ew+{mPV3Sl_7oIA2Ts< z8uVhh^+gz0ebaXZ-bLvQl2xfiU?hc}3XmU#LuNP6KhFu&K&NtQA2hC)ce@9F?SXM6 zQU$Gh?kI&&^We3pTgjmVr$mmmlh>7^veOHU z0TcuImAb&7!$&i4oltkia~9uV(X+vemkvLk;z*96|X-+m9b-sw%rRs`zb;D*-maKTKt<2Z9?YHIcUNtkk6(#F?>hAs^ zs^^C}{up7vTZRXN7Uf53H}W$cd}#@cvBnu*4Quh&ZnH0myZr71(=C=Rpx(n9Y zpy!iV-A^v9;#tY@zALSfX~%HMmOuN0&q^zcixT=++I0yxD8K}Q4Aly$)UFju65w0} zAPw!>U_od1skdrC`_ZE#EF&of(pqdp(SzJE%>*zsh3VO?0I0L{PCwLZm^d5G-)7i6dBlQ$IY*)3%l7zSwKf z{nfEdXZUpRA@Eb^y~-DXMQUV_d!Y^@ita6#5GMLo1vu;~sh5OH*{5sOo<>kfoK0}E z3IZTlx&X`Rc~{U==Fh=!i+cbaApY@o-~4QVUZ>K|yi@)YM= zNgdcyzHJ5ut28)eYgI;@wei@$Y^A{At9SEhI|)t3iZQ4-`_Ug{$La{ejdcrtiL?#B zGoe;9?z_R?(G1jgZdi%mD!qXK{t=yC;ju;{Q5@=>W|sn)wpQgSjLRo;6Z+0nuq13d z)v}Ok%}4n_pK3Yq2+y;1EhN*i_e>_V%gy5}{w>r+0`CLgsT|9r3cpl3?y($U6Fddp zfh9YRsHdfZL*g?L>z8=$tKAjcV&k3qGS}$_7Qmyt zg24YC(&f-jAd`OAspWsOaq0e#LOKf@6C*qKf9la{)Fy2=zu}z=+7^FgDdELp%}xba zH2%ZPmvmV18WIvT>0855s{0##Wjk*9y}}MC6f-lkP+8x1Tbd-Y$mLVG11L9@P#vn{ zyE|g6qMBVYX?v*7iF43N@&(ScDekoh9H-C34+a0+i^<8CP}w%skiDTjq2xVUuw4>i zuAeIBpcs4XT95rSLZ(M|vbwxVA8V|z?JK|D9q@N44pr>6h7;dgykW_cV%2gg*DlPW zKl6qN(CyE2Sij&P_h}1$N3xEIQ`cj$C3+}_y@|z-Zb-3!cjgT(a_r*6GdP55Yk(HZ zw^GzPi%;vd{8%vos`@eiON&aes(DX?_fQAjR;a1Khirf|>uAqmt*O@ZrX#SrATRnIA^ z`#R3Maf;{6Getq+WIq?)ob{+Ei&5P+ZKxZoz@%^r{DwueV;_ks*;+2xB&wal(-|W| zLE+!`y9gW(EP}l2*%g0gojTWWyxg#K_v%8)__13TsaoeQhsho-iu~>in*J(kz|?$v zw!3C-Ug`-VPNxf1T>Vy1Ets+BbB12jzJ|~7ySQwoI*vW#Bl@#s$+SIv8Kx<@)b+#d zmb>ZCYv#xQR<{3dM?R|mBV}_mv~d2PJ@iK5pgW_#QHZo}kn20F{XZb&{r6Ku4egy= ztWD$%Z4J##9M%50`HvPie^*t4FvE47(CR@~_`kKey`!lhLn_!G{)Pu$2qlxjtE~LJ zi|e|6yCx!R>9i*H!;6n#_A@C*dxUK!q;(AZF&W0GB4NlJshT}jLNqMVdqnG&_b;zR zlBhzDd%@Cx%@6GieMv8MVe?4yroa#c9m3?(qLB)FaoXo$qTEf_&b9*h!3-dR?5GeX zbqdK60pj0r!j_8V?QPVms>2T;_~{?=_Bvsp7Fl8oH5Y>~0TLGJ7s=#~viB+O18cv#X=NG`>|W3m{CUXt{=%(G_j zO&ZICAFE};tY>wEoP&Iq()9w4Ak$Gg&rbl`KmtxifH6r~T8##9H}_MZOtqR5xQ@4w z#fU~~Wm@&iO6uIG8!)ZfUWsAShd*pG%mY?swYJTn8?$IF*{<^aup4ahajvmd@6I;6 z%0Zap%q7rKZN8J9sw3YvyCh@=j7&tc^n^k)IesRhySim4)(QED5Ul;MzJUEY)QqU>+(FXTop}oUmQS@{bBa)WKJ8nGk~g^BB8Q z>QV7xI4MFkHB>MnUTxmumd{30%K(S;@(-)y3(L(!W!gbnXd|Z(O__pYfc7$}E3+7@OLN6CP?6*{+uo5xxt+Z3S%MGs`y$uu?Bfny7-y-Z&Fc*rs)xNtR=Q? zGC$=`UyDo}6F#qHCR{U?3~SO?{k2d}xZmy#)Jf@|sii`RR8vCHP`m?Tdd7&4uvRTiu7zpn}3ji#! z;nVIdVje*v_2fJZIaHWvwu+4gGDI-^ZN7 zS~$?H)c7)zVPN+`?7r1yvTZ%Q_`8_%$-bmO7S>mN>%6Vgw+N;+>Eg3iFRsFR; z&O+~bL&?iDZ;H?G?7xdI3^!Wr`QFo{Z_I=_+rzRHBH#B^K{QCwzrjKCN{B|rdDS&|Z{{#J${)hK$2yk}Nv~V^T zGjulmFCEp%2;db+IneEzvJ--XM?(kuxIFu`gU}GP(GAkF|4< zl7fn_(f6QY6A(zd(X%EzIg)0J!GVu73l{(8C(}V4v*sBoK%6{K!2kr>!W(AS9g3LE zXh*#qy!F_gIp9EkI|>$ukbO^dB`^$fyRDBu&9=gh_Ob(=3g*!}4Vj^$WOn6#zkZ;; z?Tayh2g@^4%$u-#MDro%dmd*O=7NfcBs0egV;w33drfwb(|0U3Pol0P#XGz}<#yipyJUyMSaP$-A#>y~YdD12P*( z4`7nUJq=9;Fd-PS-PJ*h_c_PJpxBuhuS6DgZj&oEI6~C78Juym}_22nxU0HCfC?u}xE-#G7n4@R&-)~G1FH|3E0R%2|iaOFDR9}sG{ z*n>D=)UI4Al&x+9WwQ*6Q+?X6J#Mm2Qd~(lek|! zGb^QAHGLRr^*&RgwCMTMhgfT5T}ykZR&4?u2mu@>a^n_f)Fi!i{%n0T>T7ksb!W8E ztvl-Lb~=rb@V$E$mkYEK{qYwiSt^qqdSzce5(TqXpb7~;VeD+=KqM}o)1&03*W#1Ge zT97TeDxHsa?ix+p^{@OqFQ&AO_nJZT=4;v(? z(<`{5H=$*bk-H5J-G|nr*}pgLgdb@UVO!+^-7YBGi1n)h5Bo<;n&|bO_j^Z6>j~3) z)M{J$)E4%J191tZIo2;jQ_hmPacZPwC?SbN1R|H5naN!HDm^~RBeaB~oKhEyVn~R{ zI3|2DoDD)F3_i(2z+CT5plx@-!bD$PLZgysF%q)B>YWBW;|Dc6%DfqmUdjbC&% zN%pml15Q%ic%bKFwV@R_&|F$z74Q^kqg%jS+s?-7A-L3CDKe zi$UzbfMA%!!sy#)YGA>F7B>Qpfn{!jp_>O#yCT}6gO4M8w-^1F16WgEriB!sXFWrV z`iH`nknRj#^?_YiBsHMVZU_Hng7DRmEJ6Q)n=U`7>OX7t`4_j4wlgxYw)p*Ds52_A z!*-AWLDaL`kjTbBOQLyaN^0G*s470uwwAeBfq?+yZt=^L;SWKHL@~f%Cbtu~?Ujrf zhEk`vnR}Fd;{3CaL;u|vb^&eDOfs~i=WwUi5xgcMI+P6;Xebz#Z2PgI*R3ScyD5U9 z7K%d%5MCG183GUywQf&;M=srV<323vs9@v@ad#;mOiL%Yy>XBwARF-$w+>#R>$V}l z@f);ZT&K!x1iV)oU5f*IcYJ>Ea7B8c>f9`4@=P&XN|`nusX;lV2=LmFHF-=JiqQng z^xbDXf5TDh-f%B14Sd^1(=YL(&7g8$lNr^wCq7skl#Vtu%A?d5e02 zw;m(&;N`oS`G&Ej#)IFc|7@&6`N0AILa+K21D(=8`;7e4YsK^bfesW+Os!3Rz=5!} zos)~B$v*+?rHX>xKN47GYB&llov7OHI^+G70fl}+L_y)H239Uw&~VBgHn3AIen%g) zy8cqL!8PCa>s)Nh?0M&V?>L`OlUXAPD?}X#K8D$bHlU&_Gp(2@wy-QxlM-zk)`-V2 zu0>$Q8Zv!4nm!bz1({&2IhsqPR&AtgI%B%1*tuOE-JYfl_Ta9Y^HiR^ z5sZirqpbvP5HrqCY}0_ilq)%R`HW2kBg`~UIx@z?FVct)tjr|^1V``7b8lWY5EG*W z8o!07O~$DQ7lSKld0ifz5`ccvJd0=b>^WAw`xs#tYl8WUc(7~;-w<>c0#&@R1q#Jl zVj^D3J2JIJaMv_JyZ`fRPzmM@r*$$&qop#^+GZDuZ@Xn0=sVEn_RmgvFF2E1R|qf( zmrF7ZR(4~?ekKv`;F#BdGeIDU%)(e_{*+qv1iWAyL;|ig4iR zJeL0GRtNexV3s=t&%`0FBj){$s#Jv_uBW`N$%{2WoD;=kh*+!nO$fjJ173;1wYX*D zAiHHwkJhC1H&JFS;xkUA3G1a^X*SUprM>P(IRKP3XU7^fN#wiy`*1AuzS}60YkxV0 zyg6NQH&kc<*3ArIo7-KySi|w&QeTIe^swW_@Ynhqx(3rZJ=8Ub4Tw8)r79GQ`aEVsF7q$Nbvin8Tt zL53@hgvC@t(pxNBQ~@spGU?*fJG)qWG$TPGoAHidUxRK{#=TU5cQ*`WF=cIzJ9~mb z1K%3~aeH2F4xlOS&x7)C9PwZ7-qD202&}snIb`%D}%NM8ATw*TI_kyM(hJf@vvsD?D z1{yLX?`j04Mr0Oso09L6I{YI1I}A$onb0B2>4&=nJLOVI8o^Km5YiFeAPv){vdF1N z5g<7mf-T|%0FH*oaK?Cnu{|~k-&w+w8Ds{LOg!E$4d>FF8z$TYVpMA*()5u#`+wsg z0IDpClpeNa7y=R;p7K5R)b1+8kB~tbhkMENb9?~S_o^y!)RPU7PZJX`bkl}3fkT~V zFdT~ATw`+n?uk<4Src-J$ZHiCqFnJ4=l4p^A6deF3ZEF^k@LTM9Gh!6#E$CU%~n5A zuNX&6p`bc(AK&*_;`lW%aM0ESmTeGS--C9DjX5KD6^s~#^f`wzb9Lidkb*Y z4QIrzyAi3~-C%mxb&NISry-~6KLWNyfFXKSW-i+k;&>0nwS27&vOA9&#l!|xKMoS` zv~GuW1IWTFrMj81bc&|q4C%tiO8ao7Uv03q^gcZ3AkPKQ#*+~63uUO9A{!`%8Yop| z03ue1*w=Bl@Cz3G>dfX{O_3*Dsf|>-H$KHgzkz5xcb%aM0h%Pp%s&8;_@pKqzfs`! z`Axnhp`0zyVJ)@AT9N43`1%Y_ec9d@(E;1jqCQ5%I8U$LW6x?j_sME0px9ip7L=cP zd%x@I%u}r$EURSFF>*?BmbH36AQWb4TH<}u$RhlyX?1~HB<_=R(i&8Kb?C8_qH zK^)r24!L}kIz9@A99X%lNJ73$OuH33V5!1SA$mJa*nqm|(`nab99c{0)`n|wC_sAy^U(a|053&Y){kelViEmUdYM5IJbxqUUp z38>aYESG#}tDr`bLE0ZgFk17njwx674>MZ8IXctT4&38V*=bK8vao*BrYvtu0j}Lk z)h0#A5S>bh4+LvJh@I=%;KW}!Rk~+nRctwL$J2{5LB6a#%;&xB4KnpkF0U!qgP<(N zSuR1!ZJ5q|jX*MNh1`LP8T!I%qkmzSGI%xw&dbjM+4~G6a+@Ws2x|>Mu&5+LdF@b4 zjXt@|-C_M%acCvU%eRH8csS4sVxabHvYt+Jr;!xiCT`H@_YSl?pF48P%*aMtpW$Ru zji?yE6rBgTw91X|spR9%_C>ph>p*~kt7&S?)uoG?-%K-R5xl zmWjf+*2`tu{Lwpn9OqcmL@R03k}eTzDz?+P$Y|-J*rJMRCr#q+C*Cpc`1O~W;&Q9s z20zXx$RnzwPH2bKO>qO9D_jA0OWq~j2nOe&@vsO#vUsh`o4s{vcVHcy;!#XCuE+~C z+w(R52(_v{7ppJkXyvX2AEAM_({+8BD%y!Gn#8(h|L;j@|GbE%;rhii-S| zx2b<}e0r!a{R&Ui+YvQM+Q(-OHL*{%{QB~`?^}jo9Ei1B*u9V4%o)eh;iZlNwwBiSH{P-LlJ^nR0{vYV0D@n?3K>%Uo`U@o> zF+iv2;Yt9S3aNY%nidh9ERKB% zg!d`DL<7CQ2t=zmV-p9KCFh%|0zICD6f11=4Q{;nPiqn2(}q2;#xiJf>8Jqo{7z`Z zmsoF%RC7spi;j-=3%ho2l^7T}AXJXQi#@oHHYI}$t;w%aoE`QnwJ)8G5}{*;Ix2Dv z%F+5xMH~aCa4Q|e<3OVjSl$YgeIuYmdc1fVH+j6+i2Y21aG+snXk?uv0p<(GM#3D+ zJW)u3O#)r1SN{Vw6Hc7pJq`w%>`}%|P_`qQ4n;=zQ22eMXZ_C~?yIW>X)Gx#${w)$ zgEGw?hamfIfCRUB=j8S*8emlxZE#l>EX@RJ-zPOug$dz7<7Nm_36OgAl=jF}f@c|{ z#lNg`(m4PPI?E<{do3(u_f^We-Oj-W5@7-9KV;)|CS8atPy&$SvnkEgy|E=-aXaU& zu?|G+KclDnI*Xh-Xtc_BXOEOm>#bfMnpXWJ+)B&KZ|g^j(EZaR5%o->P}M4SY0 zM=VS>;OiZf3Mso=Gb&U%{~lI>rI;v##@`pac}%qg@92944TgQ+*$mOXGW|Pr_U_VR zqWv*i(5v93&DvYJ#-`6rx$R_n-k# zAxmpS3qxL$%>(+%x?S~PkI_O%s{V~S6ZsQU!R&f}BjG{8jy>iyOB&HXEq9Ji}@=a0?TXji#SNjLkq zX|Q+svw$IFdG9Q-B#6i0p_7K>7q&`Q=^c{tdk*uEfVh0R&lCXQ2KKT!E0W_(AguQYEgPF$j5eb!@^Q{) z(Y4~w7>v!NEs_?8n-eGm)C1{$H`hwRb{X|Z&SN2eEE_e)A*W+kV?OtW(q3iBdLzPk zzVtIIGQ(t5Cbs-o>y`o7Mg`yPS+;f``iyxP^jrDB5p4#NWV{@RKO4F~=F{kHSfh`z6>OWK?#VW`ew^8Sqp>9sCP_E9nUB*R zZ!|YF(ET>Jgqe~9)C_|vx7QmAj~sLjB0fj^;3Pf9NhYJO*qOnJS!*;#&`H_~EZF9w zYK1hdd;TF`w*;u!PU7|>&9qVN6nx$uvwSkpm1i%#KzVK;%r_Z44jpx&0#{G^_TDuC zu?{j)z&Ng8qH$oztx?U!jV>{B9cV=j7{SE3w0S}6-q2!@96(EiQYvu?!9s?dqZq{? z1871P+?uekzofJ!3650Qtd(25{@Ah@B9TZIpgU~@VwZ9g6TY@YM+{jt)f=u$_RBWS zyd7M>v04a&Abx5_sn9T&R^>)dQ}I=P69FO5o{l8Ogux*x1dAXr^4W;WRk zVd(obi66A^>*aia>!tbKFV@Wh6asUWv}9B}P~CPZf_RC9p2XtfJ92>sb_+>myety^ zJ83Rz<%nhH`Lee`Deb+xv-3zskbNwy`Wh&E`7ZET1+ic%?3M$pN~cfJZIYd}T>rX# z<$4v@1(&l1t7_RE6_96|PK>`)^J3?W$g;h-`BCur$}4B|4%+k3hFk(@yXdw(1~d_l ztbR86Ng39gHryJpcJ_A`76)qM+_dBI=4ixTnFBB3@=hH!XV@lvloD>WY@JMX!DMTl zTsX^6?oWC`lc;^1Ui-(q3N=xQilh2{TAh*;A<_fz9(^heyDxOq`)|By6Pc8m+g8Ve zdwc|qh2w~#ljg2Fk_@q!%#)WAfNaGlynPNh`u#2<+-M+4@Brz7%#!NOo zJePs>PdaHV+pR^g*GhBk30u*yg$)$XGTm+&pQ|pvw4f+)6&v(Gh3Bo&2fIz(2fVc4 z;p-{<|0#PEJwr%W{=A}kKjIwYfAWf|T9~+rIy%}p3K^LF;|*<6m9kqGKtWJ6K$kjBxcNk&b;sqoINX8&^6)?Is)aWqNw?j;iuW2Ue+$p=b` zvbAPI=GeKL>}|Bs7lvEDPNA$b9$sk!?_~jtl|pD~m|@QQz($}H!63y86lkUC{X|e4 z90V72)w%*-OS`zThSjAl=}|Kc=(9hbJn+X3o);xaIN3xsEj&u;ttoqJVdm=7>b+Jf zRltJVgoLNI-LSRdw`y5aF&jsHTyP?j>*%835eRfX6fCtw4G>Lcm*-FuR(AjG=&N@i zK`i_n{lgys`IGeUzx#`f>}-DK@|if&SvuL-MyZVb!xYzbLJg7=pP!G#jU9;x^<#>Y zM=_sQ!UbkwO@?ryMklvC_o0`dO*ZC^l4CoWI>4UJxXo!8^dSRsN}WuAG?{dustuat zC@O4DcxEL67iLjOmPGW8Atian#o57uakDvRt!)n7t- zlQq1yp=fdMDF=5?cVm|n-(jdwwtLM?zp~p09w?d;ngUxP=WWPsROjPqQM+m{r2s29 zCQlMoJ=x8CogPuwTGF~GKi2JFG@S|h%{;Uwa!DBlyiYqG!8bCT71+>ZQcrd+gx7Kx zk0@;fv?VpP(+if$5i8bxXctz$g0b$~juzsqwX9oQ&bh?jZUyek}OW>J2nez~alkJVHa2B(np*OHW=| z4?~lE7?S1dhM9P33jy*#1Ecu+({$)XcF_)ep77sGJq7F#3Bwi~qS#!ijWOuza~Icl zv6%LI{ym&2{zhG#V$b@IUU>d(UT7!ikZ5iE(8$<8R0cWrA$SnfJWP!L0T-lvJd4jXvUq%T|-<`xX;zR zMIn+9F|zE$8OPCCWd_oCoiAZf)WdSk5DKiYy* z8rJ&=#xgP;N0bg$P)!z91!Xdmx7PlxY%^SsVzBumhU@&;@BX9fVd`RQ^pDJwe->)8 zloWnk9RCn@TO|_q37WeHC+{@(GCK{zjNm7ue>S#AKBG$j2*XxiaB~>)}2jjeV z+;+U(zL=7)DfRir2rF~t?CVsr|3Y6XsZpzb+Mtc4qV4qAd{ zK#fw<6z$=)FUy5)bhyxyP;lBLQY4K_UD`LtuUk@=f^9LrC_JLaEvcb@Mv;|z4Ac#8 zC}PX(6Tdp8aLOXJM)X!U^yRJ@07Q`qh+q8@K+$i8SUK`Jj0Mfh@pcA(qbkcsWqFpJ z<* zuWSn%*iv2tg3YPzqb)Fk>}5?FEX0dE2ELyU_3txdZrJ_(sFf677Wz}j3#RX12tz5f zo(lbP=`u?GF7vX$#u(>g2j8sbXLp49p8bH!s;TS*ch^U&x^$gtdbE^=ik&)IT)3EC zO+=2I)mw=Fi6Cqv>s|YQS`RyaNcex`EH*c>wl{J7S2+)B!|{OS;b$LQnFb9OijE)^ z*XM13J7$ZdGLj9_vm!Gn!usl>=(jErzOtO6NhZ+89NM{g;zCH0r)5s)#&)vACd|#q zr8qnf-q*&VHxpxK1_+|IEYc(G>M5WOoW1%^c%r-X9rj4$uKC*F`Ffl_Bk^s9y|b#l zd}{)9Tg%>e$-HW5jJA z=-~MIGz@C|DeW=?gV+E>%Fw~8y@P(T&EmY-qOgx=xkj_vAQK7<{L|HAtK2VS)-oaj ziwK?4dX03))i@a74=Bz2$!h;lnjaQ+$84_ZFdh%ry$`B~{J9@XEz!WK-QQJv$$*}c z?B@cZ2zx+4FiFXgjc<1tk6vrJ;apcZpdfH7kvfK8QC2;X`x=avQ$In()ua&ck+;!h zii37TXjKcEgVF08_4pg3??O+o9U#3s8X%bX+MSp`6MCTld7p#(N&ii)LNW`GZTek@ z_1xzcz#k>nwM!Y(7s5fupySwlgXhsJ56X~O%PX{1fo+f3$K>zLF5#Ye<$3?vb{-&g zg$G`n?b1TM)QU+T#VnE#uEQUgNAEx@+i=Hshnc{jQX=TwFf%KJ<5$#KXsC^%BeZBu z{kNb|oHfE62{LG1jA&cZulC@;X!(+DF0p)!aoGy2pmiSBYm`KF9M|Fy0G8=!FH>Rt zQ@U|_faVwDk@~5OLw8|d0Bz}cDCMvtw zY79?NFOht6iT<;?I!x=$9z37Sni|k#GX2o+Wu#OWh*l&Zq){9Y6AxU$++^mU(vedW z|0E#e66?MNNZvyu;4ph-CDUnek@P_vtYAvF_5+8OnRdOtl)_of8TospT;{3$K~EN| z_jC^O$w%)Sz!fQEFm>i907~7;?iqUo6sRs=j6DFnNs!jYpEzFe4AR1`WuX;G6D?(i z0sph(Sw#6Jk?x1`sk0}>-=5^h62~Q>_TSseXcEo{mvJMIZh?(LX6rX4zyeow=oh*U z{Be$*A-}1Cn3wGwAh3WZu}ZgRDpQTotyja}0W7=k)SbYr%4>q+*NW**m^ z{~F#yMVR5;Bruvd1>fHPK7MRf>FLDlaV+txQGHs(LUvr3Z?w8fob2A<>0U3eE>p=1*4_7OdTBI-aeq-d5yxq^-E{ zXhBN>{!`E2WSPZc$J^aG)oP@2DIqZRa%={Gr+o%>!IuH|i#*v3E0hA&<>mINm(8Hm zDvp9wwpStv0bVzLaWL3|Yqc%;cz^F*eSo%F|3x82ryR0F6!TZpLFIk*|x=!vPW?0@hOz7r&aJ-Vg^)Pxa;#!loV=d-K}}y zYD@i&)0Yr#;1$oF(rM|4kVCz-{s2eK3xaxJ@+3aCvqLZNq6L;k7+YC_c8-dt;BJk9P|i(lm-VWP z3okX0s@$3tNsrsb1`G}dWl{YB_FHAv(m5ZEb9~gOxX|3BAO^A(v#1f3vkWk)>o8Vn zbnm)7#3#n5N?q_?OBx|ulp^!;dt%QTzd(DY+)o+ozZI#m|30)6J;J|CbD^Y6%#!S* zkf`MMXQ7(tE$nMReKECr>Vw8>gQxXQZK9C;8!x-%Whc2E5shdj==%p&F2x^%TikHG zVPhpYoux0QY1ykpM= z`eCXZI-sm-Pmbx7&O!L}Z4o~|yT8{b9}t3F+kvuS4Rw9+JHR2nITI5 zCXzc(SM{3wlw4Fo)?1l$jOuD_P8=h+fMnmLVxWEnjF=bYRv_P$)ls%9Qsb2B#E2pA zrP4dGs;LMO~mH_l)O#sQj zt2W-a>H=Z9IAp?mD4?1^;x+ye!DP61ru$&ShOkk_TQ53ZQ&d3vqI-)5Sx1lFE*REE zsyb?!Vt#Nk>Hrfv5HxCDg`F1f)Kg%N7R&lmqe#>=! z*#p_DOy=uFv7_^L=QpZc)3IpuxvWSXR;|MUH^MO-Xc|>IEG~rq!4@^hHj%?2u8A;m zezosIiR~eUr*BtUvat~8)Za??b{I2#1x4tq(?i0@AZ;BW^#^@|zq=N)aq-QqKaEjy z^YT9}gNli^D}%KU%930zI?H<63Qv{_qDt&c_^kfL(0?eYksh^|3dFqN3VGfbKGKR@ z&Wp2UZTa-1?A&X@#_DaL5#;mQ-(Nqb+6D2HDyqKHvF>nxk_Mqyda)R8kHx-o`;~4$ zz8uCa^c4QEf-TgRz^To*Hff=ZgmC_~ug-{#f=g_u7Bcs@8W(yeQtw_kAb%_8(n~oi zt;^&&vsF_9xPrOOPlYXSuy^c|15bDt(E_x5KG(ovrfpplOd^E-cneDMt8lGp0N@VF zlyA|~NE?e|RcPaG;s-xMsui3n@WwwmX&`2nqcxP)4u*h{gJIUsk;A-v_p)VTTFwe2o^zb` zQanc9!!H8tOapVE)lDEWtJO(h{D(bQ%<5f&^3-9kiU=~C{;&G>je@!@5hR6;@>n;A zElM$^2g0umDQ;hABm^51S!~PZui!HrX+K1SzCE7IK^|fWhzM*lx>GRogRbnliiYgP z^%)7r;BzcTz9oBjibIM`5X-{MwxW%RB>J#aSuV{jnD7*Ez9X-ub(Q0C`Ar+;rOqUC z+~%Rn4RHEY!Su|)vET}J4iA8p$T5CGzSAwC&v_V+Q#*gOE|k~E33l4>%j3(fbGL+w zj4^mKyB+N>y6Q2K8MG9WR%pv#p-a8zCnX>D7HE5(RLtXl*YaCa6qCOeOE>ABV7RHo zL3{6ARs5%iIfQT}zc-GXg&nJ}^L!g3eNa+^cGh-g|2?4X|6YUl|6KF$Yasv}Nv$=gh~_JIe#j|H8UO&*|GHNAm!Pb;sI;6o zosIFO&a2~wCgyie$*h1MNc`&B0vto5#c#;QEebg84 z4Gj`*+V^q$3=yt#w{CCFxAm3oWSoo3=jXSvWx?-Vb2lF!w{QJ-YCVZ~J5u_Q1M5tf zY?(Warz0Zj?W6XnEcBQwj4)EGvb$?n%hW=ScV~C-!ADrWT4V?6~N~j=UHr z(qXuzt*qm~Ie5asTIn(x1!LHK%eBt!Ic4y!nJ;SgS4`p}$B(RGMyDFca*Rsztr<29 zEd3Ly!8&B~eHDAJN{@5pFUgGZUqMy<@@f5506^(Mq#rQkG zxn~Y+eSTf_S+GoV)Sx#wyNn=|Cx~i7YDXOUXP+k5W_UTr3>)dXcWKj%mlK969fUYH zE1y0HpSpA0{58sh_h_rs5`Tpl9jz7ar3QXeJxxc4p}}DRs0k3k=qn{oxWW%fKy%J) z_;7GVI9FU?_D?n z@ALiC?=`}`Y0Ca7cra7rj~tz{H}~0*z%eH%Lzw5wnD>WxfrR%*y!}~=oEY&Z=i%CT znjFAg1YsBrKf-BMWmy{$i;2wjQc+u-?x?I@uy9pLBK{z2bo~7rBbv2p9`$8J&@O$7 ztRvzb^yy*FG`3By=<~=+Aqidtx2F6KQHqy7q8;WGct9GE%}{27OA15tFHja50C6;k zh@)P##YFCwUO)jUF{VKbhB{rRHHFdrWXKG0{s(320`{J&p7N2S0rGtq;A(+qx{kbV znS5;ibRPrw@xTF93-t0l60T3Aalxbv90R6Zl*Tl5hk>iKz(^0gH7zf`yu{^r{ zStp^cHeEa;gFVS$2D>^c7HnTbq26SU-n5Su_S&az7Arb_29@`kFG$D)S%ryHjL9Q* zrLQ>fs|*>YLTO18R7TV7%oDC{Hsw!4rkopmbbBi&haTM4E2AF1FL2XzQmwPPp<(7> zO&x8mF4rodZVD(^pIj!6K6D~%XtupRj>6QQLa6(S-E_i1K|q0VGOuxiv6VfQVlDqF z+rvRm5S3mhK=cjLXM!_N_jIr6$YPv%&v>uu4fJ#=2+urWp?t%B8$294;_U8KHKkqZ z5$uZ~=b;XiQ(@O#@E_PXBqosb5?XWPls)MjKk@e&_Nt5W@!pXzJd<7Em74|xa0Ur8 z=J-R>Sf_U5Ly=)>o!5I3T&zH0P0|*M%DG)=#nP+bD$}8H4Q@c@>fuZ!`tdgFw zT4VvZ#BYJZo?T#zyU4hZY0Kt8I^+BWeIkuJ6F`Tot|6Zq`{EvhXfYqkQ?7I%WUwzl zF~0alt1GMHFpFs%{hJBH*ja_|dMthN9vxHAmptihc(Rdx{$c-M5Js^lqP)IkD4Gyo zZvO{*EWZO0)nS;^1Bk3yjg%zASnD`|Moz(TNa-E<6vz6lIS{yI3!rtL`3fpu)bB{9 z^=FP0r80HuN;Q{+DNsc#Q965T4F*XgH4%}hUr!FvX@o6m#l~2Ea#DW1RKzxj@1s`x zP|VJ_%xzhj*_>p~XKAxzw%;C7&}`G(1h}L@fdr^E+QJ8u!M<4Ibh^4aTp;Xy0})7B zBvshkU-f`!cj41QXSW9d5|kRY4dTO+nDnxH3Mnast;Hlvya%Yuj6H;ZlhmcMYg=v7S z)c@zIK{NQl@Osc_lhOHr)$sb5F^A<^ang(d_hOdp#*{TDafs@VIF$(S<`YC?9%0QP z2@(Lhx=})mZGEFZ3n#QQb)Slryi>qUpd3-8jNm8r17ZB|+@n6oF|xl8R97A0xSf*( zHko1pefol^2_iMd*dA%;grD*x(*q=dUy=6)8ZiOzOE3ZL{!ra&@ zfWd*QGzI1f-YxFkxM*H3+}EVOMXqqwCuniYU83>QKTRrX1=)PpZ6}_yRV|{NX}gVs z%XmdWWs;Hbs|Q!S>ln`Q8eiD@CYpj$-=Fl{PNXwbH2|<_LIlLamsyP2wCL`Vy(Lpjc)tdesY}3Utx1R?eVdoaF#p?g;Zr3m21cY-iuDr8bI}^oj-!fG#xYa6DXSpvJ;+4ba>DZlf1xY z>bJE0N=1v3e-iu5N>&1xG~ z_Wa<{6e0!TK!@%qL358`7l5fR?CT5;xir`nl4XuUWdMS5Fxu}1kglSmR~5vQx z3TR}Gt)DCL1ksf~JA(Pzm`62`nC}OiMh=|UcY^&uIC5W1%J1H5zDiDg)Up<7Zf1KE zjHWJ~;i)khX0#OIIWk%PJVv^_6Vu6!3MODSx1tFSkQ&W&<&(PGWj+Z6tRch}g5||N zapED2O-k|Sx&!=^UKi372ZWkq9`zyT`U?LYwXxP!LG33Q!Eh5dhZjDW116XQDr7c@ zL@L;ieOGg%4_=k*R?OkAZ91!)*Q|h(wZh{NR`@yvu_SSlMv(mWO}OlgE7F@o`)3#} z&MKOJ@;!^?@{LpH(mr>dj|$ z`}=krSfJ3^LU^&+7*u!04zbU(ciYEf?FT4>0U~kdr$%$&437^Zwv4@!?u;XhjF=r3 zNXCE{4$*>DiS2rCQ29~2>jlnps%-BQCns1ueDMqAPg?bqVd}e`q4W;%)#_$@FQhdI zJM{_Hz~O8hAvH`y{jtn>MhYWmo*A=Or zoxZ7~tyh+1E9-EUgo#(LwNhq?^i~hl=oleY9At8_Aw7Wz=XgNX4#)~t30QSZGtQTN zR8f7L?-ZSB#eSEy-BixP7EVr(0w;V=vuD42IedfQ=HoZvQy@1r`WicWz3#5}yMfE4 zkPU90w$|>iJ1pjkUDY1+(@GrXvzd8|t^+l;V7(Al7#g5$ASaOsYam6y0H~3b5h+Ce zL0^2|$U)iQ)dq7uX^M+%2-UC_5UW0vvk%=aW(`z*c!G&D^Xrht)v&J8JVSTPo=fT9 zbDl?m_vuwQ_ithEz*WNHq#k?K$paZjvsnh1=?pxzEC+cJ*2U_79`}|uCNl6VSF|VZ zq!Jcz=Tx(TsK#RvY*=-s8~l9_xmv3#CZ~hAk3_Wj_|7Jff(6kjs%D;+{=uTWM}F3?d9hdC{Gzvd3)c+u6z zj{x6w@7Y+gBZMiA0IXpa*iicrs=xjvjvjiM9cFiy#z1I|k)8o>vgQ2c1QVne#d=wx zeN{6DKt;g`Uq6iYPAQu9WMeY^u6=rd84zVI=%Rf_EEUVUOVd+&=TJ)S4au6YZ?|RR zk|k0V*TAXUe*k)fvzkW^vELhD8U$<>jRZ5Q%JWAr3K%X9?Yh>W^)?} z7-yyU58yllbE@e@Dlh}~9Ffm$3IErgn%1*SL#f`wZ;iU=)Ne99U-4p36V}T)y)JAH z2L#d5>t;R(s%=;^g5Ap+9W#Kx6vW+bCuHkv>^RYy&DUlq{;i#_j?WhtsVH_dek)_a zw!(laQ!=ZF*<*4HckaQ+20GQ_zV)nWV+Qx5Sp)%A$B4qhc(vz~(W@2E;ZR%`ug(xjE9D>H+K7S36sRTaF80 zr87;@pM`|JiR^FyoiSvDEdxUPjMEeL+9)We6^-;V93dbgY{#8%gO8PO@x`JzECcQ- z>#-nAVIgw5xu$1LpO#=<5oMDM${b2N)lYWWEH5KS8^1G^8w37~g0FZ6pNoTOQO}Z4 zBbmjS?EI2<&h&L2=y#s~YuK)u3Waot-1&a< z^rT1})_`iaRJojp=QC*oP!dJ1MM7*LxKrBN-~HFpN_xk`Df-FU3gB}?cP zsB^b&%f|dm9LQBzLjNF!Vfi*8iHb9YOlIb@{J zd!X=B$1#Q1WwAvi+#=OzQ8&Zxuxy>rDU;bIgDr^ft(2$-P*k(b4u!yW)9NEGG;_d`QIdc{Kp31aI&E%SBv>mh$5;ywdq9;1tU-#Nf&=D^%MYg!QG z)ldx6u0rDpWzL;wuq_faRhX#>u?q1%k*(h~_GWQKPgfoO#KChEW?L2zMe)5Op#s0A zNTZ0@pB2{yW30t{R&W{}DG6X!Ej8QBH*kx$p$Tk%E#Znc4rce#6iRisQIQuWCUkdW zFBQ)du&wYrl-+lc}|0gc(?o8F#A}fpXAsPVq^gWseOe-aB_laTAI`dK(65Omqp9Ku855 zdCsz9qT{x`^LJg=G2&!h{sR(;G6ve=h%TD*0*4uR#Rt9MNM~Pi9<_fAE<3k^Th??7 zV%F?|wa<0iM_Z6TOgZJxKXEFLwm>MIwgPo(`m6E%c^E_9$wSL}xqzw@aC$tl79%$b z9~2;5n?D<`homIA#T(sh`|I>XeyP_q+&VHUNsW($A-MU&b12K?MX2nrC*yo5!~%~I zc3EG9poT!jnGLSq7!fZRrIfxFcA4%2Po-PhOiV48zUdLX9iuQs5hC#;?u|#7{Rw*( z807R!RPskMkYLnl`N9sTn0Ag!jqmFnsJ3)$7pB%l!|9i!q(Cr35Dp-}X$aSqRVSNL z&D&Lh?Y&kj^*trZ8#(}V0GV7jwaN#{iQ`=2e|IyqdiSB#dcQ@I)qt#jdqAAnS~bY- zMdt4%t35hGVJLPQoZYgfiQ(qGrqP>`)|l#OZ`VB$Cci?-6~PWvC|~C|fH#7~-IrU| zGo`+davOfS0{(524H1;;wi=Hw@acKErg;-_-_4WOn{1RZ`+D@KQt>P|A6^e&1K5#x zCGscB_}BIM%*aY?6%dHU5pS`wkkNQLPp|2wMLqEJ>oghz9K~XrxURyf4vRK0cTrn{ zGZJJ6!wm$w6D;V}>)#GW=7W3gZOf;$mua0uEvM+XP~Rr6OWnl8OUEqjTDphzYY|&d zb?)Ql9ZfWbTd(FK^h~@3^RwC%&4XZyIgxJ9jh)J9n6pz|3nJ=!ZUR*=<3J;){;ey3 zt0i6CbqsAIxp-JRU)D@SKWgGt@O<9j%KP|^UU!HsECRz3K%Kwk$ec5g$u zB90O8QrfwAD@j?zt(5rdF0YQC9*;by)qPKp-xY=ka4x_hVi9*7zLZ=~kdbRdG3xHp zypb=&w3-(O7>4DlP0{06;Tz~oy_e#$V3<-l%B21dVhH`z{ZIhtZXe4DWODN#jF?iD z*4KZex?3Gug8IPbYG8A?V>y3x;n&(_;Yo9=VUKkzU-`9NKDXlZF6mVZ9A1B{#Dc|C)6TH8#G6t?Z zD(u&0jaEuXxP<5YR(m3lM#rp4Et=7#7q4XxE6m!jSoi6ykgF#o@mdz!m)&I}U;08F z)GD$+c0Uw5Rqnd>LaI^r$LczwyFFwvUkZ0d=goI}EI$!uazJ?K+a<^TmMluM)D-Aw zc4V>A+m)?ETlk&-ZcDk;^&BJZ0B8ikzK!*7LSWgm{ymXJ^yUdf-TDbgKH7E{(sgKt zkwU{j+CTq+-un{BgC7Ok8(N5}=lPAXvfVSE^Th7a_vO*&movaO;CEOH-9_5hhh|1) zB^{OF-%M3YjjsNV9()#wnfEmQ;ZdmT>9g&*OsW)PIB!P= z4F2i&R_yA9SO~*`S5fL6I7F<{yCd@k4DKS}%WHMz>m3yYIO0Vj;#2MFM$cAUomT|) zmwO%$!OPbk#$?RoYOIHNR(TISylLCEJ73rLURQk; z(XZ>T9kCW*14S)lFLW7CWFE9? zgsr5GEExdub_l{hA`|KqRgq4h1332W zmB=E78n6AwAXO_*ExoOZQsQjTg3SFoaa!fra~xAJ7ej^L&bdwPE8)T9HI{3nP+ZJl zw1gKkR}sBOVEwuc(<-WtJ#A0||0Xigvu)Im+8!rf(*xbhmRo^plqW(z(Ac2mCG*uN zATaN0Cje$w3(FXbac8=9NnCc+EbzB-2;+K}l~D<12w&SuZix3HIiU2+*0PHjv9m~W zRxiRi5S~`R*5=Z0SxS73gdN>R-t2+#zKn4OkVpFOBBGDwnxlb7KuRQlckO!!?$v9c zu{2X&y5vK-WJ-uIoUA3T=3Wv2M(*Ol2X$S`7rr1#Vc*mp~Nm~<3w)8%%f|i zD%~R+f@UVe8k|7FOuSk>0(&{RZU%$iH#@S*^6R!JIh(a4ch2DaVLV~drjFpVIk#FI zZkwn!vrz>e;7O5Spjh$fv;DdY`>TtMAVnbKTNOGb6wu>3@R^rB!vPzOx{lCWo^CW7 zsg^oIz&a?x9mn8k%tXrtl*!_x;6>c`eN!4+p}*|#?DN$^``(61kE0+z%-uPx^sB+7+bb~jeWSq>v0J z(}~$;S-fg*pSzke7X_@xcn6`WS9$V|<{)xruvT(O*j%>&$mxd}yV z1c7?st`lRPF}K^l}N6@P)piq;4Ngesvn}FvZDSsFT>tR5TdvS zL?mfbFR94ITbWq;V8%KPsbFyH^c-<|7OQa#bHuU|X&{W}s7;tzY8~^~IKb$VmlkVQ z4J=pF&vRs)=yC}*HG@@CJzXunZadFm?q=#SPMcFUVB4XNf3pT)`9><&B{=u}{3S?q z#amDfmYwYV{uE3_!XX!dx3W89D;VyMlqD=*RS3q1r z4ee_N4r{|s$vv8Xk1|F{kQ6=H+O@{RV3$MD;?pjEYUlU(E)a4WY@=e}b zX~OnOB@9@$d)O)xRlt6bcrF8kO~4Its~AN;uK}*9VS~Xx5u&wpp|KMKmRPsS2Rg_@ZLPRI<@?bQBDnci zkUf*D+2B*a=%Hzc6y1ZP>j!#<_Q}41Fq^p&%vC*A%3)O@=Wyfq2Hl|c>>0YEm(c|@ zamo0_l1#-=Vw2mnDUKXNN}D<-2vwW8 zU}ru_|C*mly#+;huHUyQo9{r7OhqAB!C(ewjND<7u$;MyC7;k{IS=O_*ad<{J;a_Q z1d`$)Lu8_uQ zg)Os#U>dF6*LH}aUf)LErNBCwE=BxGY(m@6MRu(#>sxJ`|F4@*E*vu5s< z+cp8A4aJF6@kIQuL1_K8i(0DHy7^Ip0}317hTsU}8oZ_7C3UaV;n?S8(b0y@A49RE zTY`&kbSoj8D@^Z6k62gM5PA-R);sIUIcgnYr)hC2q&E|HwS|e^v8h0)%6wKTKVdu_ z#mid4yDQezBPIh;LeaQQ`$CNm1fB?6#5)A?{Jz4Ox$`AqGV>bQMi)#2x=g=01(8`f zSRb!$K1a^*iw1_@`68C7NjAsm)km%INE*WjF8h}?D6yftYiOUkA0PQgYBrn@t^#ZV zWJUsCILw`FSMhH@vFymlQYJ<<35O1t6Ffr!W1M!4qJ{!p08yphz9M9t7S2ejGN~z6 zimFj~;v+w{SP3j|H#&g(EcVUEaoS>*SboxQO>PFNSu<-Ah_2 zx}T1ZRqn=M^twF4wNm3LWAHah$%YxbcV7nogthM*-FTgk*` zI)ml$sTUy-gW_HJpLs?=Pe1K$5=xf*{*6l6;s~20Sp&;Ld7{#s)8;izwqh zr?xH0INU^%*-VknZ;Nv4j}FRJa=kn6rS!dLShH$Zph#lcy0;NYuHM3QY{e+CF;mi) za5>cd2nJisCLD4B_8j!49b|n*1w^{bSdVtM=@!z#fe#6Rfo4E7p%3*FQaeKJi+zd6 z-Ly#wCt*?yMvsZ9$;wr4c`9x&5&bRL6ROPOf$oVx-Rt_Sa-;z~`U*rbK3g%_OLQKMFzPKu;+&gsyHG3L7ICjO z%OBbNBYFq@y57P5D!=$1C)06iaa;XFVE=MFVB3$qVHOyw;7 z3qy<87c686V*1XcS1fM(7AohINm zKsu-A%FhJbP#g|SDJK9y1NGiR$DHCL9$iv^pE5O;~8r z{TQL>vI+LIDB062jyd~!bd1tuHMm+K-Tb(9U3942SZZLxV^d;>+8i!){T+V-W}s{D zr*!eGYo1n@Tv{SX+Sg_eV?`jCW|+wSw&O-jYH_^C8qv*N6x45#x5st$On8`6n!KvJ zCfh44U&B`~BtErXWWPGe5q72cr-;WNb2V#n;J&qbeS;DS{_?p_9`j?Komkm&A~V64 zxT|m>;JJieMx#|iPx!bHoj?q1Eg~cw)?+$BYD=$c&%>fJ=#qV>XI2FYWH&8Etp3Yx zTwI?ZU@$FekE_M$PtTSfEAHt3Bl-N9*5;*YR8ApE%D;lA2|E~<$I#A7xe^rIJlp7s zdtJU_^F~$HY8)95Hc2|aUU>h+yYTnp@vHc>mx~L*MV&W-uVDY`Zd+dc$g9R2a91jn zFy-R=7As9a(!10)BDE#!iCD7;m|F=}GK+Lt;@{HiF!(hAZ6iq-RMa@QGcUW`6dX*e z<8l8)BBq;oej z+iMShg!wmx`M!>AH|;)Xp%0TEsnHG3zu%Z_4a|*eE)+;_wm?R`+LKn<_YwTP0L@oOYHM3f)fhtd>o_Rm zan(xXb~}i3EE|oH3vpi!`Vom|#?z{djQgGrqIoZN$8vOMdf)SVV7-^cFY_RQQ=9LT zGYHcScTODN3Dw+^ahpR!(T6Hbe&4;A(I+rQE@m@Lb*=eY|pJ_ z5jCJ1mh}AVrDh*rVcy2NQ^y}jSwv^&ROqwB((!$yczf@$o!$0#Yn` z8*rFZ)RaM_n3y5`*SSM0KAK>x&}iIH83guQf0d) zcL)C}L$So7>-EeNT6=@|{8pYlAa4a|!4LdEJ(GPO)0H2Zhd{Cxb0$+1zRED%dj^sG ztMxOP`DmHR!FadjCc4jmD?OG#NO8Uh!C3d~^0r&7Adn_U>h)Z|BxUZ`YltDTK6x=lrl}CW*>4#m~NY)5k zXrPjeuV9hf-H$7M=E{bWar=or7~Di8f(f(Z9Qq|5 z#pulEwUG{O&yS}J@ZyT+-%K>t_xI`)POMtmRADAK-ekKQJIa2!fSB``<_GR}%aoIK z0P6#Aa1)iZ(VWvE^WKyBkUdkoVJE*0tp%WdDX}Ymkp)I{*919HcK;q;Z9nKw{k_-l zI5sRjCIg`?yGlM?uo~EX__-lwGc?Y#CJDklpB6{|(N1fOgVOVqD|xZyy4lUs>w7j0 z0o)0{pX5q3?&x+u2Az>k`R;lL1XQi)z1jH%HHGPVqS3e-4tHdIVF}Z&T{y|L?IgJ^cuq&*4LC__W)%%*LvUhQdI~~Ub+M8b02-;aY ztKU?)^O~<4;I~Ip^`1ta9r0Cq?m5AvbL3hY-xARv@*4Eq#FADkNn*&_!Nl~dXdc5n zMsa9$h4m8}!wyW-y!H4}XRFB<{dW(5Jg5E_ZOKDWrw(vPbZ7hOOEbUkr5sI|9#mNEnAm#RB9Pn8 z#Lo1$o0RMRCahs@@bFhYp}{IY4WDMFxM@7+2_4I)oucz>yTrgzOh)D&?T579azs7v z%ILhC>oS;2^|syqmEQe4zW7YEoq@2u0A1@yHVSw@+b8uKv%eY1KF@2P>@Z0Zv|vL| z?#n}e2&IIaI57$4;f_5xTM)3u`QRU=gWNEkORa85)vIPK*SM7)w469JaOqO!9x3y{ ztwOjCNBFa-?i5IgNxvbiEAk+#oZ|1Zqm&8LHJ0*eQoZ`(b|f(B10L#%8De)$AM=*y zWlEaepGK>zg=HYG9UcYd3xOK~fgCTHw~RrBkKQ?~jPtgWc0#IB7A~_D$#`pt=6-B#<)Ct%ZY&_B78aN^KO!77bukW!l#(U9z67S%OV0 zxXn;UB;IdTj-{PdnK(3)Q0CEZ9Cyz(oF(K_G6T7tlMev%XsxADr{p~`qg3`P%OWTyG*I1l!3id`6VCh_%djVA zw%gcp?+sNxl3Q(cKKEPZgZNAYqzYuL^G<2)sHFT1-j`|Aa+LLZ`(Hu2+XJCW0!7J$ z#tLWcdrQe!)y@wDW?6SYBlWdm%DF`k+3DDo12P9<0#CsS!ArE*B{GDW9$<5Wk;vg?cTc5nfBY zEtVt9%`^GG5}BncsPv~lGbACBL*8#VxVxLC`<&1ay*kGJxbexFAwlW# z+?ZHTrfpjJ<{VE}uNZ0lA=I_v(a!n~9h|=3l*6)L;^;x9>tB@Lhx3-WCfhzh_^K9s z*XRc!h>j<-FJB5FW~B9J?n82Oe*Y3=&wjaYc=hR( zvbJ1@mvS{agQ!mDE|Y}}gmSd~;?RP|hHfijrGPPygCgQ|m?s332EN{mVKNWU=lHf3T z>c~jBL-#=@nI`TmAoJI(^QbFvhi{XAV7Zi*ER$}TsTa(yTjSZ2qTdDTT(L3#v5m=d z>Fhe^`BISE<Sw5!cCXzNgU@XvvFMhD=|~&axo!KO z7{~rJT~*yBW8IfKLt8tEiCzaFU{9Xnw{^A&r85$yKBK_Hel(7*E@;#`Pw(z))V=B+ z$uT**+{stQe~#t<$C&)x!y}N>59xsP2Qx(cZ^z`N#07#76Xb&8vdmxtTi z)5psvD0jLAwZx{U#ltR0X&BcEdkCsROBd%W0I{^Bf>tOcCdzjj34saLc3ZcrX;er_=u(N$E*L(frpNgg29>TY zS8JF`V(>E%maS@6vq0%PPV-Sc9T#Ygs&CkSqF0!kTcsx(NA5%SpcmgKNT9~#Vul20 zXNW|EYEAHD#i4fP_vOkb1!N3T|lL@$dOiZxFZdbTv?ftS2IOfkOeWN zJY&*KeDlGfRsp1Dy#jY0#gbpw9?%&Gbp(;{3FPL)0h~#}n%GypTrIrtbS<0lNt6s! zO3|=fL%`h+yGeT6&9zpiR!PDGxhH+EVDPt?E=BkZw4#J_V2%3}LtetN zIld!#3VNS2Nst&3glc`fu@{kN~Jf-t|3wD6C$qe<=fhlYjxm0L<@pfVd2J-8)FWuI=qF=lRfHrVGv z=Iz;SXi7&T2mjI9Qs@2D{2cLKLcc~eq_x2~QEZW7pkL+Y^d9flbiByC;I`;g;s-#DP8pf3MRD9P z50@08i)v`V?O!rX^N!MX9d9!Ene%YaxpK>}Oq3Jv9A^cE&htr#kYHq&Us&Q~V8}sP z>(q}~Czr8-uq#zZ5DT|>aKw0>gm@<*Dl=MwoLi)PBU@jBrF226949#h8-IfW!Irmp zAZ`XCJSCviJ13`f01O9ITPz^XeMPEZm`kjWekXIPFnWjNB~?7@oyKmf-&PD*O60CU z4t5s?)PWGOy7<=(ZKcPf@!rkHV7b<;(xqE&0@~N{xKDd+-nfm$T}ASEj6e?3f;(9q zkHPfF=(wV9RRA?<>5vLtRgcsgz9TOBCNt#-1vXfVfG)q?qQDu!ysI`YM_CJ@DIB@! zqw1{21PLUggqYH?IC;Bh&sbK)!c^#3tSmgwO0zm54n>N#{4gTuoNCvtS7Ra?%B`NB zE)vED08&(24$26xVs?Iip)zCsAi_{Rrg$W#Sad|nw&Q0EGFj9$OO3L+P-sq$AWfVu ztwgqHHZ8;3Pb-jQfQB54 z_?xm_V@&!3c?rDHy>ddQ?>COU2Jw49_b@-JBrYe&x>qVBGzObiGVB|-^JuDHESdPU z?%p?q5l*9g73c(`bh6rg{ZG9t!2GQ^nWx*m05dacf;K@g zO!bAn)iyh(o)wpxvoS1#vOnOAbXaP}TSizQ9xm?;qp)V6HeD8B+wF>M3%a zbj=6g5Kn+!Gse``fms|*Hzo8)w)IPXBg*D=tQyDdN+3jo6HLSIt8o;afirGI|RRR0HPD^c$=Yu0kjUFGw;0q(AMbS^Kc6B%3!e14HT88 zZ5P>X+)#z1Zosj%MTd&-d!FvlZOQCE+w8zn{AfOqPJaFt6w0c)wT*maV%SfR;T8EQ zQy_btHq{PHNGC73NyvX}$bCBmq0FQQY$}vGELX9oLz}rIg%hI2@8FKRH!hpdXm-;5|^3a=E*q|v)16Q|HSQALiXqVB$z*-nci zx~|u1MxWNduxN*H?GzUuptL9llu7G#s!%p9LJ#_>>#@NZOoGvy=-DgA9;e-q^p4!I{qz|l! z28@ur7@poLUXRq>DS7POz{5>CN%WW}u&4Oo2#T-+i%47AOld4eNC(T#APHJ3AqD)* zvEyL<7BsNT=TY3=bPz&*h=f^DE?EHQA7V5MtMEUxuY*nDkF-B2r{62f4+dnmw7Aty z)rdPlMC8I)jUGRMpLaAn++@gt>&#MQ?K^y|c_$e}md| zX^2j({Ib0;Tr^DESZ2B!CD*t^va95`R99(kyhEOCx~P{cwO*?~#%ooReSk64ThG6#^iS6r2dHyEZ9rdr`65l(oH!1i^RzZ7e{=^^D^A^wQLX=chNUxelBm)Cg z+6U|A4-{r0l2Z*${mA?Qfk!KaX_*W=_CkUoS7 zd{DWcTLx#0@+5&itB|Y4I=21Y=Bn{$np?S7glVeeLk{K1Z+_PXo|f+UnhTvTKk;05 zT4%Gv@p3pY8`Bo{5tq>?K5{uH!ES%HhE=1^Vp2n~Eh=&PnbsiYnkLsxL}0CHJis-^ za|E=+2DaVqbSnCl!og`n>~>8~08z{L^)>!I1PU&BmFhGc*WaAKL{lY9CJj|(4;>ck zRU;XRxs}iBpu}||IyDZ4R=r>|In0le`q=X9g_b~hwDGD z%5tI#{6ha|XtGttV*dW1#-3G^2K|Ml)nu{aM5q8Egc$K!@$^Z{ouFklR%A>u27B(u zr~7NM`2^Ajn>sxnD>hVXwDLQKF87{H925UaE_0qg;p()0=6nW%nRXmUP;4rWF#*?* zb5ux&m2AV2G`?Vo9_27e=M-I$&3j9q)vUp%^9Wf}x0%rY)?A6*5`)eX-SWhaJ}-A* zMhn>c>4k-AwjNnsZKrLw3S$h<&+t~AwG)rWUpcJA1x8ZDch6yjms?lRP7k}Dxc4g0 zF*UNB^Wt~?O7~(ub*#mee-X$&`Sf%5D-&bIIv=!@7|!Pam=q1a%8Y=U6^2ts#ISvy zdC25smv=(>EfKCZ<+or3#1%_UJU#-7ZJFC{z^AbB5Q*v!!Q9db4X(7vk1k0MpfFhX zrIu@)J%n=rOQk1{@W1;ZB8?$q>8WtoiH&YUk}~f=@ezZ18Tn>}33B7?N{I=d7Ed2* zvkLKd4DkckamJ2S^U1{lkcN#?o+Rmb+AkH0`eGd`!Npd4!IDo_{ ztU)rBpMC_lDaUy?7GgYkBo-o3Ka12lZA1l^#!sroyHb;e5twkz>HOCs)6peo--aAX z=|Pr9TvKu~6FO?x;F$wcf^H`V(C06ge1~T<(wg+fMVHgKThOyd390JP%q?8lHf z(jc^p07gssPa?S>s7s2uM?hWJ(@kr#Z#zF9yEpJ)|0&IvYi2pX{h@Y;&x6Qu%-(wi zn0CSk<0Id6tZqMWVOqP;Xt9eHB7yWA+go!1p{9dz*;Zp;l?=0m`avkg;F-x?gb=UO zbq$@VU%L62k5)`G^d+04GZ~HU+iKe0DOV6*A5S?GOKmfXQX7`1_a8j_W54d?Prssf zR4YNod`Y-Rl()Yb_pRV+B?&lEaMoxKj^M+cujo+uw!t6ZPnf@J|TwG z)0~;$O0}j-7}lnF@L%JYiP|aZ_ywG9(0OwP&chAOewjJGQ~ou z!O+;NUzgK{j{Z~p$Uk;g%I~K)=^t^U4EonE%71%O{4X5GVik4UpUw3rZcy!gaBlE2 zMH7&pytEA13IPr)A#sw#B%5tz+D1^*hjX8>W6Wip#-Moo>gAqQ)MVJvBXGx7sSZ&j zcC0KZ8JVF}AN%rUAKIzH&APRU$^uZiM4S>+7``Yx-e?@;1iQeP11Jzvhxl$#g26yuYS%50Aeohhzn$sJe|KIj$)x~_k5I`)Md>5u(?TP?(4+!7g~K##^Lly zf0_nw3Da?jSpr)!akk&+@5!Z4I_pat@Eo#|H5sbeD2a~5!j_TjB<7O1@$^8zZ%*wi zP<_u(7e@!ZXyfDuU`phqC@83RbW(sjsX~8yK<<-b8|PW#yN%0sF|wCMJ7e3bD9lA+ zYw{c(clcOU4lQ`{;enjbl}OipZU+|;pQwH9maCBtor%{t&T&1SgHR--&%ZpFHqR)v z!6h$fr&g#SgmGUsA7zTOV5SVr5vqKOt3|>oY7e+f=jdnW`+RiPZWaFJjd_9JSpi@% zANt=CHENMDG3Kxa?Ttoo)aah6%gzT=*V}+rljYkUM=w{zcu@yH*V?@OH31Ik#7tHE z)h*VK_5>jVkptc-BCtTV2j^`Y14#p{v>hOem~ORj~JT z-DuamP7=67&--1Xfl!bPHRZZohZLr7e8j%mqjQoO{&nzdokXRX;5ev)I%0#u z`p>weJm#g^^T?>qVae;;gmc%tn(=Sz6CJgaU4Fd|f)dR*<%43d#Bjt6l%=h9Yku3{%qtJTgj zs?Y1*op=#OXOlD+Fs%4J5*wxca?EKfKkj!zx~)f*Gf>sv9E@N-H_ftdS#8NI z&eg6$#$+%UQ!+=O?@QOop^}}82gk)K)yK+Z8%YVv@AC1%v2z2v+%#45G>XX;q{z6j zc;(Xd+GNciKzJf2(SQ-mRZy39=TV}p{h75h77+Y4PZ}3uK1!bg;bN^g#a#|aFIO^7 zLan{!X=p-OEa(gO7Ob_S`a_J03PV9qMHZbaYPe$8Etc+2Wu_gw8-0)I`>%fQzmrV} z{_U>h=wSGNA*1|zy2(F2Fa2)`EB`%T`JesfKd=9J9eyV#2Xg~wC*yxT*?$Pie4|BFn;bRiC#CDsFB1%m_C6I9eh4sLd64pzT5Y@RWF*L z)(3x^QYwKEAU6mZ`d28qo1{5}-Rr4_1;hMi4;bWRsv;nEmt6HI;EyMN5|muy>wjbB z0s9GodMm4G(=P$3HiBY~ToI#UOV0LDm}d1VH)wjQ|8*Xe{H#KgQx{MvEU`BrZ}Y}Al7lX`mDVb#{& zDuD*&7R1|H({T7MYuoIV8o6lgl2|nCyT3OGR^hy-)9_0&ai0j{hD`|Ib?b=k-6= z)KAW_v68v9vADIhv(vwVBo!rPH|XHIk5wlD!eKOA7A@T>s8R6DD*KC35FIYW_lWBV zJv-Nn_j+8d`s=w=`q4xgbJDNrS9#AeagfJV*s$CkH0G(PJs-ew@4BcmuZ(JemZP8K zPEq}@b=Uwk0hqy4msXaRuo7Jhh9P)ku0nTv!$Swo zZI_Bol+85bnsqs}S%Le>%$kJu-K)y0&VkJ>hi6;J*jScZ#hlShb!EDBv+XK_;td1z z@VUsaA(H*&`UDgQ(1)+B?GWALB-~2XO@u;o$g5uHZhMisA^R;icX2K0%;R^y(h40l z@SjH{f>QL3ssWfb#ni=%h*a)8r8Hdd$1z28ZT*ejHIp{F!W8a^)dkaY z!@m2Q(g$No$_w^2#%Lb}3d=Bb6s zhL7jPBX5Y~- zp#S>v&O829GKBoWbN&3PaQu(9@BdBy7t^;fviiZG|7_RQ7}k#SbT6De1Re{`IF4th zXm&DLWeeqr`96Fxl*D{Zjar#DGMm27?g@?NiKydAoIkv3&zxl^+1RBC=5%>lJ3|Xn zswZw1eO1d0EFP!!>ZQIe)Hcx&NnU(M-aO#$Wt&McCQ>W$v3Ihl05br~EjU;HYaqJ* z^&G)1k=sd9+Jd2e*MTsuPaj{3++0$ow9VXkQ^YrAWJiO0Ch#z{>OTg)bw-0QrbIW~ z7$m(cS)#Y&#y-f+V;p%jRoX8P3H#YOSkJs!&;H1%2uoTbG@C(_UP@*e3><{1JevKm zqq#!n7xH>c`*%2v8u=Xs5M^=aKoO8j~&80j&^Wi+O70+(4b;ozS!?*G=)OrbJodqF z7zwoOMEGpdEm9-VhRXh{U?QeAqod>6 zfBeJnl`%YQAagP#hvc_AEa5GgmYOD#-Us%QzWD1b7Y|CT^9pe5VKN>`B|@{E_i0q- zMHBTfgi8SXmw7|_7X4}pfA7UqCj0{U+rDlgMCcx@Q-iL51qwkuA@_F_Z-6lP8n7Pl zBKrwUFnTiH4lz(j3JF7ZcGa^zVz2TnkZteiD;m8)@Wq{vLVN?{BcW!*G2sp6MIUs` zU^(zO`8#pC2IgufH41Z&_(OFJt2}C$gCL9Yp4;4SAai1)V_R%0Lav`64Q4-b|v z)~NCA`RD4Gx&H3GyDy%P@pPw5DZp$_;BjG3;#d%;LYBwmk|B>I3l_p%;KzkN?3OPH z%a}eW2~)>3c95^24aVpO$Z2d)+_j_*05d=e+7}3n@i>AR`%@$(nYAM;%>r1H;{ zgu;>MO21I=vps=Jc7U{mr9bkJG>~+P_mHw$$ERDr2v206gq3May&KT<0bE;OA4G@H zFf0`-ET=(ts8MVY+G{5f8b5Y>u3@7oUAuX_?BQF7#|;o_*zv2_AR}=p@BW5INjtFl zjbLpBV{H6ez%t_e9S)>_iKdI64c`q%g0Mz0Q_aACp?>(1z>|^XpDNl?Ef4h)8T^QdQIpVM%3ps-n-K->`_WOk2nCMW6 zbd15c;e;W}2>MZO&&!yLU3(xg>J|BnBLv<#-5Q}%8i&X2A#I})aRyqfi#F)bz`&$o zOw?BkVGA_J;yx!_rFNIvFY8OKanawRQ6BJYXUOO0W}>r8)1vj*$p%{-j{8DKEL80h ze*1l6HwUe*YcvDL+QFdH$L1iMHYMC{t5ZoL{Qp?2l~ct?M4bQ9%6ZYPT@Rg8K78ZPmRB!XFUeKCa{0oCnK9MDvj|=+E+{=CohDd)~Ex_OY6%ZYI6Eo$KCM#_65CDhC%XF%a!Mh6>$t#4q_Zs zJZJ};j0Y}(nus4@A!CJi`$;~(Kku-{5D=+)@TzNq7y=;ekSF#}XT!LoktAo^YH3>x!?+;&7Fv zWPLrPf1ZpXm9o4TSt;wRM@YJ~Qf&vqruK0!4R`;c8(rz_5u95S>Lyu9Wc{%4?{Vfj zFxlDJQF(di*X+jmaT>Qxo!+oh#acKsXp#VPm1{Qt?l$NK+PMAI<~QD{p?wUdXuc2_ zIG;_7D4r*nC#3ZPAFq76%#`N*-bYa(n%<0T8~$(?=+3gCw98g z!ZFzXr_<1Amm$`>JcRgZFaxl$*Y^N}YZs6$POG=HuE7~^h*doAF-m4($Ow{l|25*X z{(JBKd@OS7wqrNXbt5;c^UKd$%J$}MgPfe|_}b`nCY^eeUHb-3Dx069a461C9=e1A zR?(R8vuklQAl2}D0J_#s>JZWwYnh}in(-|^O%!7os^tYWgSp5G+R2o$h+d#1<0|wFL#?Y-P!tQCgV{lzn1X zT=MdukDbL0nK46LGV)v^fnXHoR~;KFg6&1bkiGJYBg9mR1h)NHYw(wH_Yie%&MFtB z*4FV@ob&Pb6`{*ykg52uO3S??LThdpSOx!FZN$HZl713e^mR6TDe%fG1|PP0?Ew|V z^P}Lxt&kG0#QcQukbaqF%*fC`Nn9kQr`V{>earO9n&%x@@A3N|}!dpO0{^APFHsvI$$(BV6}a#{TwRo>s*#PHq<4vGex2 zYSTTsSfJ48!wO6zuQD%m)APwFMLByKc`H9|is5Dpc@MJ$caP#bk01wP07k;!5W_cY z!_&MOMO`7P9a;|H@QSyX-W8xh&4Pe1?a64k=&Gd8VKrSDn^jd{ucr$)1V1#ba1~1lN7$`RDr4SKmW*&*=WW{=TEBxbK;D9kU3~iMb!rlTfg&63#Vuv&b zd%DaZ50FsUwy=K3)t6F69z>9Xt2&*@FHA1xWR9xGOw5g3d#aCSU?Wd8_)|% zi>gV2Mg>SjGX>_0l+Q8!rfdF0fEgJ*j`rfzJp_eUSFo8HK66s}$57?7@x)2S#L>oJ?64xJdaYXx_^XJWDEH1^MX;np*xg~!>Y>Ot9mdQYDt`BQu zO0`%MC&f5?K8p6-Fj0Kge%`5PYTIbbf*Rv`l5WDAQlxE;r&5@*t2mam@@2_aWz*1? z44y2%Z7v~?_JOo8-z1fJt1brg)nNVi?U^m_3MUywjM9ZoWE4L>NWt#W0iTQ2IW%|& zMeb(-wIMy0CZxgm)6vb2A=ivF~4CFA2kt-zAu1{jLOQVSOqWY3O0xkWRRC zh3E{d6!<+V6wY^@VGczBq>1OHsE|xi%Iq`ZfVH6S>eCx)SK>sm(=hJXR}|32yT5+J z&8$|kugL{oDx35)R$oHpU->2;*;(6b1X;X829uneK9ABMFh*S_Y1HUKd($_Por{C5 ztA(RT5gWgh77S*BhY~YuZAc#srVq7-{~^MhL5L#3y>&?xUnL-j%)zrv+MOXRjmV^Q z-fA=qIbG93wxvW?ojP3jEDAx*hD{c$-!@>0f^f2jHw-eaxU>>rma8xB=L_L33fOji z%k3?D9}(^_sq73tqnH|H>_AkZVb1A*9gsUJZaCUlvBN>YOByf#zesz>_E5NGTQJFr zZDYl@ZQHhOn=7_$+qP{xE4H034s8?|+yzN7X=;r%q;g2CRT6#LZm36pU7D zlER1J)+O-_#Oy)Y+yTW7BaDnl+K7@~tho;S7&2a87#ghYyK7aF@D=sh_(x&U#T>Sw^K%s=n`31_ZtTS5~Gce)x7mA zh*c{;CQhTq)d&x*EhmA^O4r8Jn#4?Yi2!P8a1mfy7m2nWtDZ&!>FVtEyClPqF$E@h zaB1z_aqb+8hDas*I$Qqzfa7F^9og<;9WFF!pFMT*(uZT24x;{gLjpp);f&0#GS#TD zQW9I#NDPQSA-f~9_w@q3FnP10~&A(p-pWElM^#n+05Tj5{sGgdACtFSpoIv?nP zB2><{A5_)Dny2A3oL|y>5@Q{I|9uKKKLqEhIui*Ct*n>)D2;#{*Ox2MKD>bCRmdBK z;iRuwYrf871^XxODFdq(nuw`+B^EbzP2*y&z#FN0x|fT{#Vz^czvR{O^v&UlAF@;U z=Te@`|6MUU8tXe4n*F09ie-rTaf!4LxF zcn6lhJDi26*VPdxdKv?J8P6uT&JX0Wj-hdqCbh;{2%9iliqTImx!&l)TV3E!yCf*6 z!vX}e>5K<_F?~hgyp8h;q{s))RDH0-?;ohP1FY5tfVxic;6IfA=T&6+w|4}?Rpd?K zc=s%cUlbI%|M|yQD3Noo610MyQu26t9Seq|K!x`xF+;dCFi((UO5nnM#kpeuBsTdl zHWwXK-A#Z<@Blh)kfiya7fo&SXeBaOuMYV_wUA^YCJ!I&APZQSrrcZ&)5*Q4QM+6+ zmg33T^j@AqM9mxT-`Ep~Gb`qZ0LSs_q^-gxZjhkt%tZ=Yroocpug778MFRb<_A?>` zJ|b)e&r%jiMpBQbqNA`YYvQ}(5VO+*ELwngIOVJTNikx#KS#tPbO>@u?TSZMa_D|_ z^HQXZ5Z=-A1lUR>ZNOOCGzwmMwjnXV7F^;>9`X%qM4UdW@WpSasrah|v(9PrC=m=a z2ZbZJM^~1%vSLC1(V_&RXtkV*Tg?fy{WD-36Bux%(8U`}XVygyy2876@aGwfj;0DJ zp-sZ~Y!l5GkpaJ`b};UWPev=a$gRYm)VoxxhIPVbEWZmEC77ycArErl}#wlIa$J+QcgW+1zRdUXsy*C_E!j{%cWfq1if&8lI z%8t^rjARTPi$paCA1DLd5cw0Ui)O?Y%u7)orTe{vjq6=&4=K#Rf=#}3cTqk_d00TJ z@iWDF*%r+F_rAJ}-&EVG3^#>K5%GTA$*3j}F6;Y+U z5&d(|+51{GQb=B75ymx4b0T~K68@(Crco&=K?*6*P_%jB3i7gtv3a3TdR$q}A|ujt zI`ikEa}IY+I3$A<$O0R^%Kc*Xg>tZokL#NgQ@gh%aLcY@A53K%U+zx0Ig|xVGv7;Y zAtD8-=3CSudP2i}PNAY(iPP|2@VMi2VSuUbL7_VjGg&=bpYVZqaU+=KiU41EIpx%S zKTrY&cy>NhqDplVP1>QvbS~oPX!Bm{qy6id^CaJJR&HT)YG3k3 zfJGM$MGjy z5qKl6Uiw!f&j*|hEIBEb;p-+Al==}ws^A7niU^J60XGD(1l86%xGz9*_fh6`n3vOa zg$gNT;?9;{l&6-`O_<(zfYiD;8qwDw=5{D4?uPA`zLZm}L_ouNce0}2=r8NaC1KTP zK_-DBBE>djdQB2ZM4=o_34VCB^GWQuSCkm<}WAROvU1@yLMu-F{n*GpZXE9d^r z*Ckr0rET6t^XGaOPL_>L$#Qp+lQhX$PkFs2A0$$iE+7YVehZ|#J75NCHlf=f>g_07 zxgi;5%ZwuM9YE^BTcX_Nv9tvKSjd#F4Ecu-YI5gk^IGD_bM^Nc?KHuMp@fo9C%L!t z7O2$zA}*c!`NQU--AHzILGEHGo#`e_$~M~4Szben@ik?oQ!d=>eBXv*>%XaXnXlxEhNsNC91woQtbXx8M0?Tq^CRu4bmNY7)Y zm!V7+_HX>sa>Ii%r5tBn=>yBIAr}D~nK>wGSaUBw zR~zG*KqvCV7#Jk!4g%8P#@e1&k;Yf(;;!I4d2;Yx9+Yq|`Z|r9`X%37SrSU6R1$S^ zBcm;d(=YD0$2U=tKX>(G`fn$Na-Zz3 zCZEQ#dIPyn&`nqgD|1 z^AXhkC#>=>@lnLe+1SR(=pX+;l(Mz$&p+^$t!pnPCO*3yT63wf%>)b%Z?I9)RIYU# zkFLeJI=$}yw8P%vuC4+qq@1C3mF;u7UtC$j@=sI& zrgrKOP{Fa_51K#7h_*`+B&%UwCRu-bT{#HB?)e>5a>JjY)oZDp96%0ZxaYj3&IIeY3ZXiOwQuWe$fl6bbu*POR!6Ntkym5-%3|bbRtge@bD=6D zhP95E+7maa;YNw2M00JpUQaU%PBJ9h*xSn*7O$p)$h#HHS1_0jetUhA%d&1>eTd)b zh@V{!f7sZRjk8Mo!TrJx5_+S=SWefWPr?{AuH`c>0d!(Z!XxcB3JU%9z}R?_-ac`k zNJWg98rZL``!%8`wNGG|!KN~NO4W)-b!}#HM^@fMLo1NAHx}r&zd-d4cEC%*rVYQ= zy)*V{)aCqYMCalx8Wdz^bs zuHGLQAS`RcIf;;?`2gcDRx+rzod7_4Sdau%)49Hawb}AHP>L&8=w-`z9BSDC?fo)r zuwwk^(Uugl-|q86HTJR09sw0AY<3?ctL%c`t`0>PQEOLy^m|e)VvDZhAOv zCjEPpP|80}ye~b4uf#cE7CdI*1UHP7QjU9S;Y79iBlTNu7Jri_A+SaHGc@1)@|A7B zZ;y5#N)*7TF)0Y+65Em13t~tUEPCjQ+RI#ch5lDHDA|8_5>_uJp^m))-* zuCfi#^+E@&5QP05d%@yTutI!=q(%4U9na}6ea)uWgt9nu#GtA;QuP+(ukWqT6ytky zP{q~?E5H6_;P#eLpl*ON@aoR{CR%0_o!Y{*0MC!Xi~iu_&Hg%C$%yHJuY0Ss=?Fe& z9?f}vfgJbfq44VJz89CN=1Sn%Lpe=B8Z%8*HygQ1SKr(!2<9gXbCi3U8CjVcTiGV1 zzoqoZYWjYgPXWnUaZt0^<1uRnh(E= z@^yiNhz$I*l(K#CJ@cl)_*+afmK!b}s|R2(r~yFUL2+5EXqtfR|5|{d{u=UEd&>5& z9&OQG2!imNg$pyhTw6KxQ$OLV1LQN&8kj}{kN%A_NLuwPTb#pXc9pg1u{ysmg6l96 z%j-NciUrbDWYv9h!=~)litDZv@2Qd-gF$i3ooSN){=^3=R4Y>@1UUb}FXi3i}`@`oW z(p|WIY(IKl;c{ucK-q;Mt!APNIGl~9ap}U>H5fl(MQuNVYW)e51(`JG1Nhcn)e>L= zJ4Ip(S3?%U&1TQBj&YJ#8^el*m?6AUaKm=TZBhq@<8hXq&%uL0Y~4bt&yctl)xydc z;RlduWIJBGCtjTl_TvbGaGE$mfU_1STn-WDv*O|``dhJ#h0B8xsRJ{cI2>x)98}W` zkW%g^V<4{eB2g5>8mcQq?+VW0z`U(f(036F4vimkJkb3_0x^O-n9qi10Pa>g11m=N zZ6_4e+xt#jwh|92Kq@=(9ByX;_JD<;7dWm`ngnkK4ED3tB)%^b{-#Jvtt%UgJ^$SP z9ox7A;n^eT5l9me|K~tG5;q*Tt2YLyIS}4j-2;7?C^$yQplQ%RAl)o4*PTEHs5U92 zE2DX3Yb?w8tQ~^=n*5STl_FwqrYOD_8CZp4&?SCQG#dxymKb6`mpNXP4SQEvm=1^_qdZn#-qe+q5`m*fF-{|$lub)*U#)AfjFLG3 zn|>XrO*B>d6!b* zm5qwhc||KTvvL_9!B)P})n6OVj}R?svr{>u<=>?)C?0}x6`<2Hk3g+fk9zl_mY zMEAhJi>u%-lZC_E$b=r1ko%oKPLw9Vg?uAb$4D`-CpD}26F=aSO!a!023rGlkfIn_3o zyPNn+bG`S`d^pO;ZkflDY*B`TG~|TZef)BY9Z8u!Z}Jz~HHc0@rGd)ZB3+~PMJz{D z*MG13l`cB15FaCxT}U>4&I1uY2C~0_7+hyPKD~s~qDR61{*|~mv$fnb#Z}mnxvF{6 zCwezO?z^>@daBTv+O*-Z9jm|%e^JS@xDs9$Zo4T9Gv(XuwM%qr~$K9XpG z#0{7=A~xIw2C35cwtd85%ppc{#0-l&HwzI?3T| z`HBLQNGYzP0;>>)n*VS2<*eWMy~;K%ik`8{hDLSiSI4l+4xaoGl2L6*oMRmQ^tio5 zwqQsxxf#h{TaDO$s%Ot^-c|AY>Q#$%+F(f#5u?K7=zDKQ>Y?Ob={2T8(?Ra+qh-cY z=Nk8o`irRA@i_$#7W@T3Ey$GQ%3KLqR>OG$6d~igQauNI3^Eln>5W)Cl9|}Mv~5i@ z_g{V3^@>3USN6292)l@LQeN>@?t7y4yFlHJOPXo{Yh^bHao*d4(gO>(^cqFJ64Y2SaF{op6to%* zNB+Cl_DY(F^0Cy408PbU*>tQJEjp^FnGP`zkM}`S_EDMOj_!42{7p$@MtBhM6iAdl z?A2)rk5L;&>{F5KyRXw)Y}2F0nheHJ1_5(ooxSpH2`ivJRjJ&oEWdiBnE#`^{51Sq z_AEXB^*BlT^Q)vudQQ8&y+`n@>wKce=?ev=CEkm{gh zt$n#eXYj|fB~Ft9WY(pWskbq$%F-Vs498^6s}fx{8cg2*YK10_fHt*$m_dsl8>HgD zg+g0fQ!8UZD_dtHDO*!ha~sotAYzh|6NLp02pGkQLLV9 z786uBiim}Y{Kilf+^aAK)4^`14Wn0i1?OKP zHV#x_V+y8Pz9i}j7v$M>^VYU+4@pYBS!?(_VZryd!RQMi3t3p;1*InYFe?keyHw$`IyC= ztgZg>e7Dpz|I^U(@HD~CRC+ua2ic!dljb;K#NI>I{hY%%a58INS8;y)@0Q-_TscCEu4jtt(xqUL zl==;;&wVC)@t%&V01((W+!>$<miC&V?>vQ7Q*~RtVjb`?dKg)S(zBH71aimE`bEMBI^B8y)fN$qlPBQ22 zfWXZDEDFBu!b>zYEy^M8Ez;^Ij`~X!>P29d2%`PDpm`?hSDuu`f@=rfHZltyBjP-j zEzaIXj17Klv?ju4;djgbr+w@;??cFjq?Fpw#Sb$?gCDGWH&2HHeCjC8-Q!W@(y3jK z>#V|fvH4{BCr31T8m;pft=mbJi>0lWDvqIj@H0)nmHS;O{Oo+zpcHj#9K_p|^v z_m`{!9rGh`u1hsmPi&p%Qg23nBs=V_4a$}QLuo2vdpJ(-_nP+;ZZvC_zwa?7Z#ZL+ zMiXioS&!Ok3ze+#AXmqqUziW$H7Q7}G`UPT2bJlFD8rWb!);UZY9a7Baks)yg}K|) z|0O?wpu&WLN#gdUAZ@sS813xCAIS~i&4AXLFh8Fqc+osBPX>flO&Tvv>t-qOEv@izr4FjYNOrOZQ z6Np(Xp+eQC8c+RPXGvSJDX>HqrR%YR#~wbFCd_IZVyk&@9AwpZFO?)6L}6~)<72!S z)Zp~fBMmjumqhPDhfEFYbiiO`R@-5*DX*edcV0tOYEa=;(pi+VFWD56lu}te*ph3O z*dSnhkH0eOERhdFQ?m*d4^VboKz)SQPI|Udp zpy6lSx7xC5T+Z|Zsn7V`XA)BsLGFxwrUp6pS-S+0O8XFwxIsM+=622VB9d} zky?y;(QL4B%mgl>1WG~?hcjo8a@LrCSn~TQ>RVr0O=0|Cv5XrimQ8gdR%Id3L-^a< zo+&mh!50;(=<+)7ji-7@N{yv5=v(K!a!QzGcHnswdG zv}8$J+!&_4o)U{74P?v_^NSjReR@4Q@fDws@d|iYy9Nd7n$vl)D*MBH(3T|0VEu`= zhW4>~{?w__?d1__C!f@dt`am5zn_oY5yUhUz5=F()l>ducYEEWWSy`KZ3wcALEPxoGE~fU`0Q zO$Gg$;7^o9%rf_m*!G9WI5(jNQn__(gIphN%y zvEHsGR!5{GMoo1I8nUu3rM_D^<8I_N^|A#>+v^R6)ot z$^8?SS@7}8EjwDgOukx;4Dib6C_NmBt42J|iX*QSkVkc$ zj$NEA3I``)UViYvllg%NQCK<`Ew;4r^F-$~;#G!#|LLLv6_V~V`bv?p*WZIPpg2rDkU;O+WrKuJvnikmF>0!Z1pv_?OP~BrGRH23q8~C~8!;8rr}Jw1oMXAJiTT`l z41jXYPyC}8Y0MI$Db7L4N{?}u#x)V-V1De;=HRM4m*lV-g-CHk1u*1n50<_jB0;Ui=WSzA!Jh+Y*{|x9DjLKMyJf@H zzEd6ZOXC$+;>E73fk3d?4~XFddaZmRlb+euCW8p!A=*7^I@skwU!b8Y#g#gQGI8iu z1r9d)cYR@X((jfiREye@!bRQ>G>OV0UZTP3PaF;wqgGUtT(Seq)v6*m!E>{&wjRHC z)eoM?+>Oics`y$Qqb{1o;(j?vlQ;XCb=mU5ccHZAkjp8&C`^%bd770D8>K&TuYV`8@AEL!q)r6WzvMj|dEfS7%P@0S{ zo;ayv?GB=7j(|cEAc_6={EaHkm_7w<>JeAt@T33@S4W7(19ZHQ^y$f2E*m#SBpK^a z6{cTLP}!{J|hbXq$-ZVaO>@EOBecn~dw?+-$U34UXO3KMIvj9A@kG5J=DC z95K5lXfL`^GA$^RMm`qj6`bR;)7DYd_{gS3tX@EJyk%q-fVdKsp`1Qtnb7k}HJNWu z1BzOBK9OgXElC$475S~X%>fPlN01TnFLX1x5Gux(>g+izbx?a#t8JhaTf0rV<$}VL!UaMqWli|L$5o5?a}vqfXX-3T6(5NM*ajl*|vDlO{`P!E4UtOED8jse^eLNLp@NY zpBKAs_nRd*UZo3&y(5PW(*&z>~qt2RUoDVP);JJ;3j1+(hnBH^- zW*1Zx;pMgA!2|E$9|6^|BT5F)pc?~f_NG2V(T4sSjNiVqdI-Bsi`i}%>K{qWW97{% zbN9uH(>szHi_7CN)PndS?ESbQLiOXvsDQ_bQ;&rYU*{!Dl#C(~$>sem5{5pAM;b5eUaP8`TJV!$MYPmwb} z6CPXZ@8}=NxF3$-5H(mUK^S1hkTQn`o)kBg8VpzvonAr*l!qAHu9vB{a68C1H^Geu zHUI_)M~@qb5TR6EO#U~Y1`1}1HmlT3%9Ri+RGtb zH=6>D-;F2&2Uuy@VQ3{tp5BBhJK{?ZgzPcLGY+sUx-355t~e%y)9da2`RnQ5i;0#9 zS5>nh*y;{Os?ZzNLeIeVZA3+hfa(R9QECX1`D1M~=e~OcBN;R@bd+4A?cIcft5jTQ zPKlXac66tRHhV&VZ{hAlj*R*$I}B%X8E(d# z4}5vqh%346$B^{`(j|{p`E}B`z)M8pQ0@$Gex4}pp<@i81F`nzQ%-?Aez}yXuG&+I zO6A(6IU%X1ZFrJE>8+J$!XQm05;ERWDEQE0^#VZw_(T>ejnw@ima#J*?o!-sBza>( zD1b5C`Z$)ZMcH`xr>#5;2Wemp?7?|`61iyyzX{UKu=*K{nKuw2H8JdW#HW&>4kikK z?LfT?0rL$<0oA;@SE!TQGLm)FRRXDDL{wH=)Z02>9Rtc`YAvu0O}%1~V@azs;LK@^ zLhkAmGr*YFA?pBce#bpH2K%6w8?cn=b$}<|wnfj_X!=niWU24Y#4U~LW7Sa)5YNG$ zqf=BMz+)*gdG8b7+YuPZFh8rHEfdr^fEdW3a5d>Z!Q=o`upd@>X*UC|khE;@O;Ue6 z+j>Jr`FiU!2&^8j?XlNjYu-QTONvJW zfr39Jk17b%c$SYm+rURBVlr{W@9-yQtJ72vLvdq85sk+RC(kX5a(5})c|<4fJ+yOk z(&k3WK&09sg2pzhB(>$_u58~NV@c|tVL_C?NXkNQD9SUOX?%5(Bk-Ci&t0H2fW3M4 zp!3T#ZH2FIU1q*KYDB_lTH(5TL4c6^huXA zC6(DL4+zMhrWprTJ6}*N!HMK?yJVt`Z1D>gG5|Pa{B|{g5U=7Dgewnr9G2Zp%`p2T zn4JpGZm~oZtL9)?=A(^+*( zD^*)nCg*4Da>$d#P>CC}LE_(nMp{U4X)Rjl8tKbU_p%TqYQn- zZSNx-l+fJouwunRdC20zoOP}8l|HG2F>GYnFk>N%lmbm#CJT_!>qFw|@Qq9?N%xl= zIkMFtMM8*xVGAB@rUC;zeG|{=qkwl{Q$nkWmg(DBXGZ+bgzMf32FDG)8Q*qxR|!N0>`kXBCYh@g7hD>l(_c zDAI-2dQK|74Q-eFt1G@NqO8S>`)w}Y^d^%M_B4I^-=*>Fo*FkMP7inbvn1LySsO!f zsPkN>ih1$XZDW%hp(=?;?=&=BTvEiQl_{ z9^r4Fpja;6Oq0}i6el=jEh%FJS|ZmDA;ejCHy|q;$kywO;t@_IpB#RgWg`TtZ!D+Q zEOPQ|Mo`@|?}twR(oQG`*TA6^$f%Bpb>y^(O%MUVQwQq5+e)8khH@Xkh%THWB@oB=CP^3@i74 zOy%B6*Rnq<#%FfV{@|<`yme#E-UykT5JIDvQhKp-IrjVfkC&?+M}YaZ=XyWHiH^nB z+@ZVU`Kn7YraM^}0;tUZ)pJ^N?6bc{(rH9@e}GKliE#CgIzG-{1^ijtu}ZLnKw5a4 zD3)<5@?pF+M6krozt3*aE5ncwrY3EPQdn#r=th_KWrD<@7}_x}Z!kEMo9#(N2ncehN66-FZSY+r5vUP6D#MdXD_y z74cV$!B`Ji>AF?A%pAr^v}SjCdX%k(>8jfU2n8(*4)-j%prrozZ3kMKJMzE0o=SrQ zElr)!qI`t;NMnly`4&hURS+M4C--J5j|&cS(dr2k0@|;rB`l{qgnEi9Ou^v(%38dB&EUuGzWxG__{w zM4~3lwPf5HIr##l(L=hZtIr1^RfcIQ#xfq#!SZF$|04Ri^kn``T4>5jA1nzE-F6q5HT&WJ0YuP%SL8W0VOLCRBTE zl*s;2=y>93y&r?aPlZM7;xl~n%IM|99}p{(PWXvGNlV66aHEDal-XUv1`DvU;CupH zj5>0|fAA$P>2vJqyM%VXrc9y8T3XE6*LPX=z{}R+USrcTl3!DKl}zI2bhzcvDfHhK zr=%Er1+SkfnEa`Ne`{_2se+%tow?yZ>L5$e`agB>A4_9J?E3F@3tdIM;4-swKk-^y zKN8Y565ML*HCQ?6&uh*O_dIIPxewyo*Q@N~><-SaTuB&qlK>2CHB+~v?v5l8&pV!M zp}7~j0Kpd(2Ph~S_>+n>`&`sri6BbiBsq|^dQp|#(9Evy-x2!NQqy}{C?KW^eYY|4 z8sDZ5J6WL4NlH<^AubQ4)$OZSfX4ssRN-j)6;1 zr^q%1i#x^0y+fghS)j#>#FiUe)Z)Epe;8WmS|pm6PfUTG8s%Xb&lZk1q~)`~9!jzDln2!|HbpF8fpb8}s;Is@Vs@PKL?{~dNmtUTXAWFt(+ z@yY#EeQ9po{i@lm`AaCbvqg9QS?uSt8sn2ycij@-z39U0%@o4k?G|!+_PF}GP+Y_; zM3%KM=9XDuMTE&){jn9TXyR`2M+Sy^569bB};k3W`XZN2{UK}1;oVRn*ccpi6QAt{(M?+xu!bOr+`c5j`JXZPgfJ# z?jdorTgi;AGZQ^{^eRXI@R zfmP#7!E(r&V+TUNCJ4pcL)!>ey@-v5nb2O5!;vwvs@QERcQR6Bv%B73A_df=oramL zQUgLWf|84d!CACOodiFU$c#gQk=48V^kN&JQHtb_?+@FA7s#rBlMh7`GmAdZDD?Ck zNbrUX0+4P*1|=AidK;LJFf&_bqU(jl8fg}}z*#b;pcRXm;7s$tA<6R@7AeHM{jvq6 z8YhU?O#GiKtOJcHlKDmckev@C$caHGLZ1d4_pvsc_{Z8G7-39Lx(~%9apXa2-9*ms zy47dQTBrMo-6Wy%gvn ztX=4%m!JYuL0>*D}-Lbbcj})^U6QSXNDMnT|#Uxfh!wzbi zuCe$0)hYKkee(-#uH$;7(7C@Ja>6As1z##nB7zqc4Ri4;c@O`OZui$vW0w{SUHZx8+TnoM<*U7E|-|i zMayF;r=QSufqV`~YN=QmC`uv1f}^}cMkk^;g)}*KL#mlHkOV)BSAyoU*!T68o2%9L z8MhT|lnJYSL5(c)aI zLI+FdQRMrXeFn)x`B4!;2geer<}+1%tl4gZI%8}TtyOd63=_5KW_v@oG3kgB-B9Jk z+WFPp=uGk&FS=WXgvH|ivJO9yjgfbxAl5=HLzmg<1BpL5hjUKkm<0GyQzcT*zM1yT zX+%G2zA>4(r^V5{+?M8TYXRMd`_gDSNnp$9D)dTvQ&*XV=C<3A^4pM4zyA(Pc?z89_Rq=YwfzV zYT*CI-T%jGj8e0F4)9}1utNIx$%3CXd#1KR0{?*Fs{g-8L^NAW`5X9BWq1Nq(C~NF zjlWHK=Abo&f}rxG}P~pjy_z0uqB!b^5Qe z(9l;erZdOq9~?LE1Y#sQQyvhn7%?jU8GagaufO=uuRtq510KIMvdUetWgi%>C$!G} zP(WPlz_#ng7!Mx!nP;=$$PZk`Ft2jmdfT}>p)?FB06}oyq)7_;n+&kW{35`B>wtev z++7c!Yg*=H_i=Rda0!)L7u6y}To&>hQR0&!CwdVD=^kS#ezDl}cx`eJauPZs0Q_xI5V@Q#~AOP9p438(hs zlhP)FI6~(gKc+#gy^aIS8D=j7BZ`wm=Du@}Wa>A?NAD4a6iDi?#NYHc~QVFt)g zEC%bi4^_@n%B>h0pj590Urr*l?>Dj~L@fGBK}4LrZX-YlVcn!hW^earcNjt&hAAU2 zf-JRlUWg`L>0%(^swz7lxLi?kz!1l%2B*o<9vDHq|*@F+-Rj_$u*ZFCI7$`)>T#{8Kah=653U-RcYAmay-x#LW++;KI`dyJV>c4x0 z+F_ik>!ShAiD8z8$FY>w!<1&`>Ig{{#NkI1uVt+_x?6Rp_$G;+=QcbL8;iIg-m0M5 zm4lX|x-@M8tzb2;AtdOG0# zxDR|liKeESpGYmWH`r_Q`kJP4?$i-6YH#IUGrRXqENx-D7RI$amwV@!x-_pJ5bIgI zJaKn#JynX#Z>B{BvJ*d2hADsR%B9tDY3@nLJf4u;mgQZCgb*n1$o&yi@(r{s(n-iN zA-CdNPPNU<{SM5ne~G|pbjR8Xsn1V9Q#*?-QxY47VMzsLEuyZ_T3{G1nHZn7lr66QNnt!Ja$A&q6tys43NSU1b1lk1HKr*EiZ#c7d| zvd#62b>zr$%~h%RS5Cr#DV7J82Wku1armK?%H8a2M{vy3uB59#`!+Je0!)A*O^o!y zplg7xV(UJxsaGA+Kz;21w2P~2RmQvQmm}y`aH7W<%aHw9I05d2mt05-I&SnBB{sOu z2_6CV*}d~6ftLt5RZ-+%?T+s5MK&9Y4Cbd*uGo$zo5cfH)Uv4nkS&vnPt zAX!sdO3i)ab*YNqC}H?U33}3{4*+v}0E#8m#N5r`w?OMq_Ujj~tD@gZ>|tY8_iZ8vP#9nf$?sS}3}VEN+1##hrCO6Jk8 zN*RtJ`rHGJcJ(b9KR9Q{kIQy)tc7kc!4xe&%6c47y$q?3nwJ_9B(67+tVN_IKW&pI zEk&1^rQl$4ql3qjh250{Ku$=QsUJLDD}=BFNv$AE;3TqyneF!xUqV3COU7___3Qyn zDii>j#*>qcWfKlg$4_y8Z>knYE@d*E{!3S7MtJfg4jE!hcF|DW*QA`c)19blv3_Jpn=sLR<2%;KC041V@>ZP!r z@x*m*B!8L(fb7k))QhQ6!E*20b`d=sig@;2B6)AO=kat_pbi*_2P8p$7j1k4#6sMI zOM#&xP<5F9+{xPC*8{kkl6%$b9o(s$9-ohWZ<$#yOHqD`y}`A;0R9&=XHms0q_-Wa zE#zQ6Wwy0QcvIjpr-nTN%X&6Z9wt%3h=bG%w5&!c_0mJ3`?lK@F~KEYvsX0rKunEv z|2`1bj+yM~oDDb&J2Nialv%t0nb^ubGbQLy`Jsj@!IV}A--SE6;6eG%a0?89N?)AdMehC>~m^=a9*!c@oPz|nFdi~ zLcWucWJ&tu2=g^ih3x7>XP97Z^d}weO{p_mHl(psj%j74!)h~LuHs!^>kocfl{%|O z;L`Wth(B@6oA(vL;!{4p0U?0vGT%t_21y+O-BTNQM#~fgBMz}suIpTJ18~)vYulcu z9Uf)6J#bApeIWG0!Ig$Ogy4^k(>B+}E7;Kuo5deEwzU9ORd${wKgZ+d32Ba+t4~S5 z1?iO+0lu~=;08#Dp!C;)9-2aA+L#iC4qaQTx0J5ssTR^?K@{O7V5ong36DlM2E+Ux3c*s#CQ zweM~&h|02#ImCF;G3hhKLjWI;gAe*(nP&8=WuCysBVfmy$` zJ98Fn!T_&{#&(Y&F+qRvo*tTtJ#kOtRwzHC~*tTt3 zmEBIgb@tx%sh&SDzuj$&*+=hJA30i}j}68eU9F0c~Ui%MGkC$=l>3N&pue2(-xnKv`>;CGtuQ zkb7FqJ%4lzMY{FdX)EJ%z`t_S+w(wCWMbCqQwQ6yX)A%m;9unNr= zp~qwe0GJ6_7ShJbx3aE3f6tJb9ypnCJeIDH zmI!LT%?hk_uoJb7E+csCZ^JL<__IyYT)qhD4U>M5D?KK9m9?y(%EtBKr;@+&g1u)L z?=PACa*4vti0gtGn4Xk*?JdKp-h7Sq-gAe}GD!TUnw?B3qX51rN+q7JE;iD9f0lNX zdm%=Xxm?J-sikz_Vij4Oy6=vPBKIBC66+q;HT$@M3p=}3DFNVSQf~qVZ7&Ei8JQ-h zi7xEt>Gkd>4YikA_w-A=T+{^tB$x#d2;2O8LH+k&nTI3%&kH5D?+WFz1eDTM)p>}agAyHuWM*J`}^5oMb2a!MH@|gh$r0zB4@n6iE(UU>XV$x1m zZ@vOUT4z=>1p9Lp)Pt?fUl!$=>;bo-PxXmWfj(6yJQ%QVK>OJXqnS7t zUzo=oq$l%#9SW&qQImKvxznYyF?eH{T|W2cBkjW++dN0t$6G5=gKj8$Qs4Ij&jTeL zl;K7%VjD>v70(ivp)gh0kX{j8J)Iw)FTQ1z6^K?a!gK#zgY+pXd7)M$^k!gBT}xVU zEaJjE$R!Fi!eeM2e0;Y4THx745mZ=93Xky+^KQlQ>rY|QNi3uJYm7e;Vhm#zLu!>+ zI`8{+kLSc8r_iw4#5}~U!WgvoXaSz(i8|lXs$W7w9TuXc@N6|?Gh>xVm%TKPNRch3 zWjf+LI*Bmp)d4kWSd99$$06A>*OVWMec@{tZdVs1anM3 z6pQF-ZDOQ_82{$8ocvm9>g0r>an$sT%=%I9r_3Xpv?mAN@-&RGG`RlUcn@F!lGJeS zE-j7?z+BJPq&3)LWbqTYsE0`&W z#69FjKgNV}2}KkRMsOvd5O+~kD3xVkL4d2k3X4L`S>-0!^6-PUd* zm-6!45+q+S(h>3sz)u%igSaMb(VX(;0EzBgehc!rxC-DU{Q6JnnvuEMsNv@_V*vlp zrE4_{YhzOj$Nw}l6{CO3&GSDzf1*xb1VXnr+nrl@s$JU> z0DX5}*Whcl`U_|N@wnc4c75J1Qh*`^V^mUK7QOwGm05}M`(4DSR(0K5Gq98)qAi3n z7V(7LWXvxsARK{DlF*2gSp6n&vQA0#yr58bpflW^5%AMxJ@Ypzm5+Y`=E#A5dK)%ngGR|ga?M}paImLSo=XS| zAC}?_mAYT{gVp22zDx$fk%{d)Ku?@fT!7hRRRj*oNtA00^#h5@R6kJ>5DzzhM(Jef z9j!%)spceA&D5t$}5Qi_NL!HYGum=wCd80--#(X1F`PA2=uPXEIi*1~R z2?(jTDNv<9Nrr0gvYR$_7KEnYKWWW(nbATL;Fd5~dZWz{=8mzPi89smm0xckQvz$? zJC9)3U6-s`iC^o0NgPj2faSk16t=!VPsexbeCK>qiC5>rNPIbPV5A(bngA=gc?kVO zyWi{KJiqK8)O5eZd|#%nU3+T`qMt1*chBVq^d+wDu?-@&aye6`UA`nc8${0fJ3ygz*C2wNu0jt|~xVP}b;{%xRT$>9u|dcjOt?I}kU5uGM7A zMNpbgbhI@y3`jJn8jPhWsoOBiTkoQZZHCYqn)&kD)wVVAoNFVmd(^C@ABT0{rkjm+ zITXfIw~bxV1$09_X>W{s`Fp(+WLH6+b0wG9khs;!26a}<6S2tMx1`?aVdO+ZE6`o6 zDg~^G5JePVqW7n`*&PN>J_*zNK3hK?mqG8ibqS*?ycj(sCqz(`(k!V*n@Y$wn~t#9 zX>(Yq+#x~LYZi_dZxNls&038T z@k^#gYtlKk;4GPu%C&;XWAUx{k;W%4ZK;@}1FeS%$o3fNn=32<+9WMN>%bdXL@X?c z_zhlASs(P{UV_9k(n0NUH@^lyiLSNi{i-zA%tDK0Co1ISPGEj-U1r?6;~21qwL=z- zjf5F!&W*-c64DJZ(5s}_zl@$GF%OrQ_(}Hvd|J3<+h-MgSAKvPEGjDW*&*ksU|H? zRRKP+PHY-b#^wBYrfEn-N*}&Y>cwriD^>){chSJ{DXT-DThALS}K=SMEL6YoiCh#e0=+1!J=z8_BDS^Ch|x(4E8gmb8= zrB0B5G0XXX2UKt%sH9hd3yLk^l2O z0YfKeM*}10fA5U=A#h?dB6x4triDt9Kp;J`YD-ckDJm$VR`4Z3xpya4MK0^EZWTei zJjc*uiwgoZRRsxlG5_$*IQOl4E61^*4iYdg)XhL#Q?EKiJMUXMlTAJ!VU~8gP|!kt zh<|32QNX+)YD8YMl2W_{%szvnD~0;_+q*h1RWgM7dai%L&a0A> z*fo$k17cEp9X)JDDqIE?zkh*^8Z66X2D4@?fq%e8Q$s-Hgx3cz1G}fIgaV*H=TRK# zv|z!Pkh>uRK;&IX52250TNp7aWssgv8l@^hDO&0G_7~wnQY@sr`sY&e1pwTsEN`L6 zse0|bdPnn+ASB=(&3)vLZO9k}Fh-%?_Z;sE0Fo|JnP|L7!7{{y2`IQZvxj>!a_u@9 z9jpBWP0uQaVmA62*H}?&T&2u{JC01BE(DIgnG+~F(|4_GM@dausdF#mjU)Y#y zoBkue88|pLzI~dKZ;v&`|;4>dLw8(I2WFtQTasq=*wl?lpg ze9`sXeNzI+g;FGmeE?x3fW7GjYsfcM_wLTNAaqQ6Ri$NX6UGJ{eS zR0>r`iq->c7e7^<0F@D%Ejzn(erT=E1`qsg>8x-^R+?R`qPjs(t*z@=O+z`Xb9_r^ z9n^DVdW3A8&>gn-XYR!q4Li` z5b<>AWwXltoO6$Q6HWLpE_eyKw+r*{-;U2ba!Vk`>D>WY^r;TveI*Ii9l4s#y5})0 zU#*>qR~JDpsh^<#xeVrq*+k&{yit!IXS>`#dh`GDM*nva*G~Zd-(G97%J#nuJ3iBT z4vBH*3R+Fef}JrySja-=LTkVT2PCO~2kME}Ez0G;pR;wy{Xy$#=_Rgu-mgM?rDA@m zh=5X(1^f$_>u!jDQ6k9v&cPE=Fc1g_@)5SnJB^h$(&!xT`ZP0`eS8kr=p{HR;57>c}6tXZW zaUP{na|B7|7i~cuZjSBjQqR%(CwnJ`vt>uQ0?_-#mnfnjN+Vh{Gaa zl*HCksY8#}42i7HCCK6@hgKZBgC?DC8Q!@{Vdz%3O_9gG%p%Bv-Af=@1ad>@i4Y($f2R3T)+?GoTG zrJdhqNQzseO1iy)n&d#oDkT= z@4XroZkX(6E9)Q!ikiJ8=FeE0RPOMtf2$1mZ~!4@@{x48H|!sccsCq`;innl< z4>4hC6VeuAgecl{nSCH9X7-Uv|BzPE3{u$@{>1n}$VEAqAEdPCPqNYBUHl80+7lYv z(uXwFMaVo44H?LF&LR6Lxlxhl656r;e9Loto|x5Q1}?> zWWovi6YM`9BI_@j@mDoBc@kW28AV~~%4PsmDmlEHj+&p6U0#zUq85c-m! zCc52*q4*FSJB-2{6XUA_etXR<@nP_rU)JbBjqbs)@XvGnu$h#=Fmf;hHc_rekOafH zsJ3){L6*wQ1UZJWlO$Tka#?QYWDT^G1-?KCs-}K;2n&ok0tJ&WbOl)+;5R9Jkl3FY z`S(r@3I-lhBth}L_FkZUKEyabek==MAb@<*pSoB@;WWM9VEDx9S9T*{CM2(=iB98%aoUo8LTqX1Ly_JUDGnu5dFqM=PyVuI+GX(a6cD)+;Xl(}ZnpcfJO&P)0CGhM zLXw8GV$ip9O%jKkNG_r-f3^kmIV>ru8X@=?C}8;rjDv9)2&zEefi@GeCJg=P1s6m{ z$Tb#u3p1?DH5cdGcU%EC*hY^hfF zFQef30Ep)}+TVeaoA^g{PN5xnl{Wr6dDXOM4sNomFWb$LYWaWZasq)_9jX{S*ws+A z;I%BTiXJazKiPtBLCid06YEu(i}4MaU=dBt7B;M)Z^eVU`(0ZTm)@BXE24X5uZk9w zq`f13bSl{uJw(yw=GZqoZ6)z>bCUu$@pWD#3G+}Pt%7xzFN+@i*&83b@1OJ{y}*QKUgDvv(LA8cNbryqHr0IbMim9~XFKb#eK}Z7stMrU1=hD1Jcssac#g-m z(E0#Gh31GAdTR}cZj?tk91Zt^3TxL7!o63h&HuE=Zovlh{UOf_CKcDnbdyyC&POVN zgP#{IIHaN`iy8xw6)Sr%6&Ia32qi7`UcA~~%tWv5wEbSXbUv>({g$fTYO^0ZoC$F^ zLB5;6Z4dp7of5*4ECelm+gG4lN|{_68(wSCSbtULX0sy4w^}y6Jo@3xRdst+d1p4~ z#{SlCgo8N;?L#2^R{2wXDJN#`#H=!+eNY|N)o7R4>KNZje0NnNvo$5M6+Ys*&gM>z z?#@nh?b|fk**@aQ_^Q(X|ElBgik6np>3bwV%iK%^{zn9I$0UD)f*dPgpXyK%hRWvybG$+cW5CX45cwD zns`ZDLRk~;ec1qC>)L5+o%GnO2Bsdq8RU+SpfUEQIIF|DpO693!_TlX;~g7cnvQqh zx=VDGDCP_&B^%4j)T2+9xCZ5Mu8jPya!iXg&uJk0YA%y5-9`p@lv7cke){AkiW$XF zLD%-&@Wp3nI-OPq&D8H-o51Z|?iJP$3tT%CK|qBdP5#G&fPz!RE&!9*r(Scxs04p% zdXJE*A0_!FO+{E_MRYeOQ16D)ewMP<(4F$Xz4s4S97DczL-9n0#u*oPlqz}H))>9xm7pAe@d>kW zFXrv^bWs~?Jl4n(2r}p=@%Wb+lb@bhnLAcY4m>av9_$7{)~H5*2pOcqOxhBGd4{n+ zUtEOfhy~5Z%xQznfcQF?*p1xy@9s|$o>K~x=e>pZ_cT2U+3XXFYxV;*;iX|Cj|2hA zs^Xn{m47iJ3C~~U_%&y;g8&OUMf?U3%xE3^uBLmwuFYJp51#yD8c{4GEV}f7FzmpR z_8|zm_Lx)XT{WUq!i0j6J#P+-B5VH$>9Pw>PoXj7qyst0k|(7U(PeY6bi>oI_<{TDtx4DND}iiGYCgz`lu;7&-Ry*&O^uT!ga`giy`I$uO$~c!(c#6prodnKRKvJP4mld-u?4o`t`{yZDf@+p_`UI$et>j9qvSOw2 zIm0FVnLpw+LZ)OIE+Y>frX7ASCmk3PUvQmzA33*r6UZ4_2)|7?+*|F!L;BHT2&`Co zIG|LXpb=J(9lA}y<5_^T-<)wfW03&AgdoJ7yk{|==7T$61+W1)1c`5|~V}BD>3>QwGp!_K#?83q~!eEs}|H!DT+r0lCDuP({i7Im~ zAabzib~Y>2Ifo1DnRMi)V2%HWJO!x2SnpR@wn3DZ_Yqq8$R*sapEHi3+K zEJyWZ?-~o<0-OY4mInhQuU8&UNI0@#^2E>X`B8!SGToz8=xY{Fb4ruC#L(e=GIHpO zSJFz+^N2r-&^bfmA`kpQ%a!B&GH+4|0}aj+KgCZGzX{zIs?`zaVO%8hYh5Eh@n~J1 zyBZREBD52~xAqf^v#S@vxOc$*SniNcSGgqMsr0$2dKr>G`TO>Z)Hol>ArLnpI>6 zbx9YY%x&f)AfA5l-La?7y)BKKx2?fAkDL^aDXR4rV4XxpZeU$mIU zwz)(ru4a4&JHlcI{|@cVq`L4Bg}0?b_irB6S~t=yRDIgny94hj+?-cA#y!Eo*{tR} zS-aW@zm%D*FfnblV14dZv%*Rk6BnND+VyVs)`R`5$b_}AgPmY=blbvk>0H`%mk8i; zh~kqGyOY|J7Lqz_IMQfk%g6r)auJYdD7Y;RU_O-7+?=$j+1y)lY3u0R>}mY0tZ~`A zZCdqC@hMjtvO9Zc&m`Pi2AopQVHxkk@c717i9a2%{&YHM-Wu9Z^(=k23m7O2l(@ON zpB3Y(W3Y@ueLC;6`_GMhgs3Q>6dC{km-L@* zA*C^Ns(Q`s=DY+{@9Xpl?K0wl7^S!7gYOQCPtEmceR{?gD9m$}($hFW9%60KKoj|E zcA5}+A55Z)6i4x3L1b^kWW@7iJd!{sL40O#Nmumzwy}D8d-Gulp`0OF<({zN832-R zc*2&*Lhzigtq=YHo#K$YSHM5-S=XHG#)zt)zjJ)Vu8pSv2WVWN%{$8?J~pmb3i&l* z?_39VM1s|@}|Fd)8=Iz>>hx2BQu5@8gVLFy>4rzKCHr!8G5&(exAPl+6@LPNEo zG{)J;4&XpUf+_n;8&+(-bzpq<=H^Z7qs*YQY+kiXkR^c?4j z4&-%E-pv|f`JJ=d-wkLWl{R3y5AUS?o}=A_21v0x&5^9UmIlsvY=)fM0BLL{vfsDf zMch=E9uq~iX-@Zsyk<8A%%o!O5Q8dGd)hjPSK4eBb< z4eM;+_4*hce;U<1#Y=X@8|Wnq{uB1m%N>~vdQ9jwn}m4C*u( zGK(ps8Vdpf%kzWzaA=9b9}9^w@Nkbo^{XXiDUkC^hN&167sACmvS7K*<7HmsZX}(IIDq~> z%cmGd?i(W@OOEdF9A_R`p5q%WeFwPEfnZwT;0GhmjU16Y65)>lUdtY0y}6y>JSPmp z>?;*Sn6sQfB@yP4(qIgR4RyNsQwWW5zlmZ-I)bi{Gw_u?uUubARYI@Skurl=vUKmH z-@RT}70S)OQCknRH7sST^fzQ7zuH7+!Zclzq^MyosV?=St~s8RSqAWNha@NfD?Ui! zXNI)ySn!qp8uLTiVAt;rM;4GO`1ZjhxxB8MQ1;lHZfa!9Gm5KsWB8JW2Al6<5F1<7nMJRUR46Mu93X_6vz$MlBhoBuY#LSE)#T5QF576T zlMgq{PD;`p`nR;3v$xF{I%lVfI@aRMRWkgLw8wiDwRSMHrp5ztW}x!){p1hQ$RRyk zn<+WZDa^Op=U_Qdm32=;7twUqgf%XNrDqnG^4!f0y`fSAK&oMBC?z+AHF=;0hF;*G zDpsv!RocSDiy~SGo(E)LdK`rU=Sx7WAboLZ@!L~Nk}5Yu@4}cSd7U*?{iNf^uOK^x zs9;qDp0&Mn(Q`GGQ)T^57`nMScu2SVPH=ufWrvjW3KVd=V4=QDjv-B+B8h>*nl%Vy zRY``vK|jGdnx9o)VQ4Sna=++O!g!}{>6W(agFgO(#tm=IMbklTy{%Tr$eL1~NUhua zv{HGh&<#1$hXXS(?cn7qI{+B^y{o9R<}1P%evEi#RN;656s|eVAH!FTmdkNXD%I|% z?F^xK)1qo!cQ=$msTzhJUNPwmyVi_KeMJi`<5^YpHF@hHy}m9VPK_kKjWkEa6%`X^ z*G5vYKH{1@Rd!4tre!gxY%aRrZj_>W2(g~kjs|jpbx@Lg%8iR#rFS5<9&YJP#3Qh7 z^q9X8uQwa9a9At4xFV|wJOAl>R@>*g`@^$q(H-bGp^V^9$(w68`)HiesiHKmQ!B5s zZYQSV(9{Ksx=DM(J&+678NA> zY|-gWFG;>%-W^@?6Vt(D&h z=US4Em`bv(Kmz>h^= zQ-G%zo@<{qAwaWbH5`jRynINKq1qt@2v4kzZmUizz-+Tl^%9U${JdZp;(oia1stqjGcly z7+B!lqpEMq3M(6RuscX2%FNd>oBFK!UUFdu6SQI_hSUGN3`wqUaDQ1a`7n;U<9vsa zBU2sZ45@Z6F)M$A3G%8qIRTf>~FB+vD#2$Id<9Gp=PrJ*(ceoQp*;#1=X7_wgzq|YAB3s#>FaPl2@rHxltkp=xy%F93*E0d);CR)O&hTu|f7TS^<(C zVG);QY^#YyAIsQy0PDzQQ=|O8592e6@J!AX%*W;qhJ7c>B4;U!x}Tir;n&Lq4;74# zrI|DupZ<#`e<_C?hjV0!lZj~5_esYH?b4}KR-QdF9t#LIH^i&L%Es(-E)zVc=&Qo` z=OVW-cH>wV!L&fmM;0FpqX5+3!&^`{E_V+6-nCQ1ri$vi8Hw6wqj||>qdLhhptVnO z(WMiWSt)luUs8XVhC&+I?y<;y;FL`gzx@w^L@!!9ra+s4bSONZ%;Ul+XWzK!y=A!B zs3q|=a!}P#H7^ZboFt9Xx>=q;U>Ezf~Xly5K|}HrJ?ibV9?)PV3k@(SD>yM zy949Kb^}S(Pa(u`V+s|Lxfo0NV@~(N67g(`al5W?HM{Hw!%>ITfR*e;UVR@S6~$>* z;u<>jj!B%l^J}Qmc}?5yb;|(^_oOo_=B|95?>+Zu+qdHcK^uWAeTPN*ON| zTCJJBvniTwI)&z0R(A(Yl`pc%buRb5K35GbtR+dV43i5i!<>f0kE3X$qMpB7`N;Ro z#XXJHU2u#e=r`_3YFyZ^vmSY`ZSAX~xB2=xE+qR@C2%VvI!zlM-8p>qF2?#>d8j!A zXuHyAgM!4t(y&m=cvO#Da9a3CZ*gbwEBFZBtX{B}9hjt{IP{kencl8f@jUZWnAV%8 zyS_Nm{*d3EM7_ZyocutXsne1aS*r5p7k#Zio+PUO7EwU$qGnVk; z5PUW+#{yZZqxRT|GO0vMZ>aI?z2=YxZ~DcB^iw=DkA|`#iYU7_I;%7$D1tH(kvh^y zrC?H!qkJ*!E(-K0B|*(#`@WPMUa!X+LIsfcD5x;G4n@jtrpg{?Ua|v)`j6dj1EL`T zhd-Vh=alvO(8z30ULFAh%xnaCb(0rP7=EKm8`v!uS!pI8%A9PFO--P9pgZc8J!}d7 zJAe8}$0QIEET|WG)H71*cv!z$fv%U{YC-!p((M(X60uTu@$>xD zBw1W$p$Qwwli^B7nI6oOt8ek=fg+QP25(ves)0|J>ivX)f(0-*y3FJ5Y{6|@#xGq( zb`^1)6R;R+oe215yB01^(0s^UlU?+N*CyY7(dQc=1wmkO8LBRGo0aNME?d~ndQYRaTH zh!bHbj8%uuE^wDbzF8jIqUE%#J4npGMm(2W_Uv%ie$wto!Fw(wrD*nnEY z^$`c3SkjQLJ8x27yxz3(E#`>g8S#qoFLjhVN!CbM^z6_TK)O_98dtN$u3@)gDJx)L z?CuNVD;ihWGls3- z3h2Bw=@!*C#G9-)YplLD&Ve0=e;UXZFx%NzsdA;w%T2n-yPv>E9zQJ>>ua<^&tl(u zG`LTeE%^jXBNw=q{m7ufGd)%h%4qL4>{m%tACaF$s8W!;vEC#X?okWR|2`ttLf(7n z8p5@zaO2Kp2`0dW6jo3_LVbLmsuW6d6QYK?2NseX_?w*?xFHWjL-L!`w5t5#I~_K8 z$3`h=uEfLnZTGg!+5)us+ml@j-m^i`v1~8b?RvGkl7~mod3P-Dev*YNt|PqVpdGBz zU|=ka2i$H^WB)$-7ChT-LKb;d!*;FBDG)aQZ&+g_lB(XyVhdfe!R}+plQNOaQ!^$! zJ(B+)L52%=*F{eE5gpbDGKp`ls66}o3T)?XS97?t_T8fSsT3OBnXN16!+w`mezq{4 z_;fjw+9`7FKvmxbcT zc(}#$W1k2>0RRyFM|0u-6oCKRXc$y?cbelz`8nF&W|fms*zi^`7gQGrYr!k8RWQ#O zIMUQ*81G+|sM~yA^zbGC09NmF9Knz1UcYoZ-QOs%O%f0pTsZAPjapEM-O&&mKC9jf z6xMrp11|5HOM*sONCSK`=St}t#VG;RYK;B3^V)A3e-Uc6XhKzqK zOPPM^R125m(JcfoVS(u|mCA4rDy&S2a*!a*Q0N#zP0_2*2@lB>(bTmbEqX>SoCj6R zH{flIha3ZNP>|tWViFewpDW8LHM0KMdbkj{$X(eQh~hgmV(f5C4Px^8P+wF(vt#8| z#XumAHR}x2CgNwT`K*XQphqeg4B*e5%w%O}H*MNjEniz0-71)3%^t69A@>Un#x%+o z?a$p@0pPo3orfqV=Dz;%6s+f2eeO8regrwtIMZNGyprh8LFM+vVeH_Tc8J__5b%Jy zDA#t5#7NtgsyBcSa+X;?%CXNL5!43uL70%LyXsD~Tb!SqKl3f$Yg|J-h@a;oX6PAg zr_la`KY;Hw0htiBQ9`m8(dVx>6+X)YUNkiy#hzzBs;TNblyGNH^*8er31l*QFbyiw zmgna{AUp30sF~S$iBf5Y+y{h-s?Vd8;Ja?=`J-6(l$9Lfdz-}qo4K`%_vvytv0oz3 z6DkoVxu6t1W=LHD4AC@#jlh}_0}&={EfkF182Ud zo^1;qmdn|r$0LTew0U&A+=3K9BL^LZ2Pz4nl|0Jih1l6Yh?1NAQ3XFmm9v${bY`c@X{L#w^feW^93LV-*6bBP zEQn+zb9oqc%U+<|3s0C*D>n!uy(J3=CO(qzL8k2O0@7s;bF%te{kg)6K#yIwIsaR2 zDL1mmBN4pCY;X9Bpne_*d|&Ak6rv!4rvQv9Av>|X@x=NmFPrz3S%_-n3HC2V+ktz& za|*aRNF7^IzH$v87G>#Q*nDSpLq|!&4LhKc%_|SNnA}#F%4h=kfHZZ>p@Cj>ph}_; zRjbzX1I@wFqd-S?+(6G_1Owq7!#Cubdxyv;mWrE7gjM-RXQ$W*s@;xp{ya&hl|Nkcq~>25fAv z(#giu+c$bBQYPWJf?=f9sc)O)qLBK@|LW8if?AEBCX~Ind`}rgW+`yeRxFbm{fa$q zwifC>Y?$giN#No*kJctM(P=3?NkZD~E1gp&>Q!(I z(T^KU`v@g$?{8V-9f!cy$|4d2x858(zvcd`q9n~&tnokxxuWUJGW_U<@%u>X?3GiS zvGJbu7#=~@9bu6C$epNvEg}{SO$)+l?T=H1(!z@)w=T_s?ZDrwX zmpW z`k7&p-;e%e7k#+SKTtipYZ{@J12!vbHIU%brWCy4BcV+c&Y$+zfM?ZmZ@s2J8{-iu zL?`U))&X>07&_HlA}S4aT4ifh#ly8@x`}@aX>j;aJ|=6P?gn%U z7q?52S>q@Ups28Ij!~^5IuMorNMZ$aQ#iX50tp9m!#?9WBKVJoUy{*sK0g#c!htC( zm3GU1vJI|Roowxj_3yq$`s+<8NT^?)B*B?_tDA!aI*zx3_wCwNnzt^VSBh&)8}tgT zDz^09nC+#Bd(a{nN*7J^iNn=6PcI?)O96&e8~Bu;1uv^!oPvhxk2`CuFWxR$nkAS_ z@kYz-RBQGs9MuWFgD*%7UBgQz(&7B>XtvRA>j2v&4iHl?44i7N2#d!?z>Mu6;>{j2 zY|o=yC?#rD4NqUQv+D}KV_jvJ9zc$IG+Zk!fqk6Pq8`wL=L}MM;hT2Uq72YKZ&hcB zwOM@r3)LhORnwXDV{v5v$*2qev-$kfJ8CX0_;1s>T1Cd`#~RRmtagzfg*!yT0L;9T zfHW6Wo1c__h{A-Yp*swubtmpP*ZH2&84ed?)`Ys**uWDyiMQ-^bqo1lv6G zbiWTwI<0^Vn0#7wtqqIz`}s*>PEJxv?%V&vILW#fP9QfNzG0Ds8*fTwu<;e9LFXPvyzFyh=)2Y>88UzL}3G?p?SeK^XGivk0wRi%Hvc69)f7D!)V=_O$uomov`VbC+yH>rT%v8j|syw6;m!1QWahf^px{gTDpE0JpS zxz8UG+R$U`p$??aMsaXWLW>v@{ny8NyEYc!ygPcJw7gA1TFkdGb0NFlOs-v^o)Hkb z#Mdz)Pi9ocA(|`gd#<5{b7MrMunRI)QXCu862zrcp@h~+;%^JX6A)i51<~vdyjd-D z@d3UZ=_X>MmMfr~aK_?+b0s~`BSEnf3(z~;{xM#-wUr@JA#rRf#a7ww>CGk_c%FrH z&t>RV< z(Il$7RfqNHYiqi9FwPRh&zomHSyFY^aMXq8fuRRAsiF}rtDDN99k8zf_4{mzqQmp* zT)@5F0H}mg^7trTz0}qc--w|6lSy&WuWs`yRr`pA z_No$LuB|S8tpzNNVkj#e*L7+6F8lVi%3Fz9*CeHuC;GY%@V$a}FD@TnLr?Y`d&2m1 zbbMCh7jW@i|C@be((M*f{KGy%|EbyhXKo;&--iEjv;F_8nDQhf6jB|N<%fnu)mHSa zjcf$WrIRz=sx>S_S1i(3eyW(JswL((-3Z~kSB8&|uDyn*GFx{^Kyp0*!^>z@{_?OY zrxGS-PG?|8i@r+$=kWXXlVmme0r`ZIC=yHw$WVBpX@eL>8Et`LDuD+#{{*Xc3&Xs? zuK&7CK%n0ol`>2E+DT!(OoiDN&s~ccCuRSXYvw@E6SL(|5Nw3{xhF}nj8BWOkVZgm z1u*1+44XzxO?Cu+%0AaEi>M5V;SfU|2?tC&^B1Zs;2%lL*n@qh62 zOOl4f4c{BVM}xEUgZyp4;Qa$&U&q2GPZLL`K!%1Ap9kW+r;rnU>30jAMu95Xx`|gv zd^>Xcw~5wwFzvA=wBeGoQ(rXguVnz_t0;#vS<*lzG?U5tn@|F!Ly7Zv*egp^nV7RV z@6hby@s!nZxx^auar=Ffi8cUINRlwp2!t7km<6pro_Ly)G?eK^tZJS0e%HeyMd+ZhKEUUI^%1J&%yJb>4l+{`j&I6;BLR;|xNkgLEV z>hPxMrYKd^3XG6{^9nq7fYaG&c8JW3AofqraF0T~YLR*%YP$lqTP!y4NP~D*INk(7 zWH~mikAH9Gd@Kr56pnj+KS;$7p$A9{)+KW44M04<)Gtk33PhR?YEMah^$15E^}&ziDlb zn<8=KZMG%|vfjPAhG{j*AW|Z-aqwMPs=pftR9RPe!7ReOQIGW(8EW-2J|sBEk3eh+ z8>Csk7AARBG#8)J({<+;b;Jugm;z6O5oP!@sQ@y<>Ck!wBKy>Iztcbc@z-R~O#@y< z7}5Es7h!<~yw28D4aGDoZ@bp4*3XXf$NE)p1%!PEX#~NOXNpQrq3bwIT=McGZQ6TS zQr9dkEl$#N46eKIukc;oX-{x}^TE3Q%DV8f?NchO2wRDZFDZ^_NuE98*0qK|A z0-`J+_?O<#3HP-UX5&*A3~DPCR4k=$?U2`$ZS2ZLqH2(y1HB%$Q3yP^){uM`QN)&Ne zT+SXW#*VEij4ChuoP8+^Ve1sPD&^YHAnjXY?^-CU`fd^<6d8G!FA0Y}?IfW@>5@oA%lDfM^v~IB?l`qe$imc{J9usBE7VTV;rgR%Fz168k%2x?q z52(iRQ-!+S^7v1O?Z^L7rvC3hANxPse1AJy|5vK7YvHsO_h+3p`;okU{qv8iI9pi% ztFk&dPQ@FyWu%TYwQR&KrLpK22v&1NoCoW7QX9zw+4&H}a!*V4#T|LHm&x6-z4v(mP0+mW_WY1_7K+qP|IB`S@&x%RzdkG0krxATwFh(>gx z^~K~n-{)3Sl58p9X@S7np90kNMQ$TlUdkMouWUGgxqR>7ecb!g8=zo9;pE*a=BKie zc$|zFS8*@+AZqA84ht%;h%H6qRGd2HNam#gZPMg6>u`K1#vW+T0~bDFRm5v%I1FpD zg~n1#YgTvAl83Tjr&6q3B$B@Bg$q9q?6Z!qoNfDgI4Sm``FTIdI_Ux z9>r`n{s&=V=uA{=DFI3!r1eID8YX$Fj{b4*hg5Y+mb(?jCcK_4W!FH~;v(1llq1py z{I8YspFqFU!An@Z+VbMuf?UOiW`3uOGN#B#?@N$y_MZR?S102uT!X*eCf7Y;Pmvcg zVu>`)+v8Fs+G9ue1dY3}M0Ab7i}$)pxrbwBeOo3p!D5 zkId^`K2LC)b*tl{DAD!qmEV=d+?u;lTojO4zU@e5tq*No53e*Uu0Y{;&8Cw^I5V4^ zoq?CtuC2kxC)gh@S&J?S?C`cIob0~3*jQa*>N4EbXDtt9r@yH!9W1xbUxp^t?Qu(# z(&`zqXU4-*w!8@Gda&H%!u5f|b6Xsktnvb9n6AX6k5{!&pC)11fK0{#lc zqC@$T(v+XIWv&5f*`u3#%mP^omG39`PeGyxfYjpWcN1HS@$EbOkN$ZgrY0`-)&S#g zV{JRze{W|s0I}bH!p|LjL&Wbrq+5G%$CiRY`*8FRRoep=vqg@znH0wlx1BZ443=YL zBx~i-9FGUHllAlDOUz z8I2?gC>WKN1xI}Ck;OPNCd6|8O%^53{%V!;Fw^ioOzs4u^A%pMHeQc=BVc8Cl94u3 zXKugUeI6ui(4!K3pP(O%XCpaS zvb*1?IR{eY(PWs@U>y?yBrg=}a*ve##e8VdG;_!ZZ9`0?Qqdndu!sI?BXy!V8sW>B zf3skWWd-Mf&LpCM5d;%LHKZMOCkiFbfT`D{K@LJG7HS0WgJJp1ZIRdaUP3tFa*cg* zw9+|ffSGmKXi8=JwGuMj8H>CjG$@6>t^Nj-&V>ifXw0e>n6eYEAMM|oN%)k-1G3A2 zDZ*kHnat2$A2pfNAx%g{Av>#I8TLf48rbV4kV;07Wp{qa(v`7cwpJ?`bVZo`vQN?I zz*@8y>HDdVRgd@016xLp+*1gO8RbkZr{eJy3`YVAAq;_ErsuZDRD%V>8A^g?U!4Hk zyA?J2u^zn?`72ze6#9rFzcwW)yAOE^xD;R^W-CdZVkKgXh33)6YLKX}VZm1dR+tcP zS|#8-Mi;8s+0vG*_n}QVVlu37ekQd?R$i4Xlm>`yqi z=aarIwy%z&y8`GV)KpDYATklkzZG|$j7@^Y;&QD2C3!mY5X?un%4i~u(t0yOM5?F| zFO78T7vT15Mul2wk~nX=`Sz^s&>-aXS3clXCazF{4oQbL5c3itIRB!IYd-x~Zh#De z*|<8H6T5qi(1KsS7dv4$Wtg)#aB&MaY3Eh@tWME#fR6?A>dnQ&r(P-+!c%Nj zTe^1D*pln!ZFh_5vP^l4mB$d>k`aDgC1uo*Gu^P*I7XGhDPgmac++SWrCZ1wHN`dC zD*D#)V#kXS0}R;qWLvc4IiuM2LfVB&{}8pj5Gpq}YWnq`M?Bc%9yU#vp1DNFc!sfq ztU0n9sHf9!@B-S0frub${_LNwV9H4s@O@S~Tzml^H0rfBTzKmWrC@8qMJ3`;+9|5A zf>3Gmrk{iyhAWVa9w`7yDE~-WDyYm!l6Z6@nR^lFT2;Q-%pba}EI>2&>$CuYqV5SB z5uY7`akCEhE;wjl3Xt-oF#h*+`m&C0FoT(7VQ zl_VgUa{UC*ga}s#R^2gcF8UJ&TLnA;yOcFLOA?zbhy*Qs@#p|{#s(1hJg)P1b4 zxR_~}vte-KhKVynlnxo|C*Qna7;?C6@8k%K$#a1Y4UqJ3WlG%;@MTLD^MyTbU{n6M z{p_3_$-ZA5d6nj?rViTV#dMD2-(o!Tc>Z_~<@dx>Rm@HuiE24i<1!fn59ak7@Fwc@ zteAn_ZhBi7IN_=`{LqjV4WR?qO~E*BOeu!cxh1sqFyvUyy+u~;EJs3%-FeO?f8=kl zQg2;cW2u8G>-qbYjYl&j;Z&-UyrA80k0brvy_Y7#dvZ$%_g?=UIEvM~+$7KR@={m} zJB8}b;pCGXkGT~>M7ERm2lAG3lll|$frPfOL=MroUW!|)6H$OXF!K`UvfD7EY`kP> zzi$_!+hptE6lu@m#JfeC?&tMgX@%-qnG4=Pyi+wMYUPgJOll{O4$y74qnxl|{%W^l3 zppM(xu{6d^mS$qz1=$5_a&r?)`^6ig^cDCfwjL92eoxo`fKAB!b%?EzOj9n!XsUPB$B`rHF@ z;qho_kZWXH%Y$Mib*&EkVv3qp;g(#pD_F zYZ&A#LXj(np>u3B3g^)Cz>g0AIPjY}XRYH~nky(41PtCgha|2qZX%Q>wq8;owNfFi zLwjg9&{E-MRl+m=yA&Vsm`koLPL|FU$P1!o<$l+3_2W zC;Wd*+I^H|oxYEkyWiEX{L=+O`u<2k6?+#+QWRwayr}WSQZTfm<9ObFCBXjew$e;n zV7u#2$Wi;-Pd*Zt{Xg2}hT*2z!p1787TD9Y{ODytB?<4c33kq(IgJemW;+V6t z2OAKgp>vVL^fTdnqHK$>dw};|B1d7I_n=Q(VEkB@KJ>O$H0wqc|M@1CDbVty1iX5@ z6V_$lrvk2IuaaW2td$ApBveVCgp6gV?cZsC^JUBB_rgR`u@}#H@-6f;DUhOkglArZ zQlEo=ZQa0$Ax#47{UlYi4op$9xYyiCXcG|zyL}4UQ3eLhF=X#g6>jt{GgIQp4_}MS zFI~?r*v&|~97{hj(b#va;AJpNJmg3QPKH@UqDD8Qw9FJ32F$Q!=9)!n?EQSG$%_MH zj@=mux-%L~3fL$A(ai#UXi4l@?v5QiprEX=i739aSr*=lTQN28o)j_F_HNB0ZWTOX zEOMXq!{<|)sm>I9#*yf)P8+-46h430ID+*;xx>Q}a=4NvbUDIGlqsk432XXJ2SW?F zm2w~ZLK+*^>|wkWL06(VWlqW`L#jykpigd&(CyAj)y9FfBAv424*9tqQ z!tQ^*Pyzk&^x5yGwE^m%TG5Dj*c#f{i5UHR)vRXq-MXTFe$!~;sS^tL+`T6)H1qLb zfrP6F^KB}!j!Iaiug1O=d{@0rheeVEmE@$v&9dIJJ~=3z4Em;#u*9$^C3A~ncXLxy zT*AEWD|`-FUnmecea`)?Lp*|cyHQjiOyG?IFOXX(3@4aA58IkZN1BV?vKs>6M67iYAxW+%X1JmX`T9 zr*C*<@(S}m94A<`&Mzm=o{D@iYsW=n0^d$#2NctQ=Y}{M(Qs6zx7+h-(~!4OE=ZI; z`zg=sDN~6^5-Lu8)*v$Is?mbh(_@sLq@l|SdP79l5#3>onR<84X||2g7hy~{Vrl82 z->xGP7lR_TDf=?!oUrxqQO5@AUz}Z>H_6Wb(4`%l36jQ$6on-sn3QfYXeO<7E_zJ3 zE4d?FcS%}l4VK)wshYkl=7q6D0TV|DpEM>ASxygk332q|<4s?F(C zA0+>Vul%8M5t;aY^>_wJWWPMsA-D@fj!gjl*L$+x;mP1Q4yt*6g|AO8`zrcZMPvtg z*Ka#z4addxxjFj6ZM?A4XDSRBm8~dKceh?w?C2`UP<-Wx>ilBHBH6C%L8W_(*d276 z<|df<-v-J)?M#x)jeLhq!&bEs_Qxrm?52)(*4c0m?+wd7O4Ddlb4`)~Z;KpGV zR<^Lr!U7I5(Rx(EWB#8V9qabGnP?e0;nA-|%eahwd4%s>6!}czfQ)1!wup0<`tFqk zvZij87_XVwIteY~uMht;q;)m%W25>f=Sz>sq`wanQ}aHmH2QnFeg}9@D^f;>?bF2=ALad`L7mRTB!} zF~=^Pu;`!O*h-UQSPlt|R2u5?UY%=;Bs>@G5( z#&>|?Ug=D{7c8aRUlc&G8+&l;t!0>lJIsNwP@CjxkjXXcUwJPU$->-c0^GhwNuxx= zE`>1#Nmi z!Qa~LE#Nn$iec^I7ZXPGjjfZzbbXVCPULf|reJx&6pvQmh`)FeEYy+NG3xY7-n7cicIy$$-M0U^PY)c4&AxZG?`%q#*mT zQey1J22wUI=ol|YgcDO;Q#iB2g>a2>Wwp#G%rA7OgA;ZlKLxtA(?UAl+!8R9S0we} zEr*_ zz%xamb}aeu5(;+@;TWv(Txr3)-= zWwW&GZXH)ilA?b6mT%x=h6z;wE4!k?vO*to>+im#g-GqG^Wj7THg4^%mp9LE`y9@# z$V-ly_#R|pxhyd$VGR?O{TZ`PF5aysP5>413h!n*{#0gw)zk(GrpiW#KsNF6=8RU0 z-5|Dg3Qhfh8+HY4YfS7W{(ez^ig_dpS(Jat@C<_ z&AKk3$R&T>CDU?;Qpz8hV(O2K>WkZ}Y{}PVkk7TeT3m4;)V*$Q~3m(3U4l<}sHd*u@yTTS|eQ!bY! zK&TcAKAR}^vD68>%3o2*W_hsVkdL0?!$3j4M=|#9<5)wvdG9|_5#-GJzJYrlb%Nzz z!oD~QkIuRKAq^tOf!X$dtncSp z)kL~l;-R{1)$ZLp(M40%k$voP%(oqptW$9yN*CI7w0@>P7|bLbRr#+WB*LKC-3;V7QRP)4%oT6%=+H<>^BcOA-o{yUaU1wl zbW;3%xB7$gpA`~y+y<}r_ej4I>z@u6|G#+WWNPSWZ1HbFZ&>5JapBv3Xht8&91|uY zFW3343+=a6SI;dbc@vC?w9+E_(4n836U%w^fFmLFCv}`$Z*wL?sw)G)W=iczjZAJ4Yc88Dw;zSp_eo*f zreW{Ji6Z9Yc7S?JfY(RfH3nJ!wp{RHH_ z1Gis)ZaPCr@Sqm-(WOB>ydw(?%2fADHbSe%_H@q4gjqbJ=mA1v?-?B~q+FL^_4~PDXs!1OPouNg( z$iDjhQO6VaiZv%cu?UWKA)AKG>u9W2a#59)`|J&7)VE{q0UE!5Cw|+3v+H?!mVf}! zzCtF>QVu0rheF?cvq@{DO^CHa9EV_*=7pJJj8F=E^>)917h|1+d~d>81;6%){iA-o z!PsPQy6gHYrnJ^f>e+p53Kq(PsJ-$t1E6P%$Ebzr;=E-|nDQu^O${m!54vd?u@~J} zaQa9>4k0f5g}C(YnfqWf)~4nfpL;WgeV-~eW`K#EXF0SEX+`=$P$ZO|%ewt+C>l8= zu7@>06Db$Dp`4VuP$mac@u29o{uMdJCcL7XA)e_uY$`5QBcgwWP^@ZI27a(0n;0Zk zlIZH#WZ6Ad_|;{VqZ)QV?xx49_AAw&FU;(1?lK5#=OoHl2}~UInIm-E>fIwgZQP?_ zF76EpK0UF3hLWTjWL1+>+4EgmaOOB4s%yhD%0vB9H{vCad%J4BW-9KCU<)%3lc$yD zBG0s!I}Ko!jRp6x-c{V|^JeiJrkztd-Fh1Z--Thi@i(ZNXTY7U(KX6SZotnfM7Jii zvsuM{=u}YKL^P7-SRcCgxG`e`(hhnQ7yN=unY>iq%Zt~DW_>oKgbhNiyLIZBVKj2& zT#yE4iPX5nUyS^9MA>p)+)$qjp=hm#{#aE6Aye*c9#lS-I(nN7{+zqIdA%n*^Ksu^ z?-#~U%_EeU0iVT5wyo?h=s(Ask$@%^@nZ9! zJ3F`~eYJ2>6C(*Ka$I(?b8*xRQcf7|(3I-P;A-vBIqSG8wJd+dj;sy8hODx!9N|Q$-$X_m`gvI9qR21Yf@74N7F!jdqV&c~#1MYbZFs#B~Lq zK*iTVXNVbk=l4hjanmOUO90ok?eff84s#8G*=$yfHP#nOvY&>dC(Oq2O3(9|)dc^T zSL35rAliLm)$c7mgtJ6tSB1yQjhV$A-M3j*fPY-)P={ zOYhZc`?lY^!>`>^j=72w1+KW4WW}{#z@i}JTtRbMs1X3l{}L~BNB|!{`DE+u4Z|RiE5WGiZJ;7rXz5qI)rm> zGfiO0zox(CujN5f0J^tfrK`mHMuY--ZxybSTdiWMZ#Hja?x)A2ucgA!CudJp)h^X_ zHd!ztV)=*I150C{32cBkC0zf6$T?V}&N%)NFjh4kXU#|Z!+hrc>0O+TM@-WQZB?3o zTIa8m;9*R)Ewd)!k7#P=AW&4Vp3&+Q6BriM0rH%22w;pdDxlzU^<58m^v9zt>8%eg zPHUCkXi^{2qh5fA-0K?e=d`1t_l}R{h#G*!08Pic?Z1U?3@-N;;5O@~K1Ru=hjnROF7i22^!;iSTRlI0SVP9lv^i`#NSl z+FvyUJ3DCtHgH^p$Vfu9_j~|lZ8%U77`(bNei`gZKn(}<%ttM(NFd=ki}AxD>OANj zu+Gpx6?DuASY<_#QliU%es|~2l_Vlr1!c@^UqUu80fDZ|FO6!V zV95Zx3$O3zwOa|CiSf{$cW6ooQCK`31Qn<|8$qhbn?z867qZzURkyRj5S8nQsBYhz~Jr-8@dP)w|wubZK6Q<=Wpqur;nfV;PiodA1l*Jz+@ znJsa>ewSboLin!OcIq?FX*nicbP{7NM~J&1omR2w-G<>Ky;E(2sHrldWn2hpsJWQ^ zZK-Pe{42Fj%_P*n78n;0b#_wRmJ%_VDRI%_Wv?LJ*{!0_`X%o#(`hxUo_$a43dekX z9qGP!I{gRl=9kncDryOHB8+X|%=NN}{L!B~yvIZSekcp>y5>ef)`F)IVSK=!)g7FU zx79pntc~0#fICbspIdbw%#Lj* z;(a>4WB_c2dB^61@#o20oaj2a{oCN-?hQlnZcnL6^WXc2nn#TP>^;}wi0)=bNLSoKjr>^xrKNCR-YmY1qD*94Hl4s366N0BYyl*cJFE4 zNFQUfz7qs_yvzNxkqKH+VOhKqx`s8|^K5qV`m)3VPJNW1iOXdN_PqNsk(b$pjfXbu zUi*u;4G}nt*NE>7*CY5+mYm`#_VcUH%w1xf$Zt&iR&Z0QFFj`(R2e&_mmuYw z$Az+T5LsU7DYylx%C;D^W_lt*^U%K>x@fNqcfLYvlk-8S(uWZlYZx6k^{(@>vh_5# zCksVoN#f^;;W(}eF{(-nK8*(S?!Ry;9nHAmWf7jEqWNpMc*%3CPHvJ%$aJiEWF?s+ z7i2VKBOxZ!(q=Re=Gs{&O{*JbR``R6~Bg4J2;a04=+&Yub$y^kz}6cL@9M>L#c zhLp_OrBGFj7f3jCfUQJEb4R*{dwo zUmM)1{HR{j(HeSVL5om<{44k10v&T`yOCfmXsgK6M4!xVveJMC+kq@zo4=$r;vFC- zy~KzMih!GiSt$(D!@WJcUQy4l z^`~0Z#8nc(g6VuyrNz`+LicS~?voa^j@whbQQt!GbNmY89C}d4?l*Tb!$?ZlLDvE& z$S3aA)7P^N^7}oEFtUdJIkUX&K_cC~4a64+j4R5x)K@N2=dR1$e|w!A0gFs>b_Z=?OYxS*$hDnp zW9}Ff3cPLbFbVC=q0_hQhu5J^`FoETr34d=I0eM`H2VgVFAtlR$jWU+^a? z1ys|J0kgO;!7r%goPxhO4zY5-b@&iD@kF#MmxZKacI^^Wo+IYW-?+rh-O$AQ_ZU)5 zuBF-jwggN(JFvSK_oYa6kaJ3q+HxENk3+XCQHi?kI9lfuR^4!u}{r9 z6ajOTa0qIQ%7sJ3$a4`~KLO6&EQLSE(<$TR@s-6Kr0N#X4}1Ap%iAu9cO^h26}%2E zG9A1zXBze->uy2)0*uG%uR(3x;0_c2tN<}N#O5_etW=Oner@U_u!CwC=l#67*GwoQ z`A6|KNTQr(kngb$A+9!KW4eK_gY;iiMtWU3n{EhT<;OO2wX}ixRglv}a0C@fdU^$5 zcguc@ZMEqi)t4z@)e>awP7$KbPfUM`b&el2^znGt8CXM&?$q3^$}eOe(qU>O3cTF9 zt$(>j{iZC8H1cPP1zRsrLJ2e&oP_wYQpNF z?;V6}9toG{&}AX)NJB^yBt#I6q%S3X9M`Q@zAg>E35t5tv=eq$2T%%h0n7>SH^cLo z8N3lbvF!3*=kdarOL|2k7b=6|wwd=zXWuAiBs2|n?0BwKnRX|%ta5wbGL=@R#VYB^*VTMtuFnC&EGT74jFGV zamtbLnlP_b=LFBz*`~3bq&r2;|v0@!DQV%t!Z%O}xWyDy6ca0%454O$=!QgUI*bGuu zip5J-h3!<(yze%?4rRz#*qns0dQkC2 z?HO$;7aJ5e(w@x4f!_Tbw3_9!^Hv`pVaoucpmi^;sOG}!72M`WSMqmkupE4K=x0=Ou=w~-L-B;Ma&Tn( zY5rRcvCH&%yO39_m-d|7UvyRAEcngHPJes6+Ia6PGV*nXADu(BB{0ncGqj3OzYTvI zqAGoF6u=k3RT za2BZHS6WxKEaXOr@P?R&=OA5*z8w!-+I?`2gjSl@(yq7zyaMT~(=9$!xAF5!#AsAs z*N#IIe{nIeZ&z$l*WAuouvpHp`$4CgYmhyVb0E)g9<$gK9PW^Y&Ghd(pq2S% zl5(UAS8OA}q@c|tcZr+0{K8Q~i0!v+XR=r_U8BG)DH{X)FdsR~Z>-0~v8yNR^~cAv zn({vRSVS``_6aQWU^WmDTBY;Y^fiWu`*c8m8Vs7Dv+aI>y9(dN3Jw&+q+_XGVf|yu zSxjvi10K51V<274+N;OS2Kwn}Q@-5rK9rJSNAa1VCHLN%-6$-RnP5PY6&>i5joiU+ z;!`ZiCxST6$t|;;RLB6OuTs8lTBlr720yc7P9{nbgJ;v-?Gu95b+tal)H%QpvOgyc zWP!TPeNCK-!qp&Ev}RUI@%yg$>2Du8Pvs~AW-|X5OwvS=S6#-;S1ku9RS4rBmFA>Ea5>gXiwXy@c) zYVuzTKE_CN;e4R)Jp5gF8vG;C%76X5ps_Q+^?#JL%HPl$XH##?a~l{#3}UT!fY94F{HHyW}%$T%@iz4@rv&7Vjn z4XHbY-Z^RaJq45xBV!4VkZC8)=u;aJ^;9&y=w&xtCXGdIh>T8ULSqz4{XmjvKIm#Y zjwWiP_u4s56-PHho|B%@_smWHPHq1Q>|;4HjtWRtxR44yLpX6MH9Zl(BR&h%0DRGr}1RF??L%kT-Zpp&IQ8g5JF|h*h1r0O^;Z{ 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�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%0DVI~?Bce9yA=S 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

x(W6-ToD9wQ(=Ws1;YpWXkR-J1BM6zrjD=h!~X7 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ΊDHVy)wVS1j#bf` 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