From c7dbadace5a5c2b4db4bc15f6e7775ffa94e674e Mon Sep 17 00:00:00 2001 From: bourgoino Date: Thu, 26 Sep 2024 17:23:24 +0200 Subject: [PATCH 01/71] =?UTF-8?q?ajout=20entit=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 10 + .idea/HegreSphere.iml | 3 + .idea/php.xml | 3 + compose.override.yaml | 6 + compose.yaml | 29 +++ composer.json | 1 + composer.lock | 242 ++++++++++++++++++++++- config/bundles.php | 1 + config/packages/mercure.yaml | 8 + src/Entity/Annonce.php | 57 ++++++ src/Entity/Competence.php | 42 ++++ src/Entity/Demandeur.php | 65 ++++++ src/Entity/Diplome.php | 42 ++++ src/Entity/Employe.php | 35 ++++ src/Entity/Entreprise.php | 87 ++++++++ src/Entity/FAQ.php | 75 +++++++ src/Entity/Favoris.php | 27 +++ src/Entity/Formulaire.php | 36 ++++ src/Entity/Liste.php | 36 ++++ src/Entity/Message.php | 80 ++++++++ src/Entity/Utilisateur.php | 135 +++++++++++++ src/Entity/Verifie.php | 42 ++++ src/Repository/AnnonceRepository.php | 43 ++++ src/Repository/CompetenceRepository.php | 43 ++++ src/Repository/DemandeurRepository.php | 43 ++++ src/Repository/DiplomeRepository.php | 43 ++++ src/Repository/EmployeRepository.php | 43 ++++ src/Repository/EntrepriseRepository.php | 43 ++++ src/Repository/FAQRepository.php | 43 ++++ src/Repository/FavorisRepository.php | 43 ++++ src/Repository/FormulaireRepository.php | 43 ++++ src/Repository/ListeRepository.php | 43 ++++ src/Repository/MessageRepository.php | 43 ++++ src/Repository/UtilisateurRepository.php | 43 ++++ src/Repository/VerifieRepository.php | 43 ++++ symfony.lock | 12 ++ templates/broadcast/FAQ.stream.html.twig | 22 +++ 37 files changed, 1654 insertions(+), 1 deletion(-) create mode 100644 config/packages/mercure.yaml create mode 100644 src/Entity/Annonce.php create mode 100644 src/Entity/Competence.php create mode 100644 src/Entity/Demandeur.php create mode 100644 src/Entity/Diplome.php create mode 100644 src/Entity/Employe.php create mode 100644 src/Entity/Entreprise.php create mode 100644 src/Entity/FAQ.php create mode 100644 src/Entity/Favoris.php create mode 100644 src/Entity/Formulaire.php create mode 100644 src/Entity/Liste.php create mode 100644 src/Entity/Message.php create mode 100644 src/Entity/Utilisateur.php create mode 100644 src/Entity/Verifie.php create mode 100644 src/Repository/AnnonceRepository.php create mode 100644 src/Repository/CompetenceRepository.php create mode 100644 src/Repository/DemandeurRepository.php create mode 100644 src/Repository/DiplomeRepository.php create mode 100644 src/Repository/EmployeRepository.php create mode 100644 src/Repository/EntrepriseRepository.php create mode 100644 src/Repository/FAQRepository.php create mode 100644 src/Repository/FavorisRepository.php create mode 100644 src/Repository/FormulaireRepository.php create mode 100644 src/Repository/ListeRepository.php create mode 100644 src/Repository/MessageRepository.php create mode 100644 src/Repository/UtilisateurRepository.php create mode 100644 src/Repository/VerifieRepository.php create mode 100644 templates/broadcast/FAQ.stream.html.twig diff --git a/.env b/.env index 7c81431..9c4db2c 100644 --- a/.env +++ b/.env @@ -39,3 +39,13 @@ MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0 ###> symfony/mailer ### # MAILER_DSN=null://null ###< symfony/mailer ### + +###> symfony/mercure-bundle ### +# See https://symfony.com/doc/current/mercure.html#configuration +# The URL of the Mercure hub, used by the app to publish updates (can be a local URL) +MERCURE_URL=https://example.com/.well-known/mercure +# The public URL of the Mercure hub, used by the browser to connect +MERCURE_PUBLIC_URL=https://example.com/.well-known/mercure +# The secret used to sign the JWTs +MERCURE_JWT_SECRET="!ChangeThisMercureHubJWTSecretKey!" +###< symfony/mercure-bundle ### diff --git a/.idea/HegreSphere.iml b/.idea/HegreSphere.iml index f4221e4..edd46d8 100644 --- a/.idea/HegreSphere.iml +++ b/.idea/HegreSphere.iml @@ -134,6 +134,9 @@ + + + diff --git a/.idea/php.xml b/.idea/php.xml index e89704b..4792101 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -142,6 +142,9 @@ + + + diff --git a/compose.override.yaml b/compose.override.yaml index 8dc54de..a3ee59d 100644 --- a/compose.override.yaml +++ b/compose.override.yaml @@ -16,3 +16,9 @@ services: MP_SMTP_AUTH_ACCEPT_ANY: 1 MP_SMTP_AUTH_ALLOW_INSECURE: 1 ###< symfony/mailer ### + +###> symfony/mercure-bundle ### + mercure: + ports: + - "80" +###< symfony/mercure-bundle ### diff --git a/compose.yaml b/compose.yaml index 89c74d1..0c973d3 100644 --- a/compose.yaml +++ b/compose.yaml @@ -19,7 +19,36 @@ services: # - ./docker/db/data:/var/lib/postgresql/data:rw ###< doctrine/doctrine-bundle ### +###> symfony/mercure-bundle ### + mercure: + image: dunglas/mercure + restart: unless-stopped + environment: + # Uncomment the following line to disable HTTPS, + #SERVER_NAME: ':80' + MERCURE_PUBLISHER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!' + MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!' + # Set the URL of your Symfony project (without trailing slash!) as value of the cors_origins directive + MERCURE_EXTRA_DIRECTIVES: | + cors_origins http://127.0.0.1:8000 + # Comment the following line to disable the development mode + command: /usr/bin/caddy run --config /etc/caddy/dev.Caddyfile + healthcheck: + test: ["CMD", "curl", "-f", "https://localhost/healthz"] + timeout: 5s + retries: 5 + start_period: 60s + volumes: + - mercure_data:/data + - mercure_config:/config +###< symfony/mercure-bundle ### + volumes: ###> doctrine/doctrine-bundle ### database_data: ###< doctrine/doctrine-bundle ### + +###> symfony/mercure-bundle ### + mercure_data: + mercure_config: +###< symfony/mercure-bundle ### diff --git a/composer.json b/composer.json index 6cda857..fbdf502 100644 --- a/composer.json +++ b/composer.json @@ -25,6 +25,7 @@ "symfony/http-client": "7.1.*", "symfony/intl": "7.1.*", "symfony/mailer": "7.1.*", + "symfony/mercure-bundle": "^0.3.9", "symfony/mime": "7.1.*", "symfony/monolog-bundle": "^3.0", "symfony/notifier": "7.1.*", diff --git a/composer.lock b/composer.lock index ab09ab1..a1fc98c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1bc99d81c026aaf4e662ffffde457d04", + "content-hash": "f575e2d5a3aada9c285499efdc694f42", "packages": [ { "name": "composer/semver", @@ -1377,6 +1377,79 @@ ], "time": "2023-10-06T06:47:41+00:00" }, + { + "name": "lcobucci/jwt", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", + "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-sodium": "*", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/clock": "^1.0" + }, + "require-dev": { + "infection/infection": "^0.27.0", + "lcobucci/clock": "^3.0", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2.9", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^10.2.6" + }, + "suggest": { + "lcobucci/clock": ">= 3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/5.3.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2024-04-11T23:07:54+00:00" + }, { "name": "monolog/monolog", "version": "3.7.0", @@ -4233,6 +4306,173 @@ ], "time": "2024-09-08T12:32:26+00:00" }, + { + "name": "symfony/mercure", + "version": "v0.6.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/mercure.git", + "reference": "304cf84609ef645d63adc65fc6250292909a461b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mercure/zipball/304cf84609ef645d63adc65fc6250292909a461b", + "reference": "304cf84609ef645d63adc65fc6250292909a461b", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/deprecation-contracts": "^2.0|^3.0|^4.0", + "symfony/http-client": "^4.4|^5.0|^6.0|^7.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0|^7.0", + "symfony/polyfill-php80": "^1.22", + "symfony/web-link": "^4.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "lcobucci/jwt": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0|^7.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0|^7.0", + "symfony/phpunit-bridge": "^5.2|^6.0|^7.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0|^7.0", + "twig/twig": "^2.0|^3.0|^4.0" + }, + "suggest": { + "symfony/stopwatch": "Integration with the profiler performances" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.6.x-dev" + }, + "thanks": { + "name": "dunglas/mercure", + "url": "https://github.com/dunglas/mercure" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mercure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Mercure Component", + "homepage": "https://symfony.com", + "keywords": [ + "mercure", + "push", + "sse", + "updates" + ], + "support": { + "issues": "https://github.com/symfony/mercure/issues", + "source": "https://github.com/symfony/mercure/tree/v0.6.5" + }, + "funding": [ + { + "url": "https://github.com/dunglas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/mercure", + "type": "tidelift" + } + ], + "time": "2024-04-08T12:51:34+00:00" + }, + { + "name": "symfony/mercure-bundle", + "version": "v0.3.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/mercure-bundle.git", + "reference": "77435d740b228e9f5f3f065b6db564f85f2cdb64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mercure-bundle/zipball/77435d740b228e9f5f3f065b6db564f85f2cdb64", + "reference": "77435d740b228e9f5f3f065b6db564f85f2cdb64", + "shasum": "" + }, + "require": { + "lcobucci/jwt": "^3.4|^4.0|^5.0", + "php": ">=7.1.3", + "symfony/config": "^4.4|^5.0|^6.0|^7.0", + "symfony/dependency-injection": "^4.4|^5.4|^6.0|^7.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0|^7.0", + "symfony/mercure": "^0.6.1", + "symfony/web-link": "^4.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.3.7|^5.0|^6.0|^7.0", + "symfony/stopwatch": "^4.3.7|^5.0|^6.0|^7.0", + "symfony/ux-turbo": "*", + "symfony/var-dumper": "^4.3.7|^5.0|^6.0|^7.0" + }, + "suggest": { + "symfony/messenger": "To use the Messenger integration" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MercureBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony MercureBundle", + "homepage": "https://symfony.com", + "keywords": [ + "mercure", + "push", + "sse", + "updates" + ], + "support": { + "issues": "https://github.com/symfony/mercure-bundle/issues", + "source": "https://github.com/symfony/mercure-bundle/tree/v0.3.9" + }, + "funding": [ + { + "url": "https://github.com/dunglas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/mercure-bundle", + "type": "tidelift" + } + ], + "time": "2024-05-31T09:07:18+00:00" + }, { "name": "symfony/messenger", "version": "v7.1.5", diff --git a/config/bundles.php b/config/bundles.php index 4e3a560..e7f9c79 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -13,4 +13,5 @@ return [ Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], + Symfony\Bundle\MercureBundle\MercureBundle::class => ['all' => true], ]; diff --git a/config/packages/mercure.yaml b/config/packages/mercure.yaml new file mode 100644 index 0000000..f2a7395 --- /dev/null +++ b/config/packages/mercure.yaml @@ -0,0 +1,8 @@ +mercure: + hubs: + default: + url: '%env(MERCURE_URL)%' + public_url: '%env(MERCURE_PUBLIC_URL)%' + jwt: + secret: '%env(MERCURE_JWT_SECRET)%' + publish: '*' diff --git a/src/Entity/Annonce.php b/src/Entity/Annonce.php new file mode 100644 index 0000000..dc600bb --- /dev/null +++ b/src/Entity/Annonce.php @@ -0,0 +1,57 @@ +id; + } + + public function setId(int $id): static + { + $this->id = $id; + + return $this; + } + + public function getTitre(): ?string + { + return $this->Titre; + } + + public function setTitre(string $Titre): static + { + $this->Titre = $Titre; + + return $this; + } + + public function getDescription(): ?string + { + return $this->Description; + } + + public function setDescription(string $Description): static + { + $this->Description = $Description; + + return $this; + } +} diff --git a/src/Entity/Competence.php b/src/Entity/Competence.php new file mode 100644 index 0000000..ee8394b --- /dev/null +++ b/src/Entity/Competence.php @@ -0,0 +1,42 @@ +id; + } + + public function setId(int $id): static + { + $this->id = $id; + + return $this; + } + + public function getLibelle(): ?string + { + return $this->Libelle; + } + + public function setLibelle(string $Libelle): static + { + $this->Libelle = $Libelle; + + return $this; + } +} diff --git a/src/Entity/Demandeur.php b/src/Entity/Demandeur.php new file mode 100644 index 0000000..fae439e --- /dev/null +++ b/src/Entity/Demandeur.php @@ -0,0 +1,65 @@ +id; + } + + public function getLM(): ?string + { + return $this->LM; + } + + public function setLM(string $LM): static + { + $this->LM = $LM; + + return $this; + } + + public function getCV(): ?string + { + return $this->CV; + } + + public function setCV(string $CV): static + { + $this->CV = $CV; + + return $this; + } + + public function getMail(): ?string + { + return $this->Mail; + } + + public function setMail(string $Mail): static + { + $this->Mail = $Mail; + + return $this; + } +} diff --git a/src/Entity/Diplome.php b/src/Entity/Diplome.php new file mode 100644 index 0000000..5ca827e --- /dev/null +++ b/src/Entity/Diplome.php @@ -0,0 +1,42 @@ +id; + } + + public function setId(int $id): static + { + $this->id = $id; + + return $this; + } + + public function getLibelle(): ?string + { + return $this->Libelle; + } + + public function setLibelle(string $Libelle): static + { + $this->Libelle = $Libelle; + + return $this; + } +} diff --git a/src/Entity/Employe.php b/src/Entity/Employe.php new file mode 100644 index 0000000..1d4fa6c --- /dev/null +++ b/src/Entity/Employe.php @@ -0,0 +1,35 @@ +id; + } + + public function getMail(): ?string + { + return $this->Mail; + } + + public function setMail(string $Mail): static + { + $this->Mail = $Mail; + + return $this; + } +} diff --git a/src/Entity/Entreprise.php b/src/Entity/Entreprise.php new file mode 100644 index 0000000..2807a19 --- /dev/null +++ b/src/Entity/Entreprise.php @@ -0,0 +1,87 @@ +id; + } + + public function setId(int $id): static + { + $this->id = $id; + + return $this; + } + + public function getNom(): ?string + { + return $this->Nom; + } + + public function setNom(string $Nom): static + { + $this->Nom = $Nom; + + return $this; + } + + public function getAdresse(): ?string + { + return $this->Adresse; + } + + public function setAdresse(string $Adresse): static + { + $this->Adresse = $Adresse; + + return $this; + } + + public function getTel(): ?string + { + return $this->Tel; + } + + public function setTel(string $Tel): static + { + $this->Tel = $Tel; + + return $this; + } + + public function getMail(): ?string + { + return $this->Mail; + } + + public function setMail(string $Mail): static + { + $this->Mail = $Mail; + + return $this; + } +} diff --git a/src/Entity/FAQ.php b/src/Entity/FAQ.php new file mode 100644 index 0000000..2384232 --- /dev/null +++ b/src/Entity/FAQ.php @@ -0,0 +1,75 @@ +id; + } + + public function setId(int $id): static + { + $this->id = $id; + + return $this; + } + + public function getQuestion(): ?string + { + return $this->Question; + } + + public function setQuestion(?string $Question): static + { + $this->Question = $Question; + + return $this; + } + + public function getReponse(): ?string + { + return $this->Reponse; + } + + public function setReponse(?string $Reponse): static + { + $this->Reponse = $Reponse; + + return $this; + } + + public function getDerniereModif(): ?\DateTimeInterface + { + return $this->Derniere_modif; + } + + public function setDerniereModif(\DateTimeInterface $Derniere_modif): static + { + $this->Derniere_modif = $Derniere_modif; + + return $this; + } +} diff --git a/src/Entity/Favoris.php b/src/Entity/Favoris.php new file mode 100644 index 0000000..26f1023 --- /dev/null +++ b/src/Entity/Favoris.php @@ -0,0 +1,27 @@ +id; + } + + public function setId(int $id): static + { + $this->id = $id; + + return $this; + } +} diff --git a/src/Entity/Formulaire.php b/src/Entity/Formulaire.php new file mode 100644 index 0000000..7a8308b --- /dev/null +++ b/src/Entity/Formulaire.php @@ -0,0 +1,36 @@ +id; + } + + public function getDate(): ?\DateTimeInterface + { + return $this->Date; + } + + public function setDate(\DateTimeInterface $Date): static + { + $this->Date = $Date; + + return $this; + } +} diff --git a/src/Entity/Liste.php b/src/Entity/Liste.php new file mode 100644 index 0000000..eccf868 --- /dev/null +++ b/src/Entity/Liste.php @@ -0,0 +1,36 @@ +id; + } + + public function getDate(): ?\DateTimeInterface + { + return $this->Date; + } + + public function setDate(\DateTimeInterface $Date): static + { + $this->Date = $Date; + + return $this; + } +} diff --git a/src/Entity/Message.php b/src/Entity/Message.php new file mode 100644 index 0000000..2fe40d7 --- /dev/null +++ b/src/Entity/Message.php @@ -0,0 +1,80 @@ +id; + } + + public function setId(int $id): static + { + $this->id = $id; + + return $this; + } + + public function getContenu(): ?string + { + return $this->Contenu; + } + + public function setContenu(string $Contenu): static + { + $this->Contenu = $Contenu; + + return $this; + } + + public function getDateTime(): ?\DateTimeInterface + { + return $this->DateTime; + } + + public function setDateTime(\DateTimeInterface $DateTime): static + { + $this->DateTime = $DateTime; + + return $this; + } + + // Getter et setter pour la relation avec Utilisateur + public function getUtilisateur(): ?Utilisateur + { + return $this->utilisateur; + } + + public function setUtilisateur(?Utilisateur $utilisateur): static + { + $this->utilisateur = $utilisateur; + + return $this; + } +} diff --git a/src/Entity/Utilisateur.php b/src/Entity/Utilisateur.php new file mode 100644 index 0000000..705b358 --- /dev/null +++ b/src/Entity/Utilisateur.php @@ -0,0 +1,135 @@ +messages = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function setId(int $id): static + { + $this->id = $id; + + return $this; + } + + public function getNom(): ?string + { + return $this->Nom; + } + + public function setNom(string $Nom): static + { + $this->Nom = $Nom; + + return $this; + } + + public function getPrenom(): ?string + { + return $this->Prenom; + } + + public function setPrenom(string $Prenom): static + { + $this->Prenom = $Prenom; + + return $this; + } + + public function getTel(): ?string + { + return $this->Tel; + } + + public function setTel(string $Tel): static + { + $this->Tel = $Tel; + + return $this; + } + + public function getAdresse(): ?string + { + return $this->Adresse; + } + + public function setAdresse(string $Adresse): static + { + $this->Adresse = $Adresse; + + return $this; + } + + // Getter et setter pour la relation avec Message + /** + * @return Collection + */ + public function getMessages(): Collection + { + return $this->messages; + } + + public function addMessage(Message $message): static + { + if (!$this->messages->contains($message)) { + $this->messages[] = $message; + $message->setUtilisateur($this); + } + + return $this; + } + + public function removeMessage(Message $message): static + { + if ($this->messages->removeElement($message)) { + if ($message->getUtilisateur() === $this) { + $message->setUtilisateur(null); + } + } + + return $this; + } +} diff --git a/src/Entity/Verifie.php b/src/Entity/Verifie.php new file mode 100644 index 0000000..fa39d14 --- /dev/null +++ b/src/Entity/Verifie.php @@ -0,0 +1,42 @@ +id; + } + + public function setId(int $id): static + { + $this->id = $id; + + return $this; + } + + public function getLibelle(): ?string + { + return $this->Libelle; + } + + public function setLibelle(string $Libelle): static + { + $this->Libelle = $Libelle; + + return $this; + } +} diff --git a/src/Repository/AnnonceRepository.php b/src/Repository/AnnonceRepository.php new file mode 100644 index 0000000..776c143 --- /dev/null +++ b/src/Repository/AnnonceRepository.php @@ -0,0 +1,43 @@ + + */ +class AnnonceRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Annonce::class); + } + +// /** +// * @return Annonce[] Returns an array of Annonce objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('a') +// ->andWhere('a.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('a.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Annonce +// { +// return $this->createQueryBuilder('a') +// ->andWhere('a.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/CompetenceRepository.php b/src/Repository/CompetenceRepository.php new file mode 100644 index 0000000..f4fbf89 --- /dev/null +++ b/src/Repository/CompetenceRepository.php @@ -0,0 +1,43 @@ + + */ +class CompetenceRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Competence::class); + } + +// /** +// * @return Competence[] Returns an array of Competence objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('c') +// ->andWhere('c.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('c.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Competence +// { +// return $this->createQueryBuilder('c') +// ->andWhere('c.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/DemandeurRepository.php b/src/Repository/DemandeurRepository.php new file mode 100644 index 0000000..6ef82d1 --- /dev/null +++ b/src/Repository/DemandeurRepository.php @@ -0,0 +1,43 @@ + + */ +class DemandeurRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Demandeur::class); + } + +// /** +// * @return Demandeur[] Returns an array of Demandeur objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('d') +// ->andWhere('d.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('d.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Demandeur +// { +// return $this->createQueryBuilder('d') +// ->andWhere('d.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/DiplomeRepository.php b/src/Repository/DiplomeRepository.php new file mode 100644 index 0000000..777400a --- /dev/null +++ b/src/Repository/DiplomeRepository.php @@ -0,0 +1,43 @@ + + */ +class DiplomeRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Diplome::class); + } + +// /** +// * @return Diplome[] Returns an array of Diplome objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('d') +// ->andWhere('d.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('d.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Diplome +// { +// return $this->createQueryBuilder('d') +// ->andWhere('d.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/EmployeRepository.php b/src/Repository/EmployeRepository.php new file mode 100644 index 0000000..87ac38f --- /dev/null +++ b/src/Repository/EmployeRepository.php @@ -0,0 +1,43 @@ + + */ +class EmployeRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Employe::class); + } + +// /** +// * @return Employe[] Returns an array of Employe objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('e') +// ->andWhere('e.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('e.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Employe +// { +// return $this->createQueryBuilder('e') +// ->andWhere('e.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/EntrepriseRepository.php b/src/Repository/EntrepriseRepository.php new file mode 100644 index 0000000..3d0e694 --- /dev/null +++ b/src/Repository/EntrepriseRepository.php @@ -0,0 +1,43 @@ + + */ +class EntrepriseRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Entreprise::class); + } + +// /** +// * @return Entreprise[] Returns an array of Entreprise objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('e') +// ->andWhere('e.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('e.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Entreprise +// { +// return $this->createQueryBuilder('e') +// ->andWhere('e.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/FAQRepository.php b/src/Repository/FAQRepository.php new file mode 100644 index 0000000..9a69471 --- /dev/null +++ b/src/Repository/FAQRepository.php @@ -0,0 +1,43 @@ + + */ +class FAQRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, FAQ::class); + } + +// /** +// * @return FAQ[] Returns an array of FAQ objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('f') +// ->andWhere('f.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('f.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?FAQ +// { +// return $this->createQueryBuilder('f') +// ->andWhere('f.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/FavorisRepository.php b/src/Repository/FavorisRepository.php new file mode 100644 index 0000000..4b12a36 --- /dev/null +++ b/src/Repository/FavorisRepository.php @@ -0,0 +1,43 @@ + + */ +class FavorisRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Favoris::class); + } + +// /** +// * @return Favoris[] Returns an array of Favoris objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('f') +// ->andWhere('f.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('f.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Favoris +// { +// return $this->createQueryBuilder('f') +// ->andWhere('f.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/FormulaireRepository.php b/src/Repository/FormulaireRepository.php new file mode 100644 index 0000000..f27aa6a --- /dev/null +++ b/src/Repository/FormulaireRepository.php @@ -0,0 +1,43 @@ + + */ +class FormulaireRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Formulaire::class); + } + +// /** +// * @return Formulaire[] Returns an array of Formulaire objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('f') +// ->andWhere('f.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('f.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Formulaire +// { +// return $this->createQueryBuilder('f') +// ->andWhere('f.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/ListeRepository.php b/src/Repository/ListeRepository.php new file mode 100644 index 0000000..570b25f --- /dev/null +++ b/src/Repository/ListeRepository.php @@ -0,0 +1,43 @@ + + */ +class ListeRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Liste::class); + } + +// /** +// * @return Liste[] Returns an array of Liste objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('l') +// ->andWhere('l.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('l.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Liste +// { +// return $this->createQueryBuilder('l') +// ->andWhere('l.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/MessageRepository.php b/src/Repository/MessageRepository.php new file mode 100644 index 0000000..04e5c8a --- /dev/null +++ b/src/Repository/MessageRepository.php @@ -0,0 +1,43 @@ + + */ +class MessageRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Message::class); + } + +// /** +// * @return Message[] Returns an array of Message objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('m') +// ->andWhere('m.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('m.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Message +// { +// return $this->createQueryBuilder('m') +// ->andWhere('m.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/UtilisateurRepository.php b/src/Repository/UtilisateurRepository.php new file mode 100644 index 0000000..df1e4c6 --- /dev/null +++ b/src/Repository/UtilisateurRepository.php @@ -0,0 +1,43 @@ + + */ +class UtilisateurRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Utilisateur::class); + } + +// /** +// * @return Utilisateur[] Returns an array of Utilisateur objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('u') +// ->andWhere('u.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('u.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Utilisateur +// { +// return $this->createQueryBuilder('u') +// ->andWhere('u.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/VerifieRepository.php b/src/Repository/VerifieRepository.php new file mode 100644 index 0000000..c5384d7 --- /dev/null +++ b/src/Repository/VerifieRepository.php @@ -0,0 +1,43 @@ + + */ +class VerifieRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Verifie::class); + } + +// /** +// * @return Verifie[] Returns an array of Verifie objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('v') +// ->andWhere('v.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('v.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Verifie +// { +// return $this->createQueryBuilder('v') +// ->andWhere('v.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/symfony.lock b/symfony.lock index cf1900f..015e252 100644 --- a/symfony.lock +++ b/symfony.lock @@ -131,6 +131,18 @@ "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" } }, + "symfony/mercure-bundle": { + "version": "0.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "0.3", + "ref": "528285147494380298f8f991ee8c47abebaf79db" + }, + "files": [ + "config/packages/mercure.yaml" + ] + }, "symfony/messenger": { "version": "7.1", "recipe": { diff --git a/templates/broadcast/FAQ.stream.html.twig b/templates/broadcast/FAQ.stream.html.twig new file mode 100644 index 0000000..988ccf4 --- /dev/null +++ b/templates/broadcast/FAQ.stream.html.twig @@ -0,0 +1,22 @@ +{# Learn how to use Turbo Streams: https://github.com/symfony/ux-turbo#broadcast-doctrine-entities-update #} +{% block create %} + + + +{% endblock %} + +{% block update %} + + + +{% endblock %} + +{% block remove %} + +{% endblock %} From 5870f7072583fa398c56d9b0e6d07266a531b704 Mon Sep 17 00:00:00 2001 From: barillote Date: Thu, 3 Oct 2024 14:58:48 +0200 Subject: [PATCH 02/71] =?UTF-8?q?mise=20=C3=A0=20jour=20composer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/php.xml | 140 ++++++++++++ .../shelved.patch | 19 ++ .../shelved.patch | 19 ++ ...Checkout_at_03_10_2024_14_52__Changes_.xml | 4 + ...heckout_at_03_10_2024_14_52__Changes_1.xml | 4 + .../shelved.patch | 19 ++ ...Checkout_at_03_10_2024_14_55__Changes_.xml | 4 + .idea/workspace.xml | 215 ++++++++++++++++++ composer.json | 2 +- 9 files changed, 425 insertions(+), 1 deletion(-) create mode 100644 .idea/php.xml create mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52_[Changes]/shelved.patch create mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52_[Changes]1/shelved.patch create mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52__Changes_.xml create mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52__Changes_1.xml create mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_55_[Changes]/shelved.patch create mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_55__Changes_.xml create mode 100644 .idea/workspace.xml diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..981f297 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52_[Changes]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52_[Changes]/shelved.patch new file mode 100644 index 0000000..0f5c7a3 --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52_[Changes]/shelved.patch @@ -0,0 +1,19 @@ +Index: composer.lock +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>{\n \"_readme\": [\n \"This file locks the dependencies of your project to a known state\",\n \"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies\",\n \"This file is @generated automatically\"\n ],\n \"content-hash\": \"1bc99d81c026aaf4e662ffffde457d04\",\n \"packages\": [\n {\n \"name\": \"composer/semver\",\n \"version\": \"3.4.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/composer/semver.git\",\n \"reference\": \"4313d26ada5e0c4edfbd1dc481a92ff7bff91f12\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12\",\n \"reference\": \"4313d26ada5e0c4edfbd1dc481a92ff7bff91f12\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^5.3.2 || ^7.0 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.11\",\n \"symfony/phpunit-bridge\": \"^3 || ^7\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Composer\\\\Semver\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nils Adermann\",\n \"email\": \"naderman@naderman.de\",\n \"homepage\": \"http://www.naderman.de\"\n },\n {\n \"name\": \"Jordi Boggiano\",\n \"email\": \"j.boggiano@seld.be\",\n \"homepage\": \"http://seld.be\"\n },\n {\n \"name\": \"Rob Bast\",\n \"email\": \"rob.bast@gmail.com\",\n \"homepage\": \"http://robbast.nl\"\n }\n ],\n \"description\": \"Semver library that offers utilities, version constraint parsing and validation.\",\n \"keywords\": [\n \"semantic\",\n \"semver\",\n \"validation\",\n \"versioning\"\n ],\n \"support\": {\n \"irc\": \"ircs://irc.libera.chat:6697/composer\",\n \"issues\": \"https://github.com/composer/semver/issues\",\n \"source\": \"https://github.com/composer/semver/tree/3.4.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://packagist.com\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/composer\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/composer/composer\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-19T14:15:21+00:00\"\n },\n {\n \"name\": \"doctrine/cache\",\n \"version\": \"2.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/cache.git\",\n \"reference\": \"1ca8f21980e770095a31456042471a57bc4c68fb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb\",\n \"reference\": \"1ca8f21980e770095a31456042471a57bc4c68fb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"~7.1 || ^8.0\"\n },\n \"conflict\": {\n \"doctrine/common\": \">2.2,<2.4\"\n },\n \"require-dev\": {\n \"cache/integration-tests\": \"dev-master\",\n \"doctrine/coding-standard\": \"^9\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.5\",\n \"psr/cache\": \"^1.0 || ^2.0 || ^3.0\",\n \"symfony/cache\": \"^4.4 || ^5.4 || ^6\",\n \"symfony/var-exporter\": \"^4.4 || ^5.4 || ^6\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Common\\\\Cache\\\\\": \"lib/Doctrine/Common/Cache\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n }\n ],\n \"description\": \"PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/cache.html\",\n \"keywords\": [\n \"abstraction\",\n \"apcu\",\n \"cache\",\n \"caching\",\n \"couchdb\",\n \"memcached\",\n \"php\",\n \"redis\",\n \"xcache\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/cache/issues\",\n \"source\": \"https://github.com/doctrine/cache/tree/2.2.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Fcache\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2022-05-20T20:07:39+00:00\"\n },\n {\n \"name\": \"doctrine/collections\",\n \"version\": \"2.2.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/collections.git\",\n \"reference\": \"d8af7f248c74f195f7347424600fd9e17b57af59\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59\",\n \"reference\": \"d8af7f248c74f195f7347424600fd9e17b57af59\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/deprecations\": \"^1\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12\",\n \"ext-json\": \"*\",\n \"phpstan/phpstan\": \"^1.8\",\n \"phpstan/phpstan-phpunit\": \"^1.0\",\n \"phpunit/phpunit\": \"^10.5\",\n \"vimeo/psalm\": \"^5.11\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Common\\\\Collections\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n }\n ],\n \"description\": \"PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/collections.html\",\n \"keywords\": [\n \"array\",\n \"collections\",\n \"iterators\",\n \"php\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/collections/issues\",\n \"source\": \"https://github.com/doctrine/collections/tree/2.2.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Fcollections\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-04-18T06:56:21+00:00\"\n },\n {\n \"name\": \"doctrine/dbal\",\n \"version\": \"3.9.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/dbal.git\",\n \"reference\": \"d7dc08f98cba352b2bab5d32c5e58f7e745c11a7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/dbal/zipball/d7dc08f98cba352b2bab5d32c5e58f7e745c11a7\",\n \"reference\": \"d7dc08f98cba352b2bab5d32c5e58f7e745c11a7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \"^2\",\n \"doctrine/cache\": \"^1.11|^2.0\",\n \"doctrine/deprecations\": \"^0.5.3|^1\",\n \"doctrine/event-manager\": \"^1|^2\",\n \"php\": \"^7.4 || ^8.0\",\n \"psr/cache\": \"^1|^2|^3\",\n \"psr/log\": \"^1|^2|^3\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"12.0.0\",\n \"fig/log-test\": \"^1\",\n \"jetbrains/phpstorm-stubs\": \"2023.1\",\n \"phpstan/phpstan\": \"1.12.0\",\n \"phpstan/phpstan-strict-rules\": \"^1.6\",\n \"phpunit/phpunit\": \"9.6.20\",\n \"psalm/plugin-phpunit\": \"0.18.4\",\n \"slevomat/coding-standard\": \"8.13.1\",\n \"squizlabs/php_codesniffer\": \"3.10.2\",\n \"symfony/cache\": \"^5.4|^6.0|^7.0\",\n \"symfony/console\": \"^4.4|^5.4|^6.0|^7.0\",\n \"vimeo/psalm\": \"4.30.0\"\n },\n \"suggest\": {\n \"symfony/console\": \"For helpful console commands such as SQL execution and import of files.\"\n },\n \"bin\": [\n \"bin/doctrine-dbal\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\DBAL\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n }\n ],\n \"description\": \"Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/dbal.html\",\n \"keywords\": [\n \"abstraction\",\n \"database\",\n \"db2\",\n \"dbal\",\n \"mariadb\",\n \"mssql\",\n \"mysql\",\n \"oci8\",\n \"oracle\",\n \"pdo\",\n \"pgsql\",\n \"postgresql\",\n \"queryobject\",\n \"sasql\",\n \"sql\",\n \"sqlite\",\n \"sqlserver\",\n \"sqlsrv\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/dbal/issues\",\n \"source\": \"https://github.com/doctrine/dbal/tree/3.9.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Fdbal\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-01T13:49:23+00:00\"\n },\n {\n \"name\": \"doctrine/deprecations\",\n \"version\": \"1.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/deprecations.git\",\n \"reference\": \"dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab\",\n \"reference\": \"dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^9\",\n \"phpstan/phpstan\": \"1.4.10 || 1.10.15\",\n \"phpstan/phpstan-phpunit\": \"^1.0\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.5\",\n \"psalm/plugin-phpunit\": \"0.18.4\",\n \"psr/log\": \"^1 || ^2 || ^3\",\n \"vimeo/psalm\": \"4.30.0 || 5.12.0\"\n },\n \"suggest\": {\n \"psr/log\": \"Allows logging deprecations via PSR-3 logger implementation\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Deprecations\\\\\": \"lib/Doctrine/Deprecations\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.\",\n \"homepage\": \"https://www.doctrine-project.org/\",\n \"support\": {\n \"issues\": \"https://github.com/doctrine/deprecations/issues\",\n \"source\": \"https://github.com/doctrine/deprecations/tree/1.1.3\"\n },\n \"time\": \"2024-01-30T19:34:25+00:00\"\n },\n {\n \"name\": \"doctrine/doctrine-bundle\",\n \"version\": \"2.13.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/DoctrineBundle.git\",\n \"reference\": \"ca59d84b8e63143ce1aed90cdb333ba329d71563\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca59d84b8e63143ce1aed90cdb333ba329d71563\",\n \"reference\": \"ca59d84b8e63143ce1aed90cdb333ba329d71563\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/cache\": \"^1.11 || ^2.0\",\n \"doctrine/dbal\": \"^3.7.0 || ^4.0\",\n \"doctrine/persistence\": \"^2.2 || ^3\",\n \"doctrine/sql-formatter\": \"^1.0.1\",\n \"php\": \"^7.4 || ^8.0\",\n \"symfony/cache\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/config\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/console\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/dependency-injection\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/deprecation-contracts\": \"^2.1 || ^3\",\n \"symfony/doctrine-bridge\": \"^5.4.19 || ^6.0.7 || ^7.0\",\n \"symfony/framework-bundle\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/polyfill-php80\": \"^1.15\",\n \"symfony/service-contracts\": \"^1.1.1 || ^2.0 || ^3\"\n },\n \"conflict\": {\n \"doctrine/annotations\": \">=3.0\",\n \"doctrine/orm\": \"<2.17 || >=4.0\",\n \"twig/twig\": \"<1.34 || >=2.0 <2.4\"\n },\n \"require-dev\": {\n \"doctrine/annotations\": \"^1 || ^2\",\n \"doctrine/coding-standard\": \"^12\",\n \"doctrine/deprecations\": \"^1.0\",\n \"doctrine/orm\": \"^2.17 || ^3.0\",\n \"friendsofphp/proxy-manager-lts\": \"^1.0\",\n \"phpunit/phpunit\": \"^9.5.26\",\n \"psalm/plugin-phpunit\": \"^0.18.4\",\n \"psalm/plugin-symfony\": \"^5\",\n \"psr/log\": \"^1.1.4 || ^2.0 || ^3.0\",\n \"symfony/phpunit-bridge\": \"^6.1 || ^7.0\",\n \"symfony/property-info\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/proxy-manager-bridge\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/security-bundle\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/stopwatch\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/string\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/twig-bridge\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/validator\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/var-exporter\": \"^5.4 || ^6.2 || ^7.0\",\n \"symfony/web-profiler-bundle\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/yaml\": \"^5.4 || ^6.0 || ^7.0\",\n \"twig/twig\": \"^1.34 || ^2.12 || ^3.0\",\n \"vimeo/psalm\": \"^5.15\"\n },\n \"suggest\": {\n \"doctrine/orm\": \"The Doctrine ORM integration is optional in the bundle.\",\n \"ext-pdo\": \"*\",\n \"symfony/web-profiler-bundle\": \"To use the data collector.\"\n },\n \"type\": \"symfony-bundle\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Bundle\\\\DoctrineBundle\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n },\n {\n \"name\": \"Doctrine Project\",\n \"homepage\": \"https://www.doctrine-project.org/\"\n }\n ],\n \"description\": \"Symfony DoctrineBundle\",\n \"homepage\": \"https://www.doctrine-project.org\",\n \"keywords\": [\n \"database\",\n \"dbal\",\n \"orm\",\n \"persistence\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/DoctrineBundle/issues\",\n \"source\": \"https://github.com/doctrine/DoctrineBundle/tree/2.13.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-01T09:46:40+00:00\"\n },\n {\n \"name\": \"doctrine/doctrine-migrations-bundle\",\n \"version\": \"3.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/DoctrineMigrationsBundle.git\",\n \"reference\": \"715b62c31a5894afcb2b2cdbbc6607d7dd0580c0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/715b62c31a5894afcb2b2cdbbc6607d7dd0580c0\",\n \"reference\": \"715b62c31a5894afcb2b2cdbbc6607d7dd0580c0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/doctrine-bundle\": \"^2.4\",\n \"doctrine/migrations\": \"^3.2\",\n \"php\": \"^7.2|^8.0\",\n \"symfony/deprecation-contracts\": \"^2.1 || ^3\",\n \"symfony/framework-bundle\": \"^5.4 || ^6.0 || ^7.0\"\n },\n \"require-dev\": {\n \"composer/semver\": \"^3.0\",\n \"doctrine/coding-standard\": \"^12\",\n \"doctrine/orm\": \"^2.6 || ^3\",\n \"doctrine/persistence\": \"^2.0 || ^3 \",\n \"phpstan/phpstan\": \"^1.4\",\n \"phpstan/phpstan-deprecation-rules\": \"^1\",\n \"phpstan/phpstan-phpunit\": \"^1\",\n \"phpstan/phpstan-strict-rules\": \"^1.1\",\n \"phpstan/phpstan-symfony\": \"^1.3\",\n \"phpunit/phpunit\": \"^8.5|^9.5\",\n \"psalm/plugin-phpunit\": \"^0.18.4\",\n \"psalm/plugin-symfony\": \"^3 || ^5\",\n \"symfony/phpunit-bridge\": \"^6.3 || ^7\",\n \"symfony/var-exporter\": \"^5.4 || ^6 || ^7\",\n \"vimeo/psalm\": \"^4.30 || ^5.15\"\n },\n \"type\": \"symfony-bundle\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Bundle\\\\MigrationsBundle\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Doctrine Project\",\n \"homepage\": \"https://www.doctrine-project.org\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony DoctrineMigrationsBundle\",\n \"homepage\": \"https://www.doctrine-project.org\",\n \"keywords\": [\n \"dbal\",\n \"migrations\",\n \"schema\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/DoctrineMigrationsBundle/issues\",\n \"source\": \"https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-migrations-bundle\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-14T20:32:18+00:00\"\n },\n {\n \"name\": \"doctrine/event-manager\",\n \"version\": \"2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/event-manager.git\",\n \"reference\": \"b680156fa328f1dfd874fd48c7026c41570b9c6e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e\",\n \"reference\": \"b680156fa328f1dfd874fd48c7026c41570b9c6e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"conflict\": {\n \"doctrine/common\": \"<2.9\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12\",\n \"phpstan/phpstan\": \"^1.8.8\",\n \"phpunit/phpunit\": \"^10.5\",\n \"vimeo/psalm\": \"^5.24\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Common\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n },\n {\n \"name\": \"Marco Pivetta\",\n \"email\": \"ocramius@gmail.com\"\n }\n ],\n \"description\": \"The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/event-manager.html\",\n \"keywords\": [\n \"event\",\n \"event dispatcher\",\n \"event manager\",\n \"event system\",\n \"events\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/event-manager/issues\",\n \"source\": \"https://github.com/doctrine/event-manager/tree/2.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-22T20:47:39+00:00\"\n },\n {\n \"name\": \"doctrine/inflector\",\n \"version\": \"2.0.10\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/inflector.git\",\n \"reference\": \"5817d0659c5b50c9b950feb9af7b9668e2c436bc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc\",\n \"reference\": \"5817d0659c5b50c9b950feb9af7b9668e2c436bc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^11.0\",\n \"phpstan/phpstan\": \"^1.8\",\n \"phpstan/phpstan-phpunit\": \"^1.1\",\n \"phpstan/phpstan-strict-rules\": \"^1.3\",\n \"phpunit/phpunit\": \"^8.5 || ^9.5\",\n \"vimeo/psalm\": \"^4.25 || ^5.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Inflector\\\\\": \"lib/Doctrine/Inflector\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n }\n ],\n \"description\": \"PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/inflector.html\",\n \"keywords\": [\n \"inflection\",\n \"inflector\",\n \"lowercase\",\n \"manipulation\",\n \"php\",\n \"plural\",\n \"singular\",\n \"strings\",\n \"uppercase\",\n \"words\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/inflector/issues\",\n \"source\": \"https://github.com/doctrine/inflector/tree/2.0.10\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Finflector\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-02-18T20:23:39+00:00\"\n },\n {\n \"name\": \"doctrine/instantiator\",\n \"version\": \"2.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/instantiator.git\",\n \"reference\": \"c6222283fa3f4ac679f8b9ced9a4e23f163e80d0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0\",\n \"reference\": \"c6222283fa3f4ac679f8b9ced9a4e23f163e80d0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^11\",\n \"ext-pdo\": \"*\",\n \"ext-phar\": \"*\",\n \"phpbench/phpbench\": \"^1.2\",\n \"phpstan/phpstan\": \"^1.9.4\",\n \"phpstan/phpstan-phpunit\": \"^1.3\",\n \"phpunit/phpunit\": \"^9.5.27\",\n \"vimeo/psalm\": \"^5.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Instantiator\\\\\": \"src/Doctrine/Instantiator/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Marco Pivetta\",\n \"email\": \"ocramius@gmail.com\",\n \"homepage\": \"https://ocramius.github.io/\"\n }\n ],\n \"description\": \"A small, lightweight utility to instantiate objects in PHP without invoking their constructors\",\n \"homepage\": \"https://www.doctrine-project.org/projects/instantiator.html\",\n \"keywords\": [\n \"constructor\",\n \"instantiate\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/instantiator/issues\",\n \"source\": \"https://github.com/doctrine/instantiator/tree/2.0.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2022-12-30T00:23:10+00:00\"\n },\n {\n \"name\": \"doctrine/lexer\",\n \"version\": \"3.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/lexer.git\",\n \"reference\": \"31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\",\n \"reference\": \"31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^10.5\",\n \"psalm/plugin-phpunit\": \"^0.18.3\",\n \"vimeo/psalm\": \"^5.21\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Common\\\\Lexer\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n }\n ],\n \"description\": \"PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/lexer.html\",\n \"keywords\": [\n \"annotations\",\n \"docblock\",\n \"lexer\",\n \"parser\",\n \"php\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/lexer/issues\",\n \"source\": \"https://github.com/doctrine/lexer/tree/3.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Flexer\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-02-05T11:56:58+00:00\"\n },\n {\n \"name\": \"doctrine/migrations\",\n \"version\": \"3.8.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/migrations.git\",\n \"reference\": \"7760fbd0b7cb58bfb50415505a7bab821adf0877\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/migrations/zipball/7760fbd0b7cb58bfb50415505a7bab821adf0877\",\n \"reference\": \"7760fbd0b7cb58bfb50415505a7bab821adf0877\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \"^2\",\n \"doctrine/dbal\": \"^3.6 || ^4\",\n \"doctrine/deprecations\": \"^0.5.3 || ^1\",\n \"doctrine/event-manager\": \"^1.2 || ^2.0\",\n \"php\": \"^8.1\",\n \"psr/log\": \"^1.1.3 || ^2 || ^3\",\n \"symfony/console\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/stopwatch\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/var-exporter\": \"^6.2 || ^7.0\"\n },\n \"conflict\": {\n \"doctrine/orm\": \"<2.12 || >=4\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12\",\n \"doctrine/orm\": \"^2.13 || ^3\",\n \"doctrine/persistence\": \"^2 || ^3\",\n \"doctrine/sql-formatter\": \"^1.0\",\n \"ext-pdo_sqlite\": \"*\",\n \"fig/log-test\": \"^1\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.1\",\n \"phpstan/phpstan-phpunit\": \"^1.3\",\n \"phpstan/phpstan-strict-rules\": \"^1.4\",\n \"phpstan/phpstan-symfony\": \"^1.3\",\n \"phpunit/phpunit\": \"^10.3\",\n \"symfony/cache\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/process\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/yaml\": \"^5.4 || ^6.0 || ^7.0\"\n },\n \"suggest\": {\n \"doctrine/sql-formatter\": \"Allows to generate formatted SQL with the diff command.\",\n \"symfony/yaml\": \"Allows the use of yaml for migration configuration files.\"\n },\n \"bin\": [\n \"bin/doctrine-migrations\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Migrations\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n },\n {\n \"name\": \"Michael Simonson\",\n \"email\": \"contact@mikesimonson.com\"\n }\n ],\n \"description\": \"PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/migrations.html\",\n \"keywords\": [\n \"database\",\n \"dbal\",\n \"migrations\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/migrations/issues\",\n \"source\": \"https://github.com/doctrine/migrations/tree/3.8.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-08-28T13:17:28+00:00\"\n },\n {\n \"name\": \"doctrine/orm\",\n \"version\": \"3.2.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/orm.git\",\n \"reference\": \"831a1eb7d260925528cdbb49cc1866c0357cf147\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/orm/zipball/831a1eb7d260925528cdbb49cc1866c0357cf147\",\n \"reference\": \"831a1eb7d260925528cdbb49cc1866c0357cf147\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \"^2\",\n \"doctrine/collections\": \"^2.2\",\n \"doctrine/dbal\": \"^3.8.2 || ^4\",\n \"doctrine/deprecations\": \"^0.5.3 || ^1\",\n \"doctrine/event-manager\": \"^1.2 || ^2\",\n \"doctrine/inflector\": \"^1.4 || ^2.0\",\n \"doctrine/instantiator\": \"^1.3 || ^2\",\n \"doctrine/lexer\": \"^3\",\n \"doctrine/persistence\": \"^3.3.1\",\n \"ext-ctype\": \"*\",\n \"php\": \"^8.1\",\n \"psr/cache\": \"^1 || ^2 || ^3\",\n \"symfony/console\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/var-exporter\": \"^6.3.9 || ^7.0\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12.0\",\n \"phpbench/phpbench\": \"^1.0\",\n \"phpstan/phpstan\": \"1.11.1\",\n \"phpunit/phpunit\": \"^10.4.0\",\n \"psr/log\": \"^1 || ^2 || ^3\",\n \"squizlabs/php_codesniffer\": \"3.7.2\",\n \"symfony/cache\": \"^5.4 || ^6.2 || ^7.0\",\n \"vimeo/psalm\": \"5.24.0\"\n },\n \"suggest\": {\n \"ext-dom\": \"Provides support for XSD validation for XML mapping files\",\n \"symfony/cache\": \"Provides cache support for Setup Tool with doctrine/cache 2.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\ORM\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n },\n {\n \"name\": \"Marco Pivetta\",\n \"email\": \"ocramius@gmail.com\"\n }\n ],\n \"description\": \"Object-Relational-Mapper for PHP\",\n \"homepage\": \"https://www.doctrine-project.org/projects/orm.html\",\n \"keywords\": [\n \"database\",\n \"orm\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/orm/issues\",\n \"source\": \"https://github.com/doctrine/orm/tree/3.2.2\"\n },\n \"time\": \"2024-08-23T10:03:52+00:00\"\n },\n {\n \"name\": \"doctrine/persistence\",\n \"version\": \"3.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/persistence.git\",\n \"reference\": \"b337726451f5d530df338fc7f68dee8781b49779\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/persistence/zipball/b337726451f5d530df338fc7f68dee8781b49779\",\n \"reference\": \"b337726451f5d530df338fc7f68dee8781b49779\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/event-manager\": \"^1 || ^2\",\n \"php\": \"^7.2 || ^8.0\",\n \"psr/cache\": \"^1.0 || ^2.0 || ^3.0\"\n },\n \"conflict\": {\n \"doctrine/common\": \"<2.10\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12\",\n \"doctrine/common\": \"^3.0\",\n \"phpstan/phpstan\": \"1.11.1\",\n \"phpstan/phpstan-phpunit\": \"^1\",\n \"phpstan/phpstan-strict-rules\": \"^1.1\",\n \"phpunit/phpunit\": \"^8.5 || ^9.5\",\n \"symfony/cache\": \"^4.4 || ^5.4 || ^6.0\",\n \"vimeo/psalm\": \"4.30.0 || 5.24.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Persistence\\\\\": \"src/Persistence\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n },\n {\n \"name\": \"Marco Pivetta\",\n \"email\": \"ocramius@gmail.com\"\n }\n ],\n \"description\": \"The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/persistence.html\",\n \"keywords\": [\n \"mapper\",\n \"object\",\n \"odm\",\n \"orm\",\n \"persistence\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/persistence/issues\",\n \"source\": \"https://github.com/doctrine/persistence/tree/3.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-06-20T10:14:30+00:00\"\n },\n {\n \"name\": \"doctrine/sql-formatter\",\n \"version\": \"1.4.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/sql-formatter.git\",\n \"reference\": \"7f83911cc5eba870de7ebb11283972483f7e2891\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/sql-formatter/zipball/7f83911cc5eba870de7ebb11283972483f7e2891\",\n \"reference\": \"7f83911cc5eba870de7ebb11283972483f7e2891\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^10.5\",\n \"vimeo/psalm\": \"^5.24\"\n },\n \"bin\": [\n \"bin/sql-formatter\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\SqlFormatter\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jeremy Dorn\",\n \"email\": \"jeremy@jeremydorn.com\",\n \"homepage\": \"https://jeremydorn.com/\"\n }\n ],\n \"description\": \"a PHP SQL highlighting library\",\n \"homepage\": \"https://github.com/doctrine/sql-formatter/\",\n \"keywords\": [\n \"highlight\",\n \"sql\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/sql-formatter/issues\",\n \"source\": \"https://github.com/doctrine/sql-formatter/tree/1.4.1\"\n },\n \"time\": \"2024-08-05T20:32:22+00:00\"\n },\n {\n \"name\": \"egulias/email-validator\",\n \"version\": \"4.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/egulias/EmailValidator.git\",\n \"reference\": \"ebaaf5be6c0286928352e054f2d5125608e5405e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e\",\n \"reference\": \"ebaaf5be6c0286928352e054f2d5125608e5405e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/lexer\": \"^2.0 || ^3.0\",\n \"php\": \">=8.1\",\n \"symfony/polyfill-intl-idn\": \"^1.26\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^10.2\",\n \"vimeo/psalm\": \"^5.12\"\n },\n \"suggest\": {\n \"ext-intl\": \"PHP Internationalization Libraries are required to use the SpoofChecking validation\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Egulias\\\\EmailValidator\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Eduardo Gulias Davis\"\n }\n ],\n \"description\": \"A library for validating emails against several RFCs\",\n \"homepage\": \"https://github.com/egulias/EmailValidator\",\n \"keywords\": [\n \"email\",\n \"emailvalidation\",\n \"emailvalidator\",\n \"validation\",\n \"validator\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/egulias/EmailValidator/issues\",\n \"source\": \"https://github.com/egulias/EmailValidator/tree/4.0.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/egulias\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2023-10-06T06:47:41+00:00\"\n },\n {\n \"name\": \"monolog/monolog\",\n \"version\": \"3.7.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Seldaek/monolog.git\",\n \"reference\": \"f4393b648b78a5408747de94fca38beb5f7e9ef8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8\",\n \"reference\": \"f4393b648b78a5408747de94fca38beb5f7e9ef8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/log\": \"^2.0 || ^3.0\"\n },\n \"provide\": {\n \"psr/log-implementation\": \"3.0.0\"\n },\n \"require-dev\": {\n \"aws/aws-sdk-php\": \"^3.0\",\n \"doctrine/couchdb\": \"~1.0@dev\",\n \"elasticsearch/elasticsearch\": \"^7 || ^8\",\n \"ext-json\": \"*\",\n \"graylog2/gelf-php\": \"^1.4.2 || ^2.0\",\n \"guzzlehttp/guzzle\": \"^7.4.5\",\n \"guzzlehttp/psr7\": \"^2.2\",\n \"mongodb/mongodb\": \"^1.8\",\n \"php-amqplib/php-amqplib\": \"~2.4 || ^3\",\n \"phpstan/phpstan\": \"^1.9\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.0\",\n \"phpstan/phpstan-strict-rules\": \"^1.4\",\n \"phpunit/phpunit\": \"^10.5.17\",\n \"predis/predis\": \"^1.1 || ^2\",\n \"ruflin/elastica\": \"^7\",\n \"symfony/mailer\": \"^5.4 || ^6\",\n \"symfony/mime\": \"^5.4 || ^6\"\n },\n \"suggest\": {\n \"aws/aws-sdk-php\": \"Allow sending log messages to AWS services like DynamoDB\",\n \"doctrine/couchdb\": \"Allow sending log messages to a CouchDB server\",\n \"elasticsearch/elasticsearch\": \"Allow sending log messages to an Elasticsearch server via official client\",\n \"ext-amqp\": \"Allow sending log messages to an AMQP server (1.0+ required)\",\n \"ext-curl\": \"Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler\",\n \"ext-mbstring\": \"Allow to work properly with unicode symbols\",\n \"ext-mongodb\": \"Allow sending log messages to a MongoDB server (via driver)\",\n \"ext-openssl\": \"Required to send log messages using SSL\",\n \"ext-sockets\": \"Allow sending log messages to a Syslog server (via UDP driver)\",\n \"graylog2/gelf-php\": \"Allow sending log messages to a GrayLog2 server\",\n \"mongodb/mongodb\": \"Allow sending log messages to a MongoDB server (via library)\",\n \"php-amqplib/php-amqplib\": \"Allow sending log messages to an AMQP server using php-amqplib\",\n \"rollbar/rollbar\": \"Allow sending log messages to Rollbar\",\n \"ruflin/elastica\": \"Allow sending log messages to an Elastic Search server\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Monolog\\\\\": \"src/Monolog\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jordi Boggiano\",\n \"email\": \"j.boggiano@seld.be\",\n \"homepage\": \"https://seld.be\"\n }\n ],\n \"description\": \"Sends your logs to files, sockets, inboxes, databases and various web services\",\n \"homepage\": \"https://github.com/Seldaek/monolog\",\n \"keywords\": [\n \"log\",\n \"logging\",\n \"psr-3\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Seldaek/monolog/issues\",\n \"source\": \"https://github.com/Seldaek/monolog/tree/3.7.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Seldaek\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/monolog/monolog\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-06-28T09:40:51+00:00\"\n },\n {\n \"name\": \"phpdocumentor/reflection-common\",\n \"version\": \"2.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpDocumentor/ReflectionCommon.git\",\n \"reference\": \"1d01c49d4ed62f25aa84a747ad35d5a16924662b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b\",\n \"reference\": \"1d01c49d4ed62f25aa84a747ad35d5a16924662b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-2.x\": \"2.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"phpDocumentor\\\\Reflection\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jaap van Otterdijk\",\n \"email\": \"opensource@ijaap.nl\"\n }\n ],\n \"description\": \"Common reflection classes used by phpdocumentor to reflect the code structure\",\n \"homepage\": \"http://www.phpdoc.org\",\n \"keywords\": [\n \"FQSEN\",\n \"phpDocumentor\",\n \"phpdoc\",\n \"reflection\",\n \"static analysis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/phpDocumentor/ReflectionCommon/issues\",\n \"source\": \"https://github.com/phpDocumentor/ReflectionCommon/tree/2.x\"\n },\n \"time\": \"2020-06-27T09:03:43+00:00\"\n },\n {\n \"name\": \"phpdocumentor/reflection-docblock\",\n \"version\": \"5.4.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpDocumentor/ReflectionDocBlock.git\",\n \"reference\": \"9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c\",\n \"reference\": \"9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/deprecations\": \"^1.1\",\n \"ext-filter\": \"*\",\n \"php\": \"^7.4 || ^8.0\",\n \"phpdocumentor/reflection-common\": \"^2.2\",\n \"phpdocumentor/type-resolver\": \"^1.7\",\n \"phpstan/phpdoc-parser\": \"^1.7\",\n \"webmozart/assert\": \"^1.9.1\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~1.3.5\",\n \"phpstan/extension-installer\": \"^1.1\",\n \"phpstan/phpstan\": \"^1.8\",\n \"phpstan/phpstan-mockery\": \"^1.1\",\n \"phpstan/phpstan-webmozart-assert\": \"^1.2\",\n \"phpunit/phpunit\": \"^9.5\",\n \"vimeo/psalm\": \"^5.13\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"phpDocumentor\\\\Reflection\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mike van Riel\",\n \"email\": \"me@mikevanriel.com\"\n },\n {\n \"name\": \"Jaap van Otterdijk\",\n \"email\": \"opensource@ijaap.nl\"\n }\n ],\n \"description\": \"With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.\",\n \"support\": {\n \"issues\": \"https://github.com/phpDocumentor/ReflectionDocBlock/issues\",\n \"source\": \"https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1\"\n },\n \"time\": \"2024-05-21T05:55:05+00:00\"\n },\n {\n \"name\": \"phpdocumentor/type-resolver\",\n \"version\": \"1.8.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpDocumentor/TypeResolver.git\",\n \"reference\": \"153ae662783729388a584b4361f2545e4d841e3c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c\",\n \"reference\": \"153ae662783729388a584b4361f2545e4d841e3c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/deprecations\": \"^1.0\",\n \"php\": \"^7.3 || ^8.0\",\n \"phpdocumentor/reflection-common\": \"^2.0\",\n \"phpstan/phpdoc-parser\": \"^1.13\"\n },\n \"require-dev\": {\n \"ext-tokenizer\": \"*\",\n \"phpbench/phpbench\": \"^1.2\",\n \"phpstan/extension-installer\": \"^1.1\",\n \"phpstan/phpstan\": \"^1.8\",\n \"phpstan/phpstan-phpunit\": \"^1.1\",\n \"phpunit/phpunit\": \"^9.5\",\n \"rector/rector\": \"^0.13.9\",\n \"vimeo/psalm\": \"^4.25\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-1.x\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"phpDocumentor\\\\Reflection\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mike van Riel\",\n \"email\": \"me@mikevanriel.com\"\n }\n ],\n \"description\": \"A PSR-5 based resolver of Class names, Types and Structural Element Names\",\n \"support\": {\n \"issues\": \"https://github.com/phpDocumentor/TypeResolver/issues\",\n \"source\": \"https://github.com/phpDocumentor/TypeResolver/tree/1.8.2\"\n },\n \"time\": \"2024-02-23T11:10:43+00:00\"\n },\n {\n \"name\": \"phpstan/phpdoc-parser\",\n \"version\": \"1.32.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpstan/phpdoc-parser.git\",\n \"reference\": \"6ca22b154efdd9e3c68c56f5d94670920a1c19a4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4\",\n \"reference\": \"6ca22b154efdd9e3c68c56f5d94670920a1c19a4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"require-dev\": {\n \"doctrine/annotations\": \"^2.0\",\n \"nikic/php-parser\": \"^4.15\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.2\",\n \"phpstan/extension-installer\": \"^1.0\",\n \"phpstan/phpstan\": \"^1.5\",\n \"phpstan/phpstan-phpunit\": \"^1.1\",\n \"phpstan/phpstan-strict-rules\": \"^1.0\",\n \"phpunit/phpunit\": \"^9.5\",\n \"symfony/process\": \"^5.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"PHPStan\\\\PhpDocParser\\\\\": [\n \"src/\"\n ]\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"PHPDoc parser with support for nullable, intersection and generic types\",\n \"support\": {\n \"issues\": \"https://github.com/phpstan/phpdoc-parser/issues\",\n \"source\": \"https://github.com/phpstan/phpdoc-parser/tree/1.32.0\"\n },\n \"time\": \"2024-09-26T07:23:32+00:00\"\n },\n {\n \"name\": \"psr/cache\",\n \"version\": \"3.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/cache.git\",\n \"reference\": \"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\",\n \"reference\": \"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Cache\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for caching libraries\",\n \"keywords\": [\n \"cache\",\n \"psr\",\n \"psr-6\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/cache/tree/3.0.0\"\n },\n \"time\": \"2021-02-03T23:26:27+00:00\"\n },\n {\n \"name\": \"psr/clock\",\n \"version\": \"1.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/clock.git\",\n \"reference\": \"e41a24703d4560fd0acb709162f73b8adfc3aa0d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d\",\n \"reference\": \"e41a24703d4560fd0acb709162f73b8adfc3aa0d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.0 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Clock\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for reading the clock.\",\n \"homepage\": \"https://github.com/php-fig/clock\",\n \"keywords\": [\n \"clock\",\n \"now\",\n \"psr\",\n \"psr-20\",\n \"time\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-fig/clock/issues\",\n \"source\": \"https://github.com/php-fig/clock/tree/1.0.0\"\n },\n \"time\": \"2022-11-25T14:36:26+00:00\"\n },\n {\n \"name\": \"psr/container\",\n \"version\": \"2.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/container.git\",\n \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Container\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common Container Interface (PHP FIG PSR-11)\",\n \"homepage\": \"https://github.com/php-fig/container\",\n \"keywords\": [\n \"PSR-11\",\n \"container\",\n \"container-interface\",\n \"container-interop\",\n \"psr\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-fig/container/issues\",\n \"source\": \"https://github.com/php-fig/container/tree/2.0.2\"\n },\n \"time\": \"2021-11-05T16:47:00+00:00\"\n },\n {\n \"name\": \"psr/event-dispatcher\",\n \"version\": \"1.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/event-dispatcher.git\",\n \"reference\": \"dbefd12671e8a14ec7f180cab83036ed26714bb0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0\",\n \"reference\": \"dbefd12671e8a14ec7f180cab83036ed26714bb0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\EventDispatcher\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"http://www.php-fig.org/\"\n }\n ],\n \"description\": \"Standard interfaces for event handling.\",\n \"keywords\": [\n \"events\",\n \"psr\",\n \"psr-14\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-fig/event-dispatcher/issues\",\n \"source\": \"https://github.com/php-fig/event-dispatcher/tree/1.0.0\"\n },\n \"time\": \"2019-01-08T18:20:26+00:00\"\n },\n {\n \"name\": \"psr/link\",\n \"version\": \"2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/link.git\",\n \"reference\": \"84b159194ecfd7eaa472280213976e96415433f7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/link/zipball/84b159194ecfd7eaa472280213976e96415433f7\",\n \"reference\": \"84b159194ecfd7eaa472280213976e96415433f7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0.0\"\n },\n \"suggest\": {\n \"fig/link-util\": \"Provides some useful PSR-13 utilities\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Link\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"http://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interfaces for HTTP links\",\n \"homepage\": \"https://github.com/php-fig/link\",\n \"keywords\": [\n \"http\",\n \"http-link\",\n \"link\",\n \"psr\",\n \"psr-13\",\n \"rest\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/link/tree/2.0.1\"\n },\n \"time\": \"2021-03-11T23:00:27+00:00\"\n },\n {\n \"name\": \"psr/log\",\n \"version\": \"3.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/log.git\",\n \"reference\": \"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\",\n \"reference\": \"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Log\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for logging libraries\",\n \"homepage\": \"https://github.com/php-fig/log\",\n \"keywords\": [\n \"log\",\n \"psr\",\n \"psr-3\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/log/tree/3.0.2\"\n },\n \"time\": \"2024-09-11T13:17:53+00:00\"\n },\n {\n \"name\": \"symfony/asset\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/asset.git\",\n \"reference\": \"8970de4a0cedd34e097c0f5c502a614780b9ca43\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/asset/zipball/8970de4a0cedd34e097c0f5c502a614780b9ca43\",\n \"reference\": \"8970de4a0cedd34e097c0f5c502a614780b9ca43\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"conflict\": {\n \"symfony/http-foundation\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Asset\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/asset/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/asset-mapper\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/asset-mapper.git\",\n \"reference\": \"e3ae56f965f1fe503db1f604756a44d40e6dea16\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/asset-mapper/zipball/e3ae56f965f1fe503db1f604756a44d40e6dea16\",\n \"reference\": \"e3ae56f965f1fe503db1f604756a44d40e6dea16\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer/semver\": \"^3.0\",\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.1|^3\",\n \"symfony/filesystem\": \"^7.1\",\n \"symfony/http-client\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"symfony/framework-bundle\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/asset\": \"^6.4|^7.0\",\n \"symfony/browser-kit\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/event-dispatcher-contracts\": \"^3.0\",\n \"symfony/finder\": \"^6.4|^7.0\",\n \"symfony/framework-bundle\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/web-link\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\AssetMapper\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Maps directories of assets & makes them available in a public directory with versioned filenames.\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/asset-mapper/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-19T08:57:32+00:00\"\n },\n {\n \"name\": \"symfony/cache\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/cache.git\",\n \"reference\": \"86e5296b10e4dec8c8441056ca606aedb8a3be0a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/cache/zipball/86e5296b10e4dec8c8441056ca606aedb8a3be0a\",\n \"reference\": \"86e5296b10e4dec8c8441056ca606aedb8a3be0a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/cache\": \"^2.0|^3.0\",\n \"psr/log\": \"^1.1|^2|^3\",\n \"symfony/cache-contracts\": \"^2.5|^3\",\n \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/var-exporter\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"doctrine/dbal\": \"<3.6\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/var-dumper\": \"<6.4\"\n },\n \"provide\": {\n \"psr/cache-implementation\": \"2.0|3.0\",\n \"psr/simple-cache-implementation\": \"1.0|2.0|3.0\",\n \"symfony/cache-implementation\": \"1.1|2.0|3.0\"\n },\n \"require-dev\": {\n \"cache/integration-tests\": \"dev-master\",\n \"doctrine/dbal\": \"^3.6|^4\",\n \"predis/predis\": \"^1.1|^2.0\",\n \"psr/simple-cache\": \"^1.0|^2.0|^3.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/filesystem\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Cache\\\\\": \"\"\n },\n \"classmap\": [\n \"Traits/ValueWrapper.php\"\n ],\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides extended PSR-6, PSR-16 (and tags) implementations\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"caching\",\n \"psr6\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/cache/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-17T09:16:35+00:00\"\n },\n {\n \"name\": \"symfony/cache-contracts\",\n \"version\": \"v3.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/cache-contracts.git\",\n \"reference\": \"df6a1a44c890faded49a5fca33c2d5c5fd3c2197\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197\",\n \"reference\": \"df6a1a44c890faded49a5fca33c2d5c5fd3c2197\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/cache\": \"^3.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.5-dev\"\n },\n \"thanks\": {\n \"name\": \"symfony/contracts\",\n \"url\": \"https://github.com/symfony/contracts\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\Cache\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to caching\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/cache-contracts/tree/v3.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-04-18T09:32:20+00:00\"\n },\n {\n \"name\": \"symfony/clock\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/clock.git\",\n \"reference\": \"3dfc8b084853586de51dd1441c6242c76a28cbe7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7\",\n \"reference\": \"3dfc8b084853586de51dd1441c6242c76a28cbe7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/clock\": \"^1.0\",\n \"symfony/polyfill-php83\": \"^1.28\"\n },\n \"provide\": {\n \"psr/clock-implementation\": \"1.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/now.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Clock\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Decouples applications from the system clock\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"clock\",\n \"psr20\",\n \"time\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/clock/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/config\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/config.git\",\n \"reference\": \"2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/config/zipball/2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2\",\n \"reference\": \"2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/filesystem\": \"^7.1\",\n \"symfony/polyfill-ctype\": \"~1.8\"\n },\n \"conflict\": {\n \"symfony/finder\": \"<6.4\",\n \"symfony/service-contracts\": \"<2.5\"\n },\n \"require-dev\": {\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/finder\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/yaml\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Config\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Helps you find, load, combine, autofill and validate configuration values of any kind\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/config/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/console\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/console.git\",\n \"reference\": \"0fa539d12b3ccf068a722bbbffa07ca7079af9ee\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/console/zipball/0fa539d12b3ccf068a722bbbffa07ca7079af9ee\",\n \"reference\": \"0fa539d12b3ccf068a722bbbffa07ca7079af9ee\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-mbstring\": \"~1.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/string\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/dotenv\": \"<6.4\",\n \"symfony/event-dispatcher\": \"<6.4\",\n \"symfony/lock\": \"<6.4\",\n \"symfony/process\": \"<6.4\"\n },\n \"provide\": {\n \"psr/log-implementation\": \"1.0|2.0|3.0\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/lock\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Console\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Eases the creation of beautiful and testable command line interfaces\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"cli\",\n \"command-line\",\n \"console\",\n \"terminal\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/console/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T08:28:38+00:00\"\n },\n {\n \"name\": \"symfony/dependency-injection\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/dependency-injection.git\",\n \"reference\": \"38465f925ec4e0707b090e9147c65869837d639d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/dependency-injection/zipball/38465f925ec4e0707b090e9147c65869837d639d\",\n \"reference\": \"38465f925ec4e0707b090e9147c65869837d639d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/container\": \"^1.1|^2.0\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/service-contracts\": \"^3.5\",\n \"symfony/var-exporter\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"ext-psr\": \"<1.1|>=2\",\n \"symfony/config\": \"<6.4\",\n \"symfony/finder\": \"<6.4\",\n \"symfony/yaml\": \"<6.4\"\n },\n \"provide\": {\n \"psr/container-implementation\": \"1.1|2.0\",\n \"symfony/service-implementation\": \"1.1|2.0|3.0\"\n },\n \"require-dev\": {\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/yaml\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\DependencyInjection\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Allows you to standardize and centralize the way objects are constructed in your application\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/dependency-injection/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T08:28:38+00:00\"\n },\n {\n \"name\": \"symfony/deprecation-contracts\",\n \"version\": \"v3.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/deprecation-contracts.git\",\n \"reference\": \"0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1\",\n \"reference\": \"0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.5-dev\"\n },\n \"thanks\": {\n \"name\": \"symfony/contracts\",\n \"url\": \"https://github.com/symfony/contracts\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"function.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"A generic function and convention to trigger deprecation notices\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/deprecation-contracts/tree/v3.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-04-18T09:32:20+00:00\"\n },\n {\n \"name\": \"symfony/doctrine-bridge\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/doctrine-bridge.git\",\n \"reference\": \"2568d0adaa5b0018b07beaa90363b880a43cc957\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/doctrine-bridge/zipball/2568d0adaa5b0018b07beaa90363b880a43cc957\",\n \"reference\": \"2568d0adaa5b0018b07beaa90363b880a43cc957\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/event-manager\": \"^2\",\n \"doctrine/persistence\": \"^3.1\",\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-mbstring\": \"~1.0\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"doctrine/dbal\": \"<3.6\",\n \"doctrine/lexer\": \"<1.1\",\n \"doctrine/orm\": \"<2.15\",\n \"symfony/cache\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/form\": \"<6.4.6|>=7,<7.0.6\",\n \"symfony/http-foundation\": \"<6.4\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/lock\": \"<6.4\",\n \"symfony/messenger\": \"<6.4\",\n \"symfony/property-info\": \"<6.4\",\n \"symfony/security-bundle\": \"<6.4\",\n \"symfony/security-core\": \"<6.4\",\n \"symfony/validator\": \"<6.4\"\n },\n \"require-dev\": {\n \"doctrine/collections\": \"^1.0|^2.0\",\n \"doctrine/data-fixtures\": \"^1.1\",\n \"doctrine/dbal\": \"^3.6|^4\",\n \"doctrine/orm\": \"^2.15|^3\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/doctrine-messenger\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/form\": \"^6.4.6|^7.0.6\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/lock\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/property-info\": \"^6.4|^7.0\",\n \"symfony/security-core\": \"^6.4|^7.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4|^7.0\",\n \"symfony/type-info\": \"^7.1\",\n \"symfony/uid\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"type\": \"symfony-bridge\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bridge\\\\Doctrine\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides integration for Doctrine with various Symfony components\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/doctrine-bridge/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-08T12:32:26+00:00\"\n },\n {\n \"name\": \"symfony/doctrine-messenger\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/doctrine-messenger.git\",\n \"reference\": \"29015027fb63461e035246e07d74eeab9cb03304\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/doctrine-messenger/zipball/29015027fb63461e035246e07d74eeab9cb03304\",\n \"reference\": \"29015027fb63461e035246e07d74eeab9cb03304\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/dbal\": \"^3.6|^4\",\n \"php\": \">=8.2\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"doctrine/persistence\": \"<1.3\"\n },\n \"require-dev\": {\n \"doctrine/persistence\": \"^1.3|^2|^3\",\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4|^7.0\"\n },\n \"type\": \"symfony-messenger-bridge\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Messenger\\\\Bridge\\\\Doctrine\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony Doctrine Messenger Bridge\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/doctrine-messenger/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T08:28:38+00:00\"\n },\n {\n \"name\": \"symfony/dotenv\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/dotenv.git\",\n \"reference\": \"6d966200b399fa59759286f3fc7c919f0677c449\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/dotenv/zipball/6d966200b399fa59759286f3fc7c919f0677c449\",\n \"reference\": \"6d966200b399fa59759286f3fc7c919f0677c449\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"conflict\": {\n \"symfony/console\": \"<6.4\",\n \"symfony/process\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/process\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Dotenv\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Registers environment variables from a .env file\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"dotenv\",\n \"env\",\n \"environment\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/dotenv/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-17T09:16:35+00:00\"\n },\n {\n \"name\": \"symfony/error-handler\",\n \"version\": \"v7.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/error-handler.git\",\n \"reference\": \"432bb369952795c61ca1def65e078c4a80dad13c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/error-handler/zipball/432bb369952795c61ca1def65e078c4a80dad13c\",\n \"reference\": \"432bb369952795c61ca1def65e078c4a80dad13c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"symfony/deprecation-contracts\": \"<2.5\",\n \"symfony/http-kernel\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4|^7.0\"\n },\n \"bin\": [\n \"Resources/bin/patch-type-declarations\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\ErrorHandler\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools to manage errors and ease debugging PHP code\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/error-handler/tree/v7.1.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-07-26T13:02:51+00:00\"\n },\n {\n \"name\": \"symfony/event-dispatcher\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/event-dispatcher.git\",\n \"reference\": \"9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7\",\n \"reference\": \"9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/event-dispatcher-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/service-contracts\": \"<2.5\"\n },\n \"provide\": {\n \"psr/event-dispatcher-implementation\": \"1.0\",\n \"symfony/event-dispatcher-implementation\": \"2.0|3.0\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/error-handler\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/stopwatch\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\EventDispatcher\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools that allow your application components to communicate with each other by dispatching events and listening to them\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/event-dispatcher/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/event-dispatcher-contracts\",\n \"version\": \"v3.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/event-dispatcher-contracts.git\",\n \"reference\": \"8f93aec25d41b72493c6ddff14e916177c9efc50\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50\",\n \"reference\": \"8f93aec25d41b72493c6ddff14e916177c9efc50\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/event-dispatcher\": \"^1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.5-dev\"\n },\n \"thanks\": {\n \"name\": \"symfony/contracts\",\n \"url\": \"https://github.com/symfony/contracts\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\EventDispatcher\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to dispatching event\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-04-18T09:32:20+00:00\"\n },\n {\n \"name\": \"symfony/expression-language\",\n \"version\": \"v7.1.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/expression-language.git\",\n \"reference\": \"b9e4bc6685d513c10235145ed1042a6081635806\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/expression-language/zipball/b9e4bc6685d513c10235145ed1042a6081635806\",\n \"reference\": \"b9e4bc6685d513c10235145ed1042a6081635806\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\ExpressionLanguage\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides an engine that can compile and evaluate expressions\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/expression-language/tree/v7.1.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-08-12T09:59:40+00:00\"\n },\n {\n \"name\": \"symfony/filesystem\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/filesystem.git\",\n \"reference\": \"61fe0566189bf32e8cfee78335d8776f64a66f5a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/filesystem/zipball/61fe0566189bf32e8cfee78335d8776f64a66f5a\",\n \"reference\": \"61fe0566189bf32e8cfee78335d8776f64a66f5a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-mbstring\": \"~1.8\"\n },\n \"require-dev\": {\n \"symfony/process\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Filesystem\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides basic utilities for the filesystem\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/filesystem/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-17T09:16:35+00:00\"\n },\n {\n \"name\": \"symfony/finder\",\n \"version\": \"v7.1.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/finder.git\",\n \"reference\": \"d95bbf319f7d052082fb7af147e0f835a695e823\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/finder/zipball/d95bbf319f7d052082fb7af147e0f835a695e823\",\n \"reference\": \"d95bbf319f7d052082fb7af147e0f835a695e823\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"symfony/filesystem\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Finder\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Finds files and directories via an intuitive fluent interface\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/finder/tree/v7.1.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-08-13T14:28:19+00:00\"\n },\n {\n \"name\": \"symfony/flex\",\n \"version\": \"v2.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/flex.git\",\n \"reference\": \"4dc11919791f81d087a12db2ab4c7e044431ef6b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/flex/zipball/4dc11919791f81d087a12db2ab4c7e044431ef6b\",\n \"reference\": \"4dc11919791f81d087a12db2ab4c7e044431ef6b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-plugin-api\": \"^2.1\",\n \"php\": \">=8.0\"\n },\n \"require-dev\": {\n \"composer/composer\": \"^2.1\",\n \"symfony/dotenv\": \"^5.4|^6.0\",\n \"symfony/filesystem\": \"^5.4|^6.0\",\n \"symfony/phpunit-bridge\": \"^5.4|^6.0\",\n \"symfony/process\": \"^5.4|^6.0\"\n },\n \"type\": \"composer-plugin\",\n \"extra\": {\n \"class\": \"Symfony\\\\Flex\\\\Flex\"\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Flex\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien.potencier@gmail.com\"\n }\n ],\n \"description\": \"Composer plugin for Symfony\",\n \"support\": {\n \"issues\": \"https://github.com/symfony/flex/issues\",\n \"source\": \"https://github.com/symfony/flex/tree/v2.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-04-27T10:22:22+00:00\"\n },\n {\n \"name\": \"symfony/form\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/form.git\",\n \"reference\": \"6b8b53ad6d42f14b158c896163b96ff260d78222\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/form/zipball/6b8b53ad6d42f14b158c896163b96ff260d78222\",\n \"reference\": \"6b8b53ad6d42f14b158c896163b96ff260d78222\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/options-resolver\": \"^6.4|^7.0\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-intl-icu\": \"^1.21\",\n \"symfony/polyfill-mbstring\": \"~1.0\",\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/console\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/doctrine-bridge\": \"<6.4\",\n \"symfony/error-handler\": \"<6.4\",\n \"symfony/framework-bundle\": \"<6.4\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/translation\": \"<6.4.3|>=7.0,<7.0.3\",\n \"symfony/translation-contracts\": \"<2.5\",\n \"symfony/twig-bridge\": \"<6.4\"\n },\n \"require-dev\": {\n \"doctrine/collections\": \"^1.0|^2.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/html-sanitizer\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/intl\": \"^6.4|^7.0\",\n \"symfony/security-core\": \"^6.4|^7.0\",\n \"symfony/security-csrf\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4.3|^7.0.3\",\n \"symfony/uid\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Form\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Allows to easily create, process and reuse HTML forms\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/form/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T08:28:38+00:00\"\n },\n {\n \"name\": \"symfony/framework-bundle\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/framework-bundle.git\",\n \"reference\": \"8a792de86230c13a9de7750c0c8b23cc083183d4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/framework-bundle/zipball/8a792de86230c13a9de7750c0c8b23cc083183d4\",\n \"reference\": \"8a792de86230c13a9de7750c0c8b23cc083183d4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \">=2.1\",\n \"ext-xml\": \"*\",\n \"php\": \">=8.2\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^7.1.5\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/error-handler\": \"^6.4|^7.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/filesystem\": \"^7.1\",\n \"symfony/finder\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/polyfill-mbstring\": \"~1.0\",\n \"symfony/routing\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"doctrine/persistence\": \"<1.3\",\n \"phpdocumentor/reflection-docblock\": \"<3.2.2\",\n \"phpdocumentor/type-resolver\": \"<1.4.0\",\n \"symfony/asset\": \"<6.4\",\n \"symfony/asset-mapper\": \"<6.4\",\n \"symfony/clock\": \"<6.4\",\n \"symfony/console\": \"<6.4\",\n \"symfony/dom-crawler\": \"<6.4\",\n \"symfony/dotenv\": \"<6.4\",\n \"symfony/form\": \"<6.4\",\n \"symfony/http-client\": \"<6.4\",\n \"symfony/lock\": \"<6.4\",\n \"symfony/mailer\": \"<6.4\",\n \"symfony/messenger\": \"<6.4\",\n \"symfony/mime\": \"<6.4\",\n \"symfony/property-access\": \"<6.4\",\n \"symfony/property-info\": \"<6.4\",\n \"symfony/scheduler\": \"<6.4.4|>=7.0.0,<7.0.4\",\n \"symfony/security-core\": \"<6.4\",\n \"symfony/security-csrf\": \"<6.4\",\n \"symfony/serializer\": \"<6.4\",\n \"symfony/stopwatch\": \"<6.4\",\n \"symfony/translation\": \"<6.4\",\n \"symfony/twig-bridge\": \"<6.4\",\n \"symfony/twig-bundle\": \"<6.4\",\n \"symfony/validator\": \"<6.4\",\n \"symfony/web-profiler-bundle\": \"<6.4\",\n \"symfony/workflow\": \"<6.4\"\n },\n \"require-dev\": {\n \"doctrine/persistence\": \"^1.3|^2|^3\",\n \"dragonmantank/cron-expression\": \"^3.1\",\n \"phpdocumentor/reflection-docblock\": \"^3.0|^4.0|^5.0\",\n \"seld/jsonlint\": \"^1.10\",\n \"symfony/asset\": \"^6.4|^7.0\",\n \"symfony/asset-mapper\": \"^6.4|^7.0\",\n \"symfony/browser-kit\": \"^6.4|^7.0\",\n \"symfony/clock\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/css-selector\": \"^6.4|^7.0\",\n \"symfony/dom-crawler\": \"^6.4|^7.0\",\n \"symfony/dotenv\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/form\": \"^6.4|^7.0\",\n \"symfony/html-sanitizer\": \"^6.4|^7.0\",\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/lock\": \"^6.4|^7.0\",\n \"symfony/mailer\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/mime\": \"^6.4|^7.0\",\n \"symfony/notifier\": \"^6.4|^7.0\",\n \"symfony/polyfill-intl-icu\": \"~1.0\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/property-info\": \"^6.4|^7.0\",\n \"symfony/rate-limiter\": \"^6.4|^7.0\",\n \"symfony/scheduler\": \"^6.4.4|^7.0.4\",\n \"symfony/security-bundle\": \"^6.4|^7.0\",\n \"symfony/semaphore\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4|^7.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0\",\n \"symfony/string\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4|^7.0\",\n \"symfony/twig-bundle\": \"^6.4|^7.0\",\n \"symfony/type-info\": \"^7.1\",\n \"symfony/uid\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\",\n \"symfony/web-link\": \"^6.4|^7.0\",\n \"symfony/workflow\": \"^6.4|^7.0\",\n \"symfony/yaml\": \"^6.4|^7.0\",\n \"twig/twig\": \"^3.0.4\"\n },\n \"type\": \"symfony-bundle\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bundle\\\\FrameworkBundle\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides a tight integration between Symfony components and the Symfony full-stack framework\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/framework-bundle/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T13:35:23+00:00\"\n },\n {\n \"name\": \"symfony/http-client\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-client.git\",\n \"reference\": \"abca35865118edf35a23f2f24978a1784c831cb4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-client/zipball/abca35865118edf35a23f2f24978a1784c831cb4\",\n \"reference\": \"abca35865118edf35a23f2f24978a1784c831cb4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/http-client-contracts\": \"^3.4.1\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"php-http/discovery\": \"<1.15\",\n \"symfony/http-foundation\": \"<6.4\"\n },\n \"provide\": {\n \"php-http/async-client-implementation\": \"*\",\n \"php-http/client-implementation\": \"*\",\n \"psr/http-client-implementation\": \"1.0\",\n \"symfony/http-client-implementation\": \"3.0\"\n },\n \"require-dev\": {\n \"amphp/amp\": \"^2.5\",\n \"amphp/http-client\": \"^4.2.1\",\n \"amphp/http-tunnel\": \"^1.0\",\n \"amphp/socket\": \"^1.1\",\n \"guzzlehttp/promises\": \"^1.4|^2.0\",\n \"nyholm/psr7\": \"^1.0\",\n \"php-http/httplug\": \"^1.0|^2.0\",\n \"psr/http-client\": \"^1.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/rate-limiter\": \"^6.4|^7.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\HttpClient\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides powerful methods to fetch HTTP resources synchronously or asynchronously\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"http\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/http-client/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T13:35:23+00:00\"\n },\n {\n \"name\": \"symfony/http-client-contracts\",\n \"version\": \"v3.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-client-contracts.git\",\n \"reference\": \"20414d96f391677bf80078aa55baece78b82647d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d\",\n \"reference\": \"20414d96f391677bf80078aa55baece78b82647d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.5-dev\"\n },\n \"thanks\": {\n \"name\": \"symfony/contracts\",\n \"url\": \"https://github.com/symfony/contracts\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\HttpClient\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Test/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to HTTP clients\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/http-client-contracts/tree/v3.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-04-18T09:32:20+00:00\"\n },\n {\n \"name\": \"symfony/http-foundation\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-foundation.git\",\n \"reference\": \"e30ef73b1e44eea7eb37ba69600a354e553f694b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-foundation/zipball/e30ef73b1e44eea7eb37ba69600a354e553f694b\",\n \"reference\": \"e30ef73b1e44eea7eb37ba69600a354e553f694b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-mbstring\": \"~1.1\",\n \"symfony/polyfill-php83\": \"^1.27\"\n },\n \"conflict\": {\n \"doctrine/dbal\": \"<3.6\",\n \"symfony/cache\": \"<6.4\"\n },\n \"require-dev\": {\n \"doctrine/dbal\": \"^3.6|^4\",\n \"predis/predis\": \"^1.1|^2.0\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/mime\": \"^6.4|^7.0\",\n \"symfony/rate-limiter\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\HttpFoundation\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Defines an object-oriented layer for the HTTP specification\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/http-foundation/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T08:28:38+00:00\"\n },\n {\n \"name\": \"symfony/http-kernel\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-kernel.git\",\n \"reference\": \"44204d96150a9df1fc57601ec933d23fefc2d65b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b\",\n \"reference\": \"44204d96150a9df1fc57601ec933d23fefc2d65b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/error-handler\": \"^6.4|^7.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/polyfill-ctype\": \"^1.8\"\n },\n \"conflict\": {\n \"symfony/browser-kit\": \"<6.4\",\n \"symfony/cache\": \"<6.4\",\n \"symfony/config\": \"<6.4\",\n \"symfony/console\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/doctrine-bridge\": \"<6.4\",\n \"symfony/form\": \"<6.4\",\n \"symfony/http-client\": \"<6.4\",\n \"symfony/http-client-contracts\": \"<2.5\",\n \"symfony/mailer\": \"<6.4\",\n \"symfony/messenger\": \"<6.4\",\n \"symfony/translation\": \"<6.4\",\n \"symfony/translation-contracts\": \"<2.5\",\n \"symfony/twig-bridge\": \"<6.4\",\n \"symfony/validator\": \"<6.4\",\n \"symfony/var-dumper\": \"<6.4\",\n \"twig/twig\": \"<3.0.4\"\n },\n \"provide\": {\n \"psr/log-implementation\": \"1.0|2.0|3.0\"\n },\n \"require-dev\": {\n \"psr/cache\": \"^1.0|^2.0|^3.0\",\n \"symfony/browser-kit\": \"^6.4|^7.0\",\n \"symfony/clock\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/css-selector\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/dom-crawler\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/finder\": \"^6.4|^7.0\",\n \"symfony/http-client-contracts\": \"^2.5|^3\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/property-access\": \"^7.1\",\n \"symfony/routing\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^7.1\",\n \"symfony/stopwatch\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4|^7.0\",\n \"symfony/translation-contracts\": \"^2.5|^3\",\n \"symfony/uid\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\",\n \"symfony/var-exporter\": \"^6.4|^7.0\",\n \"twig/twig\": \"^3.0.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\HttpKernel\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides a structured process for converting a Request into a Response\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/http-kernel/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-21T06:09:21+00:00\"\n },\n {\n \"name\": \"symfony/intl\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/intl.git\",\n \"reference\": \"a0ba7a400e4c915500762c998355bea219a32d6b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/intl/zipball/a0ba7a400e4c915500762c998355bea219a32d6b\",\n \"reference\": \"a0ba7a400e4c915500762c998355bea219a32d6b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/string\": \"<7.1\"\n },\n \"require-dev\": {\n \"symfony/filesystem\": \"^6.4|^7.0\",\n \"symfony/var-exporter\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Intl\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\",\n \"/Resources/data/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@gmail.com\"\n },\n {\n \"name\": \"Eriksen Costa\",\n \"email\": \"eriksen.costa@infranology.com.br\"\n },\n {\n \"name\": \"Igor Wiedler\",\n \"email\": \"igor@wiedler.ch\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides access to the localization data of the ICU library\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"i18n\",\n \"icu\",\n \"internationalization\",\n \"intl\",\n \"l10n\",\n \"localization\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/intl/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T08:28:38+00:00\"\n },\n {\n \"name\": \"symfony/mailer\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/mailer.git\",\n \"reference\": \"bbf21460c56f29810da3df3e206e38dfbb01e80b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/mailer/zipball/bbf21460c56f29810da3df3e206e38dfbb01e80b\",\n \"reference\": \"bbf21460c56f29810da3df3e206e38dfbb01e80b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"egulias/email-validator\": \"^2.1.10|^3|^4\",\n \"php\": \">=8.2\",\n \"psr/event-dispatcher\": \"^1\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/mime\": \"^6.4|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/http-client-contracts\": \"<2.5\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/messenger\": \"<6.4\",\n \"symfony/mime\": \"<6.4\",\n \"symfony/twig-bridge\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/twig-bridge\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Mailer\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Helps sending emails\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/mailer/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-08T12:32:26+00:00\"\n },\n {\n \"name\": \"symfony/messenger\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/messenger.git\",\n \"reference\": \"e1c0ced845e3dac12ab428c5ed42dbe7a58ca576\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/messenger/zipball/e1c0ced845e3dac12ab428c5ed42dbe7a58ca576\",\n \"reference\": \"e1c0ced845e3dac12ab428c5ed42dbe7a58ca576\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/clock\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"symfony/console\": \"<6.4\",\n \"symfony/event-dispatcher\": \"<6.4\",\n \"symfony/event-dispatcher-contracts\": \"<2.5\",\n \"symfony/framework-bundle\": \"<6.4\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/serializer\": \"<6.4\"\n },\n \"require-dev\": {\n \"psr/cache\": \"^1.0|^2.0|^3.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/rate-limiter\": \"^6.4|^7.0\",\n \"symfony/routing\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/stopwatch\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Messenger\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Samuel Roze\",\n \"email\": \"samuel.roze@gmail.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Helps applications send and receive messages to/from other applications or via message queues\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/messenger/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-08T12:32:26+00:00\"\n },\n {\n \"name\": \"symfony/mime\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/mime.git\",\n \"reference\": \"711d2e167e8ce65b05aea6b258c449671cdd38ff\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff\",\n \"reference\": \"711d2e167e8ce65b05aea6b258c449671cdd38ff\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-intl-idn\": \"^1.10\",\n \"symfony/polyfill-mbstring\": \"^1.0\"\n },\n \"conflict\": {\n \"egulias/email-validator\": \"~3.0.0\",\n \"phpdocumentor/reflection-docblock\": \"<3.2.2\",\n \"phpdocumentor/type-resolver\": \"<1.4.0\",\n \"symfony/mailer\": \"<6.4\",\n \"symfony/serializer\": \"<6.4.3|>7.0,<7.0.3\"\n },\n \"require-dev\": {\n \"egulias/email-validator\": \"^2.1.10|^3.1|^4\",\n \"league/html-to-markdown\": \"^5.0\",\n \"phpdocumentor/reflection-docblock\": \"^3.0|^4.0|^5.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/property-info\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4.3|^7.0.3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Mime\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Allows manipulating MIME messages\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"mime\",\n \"mime-type\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/mime/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T08:28:38+00:00\"\n },\n {\n \"name\": \"symfony/monolog-bridge\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/monolog-bridge.git\",\n \"reference\": \"727be11ae17bb1c5a7f600753b9a1bf0cc0ec3b8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/monolog-bridge/zipball/727be11ae17bb1c5a7f600753b9a1bf0cc0ec3b8\",\n \"reference\": \"727be11ae17bb1c5a7f600753b9a1bf0cc0ec3b8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"monolog/monolog\": \"^3\",\n \"php\": \">=8.2\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/console\": \"<6.4\",\n \"symfony/http-foundation\": \"<6.4\",\n \"symfony/security-core\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/mailer\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/mime\": \"^6.4|^7.0\",\n \"symfony/security-core\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"type\": \"symfony-bridge\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bridge\\\\Monolog\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides integration for Monolog with various Symfony components\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/monolog-bridge/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/monolog-bundle\",\n \"version\": \"v3.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/monolog-bundle.git\",\n \"reference\": \"414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181\",\n \"reference\": \"414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"monolog/monolog\": \"^1.25.1 || ^2.0 || ^3.0\",\n \"php\": \">=7.2.5\",\n \"symfony/config\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/dependency-injection\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/http-kernel\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/monolog-bridge\": \"^5.4 || ^6.0 || ^7.0\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/phpunit-bridge\": \"^6.3 || ^7.0\",\n \"symfony/yaml\": \"^5.4 || ^6.0 || ^7.0\"\n },\n \"type\": \"symfony-bundle\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bundle\\\\MonologBundle\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony MonologBundle\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"log\",\n \"logging\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/symfony/monolog-bundle/issues\",\n \"source\": \"https://github.com/symfony/monolog-bundle/tree/v3.10.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2023-11-06T17:08:13+00:00\"\n },\n {\n \"name\": \"symfony/notifier\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/notifier.git\",\n \"reference\": \"843946b0b1018ddc714b467f223607c71f9f6c8f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/notifier/zipball/843946b0b1018ddc714b467f223607c71f9f6c8f\",\n \"reference\": \"843946b0b1018ddc714b467f223607c71f9f6c8f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/log\": \"^1|^2|^3\"\n },\n \"conflict\": {\n \"symfony/event-dispatcher\": \"<6.4\",\n \"symfony/event-dispatcher-contracts\": \"<2.5\",\n \"symfony/http-client-contracts\": \"<2.5\",\n \"symfony/http-kernel\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/event-dispatcher-contracts\": \"^2.5|^3\",\n \"symfony/http-client-contracts\": \"^2.5|^3\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Notifier\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Sends notifications via one or more channels (email, SMS, ...)\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"notification\",\n \"notifier\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/notifier/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-08T12:32:26+00:00\"\n },\n {\n \"name\": \"symfony/options-resolver\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/options-resolver.git\",\n \"reference\": \"47aa818121ed3950acd2b58d1d37d08a94f9bf55\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55\",\n \"reference\": \"47aa818121ed3950acd2b58d1d37d08a94f9bf55\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\OptionsResolver\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides an improved replacement for the array_replace PHP function\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"config\",\n \"configuration\",\n \"options\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/options-resolver/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/password-hasher\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/password-hasher.git\",\n \"reference\": \"4ad96eb7cf9e2f8f133ada95f2b8021769061662\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/password-hasher/zipball/4ad96eb7cf9e2f8f133ada95f2b8021769061662\",\n \"reference\": \"4ad96eb7cf9e2f8f133ada95f2b8021769061662\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"conflict\": {\n \"symfony/security-core\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/security-core\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\PasswordHasher\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Robin Chalas\",\n \"email\": \"robin.chalas@gmail.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides password hashing utilities\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"hashing\",\n \"password\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/password-hasher/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-intl-grapheme\",\n \"version\": \"v1.31.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-intl-grapheme.git\",\n \"reference\": \"b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe\",\n \"reference\": \"b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"suggest\": {\n \"ext-intl\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"name\": \"symfony/polyfill\",\n \"url\": \"https://github.com/symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Intl\\\\Grapheme\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for intl's grapheme_* functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"grapheme\",\n \"intl\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-intl-icu\",\n \"version\": \"v1.31.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-intl-icu.git\",\n \"reference\": \"d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78\",\n \"reference\": \"d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"suggest\": {\n \"ext-intl\": \"For best performance and support of other locales than \\\"en\\\"\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"name\": \"symfony/polyfill\",\n \"url\": \"https://github.com/symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Intl\\\\Icu\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ],\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for intl's ICU-related data and classes\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"icu\",\n \"intl\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-intl-icu/tree/v1.31.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-intl-idn\",\n \"version\": \"v1.31.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-intl-idn.git\",\n \"reference\": \"c36586dcf89a12315939e00ec9b4474adcb1d773\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773\",\n \"reference\": \"c36586dcf89a12315939e00ec9b4474adcb1d773\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\",\n \"symfony/polyfill-intl-normalizer\": \"^1.10\"\n },\n \"suggest\": {\n \"ext-intl\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"name\": \"symfony/polyfill\",\n \"url\": \"https://github.com/symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Intl\\\\Idn\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Laurent Bassin\",\n \"email\": \"laurent@bassin.info\"\n },\n {\n \"name\": \"Trevor Rowbotham\",\n \"email\": \"trevor.rowbotham@pm.me\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"idn\",\n \"intl\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-intl-normalizer\",\n \"version\": \"v1.31.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-intl-normalizer.git\",\n \"reference\": \"3833d7255cc303546435cb650316bff708a1c75c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c\",\n \"reference\": \"3833d7255cc303546435cb650316bff708a1c75c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"suggest\": {\n \"ext-intl\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"name\": \"symfony/polyfill\",\n \"url\": \"https://github.com/symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Intl\\\\Normalizer\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for intl's Normalizer class and related functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"intl\",\n \"normalizer\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-mbstring\",\n \"version\": \"v1.31.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-mbstring.git\",\n \"reference\": \"85181ba99b2345b0ef10ce42ecac37612d9fd341\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341\",\n \"reference\": \"85181ba99b2345b0ef10ce42ecac37612d9fd341\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"provide\": {\n \"ext-mbstring\": \"*\"\n },\n \"suggest\": {\n \"ext-mbstring\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"name\": \"symfony/polyfill\",\n \"url\": \"https://github.com/symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Mbstring\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for the Mbstring extension\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"mbstring\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-mbstring/tree/v1.31.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php83\",\n \"version\": \"v1.31.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php83.git\",\n \"reference\": \"2fb86d65e2d424369ad2905e83b236a8805ba491\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491\",\n \"reference\": \"2fb86d65e2d424369ad2905e83b236a8805ba491\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"name\": \"symfony/polyfill\",\n \"url\": \"https://github.com/symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php83\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php83/tree/v1.31.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/process\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/process.git\",\n \"reference\": \"5c03ee6369281177f07f7c68252a280beccba847\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847\",\n \"reference\": \"5c03ee6369281177f07f7c68252a280beccba847\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Process\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Executes commands in sub-processes\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/process/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-19T21:48:23+00:00\"\n },\n {\n \"name\": \"symfony/property-access\",\n \"version\": \"v7.1.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/property-access.git\",\n \"reference\": \"6c709f97103355016e5782d0622437ae381012ad\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/property-access/zipball/6c709f97103355016e5782d0622437ae381012ad\",\n \"reference\": \"6c709f97103355016e5782d0622437ae381012ad\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/property-info\": \"^6.4|^7.0\"\n },\n \"require-dev\": {\n \"symfony/cache\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\PropertyAccess\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides functions to read and write from/to an object or array using a simple string notation\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"access\",\n \"array\",\n \"extraction\",\n \"index\",\n \"injection\",\n \"object\",\n \"property\",\n \"property-path\",\n \"reflection\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/property-access/tree/v7.1.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-08-30T16:12:47+00:00\"\n },\n {\n \"name\": \"symfony/property-info\",\n \"version\": \"v7.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/property-info.git\",\n \"reference\": \"88a279df2db5b7919cac6f35d6a5d1d7147e6a9b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/property-info/zipball/88a279df2db5b7919cac6f35d6a5d1d7147e6a9b\",\n \"reference\": \"88a279df2db5b7919cac6f35d6a5d1d7147e6a9b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/string\": \"^6.4|^7.0\",\n \"symfony/type-info\": \"^7.1\"\n },\n \"conflict\": {\n \"phpdocumentor/reflection-docblock\": \"<5.2\",\n \"phpdocumentor/type-resolver\": \"<1.5.1\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/serializer\": \"<6.4\"\n },\n \"require-dev\": {\n \"phpdocumentor/reflection-docblock\": \"^5.2\",\n \"phpstan/phpdoc-parser\": \"^1.0\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\PropertyInfo\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Kévin Dunglas\",\n \"email\": \"dunglas@gmail.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Extracts information about PHP class' properties using metadata of popular sources\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"doctrine\",\n \"phpdoc\",\n \"property\",\n \"symfony\",\n \"type\",\n \"validator\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/property-info/tree/v7.1.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-07-26T07:36:36+00:00\"\n },\n {\n \"name\": \"symfony/routing\",\n \"version\": \"v7.1.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/routing.git\",\n \"reference\": \"1500aee0094a3ce1c92626ed8cf3c2037e86f5a7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/routing/zipball/1500aee0094a3ce1c92626ed8cf3c2037e86f5a7\",\n \"reference\": \"1500aee0094a3ce1c92626ed8cf3c2037e86f5a7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/config\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/yaml\": \"<6.4\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/yaml\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Routing\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Maps an HTTP request to a set of configuration variables\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"router\",\n \"routing\",\n \"uri\",\n \"url\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/routing/tree/v7.1.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-08-29T08:16:25+00:00\"\n },\n {\n \"name\": \"symfony/runtime\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/runtime.git\",\n \"reference\": \"ea34522c447dd91a2b31cb330ee4540a56ba53f6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/runtime/zipball/ea34522c447dd91a2b31cb330ee4540a56ba53f6\",\n \"reference\": \"ea34522c447dd91a2b31cb330ee4540a56ba53f6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-plugin-api\": \"^1.0|^2.0\",\n \"php\": \">=8.2\"\n },\n \"conflict\": {\n \"symfony/dotenv\": \"<6.4\"\n },\n \"require-dev\": {\n \"composer/composer\": \"^2.6\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/dotenv\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\"\n },\n \"type\": \"composer-plugin\",\n \"extra\": {\n \"class\": \"Symfony\\\\Component\\\\Runtime\\\\Internal\\\\ComposerPlugin\"\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Runtime\\\\\": \"\",\n \"Symfony\\\\Runtime\\\\Symfony\\\\Component\\\\\": \"Internal/\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Enables decoupling PHP applications from global state\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"runtime\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/runtime/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:55:39+00:00\"\n },\n {\n \"name\": \"symfony/security-bundle\",\n \"version\": \"v7.1.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/security-bundle.git\",\n \"reference\": \"5e10107856ff64d477c61fed7bcbb8a16125ea01\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/security-bundle/zipball/5e10107856ff64d477c61fed7bcbb8a16125ea01\",\n \"reference\": \"5e10107856ff64d477c61fed7bcbb8a16125ea01\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \">=2.1\",\n \"ext-xml\": \"*\",\n \"php\": \">=8.2\",\n \"symfony/clock\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4.11|^7.1.4\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/password-hasher\": \"^6.4|^7.0\",\n \"symfony/security-core\": \"^6.4|^7.0\",\n \"symfony/security-csrf\": \"^6.4|^7.0\",\n \"symfony/security-http\": \"^7.1\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/browser-kit\": \"<6.4\",\n \"symfony/console\": \"<6.4\",\n \"symfony/framework-bundle\": \"<6.4\",\n \"symfony/http-client\": \"<6.4\",\n \"symfony/ldap\": \"<6.4\",\n \"symfony/serializer\": \"<6.4\",\n \"symfony/twig-bundle\": \"<6.4\",\n \"symfony/validator\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/asset\": \"^6.4|^7.0\",\n \"symfony/browser-kit\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/css-selector\": \"^6.4|^7.0\",\n \"symfony/dom-crawler\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/form\": \"^6.4|^7.0\",\n \"symfony/framework-bundle\": \"^6.4|^7.0\",\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/ldap\": \"^6.4|^7.0\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/rate-limiter\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4|^7.0\",\n \"symfony/twig-bridge\": \"^6.4|^7.0\",\n \"symfony/twig-bundle\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\",\n \"symfony/yaml\": \"^6.4|^7.0\",\n \"twig/twig\": \"^3.0.4\",\n \"web-token/jwt-library\": \"^3.3.2|^4.0\"\n },\n \"type\": \"symfony-bundle\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bundle\\\\SecurityBundle\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides a tight integration of the Security component into the Symfony full-stack framework\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/security-bundle/tree/v7.1.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-08-20T11:38:55+00:00\"\n },\n {\n \"name\": \"symfony/security-core\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/security-core.git\",\n \"reference\": \"dbeb09f0b786590d126c0da297e2320e66ec353b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/security-core/zipball/dbeb09f0b786590d126c0da297e2320e66ec353b\",\n \"reference\": \"dbeb09f0b786590d126c0da297e2320e66ec353b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/event-dispatcher-contracts\": \"^2.5|^3\",\n \"symfony/password-hasher\": \"^6.4|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/event-dispatcher\": \"<6.4\",\n \"symfony/http-foundation\": \"<6.4\",\n \"symfony/ldap\": \"<6.4\",\n \"symfony/translation\": \"<6.4.3|>=7.0,<7.0.3\",\n \"symfony/validator\": \"<6.4\"\n },\n \"require-dev\": {\n \"psr/cache\": \"^1.0|^2.0|^3.0\",\n \"psr/container\": \"^1.1|^2.0\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/ldap\": \"^6.4|^7.0\",\n \"symfony/string\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4.3|^7.0.3\",\n \"symfony/validator\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Security\\\\Core\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony Security Component - Core Library\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/security-core/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T13:35:23+00:00\"\n },\n {\n \"name\": \"symfony/security-csrf\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/security-csrf.git\",\n \"reference\": \"27cd1bce9d7f3457a152a6ca9790712d6954dd21\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/security-csrf/zipball/27cd1bce9d7f3457a152a6ca9790712d6954dd21\",\n \"reference\": \"27cd1bce9d7f3457a152a6ca9790712d6954dd21\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/security-core\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"symfony/http-foundation\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/http-foundation\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Security\\\\Csrf\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony Security Component - CSRF Library\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/security-csrf/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/security-http\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/security-http.git\",\n \"reference\": \"d47c013bccf4b81a1496826d42dfa05da549131a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/security-http/zipball/d47c013bccf4b81a1496826d42dfa05da549131a\",\n \"reference\": \"d47c013bccf4b81a1496826d42dfa05da549131a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/polyfill-mbstring\": \"~1.0\",\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/security-core\": \"^6.4|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/clock\": \"<6.4\",\n \"symfony/event-dispatcher\": \"<6.4\",\n \"symfony/http-client-contracts\": \"<3.0\",\n \"symfony/security-bundle\": \"<6.4\",\n \"symfony/security-csrf\": \"<6.4\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/clock\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/http-client-contracts\": \"^3.0\",\n \"symfony/rate-limiter\": \"^6.4|^7.0\",\n \"symfony/routing\": \"^6.4|^7.0\",\n \"symfony/security-csrf\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4|^7.0\",\n \"web-token/jwt-library\": \"^3.3.2|^4.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Security\\\\Http\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony Security Component - HTTP Integration\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/security-http/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T08:28:38+00:00\"\n },\n {\n \"name\": \"symfony/serializer\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/serializer.git\",\n \"reference\": \"71d6e1f70f00752d1469d0f5e83b0a51716f288b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/serializer/zipball/71d6e1f70f00752d1469d0f5e83b0a51716f288b\",\n \"reference\": \"71d6e1f70f00752d1469d0f5e83b0a51716f288b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-ctype\": \"~1.8\"\n },\n \"conflict\": {\n \"phpdocumentor/reflection-docblock\": \"<3.2.2\",\n \"phpdocumentor/type-resolver\": \"<1.4.0\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/property-access\": \"<6.4\",\n \"symfony/property-info\": \"<6.4\",\n \"symfony/type-info\": \"<7.1.5\",\n \"symfony/uid\": \"<6.4\",\n \"symfony/validator\": \"<6.4\",\n \"symfony/yaml\": \"<6.4\"\n },\n \"require-dev\": {\n \"phpdocumentor/reflection-docblock\": \"^3.2|^4.0|^5.0\",\n \"phpstan/phpdoc-parser\": \"^1.0\",\n \"seld/jsonlint\": \"^1.10\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/error-handler\": \"^6.4|^7.0\",\n \"symfony/filesystem\": \"^6.4|^7.0\",\n \"symfony/form\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/mime\": \"^6.4|^7.0\",\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/property-info\": \"^6.4|^7.0\",\n \"symfony/translation-contracts\": \"^2.5|^3\",\n \"symfony/type-info\": \"^7.1.5\",\n \"symfony/uid\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\",\n \"symfony/var-exporter\": \"^6.4|^7.0\",\n \"symfony/yaml\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Serializer\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/serializer/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T12:13:15+00:00\"\n },\n {\n \"name\": \"symfony/service-contracts\",\n \"version\": \"v3.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/service-contracts.git\",\n \"reference\": \"bd1d9e59a81d8fa4acdcea3f617c581f7475a80f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f\",\n \"reference\": \"bd1d9e59a81d8fa4acdcea3f617c581f7475a80f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/container\": \"^1.1|^2.0\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"ext-psr\": \"<1.1|>=2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.5-dev\"\n },\n \"thanks\": {\n \"name\": \"symfony/contracts\",\n \"url\": \"https://github.com/symfony/contracts\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\Service\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Test/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to writing services\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/service-contracts/tree/v3.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-04-18T09:32:20+00:00\"\n },\n {\n \"name\": \"symfony/stimulus-bundle\",\n \"version\": \"v2.20.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/stimulus-bundle.git\",\n \"reference\": \"ae69e3a764694b9f45d8a009dd2b8c22444c5e0c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/stimulus-bundle/zipball/ae69e3a764694b9f45d8a009dd2b8c22444c5e0c\",\n \"reference\": \"ae69e3a764694b9f45d8a009dd2b8c22444c5e0c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"symfony/config\": \"^5.4|^6.0|^7.0\",\n \"symfony/dependency-injection\": \"^5.4|^6.0|^7.0\",\n \"symfony/deprecation-contracts\": \"^2.0|^3.0\",\n \"symfony/finder\": \"^5.4|^6.0|^7.0\",\n \"symfony/http-kernel\": \"^5.4|^6.0|^7.0\",\n \"twig/twig\": \"^2.15.3|^3.8\"\n },\n \"require-dev\": {\n \"symfony/asset-mapper\": \"^6.3|^7.0\",\n \"symfony/framework-bundle\": \"^5.4|^6.0|^7.0\",\n \"symfony/phpunit-bridge\": \"^5.4|^6.0|^7.0\",\n \"symfony/twig-bundle\": \"^5.4|^6.0|^7.0\",\n \"zenstruck/browser\": \"^1.4\"\n },\n \"type\": \"symfony-bundle\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\UX\\\\StimulusBundle\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Integration with your Symfony app & Stimulus!\",\n \"keywords\": [\n \"symfony-ux\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/stimulus-bundle/tree/v2.20.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-24T09:27:42+00:00\"\n },\n {\n \"name\": \"symfony/stopwatch\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/stopwatch.git\",\n \"reference\": \"5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d\",\n \"reference\": \"5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Stopwatch\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides a way to profile code\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/stopwatch/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/string\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/string.git\",\n \"reference\": \"d66f9c343fa894ec2037cc928381df90a7ad4306\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306\",\n \"reference\": \"d66f9c343fa894ec2037cc928381df90a7ad4306\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-intl-grapheme\": \"~1.0\",\n \"symfony/polyfill-intl-normalizer\": \"~1.0\",\n \"symfony/polyfill-mbstring\": \"~1.0\"\n },\n \"conflict\": {\n \"symfony/translation-contracts\": \"<2.5\"\n },\n \"require-dev\": {\n \"symfony/emoji\": \"^7.1\",\n \"symfony/error-handler\": \"^6.4|^7.0\",\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/intl\": \"^6.4|^7.0\",\n \"symfony/translation-contracts\": \"^2.5|^3.0\",\n \"symfony/var-exporter\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/functions.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\String\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"grapheme\",\n \"i18n\",\n \"string\",\n \"unicode\",\n \"utf-8\",\n \"utf8\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/string/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T08:28:38+00:00\"\n },\n {\n \"name\": \"symfony/translation\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/translation.git\",\n \"reference\": \"235535e3f84f3dfbdbde0208ede6ca75c3a489ea\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea\",\n \"reference\": \"235535e3f84f3dfbdbde0208ede6ca75c3a489ea\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-mbstring\": \"~1.0\",\n \"symfony/translation-contracts\": \"^2.5|^3.0\"\n },\n \"conflict\": {\n \"symfony/config\": \"<6.4\",\n \"symfony/console\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/http-client-contracts\": \"<2.5\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/service-contracts\": \"<2.5\",\n \"symfony/twig-bundle\": \"<6.4\",\n \"symfony/yaml\": \"<6.4\"\n },\n \"provide\": {\n \"symfony/translation-implementation\": \"2.3|3.0\"\n },\n \"require-dev\": {\n \"nikic/php-parser\": \"^4.18|^5.0\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/finder\": \"^6.4|^7.0\",\n \"symfony/http-client-contracts\": \"^2.5|^3.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/intl\": \"^6.4|^7.0\",\n \"symfony/polyfill-intl-icu\": \"^1.21\",\n \"symfony/routing\": \"^6.4|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/yaml\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/functions.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Translation\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools to internationalize your application\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/translation/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-16T06:30:38+00:00\"\n },\n {\n \"name\": \"symfony/translation-contracts\",\n \"version\": \"v3.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/translation-contracts.git\",\n \"reference\": \"b9d2189887bb6b2e0367a9fc7136c5239ab9b05a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a\",\n \"reference\": \"b9d2189887bb6b2e0367a9fc7136c5239ab9b05a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.5-dev\"\n },\n \"thanks\": {\n \"name\": \"symfony/contracts\",\n \"url\": \"https://github.com/symfony/contracts\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\Translation\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Test/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to translation\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/translation-contracts/tree/v3.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-04-18T09:32:20+00:00\"\n },\n {\n \"name\": \"symfony/twig-bridge\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/twig-bridge.git\",\n \"reference\": \"e997e5025b53c0f7b17632802daefdd6a04540ae\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/twig-bridge/zipball/e997e5025b53c0f7b17632802daefdd6a04540ae\",\n \"reference\": \"e997e5025b53c0f7b17632802daefdd6a04540ae\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/translation-contracts\": \"^2.5|^3\",\n \"twig/twig\": \"^3.9\"\n },\n \"conflict\": {\n \"phpdocumentor/reflection-docblock\": \"<3.2.2\",\n \"phpdocumentor/type-resolver\": \"<1.4.0\",\n \"symfony/console\": \"<6.4\",\n \"symfony/form\": \"<6.4\",\n \"symfony/http-foundation\": \"<6.4\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/mime\": \"<6.4\",\n \"symfony/serializer\": \"<6.4\",\n \"symfony/translation\": \"<6.4\",\n \"symfony/workflow\": \"<6.4\"\n },\n \"require-dev\": {\n \"egulias/email-validator\": \"^2.1.10|^3|^4\",\n \"league/html-to-markdown\": \"^5.0\",\n \"phpdocumentor/reflection-docblock\": \"^3.0|^4.0|^5.0\",\n \"symfony/asset\": \"^6.4|^7.0\",\n \"symfony/asset-mapper\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/emoji\": \"^7.1\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/finder\": \"^6.4|^7.0\",\n \"symfony/form\": \"^6.4|^7.0\",\n \"symfony/html-sanitizer\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/intl\": \"^6.4|^7.0\",\n \"symfony/mime\": \"^6.4|^7.0\",\n \"symfony/polyfill-intl-icu\": \"~1.0\",\n \"symfony/property-info\": \"^6.4|^7.0\",\n \"symfony/routing\": \"^6.4|^7.0\",\n \"symfony/security-acl\": \"^2.8|^3.0\",\n \"symfony/security-core\": \"^6.4|^7.0\",\n \"symfony/security-csrf\": \"^6.4|^7.0\",\n \"symfony/security-http\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4.3|^7.0.3\",\n \"symfony/stopwatch\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4|^7.0\",\n \"symfony/web-link\": \"^6.4|^7.0\",\n \"symfony/workflow\": \"^6.4|^7.0\",\n \"symfony/yaml\": \"^6.4|^7.0\",\n \"twig/cssinliner-extra\": \"^2.12|^3\",\n \"twig/inky-extra\": \"^2.12|^3\",\n \"twig/markdown-extra\": \"^2.12|^3\"\n },\n \"type\": \"symfony-bridge\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bridge\\\\Twig\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides integration for Twig with various Symfony components\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/twig-bridge/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-15T06:48:17+00:00\"\n },\n {\n \"name\": \"symfony/twig-bundle\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/twig-bundle.git\",\n \"reference\": \"4e6afd0dc8396f16861b682f3b854ff6e24bfb7e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/twig-bundle/zipball/4e6afd0dc8396f16861b682f3b854ff6e24bfb7e\",\n \"reference\": \"4e6afd0dc8396f16861b682f3b854ff6e24bfb7e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \">=2.1\",\n \"php\": \">=8.2\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/twig-bridge\": \"^6.4|^7.0\",\n \"twig/twig\": \"^3.0.4\"\n },\n \"conflict\": {\n \"symfony/framework-bundle\": \"<6.4\",\n \"symfony/translation\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/asset\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/finder\": \"^6.4|^7.0\",\n \"symfony/form\": \"^6.4|^7.0\",\n \"symfony/framework-bundle\": \"^6.4|^7.0\",\n \"symfony/routing\": \"^6.4|^7.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4|^7.0\",\n \"symfony/web-link\": \"^6.4|^7.0\",\n \"symfony/yaml\": \"^6.4|^7.0\"\n },\n \"type\": \"symfony-bundle\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bundle\\\\TwigBundle\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides a tight integration of Twig into the Symfony full-stack framework\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/twig-bundle/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-08T12:32:26+00:00\"\n },\n {\n \"name\": \"symfony/type-info\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/type-info.git\",\n \"reference\": \"9f6094aa900d2c06bd61576a6f279d4ac441515f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/type-info/zipball/9f6094aa900d2c06bd61576a6f279d4ac441515f\",\n \"reference\": \"9f6094aa900d2c06bd61576a6f279d4ac441515f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/container\": \"^1.1|^2.0\"\n },\n \"conflict\": {\n \"phpstan/phpdoc-parser\": \"<1.0\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/property-info\": \"<6.4\"\n },\n \"require-dev\": {\n \"phpstan/phpdoc-parser\": \"^1.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/property-info\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\TypeInfo\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mathias Arlaud\",\n \"email\": \"mathias.arlaud@gmail.com\"\n },\n {\n \"name\": \"Baptiste LEDUC\",\n \"email\": \"baptiste.leduc@gmail.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Extracts PHP types information.\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"PHPStan\",\n \"phpdoc\",\n \"symfony\",\n \"type\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/type-info/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-19T21:48:23+00:00\"\n },\n {\n \"name\": \"symfony/ux-turbo\",\n \"version\": \"v2.20.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/ux-turbo.git\",\n \"reference\": \"5eaa803dea9f954aa124963f2c872b414d97cc97\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/ux-turbo/zipball/5eaa803dea9f954aa124963f2c872b414d97cc97\",\n \"reference\": \"5eaa803dea9f954aa124963f2c872b414d97cc97\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"symfony/stimulus-bundle\": \"^2.9.1\"\n },\n \"conflict\": {\n \"symfony/flex\": \"<1.13\"\n },\n \"require-dev\": {\n \"dbrekelmans/bdi\": \"dev-main\",\n \"doctrine/doctrine-bundle\": \"^2.4.3\",\n \"doctrine/orm\": \"^2.8 | 3.0\",\n \"phpstan/phpstan\": \"^1.10\",\n \"symfony/debug-bundle\": \"^5.4|^6.0|^7.0\",\n \"symfony/expression-language\": \"^5.4|^6.0|^7.0\",\n \"symfony/form\": \"^5.4|^6.0|^7.0\",\n \"symfony/framework-bundle\": \"^5.4|^6.0|^7.0\",\n \"symfony/mercure-bundle\": \"^0.3.7\",\n \"symfony/messenger\": \"^5.4|^6.0|^7.0\",\n \"symfony/panther\": \"^1.0|^2.0\",\n \"symfony/phpunit-bridge\": \"^5.4|^6.0|^7.0\",\n \"symfony/process\": \"^5.4|6.3.*|^7.0\",\n \"symfony/property-access\": \"^5.4|^6.0|^7.0\",\n \"symfony/security-core\": \"^5.4|^6.0|^7.0\",\n \"symfony/stopwatch\": \"^5.4|^6.0|^7.0\",\n \"symfony/twig-bundle\": \"^5.4|^6.0|^7.0\",\n \"symfony/web-profiler-bundle\": \"^5.4|^6.0|^7.0\",\n \"symfony/webpack-encore-bundle\": \"^2.1.1\"\n },\n \"type\": \"symfony-bundle\",\n \"extra\": {\n \"thanks\": {\n \"name\": \"symfony/ux\",\n \"url\": \"https://github.com/symfony/ux\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\UX\\\\Turbo\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Kévin Dunglas\",\n \"email\": \"kevin@dunglas.fr\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Hotwire Turbo integration for Symfony\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"hotwire\",\n \"javascript\",\n \"mercure\",\n \"symfony-ux\",\n \"turbo\",\n \"turbo-stream\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/ux-turbo/tree/v2.20.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-10T12:38:04+00:00\"\n },\n {\n \"name\": \"symfony/validator\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/validator.git\",\n \"reference\": \"e57592782dc2a86997477f28164c51af53512ad8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/validator/zipball/e57592782dc2a86997477f28164c51af53512ad8\",\n \"reference\": \"e57592782dc2a86997477f28164c51af53512ad8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-mbstring\": \"~1.0\",\n \"symfony/polyfill-php83\": \"^1.27\",\n \"symfony/translation-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"doctrine/lexer\": \"<1.1\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/doctrine-bridge\": \"<7.0\",\n \"symfony/expression-language\": \"<6.4\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/intl\": \"<6.4\",\n \"symfony/property-info\": \"<6.4\",\n \"symfony/translation\": \"<6.4.3|>=7.0,<7.0.3\",\n \"symfony/yaml\": \"<6.4\"\n },\n \"require-dev\": {\n \"egulias/email-validator\": \"^2.1.10|^3|^4\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/finder\": \"^6.4|^7.0\",\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/intl\": \"^6.4|^7.0\",\n \"symfony/mime\": \"^6.4|^7.0\",\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/property-info\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4.3|^7.0.3\",\n \"symfony/type-info\": \"^7.1\",\n \"symfony/yaml\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Validator\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\",\n \"/Resources/bin/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools to validate values\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/validator/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-20T08:28:38+00:00\"\n },\n {\n \"name\": \"symfony/var-dumper\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/var-dumper.git\",\n \"reference\": \"e20e03889539fd4e4211e14d2179226c513c010d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d\",\n \"reference\": \"e20e03889539fd4e4211e14d2179226c513c010d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-mbstring\": \"~1.0\"\n },\n \"conflict\": {\n \"symfony/console\": \"<6.4\"\n },\n \"require-dev\": {\n \"ext-iconv\": \"*\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/uid\": \"^6.4|^7.0\",\n \"twig/twig\": \"^3.0.4\"\n },\n \"bin\": [\n \"Resources/bin/var-dump-server\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/functions/dump.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\VarDumper\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides mechanisms for walking through any arbitrary PHP variable\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"debug\",\n \"dump\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/var-dumper/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-16T10:07:02+00:00\"\n },\n {\n \"name\": \"symfony/var-exporter\",\n \"version\": \"v7.1.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/var-exporter.git\",\n \"reference\": \"b80a669a2264609f07f1667f891dbfca25eba44c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/var-exporter/zipball/b80a669a2264609f07f1667f891dbfca25eba44c\",\n \"reference\": \"b80a669a2264609f07f1667f891dbfca25eba44c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\VarExporter\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Allows exporting any serializable PHP data structure to plain PHP code\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"clone\",\n \"construct\",\n \"export\",\n \"hydrate\",\n \"instantiate\",\n \"lazy-loading\",\n \"proxy\",\n \"serialize\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/var-exporter/tree/v7.1.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-06-28T08:00:31+00:00\"\n },\n {\n \"name\": \"symfony/web-link\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/web-link.git\",\n \"reference\": \"63f90aa0054bfd9a091d2f5cf465958f1030638f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/web-link/zipball/63f90aa0054bfd9a091d2f5cf465958f1030638f\",\n \"reference\": \"63f90aa0054bfd9a091d2f5cf465958f1030638f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/link\": \"^1.1|^2.0\"\n },\n \"conflict\": {\n \"symfony/http-kernel\": \"<6.4\"\n },\n \"provide\": {\n \"psr/link-implementation\": \"1.0|2.0\"\n },\n \"require-dev\": {\n \"symfony/http-kernel\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\WebLink\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Kévin Dunglas\",\n \"email\": \"dunglas@gmail.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Manages links between resources\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"dns-prefetch\",\n \"http\",\n \"http2\",\n \"link\",\n \"performance\",\n \"prefetch\",\n \"preload\",\n \"prerender\",\n \"psr13\",\n \"push\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/web-link/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/yaml\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/yaml.git\",\n \"reference\": \"4e561c316e135e053bd758bf3b3eb291d9919de4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4\",\n \"reference\": \"4e561c316e135e053bd758bf3b3eb291d9919de4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-ctype\": \"^1.8\"\n },\n \"conflict\": {\n \"symfony/console\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0\"\n },\n \"bin\": [\n \"Resources/bin/yaml-lint\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Yaml\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Loads and dumps YAML files\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/yaml/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-17T12:49:58+00:00\"\n },\n {\n \"name\": \"twig/extra-bundle\",\n \"version\": \"v3.13.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/twigphp/twig-extra-bundle.git\",\n \"reference\": \"21a9a7aa9f79d4493bb6fed4eb2794339f9551f5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/21a9a7aa9f79d4493bb6fed4eb2794339f9551f5\",\n \"reference\": \"21a9a7aa9f79d4493bb6fed4eb2794339f9551f5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0.2\",\n \"symfony/framework-bundle\": \"^5.4|^6.4|^7.0\",\n \"symfony/twig-bundle\": \"^5.4|^6.4|^7.0\",\n \"twig/twig\": \"^3.0|^4.0\"\n },\n \"require-dev\": {\n \"league/commonmark\": \"^1.0|^2.0\",\n \"symfony/phpunit-bridge\": \"^6.4|^7.0\",\n \"twig/cache-extra\": \"^3.0\",\n \"twig/cssinliner-extra\": \"^3.0\",\n \"twig/html-extra\": \"^3.0\",\n \"twig/inky-extra\": \"^3.0\",\n \"twig/intl-extra\": \"^3.0\",\n \"twig/markdown-extra\": \"^3.0\",\n \"twig/string-extra\": \"^3.0\"\n },\n \"type\": \"symfony-bundle\",\n \"autoload\": {\n \"psr-4\": {\n \"Twig\\\\Extra\\\\TwigExtraBundle\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\",\n \"homepage\": \"http://fabien.potencier.org\",\n \"role\": \"Lead Developer\"\n }\n ],\n \"description\": \"A Symfony bundle for extra Twig extensions\",\n \"homepage\": \"https://twig.symfony.com\",\n \"keywords\": [\n \"bundle\",\n \"extra\",\n \"twig\"\n ],\n \"support\": {\n \"source\": \"https://github.com/twigphp/twig-extra-bundle/tree/v3.13.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/twig/twig\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-01T20:39:12+00:00\"\n },\n {\n \"name\": \"twig/twig\",\n \"version\": \"v3.14.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/twigphp/Twig.git\",\n \"reference\": \"126b2c97818dbff0cdf3fbfc881aedb3d40aae72\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72\",\n \"reference\": \"126b2c97818dbff0cdf3fbfc881aedb3d40aae72\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-ctype\": \"^1.8\",\n \"symfony/polyfill-mbstring\": \"^1.3\",\n \"symfony/polyfill-php81\": \"^1.29\"\n },\n \"require-dev\": {\n \"psr/container\": \"^1.0|^2.0\",\n \"symfony/phpunit-bridge\": \"^5.4.9|^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/Resources/core.php\",\n \"src/Resources/debug.php\",\n \"src/Resources/escaper.php\",\n \"src/Resources/string_loader.php\"\n ],\n \"psr-4\": {\n \"Twig\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\",\n \"homepage\": \"http://fabien.potencier.org\",\n \"role\": \"Lead Developer\"\n },\n {\n \"name\": \"Twig Team\",\n \"role\": \"Contributors\"\n },\n {\n \"name\": \"Armin Ronacher\",\n \"email\": \"armin.ronacher@active-4.com\",\n \"role\": \"Project Founder\"\n }\n ],\n \"description\": \"Twig, the flexible, fast, and secure template language for PHP\",\n \"homepage\": \"https://twig.symfony.com\",\n \"keywords\": [\n \"templating\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/twigphp/Twig/issues\",\n \"source\": \"https://github.com/twigphp/Twig/tree/v3.14.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/twig/twig\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T17:55:12+00:00\"\n },\n {\n \"name\": \"webmozart/assert\",\n \"version\": \"1.11.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/webmozarts/assert.git\",\n \"reference\": \"11cb2199493b2f8a3b53e7f19068fc6aac760991\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991\",\n \"reference\": \"11cb2199493b2f8a3b53e7f19068fc6aac760991\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-ctype\": \"*\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"conflict\": {\n \"phpstan/phpstan\": \"<0.12.20\",\n \"vimeo/psalm\": \"<4.6.1 || 4.6.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.5.13\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.10-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Webmozart\\\\Assert\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@gmail.com\"\n }\n ],\n \"description\": \"Assertions to validate method input/output with nice error messages.\",\n \"keywords\": [\n \"assert\",\n \"check\",\n \"validate\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/webmozarts/assert/issues\",\n \"source\": \"https://github.com/webmozarts/assert/tree/1.11.0\"\n },\n \"time\": \"2022-06-03T18:03:27+00:00\"\n }\n ],\n \"packages-dev\": [\n {\n \"name\": \"masterminds/html5\",\n \"version\": \"2.9.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Masterminds/html5-php.git\",\n \"reference\": \"f5ac2c0b0a2eefca70b2ce32a5809992227e75a6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6\",\n \"reference\": \"f5ac2c0b0a2eefca70b2ce32a5809992227e75a6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"php\": \">=5.3.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.7-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Masterminds\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Matt Butcher\",\n \"email\": \"technosophos@gmail.com\"\n },\n {\n \"name\": \"Matt Farina\",\n \"email\": \"matt@mattfarina.com\"\n },\n {\n \"name\": \"Asmir Mustafic\",\n \"email\": \"goetas@gmail.com\"\n }\n ],\n \"description\": \"An HTML5 parser and serializer.\",\n \"homepage\": \"http://masterminds.github.io/html5-php\",\n \"keywords\": [\n \"HTML5\",\n \"dom\",\n \"html\",\n \"parser\",\n \"querypath\",\n \"serializer\",\n \"xml\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Masterminds/html5-php/issues\",\n \"source\": \"https://github.com/Masterminds/html5-php/tree/2.9.0\"\n },\n \"time\": \"2024-03-31T07:05:07+00:00\"\n },\n {\n \"name\": \"myclabs/deep-copy\",\n \"version\": \"1.12.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/myclabs/DeepCopy.git\",\n \"reference\": \"3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c\",\n \"reference\": \"3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\"\n },\n \"conflict\": {\n \"doctrine/collections\": \"<1.6.8\",\n \"doctrine/common\": \"<2.13.3 || >=3 <3.2.2\"\n },\n \"require-dev\": {\n \"doctrine/collections\": \"^1.6.8\",\n \"doctrine/common\": \"^2.13.3 || ^3.2.2\",\n \"phpspec/prophecy\": \"^1.10\",\n \"phpunit/phpunit\": \"^7.5.20 || ^8.5.23 || ^9.5.13\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/DeepCopy/deep_copy.php\"\n ],\n \"psr-4\": {\n \"DeepCopy\\\\\": \"src/DeepCopy/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Create deep copies (clones) of your objects\",\n \"keywords\": [\n \"clone\",\n \"copy\",\n \"duplicate\",\n \"object\",\n \"object graph\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/myclabs/DeepCopy/issues\",\n \"source\": \"https://github.com/myclabs/DeepCopy/tree/1.12.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/myclabs/deep-copy\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-06-12T14:39:25+00:00\"\n },\n {\n \"name\": \"nikic/php-parser\",\n \"version\": \"v5.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nikic/PHP-Parser.git\",\n \"reference\": \"23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nikic/PHP-Parser/zipball/23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb\",\n \"reference\": \"23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-ctype\": \"*\",\n \"ext-json\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"php\": \">=7.4\"\n },\n \"require-dev\": {\n \"ircmaxell/php-yacc\": \"^0.0.7\",\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"bin\": [\n \"bin/php-parse\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"PhpParser\\\\\": \"lib/PhpParser\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Nikita Popov\"\n }\n ],\n \"description\": \"A PHP parser written in PHP\",\n \"keywords\": [\n \"parser\",\n \"php\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nikic/PHP-Parser/issues\",\n \"source\": \"https://github.com/nikic/PHP-Parser/tree/v5.2.0\"\n },\n \"time\": \"2024-09-15T16:40:33+00:00\"\n },\n {\n \"name\": \"phar-io/manifest\",\n \"version\": \"2.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phar-io/manifest.git\",\n \"reference\": \"54750ef60c58e43759730615a392c31c80e23176\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176\",\n \"reference\": \"54750ef60c58e43759730615a392c31c80e23176\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-phar\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"phar-io/version\": \"^3.0.1\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0.x-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Arne Blankerts\",\n \"email\": \"arne@blankerts.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Heuer\",\n \"email\": \"sebastian@phpeople.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Component for reading phar.io manifest information from a PHP Archive (PHAR)\",\n \"support\": {\n \"issues\": \"https://github.com/phar-io/manifest/issues\",\n \"source\": \"https://github.com/phar-io/manifest/tree/2.0.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/theseer\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-03-03T12:33:53+00:00\"\n },\n {\n \"name\": \"phar-io/version\",\n \"version\": \"3.2.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phar-io/version.git\",\n \"reference\": \"4f7fd7836c6f332bb2933569e566a0d6c4cbed74\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74\",\n \"reference\": \"4f7fd7836c6f332bb2933569e566a0d6c4cbed74\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Arne Blankerts\",\n \"email\": \"arne@blankerts.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Heuer\",\n \"email\": \"sebastian@phpeople.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Library for handling version information and constraints\",\n \"support\": {\n \"issues\": \"https://github.com/phar-io/version/issues\",\n \"source\": \"https://github.com/phar-io/version/tree/3.2.1\"\n },\n \"time\": \"2022-02-21T01:04:05+00:00\"\n },\n {\n \"name\": \"phpunit/php-code-coverage\",\n \"version\": \"9.2.32\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-code-coverage.git\",\n \"reference\": \"85402a822d1ecf1db1096959413d35e1c37cf1a5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5\",\n \"reference\": \"85402a822d1ecf1db1096959413d35e1c37cf1a5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"nikic/php-parser\": \"^4.19.1 || ^5.1.0\",\n \"php\": \">=7.3\",\n \"phpunit/php-file-iterator\": \"^3.0.6\",\n \"phpunit/php-text-template\": \"^2.0.4\",\n \"sebastian/code-unit-reverse-lookup\": \"^2.0.3\",\n \"sebastian/complexity\": \"^2.0.3\",\n \"sebastian/environment\": \"^5.1.5\",\n \"sebastian/lines-of-code\": \"^1.0.4\",\n \"sebastian/version\": \"^3.0.2\",\n \"theseer/tokenizer\": \"^1.2.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6\"\n },\n \"suggest\": {\n \"ext-pcov\": \"PHP extension that provides line coverage\",\n \"ext-xdebug\": \"PHP extension that provides line coverage as well as branch and path coverage\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"9.2.x-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library that provides collection, processing, and rendering functionality for PHP code coverage information.\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-code-coverage\",\n \"keywords\": [\n \"coverage\",\n \"testing\",\n \"xunit\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-code-coverage/issues\",\n \"security\": \"https://github.com/sebastianbergmann/php-code-coverage/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-08-22T04:23:01+00:00\"\n },\n {\n \"name\": \"phpunit/php-file-iterator\",\n \"version\": \"3.0.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-file-iterator.git\",\n \"reference\": \"cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf\",\n \"reference\": \"cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"FilterIterator implementation that filters files based on a list of suffixes.\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-file-iterator/\",\n \"keywords\": [\n \"filesystem\",\n \"iterator\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-file-iterator/issues\",\n \"source\": \"https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2021-12-02T12:48:52+00:00\"\n },\n {\n \"name\": \"phpunit/php-invoker\",\n \"version\": \"3.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-invoker.git\",\n \"reference\": \"5a10147d0aaf65b58940a0b72f71c9ac0423cc67\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67\",\n \"reference\": \"5a10147d0aaf65b58940a0b72f71c9ac0423cc67\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"ext-pcntl\": \"*\",\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"suggest\": {\n \"ext-pcntl\": \"*\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.1-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Invoke callables with a timeout\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-invoker/\",\n \"keywords\": [\n \"process\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-invoker/issues\",\n \"source\": \"https://github.com/sebastianbergmann/php-invoker/tree/3.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2020-09-28T05:58:55+00:00\"\n },\n {\n \"name\": \"phpunit/php-text-template\",\n \"version\": \"2.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-text-template.git\",\n \"reference\": \"5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28\",\n \"reference\": \"5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Simple template engine.\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-text-template/\",\n \"keywords\": [\n \"template\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-text-template/issues\",\n \"source\": \"https://github.com/sebastianbergmann/php-text-template/tree/2.0.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2020-10-26T05:33:50+00:00\"\n },\n {\n \"name\": \"phpunit/php-timer\",\n \"version\": \"5.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-timer.git\",\n \"reference\": \"5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2\",\n \"reference\": \"5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Utility class for timing\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-timer/\",\n \"keywords\": [\n \"timer\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-timer/issues\",\n \"source\": \"https://github.com/sebastianbergmann/php-timer/tree/5.0.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2020-10-26T13:16:10+00:00\"\n },\n {\n \"name\": \"phpunit/phpunit\",\n \"version\": \"9.6.21\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/phpunit.git\",\n \"reference\": \"de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa\",\n \"reference\": \"de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/instantiator\": \"^1.5.0 || ^2\",\n \"ext-dom\": \"*\",\n \"ext-json\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-mbstring\": \"*\",\n \"ext-xml\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"myclabs/deep-copy\": \"^1.12.0\",\n \"phar-io/manifest\": \"^2.0.4\",\n \"phar-io/version\": \"^3.2.1\",\n \"php\": \">=7.3\",\n \"phpunit/php-code-coverage\": \"^9.2.32\",\n \"phpunit/php-file-iterator\": \"^3.0.6\",\n \"phpunit/php-invoker\": \"^3.1.1\",\n \"phpunit/php-text-template\": \"^2.0.4\",\n \"phpunit/php-timer\": \"^5.0.3\",\n \"sebastian/cli-parser\": \"^1.0.2\",\n \"sebastian/code-unit\": \"^1.0.8\",\n \"sebastian/comparator\": \"^4.0.8\",\n \"sebastian/diff\": \"^4.0.6\",\n \"sebastian/environment\": \"^5.1.5\",\n \"sebastian/exporter\": \"^4.0.6\",\n \"sebastian/global-state\": \"^5.0.7\",\n \"sebastian/object-enumerator\": \"^4.0.4\",\n \"sebastian/resource-operations\": \"^3.0.4\",\n \"sebastian/type\": \"^3.2.1\",\n \"sebastian/version\": \"^3.0.2\"\n },\n \"suggest\": {\n \"ext-soap\": \"To be able to generate mocks based on WSDL files\",\n \"ext-xdebug\": \"PHP extension that provides line coverage as well as branch and path coverage\"\n },\n \"bin\": [\n \"phpunit\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"9.6-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/Framework/Assert/Functions.php\"\n ],\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"The PHP Unit Testing framework.\",\n \"homepage\": \"https://phpunit.de/\",\n \"keywords\": [\n \"phpunit\",\n \"testing\",\n \"xunit\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/phpunit/issues\",\n \"security\": \"https://github.com/sebastianbergmann/phpunit/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/phpunit/tree/9.6.21\"\n },\n \"funding\": [\n {\n \"url\": \"https://phpunit.de/sponsors.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/phpunit/phpunit\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-19T10:50:18+00:00\"\n },\n {\n \"name\": \"sebastian/cli-parser\",\n \"version\": \"1.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/cli-parser.git\",\n \"reference\": \"2b56bea83a09de3ac06bb18b92f068e60cc6f50b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b\",\n \"reference\": \"2b56bea83a09de3ac06bb18b92f068e60cc6f50b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library for parsing CLI options\",\n \"homepage\": \"https://github.com/sebastianbergmann/cli-parser\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/cli-parser/issues\",\n \"source\": \"https://github.com/sebastianbergmann/cli-parser/tree/1.0.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-03-02T06:27:43+00:00\"\n },\n {\n \"name\": \"sebastian/code-unit\",\n \"version\": \"1.0.8\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/code-unit.git\",\n \"reference\": \"1fc9f64c0927627ef78ba436c9b17d967e68e120\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120\",\n \"reference\": \"1fc9f64c0927627ef78ba436c9b17d967e68e120\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Collection of value objects that represent the PHP code units\",\n \"homepage\": \"https://github.com/sebastianbergmann/code-unit\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/code-unit/issues\",\n \"source\": \"https://github.com/sebastianbergmann/code-unit/tree/1.0.8\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2020-10-26T13:08:54+00:00\"\n },\n {\n \"name\": \"sebastian/code-unit-reverse-lookup\",\n \"version\": \"2.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup.git\",\n \"reference\": \"ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5\",\n \"reference\": \"ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Looks up which function or method a line of code belongs to\",\n \"homepage\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues\",\n \"source\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2020-09-28T05:30:19+00:00\"\n },\n {\n \"name\": \"sebastian/comparator\",\n \"version\": \"4.0.8\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/comparator.git\",\n \"reference\": \"fa0f136dd2334583309d32b62544682ee972b51a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a\",\n \"reference\": \"fa0f136dd2334583309d32b62544682ee972b51a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\",\n \"sebastian/diff\": \"^4.0\",\n \"sebastian/exporter\": \"^4.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Jeff Welch\",\n \"email\": \"whatthejeff@gmail.com\"\n },\n {\n \"name\": \"Volker Dusch\",\n \"email\": \"github@wallbash.com\"\n },\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@2bepublished.at\"\n }\n ],\n \"description\": \"Provides the functionality to compare PHP values for equality\",\n \"homepage\": \"https://github.com/sebastianbergmann/comparator\",\n \"keywords\": [\n \"comparator\",\n \"compare\",\n \"equality\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/comparator/issues\",\n \"source\": \"https://github.com/sebastianbergmann/comparator/tree/4.0.8\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2022-09-14T12:41:17+00:00\"\n },\n {\n \"name\": \"sebastian/complexity\",\n \"version\": \"2.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/complexity.git\",\n \"reference\": \"25f207c40d62b8b7aa32f5ab026c53561964053a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a\",\n \"reference\": \"25f207c40d62b8b7aa32f5ab026c53561964053a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nikic/php-parser\": \"^4.18 || ^5.0\",\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library for calculating the complexity of PHP code units\",\n \"homepage\": \"https://github.com/sebastianbergmann/complexity\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/complexity/issues\",\n \"source\": \"https://github.com/sebastianbergmann/complexity/tree/2.0.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2023-12-22T06:19:30+00:00\"\n },\n {\n \"name\": \"sebastian/diff\",\n \"version\": \"4.0.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/diff.git\",\n \"reference\": \"ba01945089c3a293b01ba9badc29ad55b106b0bc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc\",\n \"reference\": \"ba01945089c3a293b01ba9badc29ad55b106b0bc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\",\n \"symfony/process\": \"^4.2 || ^5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Kore Nordmann\",\n \"email\": \"mail@kore-nordmann.de\"\n }\n ],\n \"description\": \"Diff implementation\",\n \"homepage\": \"https://github.com/sebastianbergmann/diff\",\n \"keywords\": [\n \"diff\",\n \"udiff\",\n \"unidiff\",\n \"unified diff\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/diff/issues\",\n \"source\": \"https://github.com/sebastianbergmann/diff/tree/4.0.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-03-02T06:30:58+00:00\"\n },\n {\n \"name\": \"sebastian/environment\",\n \"version\": \"5.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/environment.git\",\n \"reference\": \"830c43a844f1f8d5b7a1f6d6076b784454d8b7ed\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed\",\n \"reference\": \"830c43a844f1f8d5b7a1f6d6076b784454d8b7ed\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"suggest\": {\n \"ext-posix\": \"*\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.1-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Provides functionality to handle HHVM/PHP environments\",\n \"homepage\": \"http://www.github.com/sebastianbergmann/environment\",\n \"keywords\": [\n \"Xdebug\",\n \"environment\",\n \"hhvm\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/environment/issues\",\n \"source\": \"https://github.com/sebastianbergmann/environment/tree/5.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2023-02-03T06:03:51+00:00\"\n },\n {\n \"name\": \"sebastian/exporter\",\n \"version\": \"4.0.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/exporter.git\",\n \"reference\": \"78c00df8f170e02473b682df15bfcdacc3d32d72\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72\",\n \"reference\": \"78c00df8f170e02473b682df15bfcdacc3d32d72\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\",\n \"sebastian/recursion-context\": \"^4.0\"\n },\n \"require-dev\": {\n \"ext-mbstring\": \"*\",\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Jeff Welch\",\n \"email\": \"whatthejeff@gmail.com\"\n },\n {\n \"name\": \"Volker Dusch\",\n \"email\": \"github@wallbash.com\"\n },\n {\n \"name\": \"Adam Harvey\",\n \"email\": \"aharvey@php.net\"\n },\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@gmail.com\"\n }\n ],\n \"description\": \"Provides the functionality to export PHP variables for visualization\",\n \"homepage\": \"https://www.github.com/sebastianbergmann/exporter\",\n \"keywords\": [\n \"export\",\n \"exporter\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/exporter/issues\",\n \"source\": \"https://github.com/sebastianbergmann/exporter/tree/4.0.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-03-02T06:33:00+00:00\"\n },\n {\n \"name\": \"sebastian/global-state\",\n \"version\": \"5.0.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/global-state.git\",\n \"reference\": \"bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9\",\n \"reference\": \"bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\",\n \"sebastian/object-reflector\": \"^2.0\",\n \"sebastian/recursion-context\": \"^4.0\"\n },\n \"require-dev\": {\n \"ext-dom\": \"*\",\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"suggest\": {\n \"ext-uopz\": \"*\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Snapshotting of global state\",\n \"homepage\": \"http://www.github.com/sebastianbergmann/global-state\",\n \"keywords\": [\n \"global state\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/global-state/issues\",\n \"source\": \"https://github.com/sebastianbergmann/global-state/tree/5.0.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-03-02T06:35:11+00:00\"\n },\n {\n \"name\": \"sebastian/lines-of-code\",\n \"version\": \"1.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/lines-of-code.git\",\n \"reference\": \"e1e4a170560925c26d424b6a03aed157e7dcc5c5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5\",\n \"reference\": \"e1e4a170560925c26d424b6a03aed157e7dcc5c5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nikic/php-parser\": \"^4.18 || ^5.0\",\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library for counting the lines of code in PHP source code\",\n \"homepage\": \"https://github.com/sebastianbergmann/lines-of-code\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/lines-of-code/issues\",\n \"source\": \"https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2023-12-22T06:20:34+00:00\"\n },\n {\n \"name\": \"sebastian/object-enumerator\",\n \"version\": \"4.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/object-enumerator.git\",\n \"reference\": \"5c9eeac41b290a3712d88851518825ad78f45c71\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71\",\n \"reference\": \"5c9eeac41b290a3712d88851518825ad78f45c71\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\",\n \"sebastian/object-reflector\": \"^2.0\",\n \"sebastian/recursion-context\": \"^4.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Traverses array structures and object graphs to enumerate all referenced objects\",\n \"homepage\": \"https://github.com/sebastianbergmann/object-enumerator/\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/object-enumerator/issues\",\n \"source\": \"https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2020-10-26T13:12:34+00:00\"\n },\n {\n \"name\": \"sebastian/object-reflector\",\n \"version\": \"2.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/object-reflector.git\",\n \"reference\": \"b4f479ebdbf63ac605d183ece17d8d7fe49c15c7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7\",\n \"reference\": \"b4f479ebdbf63ac605d183ece17d8d7fe49c15c7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Allows reflection of object attributes, including inherited and non-public ones\",\n \"homepage\": \"https://github.com/sebastianbergmann/object-reflector/\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/object-reflector/issues\",\n \"source\": \"https://github.com/sebastianbergmann/object-reflector/tree/2.0.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2020-10-26T13:14:26+00:00\"\n },\n {\n \"name\": \"sebastian/recursion-context\",\n \"version\": \"4.0.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/recursion-context.git\",\n \"reference\": \"e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1\",\n \"reference\": \"e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Jeff Welch\",\n \"email\": \"whatthejeff@gmail.com\"\n },\n {\n \"name\": \"Adam Harvey\",\n \"email\": \"aharvey@php.net\"\n }\n ],\n \"description\": \"Provides functionality to recursively process PHP variables\",\n \"homepage\": \"https://github.com/sebastianbergmann/recursion-context\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/recursion-context/issues\",\n \"source\": \"https://github.com/sebastianbergmann/recursion-context/tree/4.0.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2023-02-03T06:07:39+00:00\"\n },\n {\n \"name\": \"sebastian/resource-operations\",\n \"version\": \"3.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/resource-operations.git\",\n \"reference\": \"05d5692a7993ecccd56a03e40cd7e5b09b1d404e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e\",\n \"reference\": \"05d5692a7993ecccd56a03e40cd7e5b09b1d404e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Provides a list of PHP built-in functions that operate on resources\",\n \"homepage\": \"https://www.github.com/sebastianbergmann/resource-operations\",\n \"support\": {\n \"source\": \"https://github.com/sebastianbergmann/resource-operations/tree/3.0.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-03-14T16:00:52+00:00\"\n },\n {\n \"name\": \"sebastian/type\",\n \"version\": \"3.2.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/type.git\",\n \"reference\": \"75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7\",\n \"reference\": \"75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.2-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Collection of value objects that represent the types of the PHP type system\",\n \"homepage\": \"https://github.com/sebastianbergmann/type\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/type/issues\",\n \"source\": \"https://github.com/sebastianbergmann/type/tree/3.2.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2023-02-03T06:13:03+00:00\"\n },\n {\n \"name\": \"sebastian/version\",\n \"version\": \"3.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/version.git\",\n \"reference\": \"c6c1022351a901512170118436c764e473f6de8c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c\",\n \"reference\": \"c6c1022351a901512170118436c764e473f6de8c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library that helps with managing the version number of Git-hosted PHP projects\",\n \"homepage\": \"https://github.com/sebastianbergmann/version\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/version/issues\",\n \"source\": \"https://github.com/sebastianbergmann/version/tree/3.0.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2020-09-28T06:39:44+00:00\"\n },\n {\n \"name\": \"symfony/browser-kit\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/browser-kit.git\",\n \"reference\": \"9c13742e3175b5815e272b981876ae329bec2040\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/browser-kit/zipball/9c13742e3175b5815e272b981876ae329bec2040\",\n \"reference\": \"9c13742e3175b5815e272b981876ae329bec2040\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/dom-crawler\": \"^6.4|^7.0\"\n },\n \"require-dev\": {\n \"symfony/css-selector\": \"^6.4|^7.0\",\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/mime\": \"^6.4|^7.0\",\n \"symfony/process\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\BrowserKit\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/browser-kit/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/css-selector\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/css-selector.git\",\n \"reference\": \"1c7cee86c6f812896af54434f8ce29c8d94f9ff4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4\",\n \"reference\": \"1c7cee86c6f812896af54434f8ce29c8d94f9ff4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\CssSelector\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Jean-François Simon\",\n \"email\": \"jeanfrancois.simon@sensiolabs.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Converts CSS selectors to XPath expressions\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/css-selector/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:57:53+00:00\"\n },\n {\n \"name\": \"symfony/debug-bundle\",\n \"version\": \"v7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/debug-bundle.git\",\n \"reference\": \"aa024d28ce7ce0c6a16ee57c066838bece92893f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/debug-bundle/zipball/aa024d28ce7ce0c6a16ee57c066838bece92893f\",\n \"reference\": \"aa024d28ce7ce0c6a16ee57c066838bece92893f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-xml\": \"*\",\n \"php\": \">=8.2\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/twig-bridge\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"symfony/config\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/web-profiler-bundle\": \"^6.4|^7.0\"\n },\n \"type\": \"symfony-bundle\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bundle\\\\DebugBundle\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/debug-bundle/tree/v7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-31T14:55:39+00:00\"\n },\n {\n \"name\": \"symfony/dom-crawler\",\n \"version\": \"v7.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/dom-crawler.git\",\n \"reference\": \"b92af238457a7cdd2738f941cd525d76313e8283\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/dom-crawler/zipball/b92af238457a7cdd2738f941cd525d76313e8283\",\n \"reference\": \"b92af238457a7cdd2738f941cd525d76313e8283\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"masterminds/html5\": \"^2.6\",\n \"php\": \">=8.2\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-mbstring\": \"~1.0\"\n },\n \"require-dev\": {\n \"symfony/css-selector\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\DomCrawler\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Eases DOM navigation for HTML and XML documents\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/dom-crawler/tree/v7.1.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-15T06:48:17+00:00\"\n },\n {\n \"name\": \"symfony/maker-bundle\",\n \"version\": \"v1.61.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/maker-bundle.git\",\n \"reference\": \"a3b7f14d349f8f44ed752d4dde2263f77510cc18\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/maker-bundle/zipball/a3b7f14d349f8f44ed752d4dde2263f77510cc18\",\n \"reference\": \"a3b7f14d349f8f44ed752d4dde2263f77510cc18\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/inflector\": \"^2.0\",\n \"nikic/php-parser\": \"^4.18|^5.0\",\n \"php\": \">=8.1\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/deprecation-contracts\": \"^2.2|^3\",\n \"symfony/filesystem\": \"^6.4|^7.0\",\n \"symfony/finder\": \"^6.4|^7.0\",\n \"symfony/framework-bundle\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/process\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"doctrine/doctrine-bundle\": \"<2.10\",\n \"doctrine/orm\": \"<2.15\"\n },\n \"require-dev\": {\n \"composer/semver\": \"^3.0\",\n \"doctrine/doctrine-bundle\": \"^2.5.0\",\n \"doctrine/orm\": \"^2.15|^3\",\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/phpunit-bridge\": \"^6.4.1|^7.0\",\n \"symfony/security-core\": \"^6.4|^7.0\",\n \"symfony/yaml\": \"^6.4|^7.0\",\n \"twig/twig\": \"^3.0|^4.x-dev\"\n },\n \"type\": \"symfony-bundle\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bundle\\\\MakerBundle\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.\",\n \"homepage\": \"https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html\",\n \"keywords\": [\n \"code generator\",\n \"dev\",\n \"generator\",\n \"scaffold\",\n \"scaffolding\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/symfony/maker-bundle/issues\",\n \"source\": \"https://github.com/symfony/maker-bundle/tree/v1.61.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-08-29T22:50:23+00:00\"\n },\n {\n \"name\": \"symfony/phpunit-bridge\",\n \"version\": \"v7.1.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/phpunit-bridge.git\",\n \"reference\": \"e876eb90e32a8fc4c4911d458e09f88d65877d1c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/phpunit-bridge/zipball/e876eb90e32a8fc4c4911d458e09f88d65877d1c\",\n \"reference\": \"e876eb90e32a8fc4c4911d458e09f88d65877d1c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2.5\"\n },\n \"conflict\": {\n \"phpunit/phpunit\": \"<7.5|9.1.2\"\n },\n \"require-dev\": {\n \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n \"symfony/error-handler\": \"^5.4|^6.4|^7.0\",\n \"symfony/polyfill-php81\": \"^1.27\"\n },\n \"bin\": [\n \"bin/simple-phpunit\"\n ],\n \"type\": \"symfony-bridge\",\n \"extra\": {\n \"thanks\": {\n \"name\": \"phpunit/phpunit\",\n \"url\": \"https://github.com/sebastianbergmann/phpunit\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Bridge\\\\PhpUnit\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\",\n \"/bin/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides utilities for PHPUnit, especially user deprecation notices management\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/phpunit-bridge/tree/v7.1.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-08-13T14:28:19+00:00\"\n },\n {\n \"name\": \"symfony/web-profiler-bundle\",\n \"version\": \"v7.1.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/web-profiler-bundle.git\",\n \"reference\": \"3cfc775277a8f2dacdd0f72d196bc87b272a763f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3cfc775277a8f2dacdd0f72d196bc87b272a763f\",\n \"reference\": \"3cfc775277a8f2dacdd0f72d196bc87b272a763f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/framework-bundle\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/routing\": \"^6.4|^7.0\",\n \"symfony/twig-bundle\": \"^6.4|^7.0\",\n \"twig/twig\": \"^3.10\"\n },\n \"conflict\": {\n \"symfony/form\": \"<6.4\",\n \"symfony/mailer\": \"<6.4\",\n \"symfony/messenger\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/browser-kit\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/css-selector\": \"^6.4|^7.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0\"\n },\n \"type\": \"symfony-bundle\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bundle\\\\WebProfilerBundle\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides a development tool that gives detailed information about the execution of any request\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"dev\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/web-profiler-bundle/tree/v7.1.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-08-12T09:59:40+00:00\"\n },\n {\n \"name\": \"theseer/tokenizer\",\n \"version\": \"1.2.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/theseer/tokenizer.git\",\n \"reference\": \"737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2\",\n \"reference\": \"737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Arne Blankerts\",\n \"email\": \"arne@blankerts.de\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A small library for converting tokenized PHP source code into XML and potentially other formats\",\n \"support\": {\n \"issues\": \"https://github.com/theseer/tokenizer/issues\",\n \"source\": \"https://github.com/theseer/tokenizer/tree/1.2.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/theseer\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-03-03T12:36:25+00:00\"\n }\n ],\n \"aliases\": [],\n \"minimum-stability\": \"stable\",\n \"stability-flags\": [],\n \"prefer-stable\": true,\n \"prefer-lowest\": false,\n \"platform\": {\n \"php\": \">=8.2\",\n \"ext-ctype\": \"*\",\n \"ext-iconv\": \"*\"\n },\n \"platform-dev\": [],\n \"plugin-api-version\": \"2.3.0\"\n}\n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/composer.lock b/composer.lock +--- a/composer.lock (revision f128451487f275e741703dcef9c507c89d7e07d3) ++++ b/composer.lock (date 1727359994896) +@@ -4,7 +4,7 @@ + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], +- "content-hash": "1bc99d81c026aaf4e662ffffde457d04", ++ "content-hash": "21495c6f5028b1832d53a6ef3be7e9f6", + "packages": [ + { + "name": "composer/semver", diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52_[Changes]1/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52_[Changes]1/shelved.patch new file mode 100644 index 0000000..8e6321a --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52_[Changes]1/shelved.patch @@ -0,0 +1,19 @@ +Index: composer.json +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>{\n \"type\": \"project\",\n \"license\": \"proprietary\",\n \"minimum-stability\": \"stable\",\n \"prefer-stable\": true,\n \"require\": {\n \"php\": \">=8.2\",\n \"ext-ctype\": \"*\",\n \"ext-iconv\": \"*\",\n \"doctrine/dbal\": \"^3\",\n \"doctrine/doctrine-bundle\": \"^2.13\",\n \"doctrine/doctrine-migrations-bundle\": \"^3.3\",\n \"doctrine/orm\": \"^3.2\",\n \"phpdocumentor/reflection-docblock\": \"^5.4\",\n \"phpstan/phpdoc-parser\": \"^1.32\",\n \"symfony/asset\": \"7.1.*\",\n \"symfony/asset-mapper\": \"7.1.*\",\n \"symfony/console\": \"7.1.*\",\n \"symfony/doctrine-messenger\": \"7.1.*\",\n \"symfony/dotenv\": \"7.1.*\",\n \"symfony/expression-language\": \"7.1.*\",\n \"symfony/flex\": \"^2\",\n \"symfony/form\": \"7.1.*\",\n \"symfony/framework-bundle\": \"7.1.*\",\n \"symfony/http-client\": \"7.1.*\",\n \"symfony/intl\": \"7.1.*\",\n \"symfony/mailer\": \"7.1.*\",\n \"symfony/mime\": \"7.1.*\",\n \"symfony/monolog-bundle\": \"^3.0\",\n \"symfony/notifier\": \"7.1.*\",\n \"symfony/process\": \"7.1.*\",\n \"symfony/property-access\": \"7.1.*\",\n \"symfony/property-info\": \"7.1.*\",\n \"symfony/runtime\": \"7.1.*\",\n \"symfony/security-bundle\": \"7.1.*\",\n \"symfony/serializer\": \"7.1.*\",\n \"symfony/stimulus-bundle\": \"^2.20\",\n \"symfony/string\": \"7.1.*\",\n \"symfony/translation\": \"7.1.*\",\n \"symfony/twig-bundle\": \"7.1.*\",\n \"symfony/ux-turbo\": \"^2.20\",\n \"symfony/validator\": \"7.1.*\",\n \"symfony/web-link\": \"7.1.*\",\n \"symfony/yaml\": \"7.1.*\",\n \"twig/extra-bundle\": \"^2.12|^3.0\",\n \"twig/twig\": \"^2.12|^3.0\"\n },\n \"config\": {\n \"allow-plugins\": {\n \"php-http/discovery\": true,\n \"symfony/flex\": true,\n \"symfony/runtime\": true\n },\n \"sort-packages\": true\n },\n \"autoload\": {\n \"psr-4\": {\n \"App\\\\\": \"src/\"\n }\n },\n \"autoload-dev\": {\n \"psr-4\": {\n \"App\\\\Tests\\\\\": \"tests/\"\n }\n },\n \"replace\": {\n \"symfony/polyfill-ctype\": \"*\",\n \"symfony/polyfill-iconv\": \"*\",\n \"symfony/polyfill-php72\": \"*\",\n \"symfony/polyfill-php73\": \"*\",\n \"symfony/polyfill-php74\": \"*\",\n \"symfony/polyfill-php80\": \"*\",\n \"symfony/polyfill-php81\": \"*\",\n \"symfony/polyfill-php82\": \"*\"\n },\n \"scripts\": {\n \"auto-scripts\": {\n \"cache:clear\": \"symfony-cmd\",\n \"assets:install %PUBLIC_DIR%\": \"symfony-cmd\",\n \"importmap:install\": \"symfony-cmd\"\n },\n \"post-install-cmd\": [\n \"@auto-scripts\"\n ],\n \"post-update-cmd\": [\n \"@auto-scripts\"\n ]\n },\n \"conflict\": {\n \"symfony/symfony\": \"*\"\n },\n \"extra\": {\n \"symfony\": {\n \"allow-contrib\": false,\n \"require\": \"7.1.*\"\n }\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5\",\n \"symfony/browser-kit\": \"7.1.*\",\n \"symfony/css-selector\": \"7.1.*\",\n \"symfony/debug-bundle\": \"7.1.*\",\n \"symfony/maker-bundle\": \"^1.0\",\n \"symfony/phpunit-bridge\": \"^7.1\",\n \"symfony/stopwatch\": \"7.1.*\",\n \"symfony/web-profiler-bundle\": \"7.1.*\"\n }\n}\n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/composer.json b/composer.json +--- a/composer.json (revision f128451487f275e741703dcef9c507c89d7e07d3) ++++ b/composer.json (date 1727359994888) +@@ -100,7 +100,7 @@ + "symfony/browser-kit": "7.1.*", + "symfony/css-selector": "7.1.*", + "symfony/debug-bundle": "7.1.*", +- "symfony/maker-bundle": "^1.0", ++ "symfony/maker-bundle": "^1.61", + "symfony/phpunit-bridge": "^7.1", + "symfony/stopwatch": "7.1.*", + "symfony/web-profiler-bundle": "7.1.*" diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52__Changes_.xml b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52__Changes_.xml new file mode 100644 index 0000000..c25083f --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52__Changes_.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52__Changes_1.xml b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52__Changes_1.xml new file mode 100644 index 0000000..8564c8f --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_52__Changes_1.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_55_[Changes]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_55_[Changes]/shelved.patch new file mode 100644 index 0000000..69d80be --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_55_[Changes]/shelved.patch @@ -0,0 +1,19 @@ +Index: composer.json +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>{\n \"type\": \"project\",\n \"license\": \"proprietary\",\n \"minimum-stability\": \"stable\",\n \"prefer-stable\": true,\n \"require\": {\n \"php\": \">=8.2\",\n \"ext-ctype\": \"*\",\n \"ext-iconv\": \"*\",\n \"doctrine/dbal\": \"^3\",\n \"doctrine/doctrine-bundle\": \"^2.13\",\n \"doctrine/doctrine-migrations-bundle\": \"^3.3\",\n \"doctrine/orm\": \"^3.2\",\n \"phpdocumentor/reflection-docblock\": \"^5.4\",\n \"phpstan/phpdoc-parser\": \"^1.32\",\n \"symfony/asset\": \"7.1.*\",\n \"symfony/asset-mapper\": \"7.1.*\",\n \"symfony/console\": \"7.1.*\",\n \"symfony/doctrine-messenger\": \"7.1.*\",\n \"symfony/dotenv\": \"7.1.*\",\n \"symfony/expression-language\": \"7.1.*\",\n \"symfony/flex\": \"^2\",\n \"symfony/form\": \"7.1.*\",\n \"symfony/framework-bundle\": \"7.1.*\",\n \"symfony/http-client\": \"7.1.*\",\n \"symfony/intl\": \"7.1.*\",\n \"symfony/mailer\": \"7.1.*\",\n \"symfony/mercure-bundle\": \"^0.3.9\",\n \"symfony/mime\": \"7.1.*\",\n \"symfony/monolog-bundle\": \"^3.0\",\n \"symfony/notifier\": \"7.1.*\",\n \"symfony/process\": \"7.1.*\",\n \"symfony/property-access\": \"7.1.*\",\n \"symfony/property-info\": \"7.1.*\",\n \"symfony/runtime\": \"7.1.*\",\n \"symfony/security-bundle\": \"7.1.*\",\n \"symfony/serializer\": \"7.1.*\",\n \"symfony/stimulus-bundle\": \"^2.20\",\n \"symfony/string\": \"7.1.*\",\n \"symfony/translation\": \"7.1.*\",\n \"symfony/twig-bundle\": \"7.1.*\",\n \"symfony/ux-turbo\": \"^2.20\",\n \"symfony/validator\": \"7.1.*\",\n \"symfony/web-link\": \"7.1.*\",\n \"symfony/yaml\": \"7.1.*\",\n \"twig/extra-bundle\": \"^2.12|^3.0\",\n \"twig/twig\": \"^2.12|^3.0\"\n },\n \"config\": {\n \"allow-plugins\": {\n \"php-http/discovery\": true,\n \"symfony/flex\": true,\n \"symfony/runtime\": true\n },\n \"sort-packages\": true\n },\n \"autoload\": {\n \"psr-4\": {\n \"App\\\\\": \"src/\"\n }\n },\n \"autoload-dev\": {\n \"psr-4\": {\n \"App\\\\Tests\\\\\": \"tests/\"\n }\n },\n \"replace\": {\n \"symfony/polyfill-ctype\": \"*\",\n \"symfony/polyfill-iconv\": \"*\",\n \"symfony/polyfill-php72\": \"*\",\n \"symfony/polyfill-php73\": \"*\",\n \"symfony/polyfill-php74\": \"*\",\n \"symfony/polyfill-php80\": \"*\",\n \"symfony/polyfill-php81\": \"*\",\n \"symfony/polyfill-php82\": \"*\"\n },\n \"scripts\": {\n \"auto-scripts\": {\n \"cache:clear\": \"symfony-cmd\",\n \"assets:install %PUBLIC_DIR%\": \"symfony-cmd\",\n \"importmap:install\": \"symfony-cmd\"\n },\n \"post-install-cmd\": [\n \"@auto-scripts\"\n ],\n \"post-update-cmd\": [\n \"@auto-scripts\"\n ]\n },\n \"conflict\": {\n \"symfony/symfony\": \"*\"\n },\n \"extra\": {\n \"symfony\": {\n \"allow-contrib\": false,\n \"require\": \"7.1.*\"\n }\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5\",\n \"symfony/browser-kit\": \"7.1.*\",\n \"symfony/css-selector\": \"7.1.*\",\n \"symfony/debug-bundle\": \"7.1.*\",\n \"symfony/maker-bundle\": \"^1.0\",\n \"symfony/phpunit-bridge\": \"^7.1\",\n \"symfony/stopwatch\": \"7.1.*\",\n \"symfony/web-profiler-bundle\": \"7.1.*\"\n }\n}\n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/composer.json b/composer.json +--- a/composer.json (revision c7dbadace5a5c2b4db4bc15f6e7775ffa94e674e) ++++ b/composer.json (date 1727959935786) +@@ -101,7 +101,7 @@ + "symfony/browser-kit": "7.1.*", + "symfony/css-selector": "7.1.*", + "symfony/debug-bundle": "7.1.*", +- "symfony/maker-bundle": "^1.0", ++ "symfony/maker-bundle": "^1.61", + "symfony/phpunit-bridge": "^7.1", + "symfony/stopwatch": "7.1.*", + "symfony/web-profiler-bundle": "7.1.*" diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_55__Changes_.xml b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_55__Changes_.xml new file mode 100644 index 0000000..7b36ea8 --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Checkout_at_03_10_2024_14_55__Changes_.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..708202f --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,215 @@ + + + + + + + + + $PROJECT_DIR$/composer.json + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "associatedIndex": 1 +} + + + + + + + + + + + + + + + + + + + + + 1727358056779 + + + + + + \ No newline at end of file diff --git a/composer.json b/composer.json index 6cda857..18fe331 100644 --- a/composer.json +++ b/composer.json @@ -100,7 +100,7 @@ "symfony/browser-kit": "7.1.*", "symfony/css-selector": "7.1.*", "symfony/debug-bundle": "7.1.*", - "symfony/maker-bundle": "^1.0", + "symfony/maker-bundle": "^1.61", "symfony/phpunit-bridge": "^7.1", "symfony/stopwatch": "7.1.*", "symfony/web-profiler-bundle": "7.1.*" From 30ce97e13bf294018dcf1685369d43f25c89b3cd Mon Sep 17 00:00:00 2001 From: barillote Date: Thu, 3 Oct 2024 15:18:31 +0200 Subject: [PATCH 03/71] Projet repare --- .env | 10 -- .idea/codeception.xml | 12 ++ .idea/php.xml | 123 +++++++--------- .idea/phpspec.xml | 10 ++ .idea/workspace.xml | 271 +++++++++++++++++++---------------- compose.override.yaml | 6 - compose.yaml | 29 ---- composer.json | 1 - composer.lock | 267 ++-------------------------------- config/bundles.php | 1 - config/packages/mercure.yaml | 8 -- symfony.lock | 12 -- 12 files changed, 231 insertions(+), 519 deletions(-) create mode 100644 .idea/codeception.xml create mode 100644 .idea/phpspec.xml delete mode 100644 config/packages/mercure.yaml diff --git a/.env b/.env index 9c4db2c..7c81431 100644 --- a/.env +++ b/.env @@ -39,13 +39,3 @@ MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0 ###> symfony/mailer ### # MAILER_DSN=null://null ###< symfony/mailer ### - -###> symfony/mercure-bundle ### -# See https://symfony.com/doc/current/mercure.html#configuration -# The URL of the Mercure hub, used by the app to publish updates (can be a local URL) -MERCURE_URL=https://example.com/.well-known/mercure -# The public URL of the Mercure hub, used by the browser to connect -MERCURE_PUBLIC_URL=https://example.com/.well-known/mercure -# The secret used to sign the JWTs -MERCURE_JWT_SECRET="!ChangeThisMercureHubJWTSecretKey!" -###< symfony/mercure-bundle ### diff --git a/.idea/codeception.xml b/.idea/codeception.xml new file mode 100644 index 0000000..330f2dd --- /dev/null +++ b/.idea/codeception.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml index 5dd201e..d41c898 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -1,20 +1,51 @@ -<<<<<<< HEAD -======= - - - - - - ->>>>>>> oscar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -32,7 +63,6 @@ - @@ -42,48 +72,31 @@ - - + - - - - - - - - - - - - - - - - - + @@ -94,16 +107,12 @@ + - - - - - @@ -111,20 +120,7 @@ - - - - - - - - - - - - - - + @@ -135,34 +131,13 @@ - - - - - - - - - - - - - + -<<<<<<< HEAD -======= - - - - ->>>>>>> oscar \ No newline at end of file diff --git a/.idea/phpspec.xml b/.idea/phpspec.xml new file mode 100644 index 0000000..33107fd --- /dev/null +++ b/.idea/phpspec.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 708202f..13f8a62 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,13 +4,18 @@ - + + + + + + - + $PROJECT_DIR$/composer.json @@ -26,139 +31,136 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - + + - - - - - - - + + + + - - - + + + + + + + + + + + - - + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { @@ -179,6 +181,7 @@ "node.js.selected.package.eslint": "(autodetect)", "node.js.selected.package.tslint": "(autodetect)", "nodejs_package_manager_path": "npm", + "settings.editor.selected.configurable": "Errors", "vue.rearranger.settings.migration": "true" } }]]> @@ -212,4 +215,22 @@ + + + + + + + + - - \ No newline at end of file From 172c1f79809f0f2ab3218c17d9106e8482e4d56a Mon Sep 17 00:00:00 2001 From: barillote Date: Thu, 3 Oct 2024 15:52:31 +0200 Subject: [PATCH 17/71] Supprimer .idea/vcs.xml --- .idea/vcs.xml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .idea/vcs.xml diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 925cbaf3ee5ba7b59a33cd1a38bce2928b78914a Mon Sep 17 00:00:00 2001 From: barillote Date: Thu, 3 Oct 2024 15:52:35 +0200 Subject: [PATCH 18/71] Supprimer .idea/phpunit.xml --- .idea/phpunit.xml | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 .idea/phpunit.xml diff --git a/.idea/phpunit.xml b/.idea/phpunit.xml deleted file mode 100644 index 4f8104c..0000000 --- a/.idea/phpunit.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file From 562b343063b5db47dc9c97db769d5452a86a9d42 Mon Sep 17 00:00:00 2001 From: bourgoino Date: Thu, 17 Oct 2024 16:38:47 +0200 Subject: [PATCH 19/71] estebouche attrape ! --- .gitignore | 2 +- compose.yaml | 7 +- composer.json | 1 + composer.lock | 57 +++++++++- config/bundles.php | 1 + config/packages/security.yaml | 13 +++ config/services.yaml | 2 +- migrations/Version20241017125351.php | 48 ++++++++ src/Controller/RegistrationController.php | 44 ++++++++ src/Controller/SecurityController.php | 103 ++++++++++++++++++ src/Entity/User.php | 81 +++++++++++++- src/Form/RegistrationFormType.php | 56 ++++++++++ src/Form/ResetPasswordRequestFormType.php | 25 +++++ src/Security/UserAuthenticator.php | 60 ++++++++++ symfony.lock | 3 + templates/registration/register.html.twig | 27 +++++ templates/security/login.html.twig | 42 +++++++ .../security/reset_password_request.html.twig | 14 +++ 18 files changed, 578 insertions(+), 8 deletions(-) create mode 100644 migrations/Version20241017125351.php create mode 100644 src/Controller/RegistrationController.php create mode 100644 src/Controller/SecurityController.php create mode 100644 src/Form/RegistrationFormType.php create mode 100644 src/Form/ResetPasswordRequestFormType.php create mode 100644 src/Security/UserAuthenticator.php create mode 100644 templates/registration/register.html.twig create mode 100644 templates/security/login.html.twig create mode 100644 templates/security/reset_password_request.html.twig diff --git a/.gitignore b/.gitignore index 2b08932..48a881d 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,4 @@ /public/assets/ /assets/vendor/ ###< symfony/asset-mapper ### -./idea \ No newline at end of file +.idea \ No newline at end of file diff --git a/compose.yaml b/compose.yaml index 89c74d1..3bd1f7f 100644 --- a/compose.yaml +++ b/compose.yaml @@ -4,10 +4,10 @@ services: database: image: postgres:${POSTGRES_VERSION:-16}-alpine environment: - POSTGRES_DB: ${POSTGRES_DB:-app} + POSTGRES_DB: ${POSTGRES_DB:-hegresphere} # You should definitely change the password in production - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-!ChangeMe!} - POSTGRES_USER: ${POSTGRES_USER:-app} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-Btssio2024} + POSTGRES_USER: ${POSTGRES_USER:-bourgoino} healthcheck: test: ["CMD", "pg_isready", "-d", "${POSTGRES_DB:-app}", "-U", "${POSTGRES_USER:-app}"] timeout: 5s @@ -23,3 +23,4 @@ volumes: ###> doctrine/doctrine-bundle ### database_data: ###< doctrine/doctrine-bundle ### + diff --git a/composer.json b/composer.json index 6cda857..d6015f0 100644 --- a/composer.json +++ b/composer.json @@ -42,6 +42,7 @@ "symfony/validator": "7.1.*", "symfony/web-link": "7.1.*", "symfony/yaml": "7.1.*", + "symfonycasts/sass-bundle": "^0.7.0", "twig/extra-bundle": "^2.12|^3.0", "twig/twig": "^2.12|^3.0" }, diff --git a/composer.lock b/composer.lock index ab09ab1..8520c82 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1bc99d81c026aaf4e662ffffde457d04", + "content-hash": "39f4377209acc13ab9e977a5301faef0", "packages": [ { "name": "composer/semver", @@ -7344,6 +7344,61 @@ ], "time": "2024-09-17T12:49:58+00:00" }, + { + "name": "symfonycasts/sass-bundle", + "version": "v0.7.0", + "source": { + "type": "git", + "url": "https://github.com/SymfonyCasts/sass-bundle.git", + "reference": "d88601c50eff716d9273dffbd736adefdc19e2fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SymfonyCasts/sass-bundle/zipball/d88601c50eff716d9273dffbd736adefdc19e2fc", + "reference": "d88601c50eff716d9273dffbd736adefdc19e2fc", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/asset-mapper": "^6.3|^7.0", + "symfony/console": "^5.4|^6.3|^7.0", + "symfony/filesystem": "^5.4|^6.3|^7.0", + "symfony/http-client": "^5.4|^6.3|^7.0", + "symfony/process": "^5.4|^6.3|^7.0" + }, + "require-dev": { + "matthiasnoback/symfony-config-test": "^5.0", + "phpstan/phpstan-symfony": "^1.4", + "symfony/framework-bundle": "^6.3|^7.0", + "symfony/phpunit-bridge": "^6.3|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfonycasts\\SassBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathéo Daninos", + "homepage": "https://github.com/WebMamba" + } + ], + "description": "Delightful Sass Support for Symfony + AssetMapper", + "keywords": [ + "asset-mapper", + "sass" + ], + "support": { + "issues": "https://github.com/SymfonyCasts/sass-bundle/issues", + "source": "https://github.com/SymfonyCasts/sass-bundle/tree/v0.7.0" + }, + "time": "2024-05-22T14:59:07+00:00" + }, { "name": "twig/extra-bundle", "version": "v3.13.0", diff --git a/config/bundles.php b/config/bundles.php index 4e3a560..1ebcba9 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -13,4 +13,5 @@ return [ Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], + Symfonycasts\SassBundle\SymfonycastsSassBundle::class => ['all' => true], ]; diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 6b3167f..ce8f2b7 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -16,6 +16,19 @@ security: main: lazy: true provider: app_user_provider + custom_authenticator: App\Security\UserAuthenticator + logout: + path: app_logout + # where to redirect after logout + # target: app_any_route + + remember_me: + secret: '%kernel.secret%' + lifetime: 604800 + path: / + # by default, the feature is enabled by checking a checkbox in the + # login form, uncomment the following line to always enable it. + #always_remember_me: true # activate different ways to authenticate # https://symfony.com/doc/current/security.html#the-firewall diff --git a/config/services.yaml b/config/services.yaml index 2d6a76f..c77d5e2 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -4,7 +4,7 @@ # Put parameters here that don't need to change on each machine where the app is deployed # https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration parameters: - + app.jwtsecret : '%env(JWT_SECRET)%' services: # default configuration for services in *this* file _defaults: diff --git a/migrations/Version20241017125351.php b/migrations/Version20241017125351.php new file mode 100644 index 0000000..e9561a5 --- /dev/null +++ b/migrations/Version20241017125351.php @@ -0,0 +1,48 @@ +addSql('DROP SEQUENCE user_id_seq CASCADE'); + $this->addSql('CREATE SEQUENCE "userApp_id_seq" INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE "userApp" (id INT NOT NULL, nickname VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_NICKNAME ON "userApp" (nickname)'); + $this->addSql('ALTER TABLE employee DROP CONSTRAINT fk_5d9f75a1bf396750'); + $this->addSql('ALTER TABLE intern DROP CONSTRAINT fk_a5795f36bf396750'); + $this->addSql('DROP TABLE employee'); + $this->addSql('DROP TABLE "user"'); + $this->addSql('DROP TABLE intern'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('DROP SEQUENCE "userApp_id_seq" CASCADE'); + $this->addSql('CREATE SEQUENCE user_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE employee (id INT NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE "user" (id INT NOT NULL, nickname VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, discriminator VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX uniq_identifier_nickname ON "user" (nickname)'); + $this->addSql('CREATE TABLE intern (id INT NOT NULL, cover_letter TEXT NOT NULL, resume VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('ALTER TABLE employee ADD CONSTRAINT fk_5d9f75a1bf396750 FOREIGN KEY (id) REFERENCES "user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern ADD CONSTRAINT fk_a5795f36bf396750 FOREIGN KEY (id) REFERENCES "user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('DROP TABLE "userApp"'); + } +} diff --git a/src/Controller/RegistrationController.php b/src/Controller/RegistrationController.php new file mode 100644 index 0000000..88a4a84 --- /dev/null +++ b/src/Controller/RegistrationController.php @@ -0,0 +1,44 @@ +createForm(RegistrationFormType::class, $user); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + /** @var string $plainPassword */ + $plainPassword = $form->get('plainPassword')->getData(); + + // encode the plain password + $user->setPassword($userPasswordHasher->hashPassword($user, $plainPassword)); + + $entityManager->persist($user); + $entityManager->flush(); + + // do anything else you need here, like send an email + + return $security->login($user, UserAuthenticator::class, 'main'); + } + + return $this->render('registration/register.html.twig', [ + 'registrationForm' => $form, + ]); + } +} diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php new file mode 100644 index 0000000..25c2c56 --- /dev/null +++ b/src/Controller/SecurityController.php @@ -0,0 +1,103 @@ +getUser()) { + // return $this->redirectToRoute('target_path'); + // } + + // get the login error if there is one + $error = $authenticationUtils->getLastAuthenticationError(); + // last username entered by the user + $lastUsername = $authenticationUtils->getLastUsername(); + + return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]); + } + + #[Route(path: '/logout', name: 'app_logout')] + public function logout(): void + { + throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.'); + } + + #[Route('/mot-de-passe-oublie', name: 'forgotten_password')] + public function forgottenPassword( + Request $request, + UserRepository $userRepository, + JWTService $jwt, + SendEmailService $mail + ) : Response + { + $form = $this->createForm(ResetPasswordRequestFormType::class); + + $form->handleRequest($request); + + if($form->isSubmitted() && $form->isValid()) { + // Le formulaire est envoyé ET valide + // On va aller chercher l'utilisateur dans la base + $user = $userRepository->findOneByEmail($form->get('email')->getData()); + + // On verifie si on a un utilisateur + if($user) { + // On a un utilisateur + // On génère un JWT + // Générer le token + // Header + $header = [ + 'typ' => 'JWT', + 'alg' => 'HS256' + ]; + + //Payload + $payload = [ + 'user_id' => $user->getId() + ]; + + //On Génère le token + $token = $jwt->generate($header, $payload, $this->getParameter('app.jwtsecret')); + + // On génère l'URL vers reset_password + $url = $this->generateUrl('reset_password', ['token' => $token], + UrlGeneratorInterface::ABSOLUTE_URL); + + // Envoyer l'e-mail + $mail->send( + 'no-reply@openblog.test', + $user->getEmail(), + 'Récupération de votre mode de passe sur le site OpenBlog', + 'password_reset', + compact('user','url') // ['user' => $user, 'url'=>$url] + ); + + $this->addFlash('success', 'Email envoyé avec succès'); + return $this->redirectToRoute('app_login'); + + } + // $user est null + $this->addFlash('danger', 'Un problème est survenu'); + return $this->redirectToRoute('app_login'); + + } + + + return $this->render('security/reset_password_request.html.twig', ['requestPassForm' => $form->createView()]); + } + //#[Route('/mot-de-passe-oublie/{token}', name: 'reset_password')] + //public function resetPassword(): Response{ + + //}; +} diff --git a/src/Entity/User.php b/src/Entity/User.php index 34c4b48..6706db8 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -4,12 +4,14 @@ namespace App\Entity; use App\Repository\UserRepository; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\UserInterface; #[ORM\Entity(repositoryClass: UserRepository::class)] -#[ORM\Table(name: '`user`')] +#[ORM\Table(name: 'userApp')] #[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_NICKNAME', fields: ['nickname'])] +#[UniqueEntity(fields: ['nickname'], message: 'Il y a déjà un utilisateur à ce nom')] class User implements UserInterface, PasswordAuthenticatedUserInterface { #[ORM\Id] @@ -32,6 +34,21 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface #[ORM\Column] private ?string $password = null; + #[ORM\Column(length: 255)] + private ?string $firstName = null; + + #[ORM\Column(length: 255)] + private ?string $lastName = null; + + #[ORM\Column(length: 255)] + private ?string $tel = null; + + #[ORM\Column(length: 255)] + private ?string $address = null; + + #[ORM\Column(length: 255)] + private ?string $email = null; + public function getId(): ?int { return $this->id; @@ -106,4 +123,64 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface // If you store any temporary, sensitive data on the user, clear it here // $this->plainPassword = null; } -} + + public function getFirstName(): ?string + { + return $this->firstName; + } + + public function setFirstName(string $firstName): static + { + $this->firstName = $firstName; + + return $this; + } + + public function getLastName(): ?string + { + return $this->lastName; + } + + public function setLastName(string $lastName): static + { + $this->lastName = $lastName; + + return $this; + } + + public function getTel(): ?string + { + return $this->tel; + } + + public function setTel(string $tel): static + { + $this->tel = $tel; + + return $this; + } + + public function getAddress(): ?string + { + return $this->address; + } + + public function setAddress(string $address): static + { + $this->address = $address; + + return $this; + } + + public function getEmail(): ?string + { + return $this->email; + } + + public function setEmail(string $email): static + { + $this->email = $email; + + return $this; + } +} \ No newline at end of file diff --git a/src/Form/RegistrationFormType.php b/src/Form/RegistrationFormType.php new file mode 100644 index 0000000..9fe1e5a --- /dev/null +++ b/src/Form/RegistrationFormType.php @@ -0,0 +1,56 @@ +add('nickname') + ->add('email') + ->add('agreeTerms', CheckboxType::class, [ + 'mapped' => false, + 'constraints' => [ + new IsTrue([ + 'message' => 'You should agree to our terms.', + ]), + ], + ]) + ->add('plainPassword', PasswordType::class, [ + // instead of being set onto the object directly, + // this is read and encoded in the controller + 'mapped' => false, + 'attr' => ['autocomplete' => 'new-password'], + 'constraints' => [ + new NotBlank([ + 'message' => 'Please enter a password', + ]), + new Length([ + 'min' => 8, + 'minMessage' => 'Your password should be at least {{ limit }} characters', + // max length allowed by Symfony for security reasons + 'max' => 4096, + ]), + ], + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => User::class, + ]); + } +} diff --git a/src/Form/ResetPasswordRequestFormType.php b/src/Form/ResetPasswordRequestFormType.php new file mode 100644 index 0000000..b92b33e --- /dev/null +++ b/src/Form/ResetPasswordRequestFormType.php @@ -0,0 +1,25 @@ +add('email', EmailType::class) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + // Configure your form options here + ]); + } +} diff --git a/src/Security/UserAuthenticator.php b/src/Security/UserAuthenticator.php new file mode 100644 index 0000000..a8d7224 --- /dev/null +++ b/src/Security/UserAuthenticator.php @@ -0,0 +1,60 @@ +getPayload()->getString('nickname'); + + $request->getSession()->set(SecurityRequestAttributes::LAST_USERNAME, $nickname); + + return new Passport( + new UserBadge($nickname), + new PasswordCredentials($request->getPayload()->getString('password')), + [ + new CsrfTokenBadge('authenticate', $request->getPayload()->getString('_csrf_token')), + new RememberMeBadge(), + ] + ); + } + + public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response + { + if ($targetPath = $this->getTargetPath($request->getSession(), $firewallName)) { + return new RedirectResponse($targetPath); + } + + // For example: + return new RedirectResponse($this->urlGenerator->generate('index')); + //throw new \Exception('TODO: provide a valid redirect inside '.__FILE__); + } + + protected function getLoginUrl(Request $request): string + { + return $this->urlGenerator->generate(self::LOGIN_ROUTE); + } +} diff --git a/symfony.lock b/symfony.lock index cf1900f..fdb5abe 100644 --- a/symfony.lock +++ b/symfony.lock @@ -288,6 +288,9 @@ "config/packages/messenger.yaml" ] }, + "symfonycasts/sass-bundle": { + "version": "v0.7.0" + }, "twig/extra-bundle": { "version": "v3.13.0" } diff --git a/templates/registration/register.html.twig b/templates/registration/register.html.twig new file mode 100644 index 0000000..19b63c7 --- /dev/null +++ b/templates/registration/register.html.twig @@ -0,0 +1,27 @@ +{% extends 'base.html.twig' %} + +{% block title %}M'inscrire{% endblock %} + +{% block body %} +

M'inscrire

+ + {{ form_errors(registrationForm) }} + + {{ form_start(registrationForm) }} +
+ {{ form_row(registrationForm.nickname) }} +
+
+ {{ form_row(registrationForm.plainPassword, { + label: 'Password' + }) }} +
+
+ {{ form_row(registrationForm.email) }} + {{ form_row(registrationForm.agreeTerms) }} +
+ + + {{ form_end(registrationForm) }} +

Déjà inscrit(e) ? Me connecter

+{% endblock %} diff --git a/templates/security/login.html.twig b/templates/security/login.html.twig new file mode 100644 index 0000000..e7c0e1e --- /dev/null +++ b/templates/security/login.html.twig @@ -0,0 +1,42 @@ +{% extends 'base.html.twig' %} + +{% block title %}Me connecter{% endblock %} + +{% block body %} +
+ {% if error %} +
{{ error.messageKey|trans(error.messageData, 'security') }}
+ {% endif %} + + {% if app.user %} +
+ Vous êtes déjà connecté(e) en tant que {{ app.user.userIdentifier }}, Se déconnecter +
+ {% endif %} + +

Me connecter

+
+ + +
+
+ + +
+ + +
+ +
+ + +

Mot de passe oublié

+

Pas encore inscrit(e) ? M'inscrire

+
+{% endblock %} diff --git a/templates/security/reset_password_request.html.twig b/templates/security/reset_password_request.html.twig new file mode 100644 index 0000000..baba306 --- /dev/null +++ b/templates/security/reset_password_request.html.twig @@ -0,0 +1,14 @@ +{% extends 'base.html.twig' %} + +{% block title %}Demande de réinitialisation de mot de passe{% endblock %} + +{% block body %} +
+

Demande de réinitialisation de mot de passe

+ {{ form_start(requestPassForm) }} + {{ form_row(requestPassForm.email) }} + + + {{ form_end(requestPassForm) }} +
+{% endblock %} From ea5be39a2ed00f657ac8b47f69d9366af458dbe1 Mon Sep 17 00:00:00 2001 From: ALLAVENA--VALETTE Romain Date: Thu, 10 Oct 2024 14:47:52 +0200 Subject: [PATCH 20/71] tqt --- src/Entity/User.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Entity/User.php b/src/Entity/User.php index 6706db8..4536d5c 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -4,14 +4,12 @@ namespace App\Entity; use App\Repository\UserRepository; use Doctrine\ORM\Mapping as ORM; -use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\UserInterface; #[ORM\Entity(repositoryClass: UserRepository::class)] -#[ORM\Table(name: 'userApp')] +#[ORM\Table(name: '`user`')] #[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_NICKNAME', fields: ['nickname'])] -#[UniqueEntity(fields: ['nickname'], message: 'Il y a déjà un utilisateur à ce nom')] class User implements UserInterface, PasswordAuthenticatedUserInterface { #[ORM\Id] @@ -47,7 +45,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface private ?string $address = null; #[ORM\Column(length: 255)] - private ?string $email = null; + private ?string $mail = null; public function getId(): ?int { @@ -172,15 +170,17 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface return $this; } - public function getEmail(): ?string + public function getMail(): ?string { - return $this->email; + return $this->mail; } - public function setEmail(string $email): static + public function setMail(string $mail): static { - $this->email = $email; + $this->mail = $mail; return $this; } -} \ No newline at end of file +} + + From 007935cea630ed58e59635ce06ba4eae32833f70 Mon Sep 17 00:00:00 2001 From: allavenavr Date: Thu, 17 Oct 2024 17:56:46 +0200 Subject: [PATCH 21/71] ya des entite tkt --- .gitignore | 3 - composer.json | 3 +- migrations/Version20241017134137.php | 67 +++++++++ migrations/Version20241017142722.php | 52 +++++++ migrations/Version20241017152949.php | 46 +++++++ src/Entity/Announcement.php | 156 +++++++++++++++++++++ src/Entity/Company.php | 161 ++++++++++++++++++++++ src/Entity/Employee.php | 26 ++++ src/Entity/Intern.php | 143 +++++++++++++++++++ src/Entity/Obtaining.php | 36 +++++ src/Entity/Skill.php | 75 ++++++++++ src/Entity/Status.php | 78 +++++++++++ src/Entity/{User.php => UserApp.php} | 7 +- src/Repository/AnnouncementRepository.php | 43 ++++++ src/Repository/CompanyRepository.php | 43 ++++++ src/Repository/EmployeeRepository.php | 43 ++++++ src/Repository/InternRepository.php | 43 ++++++ src/Repository/ObtainingRepository.php | 43 ++++++ src/Repository/SkillRepository.php | 43 ++++++ src/Repository/StatusRepository.php | 43 ++++++ src/Repository/UserRepository.php | 12 +- 21 files changed, 1154 insertions(+), 12 deletions(-) create mode 100644 migrations/Version20241017134137.php create mode 100644 migrations/Version20241017142722.php create mode 100644 migrations/Version20241017152949.php create mode 100644 src/Entity/Announcement.php create mode 100644 src/Entity/Company.php create mode 100644 src/Entity/Employee.php create mode 100644 src/Entity/Intern.php create mode 100644 src/Entity/Obtaining.php create mode 100644 src/Entity/Skill.php create mode 100644 src/Entity/Status.php rename src/Entity/{User.php => UserApp.php} (92%) create mode 100644 src/Repository/AnnouncementRepository.php create mode 100644 src/Repository/CompanyRepository.php create mode 100644 src/Repository/EmployeeRepository.php create mode 100644 src/Repository/InternRepository.php create mode 100644 src/Repository/ObtainingRepository.php create mode 100644 src/Repository/SkillRepository.php create mode 100644 src/Repository/StatusRepository.php diff --git a/.gitignore b/.gitignore index 48a881d..7540fb1 100644 --- a/.gitignore +++ b/.gitignore @@ -14,9 +14,6 @@ .phpunit.result.cache ###< phpunit/phpunit ### -###> symfony/phpunit-bridge ### -.phpunit.result.cache -/phpunit.xml ###< symfony/phpunit-bridge ### ###> symfony/asset-mapper ### diff --git a/composer.json b/composer.json index d6015f0..e02a65a 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,8 @@ "symfony/yaml": "7.1.*", "symfonycasts/sass-bundle": "^0.7.0", "twig/extra-bundle": "^2.12|^3.0", - "twig/twig": "^2.12|^3.0" + "twig/twig": "^2.12|^3.0", + "ext-http": "*" }, "config": { "allow-plugins": { diff --git a/migrations/Version20241017134137.php b/migrations/Version20241017134137.php new file mode 100644 index 0000000..0dc3e3c --- /dev/null +++ b/migrations/Version20241017134137.php @@ -0,0 +1,67 @@ +addSql('CREATE SEQUENCE announcement_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE company_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE userApp_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE announcement (id INT NOT NULL, title VARCHAR(255) NOT NULL, description VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE company (id INT NOT NULL, name VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE employee (id INT NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE intern (id INT NOT NULL, cover_letter TEXT NOT NULL, resume VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE userApp (id INT NOT NULL, nickname VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, DISCRIMINATOR VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_NICKNAME ON userApp (nickname)'); + $this->addSql('CREATE TABLE messenger_messages (id BIGSERIAL NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0 ON messenger_messages (queue_name)'); + $this->addSql('CREATE INDEX IDX_75EA56E0E3BD61CE ON messenger_messages (available_at)'); + $this->addSql('CREATE INDEX IDX_75EA56E016BA31DB ON messenger_messages (delivered_at)'); + $this->addSql('COMMENT ON COLUMN messenger_messages.created_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('COMMENT ON COLUMN messenger_messages.available_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('COMMENT ON COLUMN messenger_messages.delivered_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('CREATE OR REPLACE FUNCTION notify_messenger_messages() RETURNS TRIGGER AS $$ + BEGIN + PERFORM pg_notify(\'messenger_messages\', NEW.queue_name::text); + RETURN NEW; + END; + $$ LANGUAGE plpgsql;'); + $this->addSql('DROP TRIGGER IF EXISTS notify_trigger ON messenger_messages;'); + $this->addSql('CREATE TRIGGER notify_trigger AFTER INSERT OR UPDATE ON messenger_messages FOR EACH ROW EXECUTE PROCEDURE notify_messenger_messages();'); + $this->addSql('ALTER TABLE employee ADD CONSTRAINT FK_5D9F75A1BF396750 FOREIGN KEY (id) REFERENCES userApp (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern ADD CONSTRAINT FK_A5795F36BF396750 FOREIGN KEY (id) REFERENCES userApp (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('DROP SEQUENCE announcement_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE company_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE userApp_id_seq CASCADE'); + $this->addSql('ALTER TABLE employee DROP CONSTRAINT FK_5D9F75A1BF396750'); + $this->addSql('ALTER TABLE intern DROP CONSTRAINT FK_A5795F36BF396750'); + $this->addSql('DROP TABLE announcement'); + $this->addSql('DROP TABLE company'); + $this->addSql('DROP TABLE employee'); + $this->addSql('DROP TABLE intern'); + $this->addSql('DROP TABLE userApp'); + $this->addSql('DROP TABLE messenger_messages'); + } +} diff --git a/migrations/Version20241017142722.php b/migrations/Version20241017142722.php new file mode 100644 index 0000000..73818a8 --- /dev/null +++ b/migrations/Version20241017142722.php @@ -0,0 +1,52 @@ +addSql('CREATE SEQUENCE status_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE status (id INT NOT NULL, label VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('ALTER TABLE announcement ADD company_id INT NOT NULL'); + $this->addSql('ALTER TABLE announcement ADD status_id INT NOT NULL'); + $this->addSql('ALTER TABLE announcement ADD CONSTRAINT FK_4DB9D91C979B1AD6 FOREIGN KEY (company_id) REFERENCES company (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE announcement ADD CONSTRAINT FK_4DB9D91C6BF700BD FOREIGN KEY (status_id) REFERENCES status (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('CREATE INDEX IDX_4DB9D91C979B1AD6 ON announcement (company_id)'); + $this->addSql('CREATE INDEX IDX_4DB9D91C6BF700BD ON announcement (status_id)'); + $this->addSql('ALTER TABLE employee ADD company_id INT NOT NULL'); + $this->addSql('ALTER TABLE employee ADD CONSTRAINT FK_5D9F75A1979B1AD6 FOREIGN KEY (company_id) REFERENCES company (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('CREATE INDEX IDX_5D9F75A1979B1AD6 ON employee (company_id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE announcement DROP CONSTRAINT FK_4DB9D91C6BF700BD'); + $this->addSql('DROP SEQUENCE status_id_seq CASCADE'); + $this->addSql('DROP TABLE status'); + $this->addSql('ALTER TABLE announcement DROP CONSTRAINT FK_4DB9D91C979B1AD6'); + $this->addSql('DROP INDEX IDX_4DB9D91C979B1AD6'); + $this->addSql('DROP INDEX IDX_4DB9D91C6BF700BD'); + $this->addSql('ALTER TABLE announcement DROP company_id'); + $this->addSql('ALTER TABLE announcement DROP status_id'); + $this->addSql('ALTER TABLE employee DROP CONSTRAINT FK_5D9F75A1979B1AD6'); + $this->addSql('DROP INDEX IDX_5D9F75A1979B1AD6'); + $this->addSql('ALTER TABLE employee DROP company_id'); + } +} diff --git a/migrations/Version20241017152949.php b/migrations/Version20241017152949.php new file mode 100644 index 0000000..1282d23 --- /dev/null +++ b/migrations/Version20241017152949.php @@ -0,0 +1,46 @@ +addSql('CREATE TABLE favorites (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); + $this->addSql('CREATE INDEX IDX_E46960F5525DD4B4 ON favorites (intern_id)'); + $this->addSql('CREATE INDEX IDX_E46960F5913AEA17 ON favorites (announcement_id)'); + $this->addSql('CREATE TABLE applications (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); + $this->addSql('CREATE INDEX IDX_F7C966F0525DD4B4 ON applications (intern_id)'); + $this->addSql('CREATE INDEX IDX_F7C966F0913AEA17 ON applications (announcement_id)'); + $this->addSql('ALTER TABLE favorites ADD CONSTRAINT FK_E46960F5525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE favorites ADD CONSTRAINT FK_E46960F5913AEA17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE applications ADD CONSTRAINT FK_F7C966F0525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE applications ADD CONSTRAINT FK_F7C966F0913AEA17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE favorites DROP CONSTRAINT FK_E46960F5525DD4B4'); + $this->addSql('ALTER TABLE favorites DROP CONSTRAINT FK_E46960F5913AEA17'); + $this->addSql('ALTER TABLE applications DROP CONSTRAINT FK_F7C966F0525DD4B4'); + $this->addSql('ALTER TABLE applications DROP CONSTRAINT FK_F7C966F0913AEA17'); + $this->addSql('DROP TABLE favorites'); + $this->addSql('DROP TABLE applications'); + } +} diff --git a/src/Entity/Announcement.php b/src/Entity/Announcement.php new file mode 100644 index 0000000..41bcf91 --- /dev/null +++ b/src/Entity/Announcement.php @@ -0,0 +1,156 @@ + + */ + #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'favorites')] + private Collection $internsfav; + + /** + * @var Collection + */ + #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'applications')] + private Collection $applicants; + + public function __construct() + { + $this->internsfav = new ArrayCollection(); + $this->applicants = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getTitle(): ?string + { + return $this->title; + } + + public function setTitle(string $title): static + { + $this->title = $title; + + return $this; + } + + public function getDescription(): ?string + { + return $this->description; + } + + public function setDescription(string $description): static + { + $this->description = $description; + + return $this; + } + + public function getCompany(): ?Company + { + return $this->company; + } + + public function setCompany(?Company $company): static + { + $this->company = $company; + + return $this; + } + + public function getStatus(): ?Status + { + return $this->status; + } + + public function setStatus(?Status $status): static + { + $this->status = $status; + + return $this; + } + + /** + * @return Collection + */ + public function getInternsfav(): Collection + { + return $this->internsfav; + } + + public function addInternfav(Intern $intern): static + { + if (!$this->internsfav->contains($intern)) { + $this->internsfav->add($intern); + $intern->addFavorite($this); + } + + return $this; + } + + public function removeInternfav(Intern $intern): static + { + if ($this->internsfav->removeElement($intern)) { + $intern->removeFavorite($this); + } + + return $this; + } + + /** + * @return Collection + */ + public function getApplicants(): Collection + { + return $this->applicants; + } + + public function addApplicant(Intern $applicant): static + { + if (!$this->applicants->contains($applicant)) { + $this->applicants->add($applicant); + $applicant->addApplication($this); + } + + return $this; + } + + public function removeApplicant(Intern $applicant): static + { + if ($this->applicants->removeElement($applicant)) { + $applicant->removeApplication($this); + } + + return $this; + } +} diff --git a/src/Entity/Company.php b/src/Entity/Company.php new file mode 100644 index 0000000..ae8ccaa --- /dev/null +++ b/src/Entity/Company.php @@ -0,0 +1,161 @@ + + */ + #[ORM\OneToMany(targetEntity: Employee::class, mappedBy: 'company')] + private Collection $employees; + + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: Announcement::class, mappedBy: 'company')] + private Collection $announcements; + + public function __construct() + { + $this->employees = new ArrayCollection(); + $this->announcements = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): static + { + $this->name = $name; + + return $this; + } + + public function getAddress(): ?string + { + return $this->address; + } + + public function setAddress(string $address): static + { + $this->address = $address; + + return $this; + } + + public function getTel(): ?string + { + return $this->tel; + } + + public function setTel(string $tel): static + { + $this->tel = $tel; + + return $this; + } + + public function getMail(): ?string + { + return $this->mail; + } + + public function setMail(string $mail): static + { + $this->mail = $mail; + + return $this; + } + + /** + * @return Collection + */ + public function getEmployees(): Collection + { + return $this->employees; + } + + public function addEmployee(Employee $employee): static + { + if (!$this->employees->contains($employee)) { + $this->employees->add($employee); + $employee->setCompany($this); + } + + return $this; + } + + public function removeEmployee(Employee $employee): static + { + if ($this->employees->removeElement($employee)) { + // set the owning side to null (unless already changed) + if ($employee->getCompany() === $this) { + $employee->setCompany(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getAnnouncements(): Collection + { + return $this->announcements; + } + + public function addAnnouncement(Announcement $announcement): static + { + if (!$this->announcements->contains($announcement)) { + $this->announcements->add($announcement); + $announcement->setCompany($this); + } + + return $this; + } + + public function removeAnnouncement(Announcement $announcement): static + { + if ($this->announcements->removeElement($announcement)) { + // set the owning side to null (unless already changed) + if ($announcement->getCompany() === $this) { + $announcement->setCompany(null); + } + } + + return $this; + } + +} diff --git a/src/Entity/Employee.php b/src/Entity/Employee.php new file mode 100644 index 0000000..393a529 --- /dev/null +++ b/src/Entity/Employee.php @@ -0,0 +1,26 @@ +company; + } + + public function setCompany(?Company $company): static + { + $this->company = $company; + + return $this; + } +} diff --git a/src/Entity/Intern.php b/src/Entity/Intern.php new file mode 100644 index 0000000..b03dcd8 --- /dev/null +++ b/src/Entity/Intern.php @@ -0,0 +1,143 @@ + + */ + #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'interns')] + #[ORM\JoinTable(name: 'favorites')] + private Collection $favorites; + + /** + * @var Collection + */ + #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'applicants')] + #[ORM\JoinTable(name: 'applications')] + private Collection $applications; + + /** + * @var Collection + */ + #[ORM\ManyToMany(targetEntity: Skill::class, inversedBy: 'interns')] + private Collection $skills; + + public function __construct() + { + $this->favorites = new ArrayCollection(); + $this->applications = new ArrayCollection(); + $this->skills = new ArrayCollection(); + } + + public function getCoverLetter(): ?string + { + return $this->coverLetter; + } + + public function setCoverLetter(string $coverLetter): static + { + $this->coverLetter = $coverLetter; + + return $this; + } + + public function getResume(): ?string + { + return $this->resume; + } + + public function setResume(string $resume): static + { + $this->resume = $resume; + + return $this; + } + + /** + * @return Collection + */ + public function getFavorites(): Collection + { + return $this->favorites; + } + + public function addFavorite(Announcement $favorite): static + { + if (!$this->favorites->contains($favorite)) { + $this->favorites->add($favorite); + } + + return $this; + } + + public function removeFavorite(Announcement $favorite): static + { + $this->favorites->removeElement($favorite); + + return $this; + } + + /** + * @return Collection + */ + public function getApplications(): Collection + { + return $this->applications; + } + + public function addApplication(Announcement $application): static + { + if (!$this->applications->contains($application)) { + $this->applications->add($application); + } + + return $this; + } + + public function removeApplication(Announcement $application): static + { + $this->applications->removeElement($application); + + return $this; + } + + /** + * @return Collection + */ + public function getSkills(): Collection + { + return $this->skills; + } + + public function addSkill(Skill $skill): static + { + if (!$this->skills->contains($skill)) { + $this->skills->add($skill); + } + + return $this; + } + + public function removeSkill(Skill $skill): static + { + $this->skills->removeElement($skill); + + return $this; + } +} diff --git a/src/Entity/Obtaining.php b/src/Entity/Obtaining.php new file mode 100644 index 0000000..cecb3c1 --- /dev/null +++ b/src/Entity/Obtaining.php @@ -0,0 +1,36 @@ +id; + } + + public function getDate(): ?\DateTimeInterface + { + return $this->date; + } + + public function setDate(\DateTimeInterface $date): static + { + $this->date = $date; + + return $this; + } +} diff --git a/src/Entity/Skill.php b/src/Entity/Skill.php new file mode 100644 index 0000000..47bea20 --- /dev/null +++ b/src/Entity/Skill.php @@ -0,0 +1,75 @@ + + */ + #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'skills')] + private Collection $interns; + + public function __construct() + { + $this->interns = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getLabel(): ?string + { + return $this->label; + } + + public function setLabel(string $label): static + { + $this->label = $label; + + return $this; + } + + /** + * @return Collection + */ + public function getInterns(): Collection + { + return $this->interns; + } + + public function addIntern(Intern $intern): static + { + if (!$this->interns->contains($intern)) { + $this->interns->add($intern); + $intern->addSkill($this); + } + + return $this; + } + + public function removeIntern(Intern $intern): static + { + if ($this->interns->removeElement($intern)) { + $intern->removeSkill($this); + } + + return $this; + } +} diff --git a/src/Entity/Status.php b/src/Entity/Status.php new file mode 100644 index 0000000..e672f8c --- /dev/null +++ b/src/Entity/Status.php @@ -0,0 +1,78 @@ + + */ + #[ORM\OneToMany(targetEntity: Announcement::class, mappedBy: 'status')] + private Collection $announcements; + + public function __construct() + { + $this->announcements = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getLabel(): ?string + { + return $this->label; + } + + public function setLabel(string $label): static + { + $this->label = $label; + + return $this; + } + + /** + * @return Collection + */ + public function getAnnouncements(): Collection + { + return $this->announcements; + } + + public function addAnnouncement(Announcement $announcement): static + { + if (!$this->announcements->contains($announcement)) { + $this->announcements->add($announcement); + $announcement->setStatus($this); + } + + return $this; + } + + public function removeAnnouncement(Announcement $announcement): static + { + if ($this->announcements->removeElement($announcement)) { + // set the owning side to null (unless already changed) + if ($announcement->getStatus() === $this) { + $announcement->setStatus(null); + } + } + + return $this; + } +} diff --git a/src/Entity/User.php b/src/Entity/UserApp.php similarity index 92% rename from src/Entity/User.php rename to src/Entity/UserApp.php index 4536d5c..fe10006 100644 --- a/src/Entity/User.php +++ b/src/Entity/UserApp.php @@ -8,9 +8,12 @@ use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\UserInterface; #[ORM\Entity(repositoryClass: UserRepository::class)] -#[ORM\Table(name: '`user`')] +#[ORM\Table(name: 'userApp')] +#[ORM\InheritanceType('JOINED')] +#[ORM\DiscriminatorColumn(name: 'DISCRIMINATOR', type: 'string')] +#[ORM\DiscriminatorMap(['employee' => Employee::class, 'intern' => Intern::class])] #[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_NICKNAME', fields: ['nickname'])] -class User implements UserInterface, PasswordAuthenticatedUserInterface +class UserApp implements UserInterface, PasswordAuthenticatedUserInterface { #[ORM\Id] #[ORM\GeneratedValue] diff --git a/src/Repository/AnnouncementRepository.php b/src/Repository/AnnouncementRepository.php new file mode 100644 index 0000000..36813af --- /dev/null +++ b/src/Repository/AnnouncementRepository.php @@ -0,0 +1,43 @@ + + */ +class AnnouncementRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Announcement::class); + } + + // /** + // * @return Announcement[] Returns an array of Announcement objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('a') + // ->andWhere('a.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('a.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Announcement + // { + // return $this->createQueryBuilder('a') + // ->andWhere('a.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/CompanyRepository.php b/src/Repository/CompanyRepository.php new file mode 100644 index 0000000..c0140b5 --- /dev/null +++ b/src/Repository/CompanyRepository.php @@ -0,0 +1,43 @@ + + */ +class CompanyRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Company::class); + } + + // /** + // * @return Company[] Returns an array of Company objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('c') + // ->andWhere('c.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('c.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Company + // { + // return $this->createQueryBuilder('c') + // ->andWhere('c.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/EmployeeRepository.php b/src/Repository/EmployeeRepository.php new file mode 100644 index 0000000..5606e30 --- /dev/null +++ b/src/Repository/EmployeeRepository.php @@ -0,0 +1,43 @@ + + */ +class EmployeeRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Employee::class); + } + + // /** + // * @return Employee[] Returns an array of Employee objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('e') + // ->andWhere('e.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('e.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Employee + // { + // return $this->createQueryBuilder('e') + // ->andWhere('e.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/InternRepository.php b/src/Repository/InternRepository.php new file mode 100644 index 0000000..dde6e54 --- /dev/null +++ b/src/Repository/InternRepository.php @@ -0,0 +1,43 @@ + + */ +class InternRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Intern::class); + } + + // /** + // * @return Intern[] Returns an array of Intern objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('i') + // ->andWhere('i.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('i.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Intern + // { + // return $this->createQueryBuilder('i') + // ->andWhere('i.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/ObtainingRepository.php b/src/Repository/ObtainingRepository.php new file mode 100644 index 0000000..fe6723e --- /dev/null +++ b/src/Repository/ObtainingRepository.php @@ -0,0 +1,43 @@ + + */ +class ObtainingRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Obtaining::class); + } + + // /** + // * @return Obtaining[] Returns an array of Obtaining objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('o') + // ->andWhere('o.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('o.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Obtaining + // { + // return $this->createQueryBuilder('o') + // ->andWhere('o.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/SkillRepository.php b/src/Repository/SkillRepository.php new file mode 100644 index 0000000..dd659e5 --- /dev/null +++ b/src/Repository/SkillRepository.php @@ -0,0 +1,43 @@ + + */ +class SkillRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Skill::class); + } + + // /** + // * @return Skill[] Returns an array of Skill objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('s') + // ->andWhere('s.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('s.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Skill + // { + // return $this->createQueryBuilder('s') + // ->andWhere('s.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/StatusRepository.php b/src/Repository/StatusRepository.php new file mode 100644 index 0000000..ea2e260 --- /dev/null +++ b/src/Repository/StatusRepository.php @@ -0,0 +1,43 @@ + + */ +class StatusRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Status::class); + } + +// /** +// * @return Status[] Returns an array of Status objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('v') +// ->andWhere('v.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('v.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?Status +// { +// return $this->createQueryBuilder('v') +// ->andWhere('v.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index 4f2804e..b502329 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -2,7 +2,7 @@ namespace App\Repository; -use App\Entity\User; +use App\Entity\UserApp; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; @@ -10,13 +10,13 @@ use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\PasswordUpgraderInterface; /** - * @extends ServiceEntityRepository + * @extends ServiceEntityRepository */ class UserRepository extends ServiceEntityRepository implements PasswordUpgraderInterface { public function __construct(ManagerRegistry $registry) { - parent::__construct($registry, User::class); + parent::__construct($registry, UserApp::class); } /** @@ -24,7 +24,7 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader */ public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $newHashedPassword): void { - if (!$user instanceof User) { + if (!$user instanceof UserApp) { throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', $user::class)); } @@ -34,7 +34,7 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader } // /** - // * @return User[] Returns an array of User objects + // * @return UserApp[] Returns an array of UserApp objects // */ // public function findByExampleField($value): array // { @@ -48,7 +48,7 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader // ; // } - // public function findOneBySomeField($value): ?User + // public function findOneBySomeField($value): ?UserApp // { // return $this->createQueryBuilder('u') // ->andWhere('u.exampleField = :val') From bfbccea96f931601e02f406f3760f732d88840cf Mon Sep 17 00:00:00 2001 From: Romain Date: Sun, 10 Nov 2024 15:41:01 +0100 Subject: [PATCH 22/71] ajout diplome et message + gestion des relations --- src/Entity/Announcement.php | 90 ++++++----- src/Entity/Degree.php | 78 ++++++++++ src/Entity/Intern.php | 147 ++++++++++++------ src/Entity/InternApplication.php | 66 ++++++++ src/Entity/InternDegree.php | 66 ++++++++ src/Entity/InternFavorite.php | 50 ++++++ src/Entity/InternSkill.php | 50 ++++++ src/Entity/Message.php | 81 ++++++++++ src/Entity/Skill.php | 17 +- src/Repository/DegreeRepository.php | 43 +++++ .../InternApplicationRepository.php | 43 +++++ src/Repository/InternDegreeRepository.php | 43 +++++ src/Repository/InternFavoriteRepository.php | 43 +++++ src/Repository/InternSkillRepository.php | 43 +++++ src/Repository/MessageRepository.php | 43 +++++ 15 files changed, 807 insertions(+), 96 deletions(-) create mode 100644 src/Entity/Degree.php create mode 100644 src/Entity/InternApplication.php create mode 100644 src/Entity/InternDegree.php create mode 100644 src/Entity/InternFavorite.php create mode 100644 src/Entity/InternSkill.php create mode 100644 src/Entity/Message.php create mode 100644 src/Repository/DegreeRepository.php create mode 100644 src/Repository/InternApplicationRepository.php create mode 100644 src/Repository/InternDegreeRepository.php create mode 100644 src/Repository/InternFavoriteRepository.php create mode 100644 src/Repository/InternSkillRepository.php create mode 100644 src/Repository/MessageRepository.php diff --git a/src/Entity/Announcement.php b/src/Entity/Announcement.php index 41bcf91..5cf1c55 100644 --- a/src/Entity/Announcement.php +++ b/src/Entity/Announcement.php @@ -30,21 +30,21 @@ class Announcement private ?Status $status = null; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'favorites')] - private Collection $internsfav; + #[ORM\OneToMany(targetEntity: InternApplication::class, mappedBy: 'application')] + private Collection $applicants; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'applications')] - private Collection $applicants; + #[ORM\OneToMany(targetEntity: InternFavorite::class, mappedBy: 'announcement')] + private Collection $favoritesInterns; public function __construct() { - $this->internsfav = new ArrayCollection(); $this->applicants = new ArrayCollection(); + $this->favoritesInterns = new ArrayCollection(); } public function getId(): ?int @@ -101,54 +101,60 @@ class Announcement } /** - * @return Collection - */ - public function getInternsfav(): Collection - { - return $this->internsfav; - } - - public function addInternfav(Intern $intern): static - { - if (!$this->internsfav->contains($intern)) { - $this->internsfav->add($intern); - $intern->addFavorite($this); - } - - return $this; - } - - public function removeInternfav(Intern $intern): static - { - if ($this->internsfav->removeElement($intern)) { - $intern->removeFavorite($this); - } - - return $this; - } - - /** - * @return Collection + * @return Collection */ public function getApplicants(): Collection { return $this->applicants; } - public function addApplicant(Intern $applicant): static + public function addApplicants(InternApplication $applicants): static { - if (!$this->applicants->contains($applicant)) { - $this->applicants->add($applicant); - $applicant->addApplication($this); + if (!$this->applicants->contains($applicants)) { + $this->applicants->add($applicants); + $applicants->setApplication($this); } return $this; } - public function removeApplicant(Intern $applicant): static + public function removeApplicants(InternApplication $applicants): static { - if ($this->applicants->removeElement($applicant)) { - $applicant->removeApplication($this); + if ($this->applicants->removeElement($applicants)) { + // set the owning side to null (unless already changed) + if ($applicants->getApplication() === $this) { + $applicants->setApplication(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getFavoritesInterns(): Collection + { + return $this->favoritesInterns; + } + + public function addFavoritesIntern(InternFavorite $favoritesIntern): static + { + if (!$this->favoritesInterns->contains($favoritesIntern)) { + $this->favoritesInterns->add($favoritesIntern); + $favoritesIntern->setAnnouncement($this); + } + + return $this; + } + + public function removeFavoritesIntern(InternFavorite $favoritesIntern): static + { + if ($this->favoritesInterns->removeElement($favoritesIntern)) { + // set the owning side to null (unless already changed) + if ($favoritesIntern->getAnnouncement() === $this) { + $favoritesIntern->setAnnouncement(null); + } } return $this; diff --git a/src/Entity/Degree.php b/src/Entity/Degree.php new file mode 100644 index 0000000..228a32d --- /dev/null +++ b/src/Entity/Degree.php @@ -0,0 +1,78 @@ + + */ + #[ORM\OneToMany(targetEntity: InternDegree::class, mappedBy: 'degree')] + private Collection $interns; + + public function __construct() + { + $this->interns = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getLabel(): ?string + { + return $this->label; + } + + public function setLabel(string $label): static + { + $this->label = $label; + + return $this; + } + + /** + * @return Collection + */ + public function getInterns(): Collection + { + return $this->interns; + } + + public function addIntern(InternDegree $intern): static + { + if (!$this->interns->contains($intern)) { + $this->interns->add($intern); + $intern->setDegree($this); + } + + return $this; + } + + public function removeIntern(InternDegree $intern): static + { + if ($this->interns->removeElement($intern)) { + // set the owning side to null (unless already changed) + if ($intern->getDegree() === $this) { + $intern->setDegree(null); + } + } + + return $this; + } +} diff --git a/src/Entity/Intern.php b/src/Entity/Intern.php index b03dcd8..2ca1f8e 100644 --- a/src/Entity/Intern.php +++ b/src/Entity/Intern.php @@ -19,30 +19,35 @@ class Intern extends UserApp private ?string $resume = null; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'interns')] - #[ORM\JoinTable(name: 'favorites')] - private Collection $favorites; + #[ORM\OneToMany(targetEntity: InternDegree::class, mappedBy: 'intern')] + private Collection $degrees; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'applicants')] - #[ORM\JoinTable(name: 'applications')] + #[ORM\OneToMany(targetEntity: InternSkill::class, mappedBy: 'intern')] + private Collection $skills; + + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: InternApplication::class, mappedBy: 'intern')] private Collection $applications; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Skill::class, inversedBy: 'interns')] - private Collection $skills; + #[ORM\OneToMany(targetEntity: InternFavorite::class, mappedBy: 'intern')] + private Collection $favorites; public function __construct() { - $this->favorites = new ArrayCollection(); - $this->applications = new ArrayCollection(); + $this->degrees = new ArrayCollection(); $this->skills = new ArrayCollection(); + $this->applications = new ArrayCollection(); + $this->favorites = new ArrayCollection(); } public function getCoverLetter(): ?string @@ -70,73 +75,121 @@ class Intern extends UserApp } /** - * @return Collection + * @return Collection */ - public function getFavorites(): Collection + public function getDegrees(): Collection { - return $this->favorites; + return $this->degrees; } - public function addFavorite(Announcement $favorite): static + public function addDegree(InternDegree $degree): static { - if (!$this->favorites->contains($favorite)) { - $this->favorites->add($favorite); + if (!$this->degrees->contains($degree)) { + $this->degrees->add($degree); + $degree->setIntern($this); } return $this; } - public function removeFavorite(Announcement $favorite): static + public function removeDegree(InternDegree $degree): static { - $this->favorites->removeElement($favorite); - - return $this; - } - - /** - * @return Collection - */ - public function getApplications(): Collection - { - return $this->applications; - } - - public function addApplication(Announcement $application): static - { - if (!$this->applications->contains($application)) { - $this->applications->add($application); + if ($this->degrees->removeElement($degree)) { + // set the owning side to null (unless already changed) + if ($degree->getIntern() === $this) { + $degree->setIntern(null); + } } return $this; } - public function removeApplication(Announcement $application): static - { - $this->applications->removeElement($application); - - return $this; - } - /** - * @return Collection + * @return Collection */ public function getSkills(): Collection { return $this->skills; } - public function addSkill(Skill $skill): static + public function addSkill(InternSkill $skill): static { if (!$this->skills->contains($skill)) { $this->skills->add($skill); + $skill->setIntern($this); } return $this; } - public function removeSkill(Skill $skill): static + public function removeSkill(InternSkill $skill): static { - $this->skills->removeElement($skill); + if ($this->skills->removeElement($skill)) { + // set the owning side to null (unless already changed) + if ($skill->getIntern() === $this) { + $skill->setIntern(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getApplications(): Collection + { + return $this->applications; + } + + public function addApplication(InternApplication $application): static + { + if (!$this->applications->contains($application)) { + $this->applications->add($application); + $application->setIntern($this); + } + + return $this; + } + + public function removeApplication(InternApplication $application): static + { + if ($this->applications->removeElement($application)) { + // set the owning side to null (unless already changed) + if ($application->getIntern() === $this) { + $application->setIntern(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getFavorites(): Collection + { + return $this->favorites; + } + + public function addFavorite(InternFavorite $favorite): static + { + if (!$this->favorites->contains($favorite)) { + $this->favorites->add($favorite); + $favorite->setIntern($this); + } + + return $this; + } + + public function removeFavorite(InternFavorite $favorite): static + { + if ($this->favorites->removeElement($favorite)) { + // set the owning side to null (unless already changed) + if ($favorite->getIntern() === $this) { + $favorite->setIntern(null); + } + } return $this; } diff --git a/src/Entity/InternApplication.php b/src/Entity/InternApplication.php new file mode 100644 index 0000000..484a6ea --- /dev/null +++ b/src/Entity/InternApplication.php @@ -0,0 +1,66 @@ +id; + } + + public function getApplication(): ?Announcement + { + return $this->application; + } + + public function setApplication(?Announcement $application): static + { + $this->application = $application; + + return $this; + } + + public function getIntern(): ?Intern + { + return $this->intern; + } + + public function setIntern(?Intern $intern): static + { + $this->intern = $intern; + + return $this; + } + + public function getApplicationDate(): ?\DateTimeInterface + { + return $this->applicationDate; + } + + public function setApplicationDate(\DateTimeInterface $applicationDate): static + { + $this->applicationDate = $applicationDate; + + return $this; + } +} diff --git a/src/Entity/InternDegree.php b/src/Entity/InternDegree.php new file mode 100644 index 0000000..01be94b --- /dev/null +++ b/src/Entity/InternDegree.php @@ -0,0 +1,66 @@ +id; + } + + public function getDegree(): ?Degree + { + return $this->degree; + } + + public function setDegree(?Degree $degree): static + { + $this->degree = $degree; + + return $this; + } + + public function getIntern(): ?Intern + { + return $this->intern; + } + + public function setIntern(?Intern $intern): static + { + $this->intern = $intern; + + return $this; + } + + public function getGraduationDate(): ?\DateTimeInterface + { + return $this->graduationDate; + } + + public function setGraduationDate(\DateTimeInterface $graduationDate): static + { + $this->graduationDate = $graduationDate; + + return $this; + } +} diff --git a/src/Entity/InternFavorite.php b/src/Entity/InternFavorite.php new file mode 100644 index 0000000..8dd915b --- /dev/null +++ b/src/Entity/InternFavorite.php @@ -0,0 +1,50 @@ +id; + } + + public function getAnnouncement(): ?Announcement + { + return $this->announcement; + } + + public function setAnnouncement(?Announcement $announcement): static + { + $this->announcement = $announcement; + + return $this; + } + + public function getIntern(): ?Intern + { + return $this->intern; + } + + public function setIntern(?Intern $intern): static + { + $this->intern = $intern; + + return $this; + } +} diff --git a/src/Entity/InternSkill.php b/src/Entity/InternSkill.php new file mode 100644 index 0000000..89d8cfa --- /dev/null +++ b/src/Entity/InternSkill.php @@ -0,0 +1,50 @@ +id; + } + + public function getSkill(): ?Skill + { + return $this->skill; + } + + public function setSkill(?Skill $skill): static + { + $this->skill = $skill; + + return $this; + } + + public function getIntern(): ?Intern + { + return $this->intern; + } + + public function setIntern(?Intern $intern): static + { + $this->intern = $intern; + + return $this; + } +} diff --git a/src/Entity/Message.php b/src/Entity/Message.php new file mode 100644 index 0000000..b9e9969 --- /dev/null +++ b/src/Entity/Message.php @@ -0,0 +1,81 @@ +id; + } + + public function getSender(): ?UserApp + { + return $this->sender; + } + + public function setSender(?UserApp $sender): static + { + $this->sender = $sender; + + return $this; + } + + public function getReceiver(): ?UserApp + { + return $this->receiver; + } + + public function setReceiver(?UserApp $receiver): static + { + $this->receiver = $receiver; + + return $this; + } + + public function getContent(): ?string + { + return $this->content; + } + + public function setContent(string $content): static + { + $this->content = $content; + + return $this; + } + + public function getSendingDate(): ?\DateTimeInterface + { + return $this->sendingDate; + } + + public function setSendingDate(\DateTimeInterface $sendingDate): static + { + $this->sendingDate = $sendingDate; + + return $this; + } +} diff --git a/src/Entity/Skill.php b/src/Entity/Skill.php index 47bea20..7752cfe 100644 --- a/src/Entity/Skill.php +++ b/src/Entity/Skill.php @@ -19,9 +19,9 @@ class Skill private ?string $label = null; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'skills')] + #[ORM\OneToMany(targetEntity: InternSkill::class, mappedBy: 'skill')] private Collection $interns; public function __construct() @@ -47,27 +47,30 @@ class Skill } /** - * @return Collection + * @return Collection */ public function getInterns(): Collection { return $this->interns; } - public function addIntern(Intern $intern): static + public function addIntern(InternSkill $intern): static { if (!$this->interns->contains($intern)) { $this->interns->add($intern); - $intern->addSkill($this); + $intern->setSkill($this); } return $this; } - public function removeIntern(Intern $intern): static + public function removeIntern(InternSkill $intern): static { if ($this->interns->removeElement($intern)) { - $intern->removeSkill($this); + // set the owning side to null (unless already changed) + if ($intern->getSkill() === $this) { + $intern->setSkill(null); + } } return $this; diff --git a/src/Repository/DegreeRepository.php b/src/Repository/DegreeRepository.php new file mode 100644 index 0000000..474fbe7 --- /dev/null +++ b/src/Repository/DegreeRepository.php @@ -0,0 +1,43 @@ + + */ +class DegreeRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Degree::class); + } + + // /** + // * @return Degree[] Returns an array of Degree objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('d') + // ->andWhere('d.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('d.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Degree + // { + // return $this->createQueryBuilder('d') + // ->andWhere('d.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/InternApplicationRepository.php b/src/Repository/InternApplicationRepository.php new file mode 100644 index 0000000..b2957e1 --- /dev/null +++ b/src/Repository/InternApplicationRepository.php @@ -0,0 +1,43 @@ + + */ +class InternApplicationRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, InternApplication::class); + } + + // /** + // * @return InternApplication[] Returns an array of InternApplication objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('i') + // ->andWhere('i.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('i.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?InternApplication + // { + // return $this->createQueryBuilder('i') + // ->andWhere('i.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/InternDegreeRepository.php b/src/Repository/InternDegreeRepository.php new file mode 100644 index 0000000..7c7dafb --- /dev/null +++ b/src/Repository/InternDegreeRepository.php @@ -0,0 +1,43 @@ + + */ +class InternDegreeRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, InternDegree::class); + } + + // /** + // * @return InternDegree[] Returns an array of InternDegree objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('i') + // ->andWhere('i.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('i.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?InternDegree + // { + // return $this->createQueryBuilder('i') + // ->andWhere('i.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/InternFavoriteRepository.php b/src/Repository/InternFavoriteRepository.php new file mode 100644 index 0000000..ff5b296 --- /dev/null +++ b/src/Repository/InternFavoriteRepository.php @@ -0,0 +1,43 @@ + + */ +class InternFavoriteRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, InternFavorite::class); + } + + // /** + // * @return InternFavorite[] Returns an array of InternFavorite objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('i') + // ->andWhere('i.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('i.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?InternFavorite + // { + // return $this->createQueryBuilder('i') + // ->andWhere('i.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/InternSkillRepository.php b/src/Repository/InternSkillRepository.php new file mode 100644 index 0000000..fd0d1af --- /dev/null +++ b/src/Repository/InternSkillRepository.php @@ -0,0 +1,43 @@ + + */ +class InternSkillRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, InternSkill::class); + } + + // /** + // * @return InternSkill[] Returns an array of InternSkill objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('i') + // ->andWhere('i.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('i.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?InternSkill + // { + // return $this->createQueryBuilder('i') + // ->andWhere('i.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/MessageRepository.php b/src/Repository/MessageRepository.php new file mode 100644 index 0000000..e7f1849 --- /dev/null +++ b/src/Repository/MessageRepository.php @@ -0,0 +1,43 @@ + + */ +class MessageRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Message::class); + } + + // /** + // * @return Message[] Returns an array of Message objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('m') + // ->andWhere('m.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('m.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Message + // { + // return $this->createQueryBuilder('m') + // ->andWhere('m.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} From e153266b654b5aa09d7a4394e18de79e5ed98dc9 Mon Sep 17 00:00:00 2001 From: Romain Date: Mon, 11 Nov 2024 16:00:51 +0100 Subject: [PATCH 23/71] ajout FAQ + premiers controller / vues / formulaire pour annonce --- src/Controller/AnnouncementController.php | 84 +++++++++++++++++++++++ src/Entity/Announcement.php | 24 +++++-- src/Entity/FAQ.php | 66 ++++++++++++++++++ src/Entity/Obtaining.php | 36 ---------- src/Form/AnnouncementType.php | 39 +++++++++++ src/Repository/FAQRepository.php | 43 ++++++++++++ templates/announcement/add.html.twig | 14 ++++ templates/announcement/index.html.twig | 20 ++++++ templates/announcement/list.html.twig | 21 ++++++ 9 files changed, 307 insertions(+), 40 deletions(-) create mode 100644 src/Controller/AnnouncementController.php create mode 100644 src/Entity/FAQ.php delete mode 100644 src/Entity/Obtaining.php create mode 100644 src/Form/AnnouncementType.php create mode 100644 src/Repository/FAQRepository.php create mode 100644 templates/announcement/add.html.twig create mode 100644 templates/announcement/index.html.twig create mode 100644 templates/announcement/list.html.twig diff --git a/src/Controller/AnnouncementController.php b/src/Controller/AnnouncementController.php new file mode 100644 index 0000000..9ca78fc --- /dev/null +++ b/src/Controller/AnnouncementController.php @@ -0,0 +1,84 @@ +createForm(AnnouncementType::class, $announcement); + $form->handleRequest($request); + + if($form->isSubmitted() && $form->isValid()) + { + //met la date de création de l'annonce au moment où le formulaire est envoyé + $announcement->setCreationDate(new \DateTime()); + + $this->entityManager->persist($announcement); + $this->entityManager->flush(); + + $this->addFlash('success', 'Annonce créée avec succès.'); + return $this->redirectToRoute('app_announcement_list'); + } + + return $this->render('announcement/add.html.twig', [ + 'announcementForm' => $form, + ]); + } + + #[Route('/list', name: '_list')] + public function list(): Response + { + $announcements = $this->announcementRepository->findAll(); + + return $this->render('announcement/list.html.twig', [ + 'announcements' => $announcements, + ]); + } + + #[Route('/update/{id}', name: '_update')] + public function update(int $id, Request $request): Response + { + $announcement = $this->announcementRepository->find($id); + $form = $this->createForm(AnnouncementType::class, $announcement); + $form->handleRequest($request); + + if($form->isSubmitted() && $form->isValid()) + { + $this->entityManager->persist($announcement); + $this->entityManager->flush(); + } + + return $this->render('announcement/add.html.twig', [ + 'formAdd' => $form, + ]); + } + + #[Route('/delete/{id}', name: '_delete')] + public function delete(int $id): Response + { + $announcement = $this->announcementRepository->find($id); + $this->entityManager->remove($announcement); + $this->entityManager->flush(); + + return $this->redirectToRoute('app_announcement_list'); + } +} diff --git a/src/Entity/Announcement.php b/src/Entity/Announcement.php index 5cf1c55..94cf1a6 100644 --- a/src/Entity/Announcement.php +++ b/src/Entity/Announcement.php @@ -5,6 +5,7 @@ namespace App\Entity; use App\Repository\AnnouncementRepository; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: AnnouncementRepository::class)] @@ -30,16 +31,19 @@ class Announcement private ?Status $status = null; /** - * @var Collection + * @var ?Collection */ #[ORM\OneToMany(targetEntity: InternApplication::class, mappedBy: 'application')] - private Collection $applicants; + private ?Collection $applicants; /** - * @var Collection + * @var ?Collection */ #[ORM\OneToMany(targetEntity: InternFavorite::class, mappedBy: 'announcement')] - private Collection $favoritesInterns; + private ?Collection $favoritesInterns; + + #[ORM\Column(type: Types::DATE_MUTABLE)] + private ?\DateTimeInterface $creationDate = null; public function __construct() { @@ -159,4 +163,16 @@ class Announcement return $this; } + + public function getCreationDate(): ?\DateTimeInterface + { + return $this->creationDate; + } + + public function setCreationDate(\DateTimeInterface $creationDate): static + { + $this->creationDate = $creationDate; + + return $this; + } } diff --git a/src/Entity/FAQ.php b/src/Entity/FAQ.php new file mode 100644 index 0000000..986bc05 --- /dev/null +++ b/src/Entity/FAQ.php @@ -0,0 +1,66 @@ +id; + } + + public function getQuestion(): ?string + { + return $this->question; + } + + public function setQuestion(string $question): static + { + $this->question = $question; + + return $this; + } + + public function getAnswer(): ?string + { + return $this->answer; + } + + public function setAnswer(?string $answer): static + { + $this->answer = $answer; + + return $this; + } + + public function getUpdateDate(): ?\DateTimeInterface + { + return $this->updateDate; + } + + public function setUpdateDate(\DateTimeInterface $updateDate): static + { + $this->updateDate = $updateDate; + + return $this; + } +} diff --git a/src/Entity/Obtaining.php b/src/Entity/Obtaining.php deleted file mode 100644 index cecb3c1..0000000 --- a/src/Entity/Obtaining.php +++ /dev/null @@ -1,36 +0,0 @@ -id; - } - - public function getDate(): ?\DateTimeInterface - { - return $this->date; - } - - public function setDate(\DateTimeInterface $date): static - { - $this->date = $date; - - return $this; - } -} diff --git a/src/Form/AnnouncementType.php b/src/Form/AnnouncementType.php new file mode 100644 index 0000000..ef1255f --- /dev/null +++ b/src/Form/AnnouncementType.php @@ -0,0 +1,39 @@ +add('title') + ->add('description') + ->add('company', EntityType::class, [ + 'class' => Company::class, + 'choice_label' => 'id', + ]) + ->add('status', EntityType::class, [ + 'class' => Status::class, + 'choice_label' => 'id', + ]) + ->add('submit', SubmitType::class) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Announcement::class, + ]); + } +} diff --git a/src/Repository/FAQRepository.php b/src/Repository/FAQRepository.php new file mode 100644 index 0000000..228a85f --- /dev/null +++ b/src/Repository/FAQRepository.php @@ -0,0 +1,43 @@ + + */ +class FAQRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, FAQ::class); + } + + // /** + // * @return FAQ[] Returns an array of FAQ objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('f') + // ->andWhere('f.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('f.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?FAQ + // { + // return $this->createQueryBuilder('f') + // ->andWhere('f.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/templates/announcement/add.html.twig b/templates/announcement/add.html.twig new file mode 100644 index 0000000..6171d29 --- /dev/null +++ b/templates/announcement/add.html.twig @@ -0,0 +1,14 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello AnnouncementController!{% endblock %} + +{% block body %} + + + {{ form(announcementForm) }} + + +{% endblock %} \ No newline at end of file diff --git a/templates/announcement/index.html.twig b/templates/announcement/index.html.twig new file mode 100644 index 0000000..aca0c93 --- /dev/null +++ b/templates/announcement/index.html.twig @@ -0,0 +1,20 @@ +{% extends 'base.html.twig' %} + +{% block title %}Hello AnnouncementController!{% endblock %} + +{% block body %} + + +
+

Hello {{ controller_name }}! ✅

+ + This friendly message is coming from: +
    +
  • Your controller at C:/Users/csese/Romain/Phpstorm_projets/ProjetHegreSphere/hegresphere/src/Controller/AnnouncementController.php
  • +
  • Your template at C:/Users/csese/Romain/Phpstorm_projets/ProjetHegreSphere/hegresphere/templates/announcement/index.html.twig
  • +
+
+{% endblock %} diff --git a/templates/announcement/list.html.twig b/templates/announcement/list.html.twig new file mode 100644 index 0000000..d1d3c02 --- /dev/null +++ b/templates/announcement/list.html.twig @@ -0,0 +1,21 @@ +{% extends 'base.html.twig' %} + +{% block title %}Bienvenue sur Hegreshpere{% endblock %} + +{% block body %} + + +

Liste des annonces

+ {% for ann in announcements %} +

{{ ann.title }}

+

{{ ann.company.name }}

+

{{ ann.description }}

+ +

{{ ann.creationDate }}

+ {% endfor %} + + +{% endblock %} \ No newline at end of file From d4c858474c81cc5b2d28a1672827b5d264c187a2 Mon Sep 17 00:00:00 2001 From: allavenavr Date: Thu, 21 Nov 2024 16:18:44 +0100 Subject: [PATCH 24/71] controllers --- src/Controller/AnnouncementController.php | 39 +++++++++++ src/Controller/CompanyController.php | 81 +++++++++++++++++++++++ src/Controller/DegreeController.php | 81 +++++++++++++++++++++++ src/Controller/EmployeeController.php | 81 +++++++++++++++++++++++ src/Controller/FAQController.php | 81 +++++++++++++++++++++++ src/Controller/InternController.php | 81 +++++++++++++++++++++++ src/Controller/MessageController.php | 81 +++++++++++++++++++++++ src/Controller/SkillController.php | 81 +++++++++++++++++++++++ src/Controller/UserAppController.php | 81 +++++++++++++++++++++++ src/Entity/Announcement.php | 13 ++-- src/Entity/UserApp.php | 4 +- src/Form/AnnouncementType.php | 4 -- src/Form/CompanyType.php | 28 ++++++++ src/Form/DegreeType.php | 25 +++++++ src/Form/EmployeeType.php | 38 +++++++++++ src/Form/FAQType.php | 29 ++++++++ src/Form/InternType.php | 34 ++++++++++ src/Form/MessageType.php | 38 +++++++++++ src/Form/SkillType.php | 25 +++++++ src/Form/UserAppType.php | 32 +++++++++ 20 files changed, 944 insertions(+), 13 deletions(-) create mode 100644 src/Controller/CompanyController.php create mode 100644 src/Controller/DegreeController.php create mode 100644 src/Controller/EmployeeController.php create mode 100644 src/Controller/FAQController.php create mode 100644 src/Controller/InternController.php create mode 100644 src/Controller/MessageController.php create mode 100644 src/Controller/SkillController.php create mode 100644 src/Controller/UserAppController.php create mode 100644 src/Form/CompanyType.php create mode 100644 src/Form/DegreeType.php create mode 100644 src/Form/EmployeeType.php create mode 100644 src/Form/FAQType.php create mode 100644 src/Form/InternType.php create mode 100644 src/Form/MessageType.php create mode 100644 src/Form/SkillType.php create mode 100644 src/Form/UserAppType.php diff --git a/src/Controller/AnnouncementController.php b/src/Controller/AnnouncementController.php index 9ca78fc..150595b 100644 --- a/src/Controller/AnnouncementController.php +++ b/src/Controller/AnnouncementController.php @@ -3,6 +3,7 @@ namespace App\Controller; use App\Entity\Announcement; +use App\Entity\InternApplication; use App\Form\AnnouncementType; use App\Repository\AnnouncementRepository; use Doctrine\ORM\EntityManagerInterface; @@ -65,6 +66,9 @@ class AnnouncementController extends AbstractController { $this->entityManager->persist($announcement); $this->entityManager->flush(); + + $this->addFlash('success', 'Annonce modifiéé avec succès.'); + return $this->redirectToRoute('app_announcement_list'); } return $this->render('announcement/add.html.twig', [ @@ -81,4 +85,39 @@ class AnnouncementController extends AbstractController return $this->redirectToRoute('app_announcement_list'); } + + #[Route('/apply/{id}', name: '_apply')] + public function applyToAnnouncement(int $id): Response + { + + $announcement = $this->announcementRepository->find($id); + + $user = $this->getUser(); + + $existingCandidature = $this->entityManager->getRepository(InternApplication::class)->findOneBy([ + 'intern' => $user, + 'announcement' => $announcement + ]); + + if($existingCandidature) { + $this->addFlash('error', 'Vous avez déjà postulé à cette annonce.'); + return $this->redirectToRoute('app_announcement_list'); + } + $application = new InternApplication(); + $application->setIntern($user); + $application->setIntern($announcement); + $application->setApplicationDate(new \DateTime()); + + $this->entityManager->persist($application); + $this->entityManager->flush(); + + $this->addFlash('success', 'Votre candidature a été envoyée avec succès.'); + return $this->redirectToRoute('annonce_list', ['id' => $announcement->getId()]); + } + + #[Route('/filterByCompany', name: '_filterByCompany')] + public function filterByCompany(int $id): Response + { + return $this->redirectToRoute('annonce_list', ['id' => $id]); + } } diff --git a/src/Controller/CompanyController.php b/src/Controller/CompanyController.php new file mode 100644 index 0000000..0ddeb19 --- /dev/null +++ b/src/Controller/CompanyController.php @@ -0,0 +1,81 @@ +render('company/index.html.twig', [ + 'companies' => $companyRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_company_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $company = new Company(); + $form = $this->createForm(CompanyType::class, $company); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->persist($company); + $entityManager->flush(); + + return $this->redirectToRoute('app_company_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('company/new.html.twig', [ + 'company' => $company, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_company_show', methods: ['GET'])] + public function show(Company $company): Response + { + return $this->render('company/show.html.twig', [ + 'company' => $company, + ]); + } + + #[Route('/{id}/edit', name: 'app_company_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, Company $company, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(CompanyType::class, $company); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_company_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('company/edit.html.twig', [ + 'company' => $company, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_company_delete', methods: ['POST'])] + public function delete(Request $request, Company $company, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$company->getId(), $request->getPayload()->getString('_token'))) { + $entityManager->remove($company); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_company_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Controller/DegreeController.php b/src/Controller/DegreeController.php new file mode 100644 index 0000000..d7d54e0 --- /dev/null +++ b/src/Controller/DegreeController.php @@ -0,0 +1,81 @@ +render('degree/index.html.twig', [ + 'degrees' => $degreeRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_degree_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $degree = new Degree(); + $form = $this->createForm(DegreeType::class, $degree); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->persist($degree); + $entityManager->flush(); + + return $this->redirectToRoute('app_degree_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('degree/new.html.twig', [ + 'degree' => $degree, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_degree_show', methods: ['GET'])] + public function show(Degree $degree): Response + { + return $this->render('degree/show.html.twig', [ + 'degree' => $degree, + ]); + } + + #[Route('/{id}/edit', name: 'app_degree_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, Degree $degree, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(DegreeType::class, $degree); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_degree_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('degree/edit.html.twig', [ + 'degree' => $degree, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_degree_delete', methods: ['POST'])] + public function delete(Request $request, Degree $degree, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$degree->getId(), $request->getPayload()->getString('_token'))) { + $entityManager->remove($degree); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_degree_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Controller/EmployeeController.php b/src/Controller/EmployeeController.php new file mode 100644 index 0000000..6e096c7 --- /dev/null +++ b/src/Controller/EmployeeController.php @@ -0,0 +1,81 @@ +render('employee/index.html.twig', [ + 'employees' => $employeeRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_employee_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $employee = new Employee(); + $form = $this->createForm(EmployeeType::class, $employee); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->persist($employee); + $entityManager->flush(); + + return $this->redirectToRoute('app_employee_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('employee/new.html.twig', [ + 'employee' => $employee, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_employee_show', methods: ['GET'])] + public function show(Employee $employee): Response + { + return $this->render('employee/show.html.twig', [ + 'employee' => $employee, + ]); + } + + #[Route('/{id}/edit', name: 'app_employee_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, Employee $employee, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(EmployeeType::class, $employee); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_employee_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('employee/edit.html.twig', [ + 'employee' => $employee, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_employee_delete', methods: ['POST'])] + public function delete(Request $request, Employee $employee, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$employee->getId(), $request->getPayload()->getString('_token'))) { + $entityManager->remove($employee); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_employee_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Controller/FAQController.php b/src/Controller/FAQController.php new file mode 100644 index 0000000..fbba2aa --- /dev/null +++ b/src/Controller/FAQController.php @@ -0,0 +1,81 @@ +render('faq/index.html.twig', [ + 'faqs' => $fAQRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_faq_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $fAQ = new FAQ(); + $form = $this->createForm(FAQType::class, $fAQ); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->persist($fAQ); + $entityManager->flush(); + + return $this->redirectToRoute('app_faq_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('faq/new.html.twig', [ + 'faq' => $fAQ, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_faq_show', methods: ['GET'])] + public function show(FAQ $fAQ): Response + { + return $this->render('faq/show.html.twig', [ + 'faq' => $fAQ, + ]); + } + + #[Route('/{id}/edit', name: 'app_faq_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, FAQ $fAQ, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(FAQType::class, $fAQ); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_faq_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('faq/edit.html.twig', [ + 'faq' => $fAQ, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_faq_delete', methods: ['POST'])] + public function delete(Request $request, FAQ $fAQ, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$fAQ->getId(), $request->getPayload()->getString('_token'))) { + $entityManager->remove($fAQ); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_faq_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Controller/InternController.php b/src/Controller/InternController.php new file mode 100644 index 0000000..fd4063d --- /dev/null +++ b/src/Controller/InternController.php @@ -0,0 +1,81 @@ +render('intern/index.html.twig', [ + 'interns' => $internRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_intern_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $intern = new Intern(); + $form = $this->createForm(InternType::class, $intern); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->persist($intern); + $entityManager->flush(); + + return $this->redirectToRoute('app_intern_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('intern/new.html.twig', [ + 'intern' => $intern, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_intern_show', methods: ['GET'])] + public function show(Intern $intern): Response + { + return $this->render('intern/show.html.twig', [ + 'intern' => $intern, + ]); + } + + #[Route('/{id}/edit', name: 'app_intern_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, Intern $intern, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(InternType::class, $intern); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_intern_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('intern/edit.html.twig', [ + 'intern' => $intern, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_intern_delete', methods: ['POST'])] + public function delete(Request $request, Intern $intern, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$intern->getId(), $request->getPayload()->getString('_token'))) { + $entityManager->remove($intern); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_intern_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Controller/MessageController.php b/src/Controller/MessageController.php new file mode 100644 index 0000000..f46276b --- /dev/null +++ b/src/Controller/MessageController.php @@ -0,0 +1,81 @@ +render('message/index.html.twig', [ + 'messages' => $messageRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_message_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $message = new Message(); + $form = $this->createForm(MessageType::class, $message); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->persist($message); + $entityManager->flush(); + + return $this->redirectToRoute('app_message_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('message/new.html.twig', [ + 'message' => $message, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_message_show', methods: ['GET'])] + public function show(Message $message): Response + { + return $this->render('message/show.html.twig', [ + 'message' => $message, + ]); + } + + #[Route('/{id}/edit', name: 'app_message_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, Message $message, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(MessageType::class, $message); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_message_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('message/edit.html.twig', [ + 'message' => $message, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_message_delete', methods: ['POST'])] + public function delete(Request $request, Message $message, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$message->getId(), $request->getPayload()->getString('_token'))) { + $entityManager->remove($message); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_message_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Controller/SkillController.php b/src/Controller/SkillController.php new file mode 100644 index 0000000..2d2adac --- /dev/null +++ b/src/Controller/SkillController.php @@ -0,0 +1,81 @@ +render('skill/index.html.twig', [ + 'skills' => $skillRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_skill_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $skill = new Skill(); + $form = $this->createForm(SkillType::class, $skill); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->persist($skill); + $entityManager->flush(); + + return $this->redirectToRoute('app_skill_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('skill/new.html.twig', [ + 'skill' => $skill, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_skill_show', methods: ['GET'])] + public function show(Skill $skill): Response + { + return $this->render('skill/show.html.twig', [ + 'skill' => $skill, + ]); + } + + #[Route('/{id}/edit', name: 'app_skill_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, Skill $skill, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(SkillType::class, $skill); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_skill_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('skill/edit.html.twig', [ + 'skill' => $skill, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_skill_delete', methods: ['POST'])] + public function delete(Request $request, Skill $skill, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$skill->getId(), $request->getPayload()->getString('_token'))) { + $entityManager->remove($skill); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_skill_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Controller/UserAppController.php b/src/Controller/UserAppController.php new file mode 100644 index 0000000..f6e8161 --- /dev/null +++ b/src/Controller/UserAppController.php @@ -0,0 +1,81 @@ +render('user_app/index.html.twig', [ + 'user_apps' => $userRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_user_app_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $userApp = new UserApp(); + $form = $this->createForm(UserAppType::class, $userApp); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->persist($userApp); + $entityManager->flush(); + + return $this->redirectToRoute('app_user_app_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('user_app/new.html.twig', [ + 'user_app' => $userApp, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_user_app_show', methods: ['GET'])] + public function show(UserApp $userApp): Response + { + return $this->render('user_app/show.html.twig', [ + 'user_app' => $userApp, + ]); + } + + #[Route('/{id}/edit', name: 'app_user_app_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, UserApp $userApp, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(UserAppType::class, $userApp); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_user_app_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('user_app/edit.html.twig', [ + 'user_app' => $userApp, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_user_app_delete', methods: ['POST'])] + public function delete(Request $request, UserApp $userApp, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$userApp->getId(), $request->getPayload()->getString('_token'))) { + $entityManager->remove($userApp); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_user_app_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Entity/Announcement.php b/src/Entity/Announcement.php index 94cf1a6..6360da7 100644 --- a/src/Entity/Announcement.php +++ b/src/Entity/Announcement.php @@ -22,13 +22,15 @@ class Announcement #[ORM\Column(length: 255)] private ?string $description = null; + #[ORM\Column(type: Types::DATE_MUTABLE)] + private ?\DateTimeInterface $creationDate = null; + #[ORM\ManyToOne(inversedBy: 'announcements')] #[ORM\JoinColumn(nullable: false)] private ?Company $company = null; - #[ORM\ManyToOne(inversedBy: 'announcements')] - #[ORM\JoinColumn(nullable: false)] - private ?Status $status = null; + #[ORM\Column(length: 255,nullable: false)] + private ?string $status = "notVerified"; /** * @var ?Collection @@ -42,9 +44,6 @@ class Announcement #[ORM\OneToMany(targetEntity: InternFavorite::class, mappedBy: 'announcement')] private ?Collection $favoritesInterns; - #[ORM\Column(type: Types::DATE_MUTABLE)] - private ?\DateTimeInterface $creationDate = null; - public function __construct() { $this->applicants = new ArrayCollection(); @@ -92,7 +91,7 @@ class Announcement return $this; } - public function getStatus(): ?Status + public function getStatus(): ?string { return $this->status; } diff --git a/src/Entity/UserApp.php b/src/Entity/UserApp.php index fe10006..5c68f4f 100644 --- a/src/Entity/UserApp.php +++ b/src/Entity/UserApp.php @@ -26,8 +26,8 @@ class UserApp implements UserInterface, PasswordAuthenticatedUserInterface /** * @var list The user roles */ - #[ORM\Column] - private array $roles = []; + #[ORM\Column(nullable: true)] + private ?array $roles = null; /** * @var string The hashed password diff --git a/src/Form/AnnouncementType.php b/src/Form/AnnouncementType.php index ef1255f..21a844d 100644 --- a/src/Form/AnnouncementType.php +++ b/src/Form/AnnouncementType.php @@ -22,10 +22,6 @@ class AnnouncementType extends AbstractType 'class' => Company::class, 'choice_label' => 'id', ]) - ->add('status', EntityType::class, [ - 'class' => Status::class, - 'choice_label' => 'id', - ]) ->add('submit', SubmitType::class) ; } diff --git a/src/Form/CompanyType.php b/src/Form/CompanyType.php new file mode 100644 index 0000000..33ec969 --- /dev/null +++ b/src/Form/CompanyType.php @@ -0,0 +1,28 @@ +add('name') + ->add('address') + ->add('tel') + ->add('mail') + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Company::class, + ]); + } +} diff --git a/src/Form/DegreeType.php b/src/Form/DegreeType.php new file mode 100644 index 0000000..bf70b71 --- /dev/null +++ b/src/Form/DegreeType.php @@ -0,0 +1,25 @@ +add('label') + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Degree::class, + ]); + } +} diff --git a/src/Form/EmployeeType.php b/src/Form/EmployeeType.php new file mode 100644 index 0000000..3ff32e3 --- /dev/null +++ b/src/Form/EmployeeType.php @@ -0,0 +1,38 @@ +add('nickname') + ->add('roles') + ->add('password') + ->add('firstName') + ->add('lastName') + ->add('tel') + ->add('address') + ->add('mail') + ->add('company', EntityType::class, [ + 'class' => Company::class, + 'choice_label' => 'id', + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Employee::class, + ]); + } +} diff --git a/src/Form/FAQType.php b/src/Form/FAQType.php new file mode 100644 index 0000000..c420a1c --- /dev/null +++ b/src/Form/FAQType.php @@ -0,0 +1,29 @@ +add('question') + ->add('answer') + ->add('updateDate', null, [ + 'widget' => 'single_text', + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => FAQ::class, + ]); + } +} diff --git a/src/Form/InternType.php b/src/Form/InternType.php new file mode 100644 index 0000000..a2b7931 --- /dev/null +++ b/src/Form/InternType.php @@ -0,0 +1,34 @@ +add('nickname') + ->add('roles') + ->add('password') + ->add('firstName') + ->add('lastName') + ->add('tel') + ->add('address') + ->add('mail') + ->add('coverLetter') + ->add('resume') + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Intern::class, + ]); + } +} diff --git a/src/Form/MessageType.php b/src/Form/MessageType.php new file mode 100644 index 0000000..b1208d9 --- /dev/null +++ b/src/Form/MessageType.php @@ -0,0 +1,38 @@ +add('content') + ->add('sendingDate', null, [ + 'widget' => 'single_text', + ]) + ->add('sender', EntityType::class, [ + 'class' => UserApp::class, + 'choice_label' => 'id', + ]) + ->add('receiver', EntityType::class, [ + 'class' => UserApp::class, + 'choice_label' => 'id', + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Message::class, + ]); + } +} diff --git a/src/Form/SkillType.php b/src/Form/SkillType.php new file mode 100644 index 0000000..7e3df80 --- /dev/null +++ b/src/Form/SkillType.php @@ -0,0 +1,25 @@ +add('label') + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Skill::class, + ]); + } +} diff --git a/src/Form/UserAppType.php b/src/Form/UserAppType.php new file mode 100644 index 0000000..dbd2033 --- /dev/null +++ b/src/Form/UserAppType.php @@ -0,0 +1,32 @@ +add('nickname') + ->add('roles') + ->add('password') + ->add('firstName') + ->add('lastName') + ->add('tel') + ->add('address') + ->add('mail') + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => UserApp::class, + ]); + } +} From 18dd03a84be35776894a50ff010ca84293e757e5 Mon Sep 17 00:00:00 2001 From: allavenavr Date: Thu, 21 Nov 2024 17:04:56 +0100 Subject: [PATCH 25/71] vues twig --- templates/announcement/list.html.twig | 3 +- templates/company/_delete_form.html.twig | 4 ++ templates/company/_form.html.twig | 4 ++ templates/company/edit.html.twig | 13 +++++ templates/company/index.html.twig | 41 +++++++++++++++ templates/company/new.html.twig | 11 ++++ templates/company/show.html.twig | 38 ++++++++++++++ templates/degree/_delete_form.html.twig | 4 ++ templates/degree/_form.html.twig | 4 ++ templates/degree/edit.html.twig | 13 +++++ templates/degree/index.html.twig | 35 +++++++++++++ templates/degree/new.html.twig | 11 ++++ templates/degree/show.html.twig | 26 ++++++++++ templates/employee/_delete_form.html.twig | 4 ++ templates/employee/_form.html.twig | 4 ++ templates/employee/edit.html.twig | 13 +++++ templates/employee/index.html.twig | 49 ++++++++++++++++++ templates/employee/new.html.twig | 11 ++++ templates/employee/show.html.twig | 54 ++++++++++++++++++++ templates/faq/_delete_form.html.twig | 4 ++ templates/faq/_form.html.twig | 4 ++ templates/faq/edit.html.twig | 13 +++++ templates/faq/index.html.twig | 39 ++++++++++++++ templates/faq/new.html.twig | 11 ++++ templates/faq/show.html.twig | 34 +++++++++++++ templates/intern/_delete_form.html.twig | 4 ++ templates/intern/_form.html.twig | 4 ++ templates/intern/edit.html.twig | 13 +++++ templates/intern/index.html.twig | 53 +++++++++++++++++++ templates/intern/new.html.twig | 11 ++++ templates/intern/show.html.twig | 62 +++++++++++++++++++++++ templates/message/_delete_form.html.twig | 4 ++ templates/message/_form.html.twig | 4 ++ templates/message/edit.html.twig | 13 +++++ templates/message/index.html.twig | 37 ++++++++++++++ templates/message/new.html.twig | 11 ++++ templates/message/show.html.twig | 30 +++++++++++ templates/skill/_delete_form.html.twig | 4 ++ templates/skill/_form.html.twig | 4 ++ templates/skill/edit.html.twig | 13 +++++ templates/skill/index.html.twig | 35 +++++++++++++ templates/skill/new.html.twig | 11 ++++ templates/skill/show.html.twig | 26 ++++++++++ templates/user_app/_delete_form.html.twig | 4 ++ templates/user_app/_form.html.twig | 4 ++ templates/user_app/edit.html.twig | 13 +++++ templates/user_app/index.html.twig | 49 ++++++++++++++++++ templates/user_app/new.html.twig | 11 ++++ templates/user_app/show.html.twig | 54 ++++++++++++++++++++ 49 files changed, 919 insertions(+), 2 deletions(-) create mode 100644 templates/company/_delete_form.html.twig create mode 100644 templates/company/_form.html.twig create mode 100644 templates/company/edit.html.twig create mode 100644 templates/company/index.html.twig create mode 100644 templates/company/new.html.twig create mode 100644 templates/company/show.html.twig create mode 100644 templates/degree/_delete_form.html.twig create mode 100644 templates/degree/_form.html.twig create mode 100644 templates/degree/edit.html.twig create mode 100644 templates/degree/index.html.twig create mode 100644 templates/degree/new.html.twig create mode 100644 templates/degree/show.html.twig create mode 100644 templates/employee/_delete_form.html.twig create mode 100644 templates/employee/_form.html.twig create mode 100644 templates/employee/edit.html.twig create mode 100644 templates/employee/index.html.twig create mode 100644 templates/employee/new.html.twig create mode 100644 templates/employee/show.html.twig create mode 100644 templates/faq/_delete_form.html.twig create mode 100644 templates/faq/_form.html.twig create mode 100644 templates/faq/edit.html.twig create mode 100644 templates/faq/index.html.twig create mode 100644 templates/faq/new.html.twig create mode 100644 templates/faq/show.html.twig create mode 100644 templates/intern/_delete_form.html.twig create mode 100644 templates/intern/_form.html.twig create mode 100644 templates/intern/edit.html.twig create mode 100644 templates/intern/index.html.twig create mode 100644 templates/intern/new.html.twig create mode 100644 templates/intern/show.html.twig create mode 100644 templates/message/_delete_form.html.twig create mode 100644 templates/message/_form.html.twig create mode 100644 templates/message/edit.html.twig create mode 100644 templates/message/index.html.twig create mode 100644 templates/message/new.html.twig create mode 100644 templates/message/show.html.twig create mode 100644 templates/skill/_delete_form.html.twig create mode 100644 templates/skill/_form.html.twig create mode 100644 templates/skill/edit.html.twig create mode 100644 templates/skill/index.html.twig create mode 100644 templates/skill/new.html.twig create mode 100644 templates/skill/show.html.twig create mode 100644 templates/user_app/_delete_form.html.twig create mode 100644 templates/user_app/_form.html.twig create mode 100644 templates/user_app/edit.html.twig create mode 100644 templates/user_app/index.html.twig create mode 100644 templates/user_app/new.html.twig create mode 100644 templates/user_app/show.html.twig diff --git a/templates/announcement/list.html.twig b/templates/announcement/list.html.twig index d1d3c02..91cfb8d 100644 --- a/templates/announcement/list.html.twig +++ b/templates/announcement/list.html.twig @@ -13,8 +13,7 @@

{{ ann.title }}

{{ ann.company.name }}

{{ ann.description }}

- -

{{ ann.creationDate }}

+ ------------------------------ {% endfor %} diff --git a/templates/company/_delete_form.html.twig b/templates/company/_delete_form.html.twig new file mode 100644 index 0000000..5873f22 --- /dev/null +++ b/templates/company/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/company/_form.html.twig b/templates/company/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/company/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/company/edit.html.twig b/templates/company/edit.html.twig new file mode 100644 index 0000000..2ba5039 --- /dev/null +++ b/templates/company/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit Company{% endblock %} + +{% block body %} +

Edit Company

+ + {{ include('company/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('company/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/company/index.html.twig b/templates/company/index.html.twig new file mode 100644 index 0000000..2c1affd --- /dev/null +++ b/templates/company/index.html.twig @@ -0,0 +1,41 @@ +{% extends 'base.html.twig' %} + +{% block title %}Company index{% endblock %} + +{% block body %} +

Company index

+ + + + + + + + + + + + + + {% for company in companies %} + + + + + + + + + {% else %} + + + + {% endfor %} + +
IdNameAddressTelMailactions
{{ company.id }}{{ company.name }}{{ company.address }}{{ company.tel }}{{ company.mail }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/company/new.html.twig b/templates/company/new.html.twig new file mode 100644 index 0000000..e957106 --- /dev/null +++ b/templates/company/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New Company{% endblock %} + +{% block body %} +

Create new Company

+ + {{ include('company/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/company/show.html.twig b/templates/company/show.html.twig new file mode 100644 index 0000000..a46b203 --- /dev/null +++ b/templates/company/show.html.twig @@ -0,0 +1,38 @@ +{% extends 'base.html.twig' %} + +{% block title %}Company{% endblock %} + +{% block body %} +

Company

+ + + + + + + + + + + + + + + + + + + + + + + + +
Id{{ company.id }}
Name{{ company.name }}
Address{{ company.address }}
Tel{{ company.tel }}
Mail{{ company.mail }}
+ + back to list + + edit + + {{ include('company/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/degree/_delete_form.html.twig b/templates/degree/_delete_form.html.twig new file mode 100644 index 0000000..eb768ea --- /dev/null +++ b/templates/degree/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/degree/_form.html.twig b/templates/degree/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/degree/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/degree/edit.html.twig b/templates/degree/edit.html.twig new file mode 100644 index 0000000..73e9f09 --- /dev/null +++ b/templates/degree/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit Degree{% endblock %} + +{% block body %} +

Edit Degree

+ + {{ include('degree/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('degree/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/degree/index.html.twig b/templates/degree/index.html.twig new file mode 100644 index 0000000..67172f7 --- /dev/null +++ b/templates/degree/index.html.twig @@ -0,0 +1,35 @@ +{% extends 'base.html.twig' %} + +{% block title %}Degree index{% endblock %} + +{% block body %} +

Degree index

+ + + + + + + + + + + {% for degree in degrees %} + + + + + + {% else %} + + + + {% endfor %} + +
IdLabelactions
{{ degree.id }}{{ degree.label }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/degree/new.html.twig b/templates/degree/new.html.twig new file mode 100644 index 0000000..875707f --- /dev/null +++ b/templates/degree/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New Degree{% endblock %} + +{% block body %} +

Create new Degree

+ + {{ include('degree/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/degree/show.html.twig b/templates/degree/show.html.twig new file mode 100644 index 0000000..fd86e8d --- /dev/null +++ b/templates/degree/show.html.twig @@ -0,0 +1,26 @@ +{% extends 'base.html.twig' %} + +{% block title %}Degree{% endblock %} + +{% block body %} +

Degree

+ + + + + + + + + + + + +
Id{{ degree.id }}
Label{{ degree.label }}
+ + back to list + + edit + + {{ include('degree/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/employee/_delete_form.html.twig b/templates/employee/_delete_form.html.twig new file mode 100644 index 0000000..39da1f7 --- /dev/null +++ b/templates/employee/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/employee/_form.html.twig b/templates/employee/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/employee/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/employee/edit.html.twig b/templates/employee/edit.html.twig new file mode 100644 index 0000000..4dadd66 --- /dev/null +++ b/templates/employee/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit Employee{% endblock %} + +{% block body %} +

Edit Employee

+ + {{ include('employee/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('employee/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/employee/index.html.twig b/templates/employee/index.html.twig new file mode 100644 index 0000000..1e8c132 --- /dev/null +++ b/templates/employee/index.html.twig @@ -0,0 +1,49 @@ +{% extends 'base.html.twig' %} + +{% block title %}Employee index{% endblock %} + +{% block body %} +

Employee index

+ + + + + + + + + + + + + + + + + + {% for employee in employees %} + + + + + + + + + + + + + {% else %} + + + + {% endfor %} + +
IdNicknameRolesPasswordFirstNameLastNameTelAddressMailactions
{{ employee.id }}{{ employee.nickname }}{{ employee.roles ? employee.roles|json_encode : '' }}{{ employee.password }}{{ employee.firstName }}{{ employee.lastName }}{{ employee.tel }}{{ employee.address }}{{ employee.mail }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/employee/new.html.twig b/templates/employee/new.html.twig new file mode 100644 index 0000000..677c5b6 --- /dev/null +++ b/templates/employee/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New Employee{% endblock %} + +{% block body %} +

Create new Employee

+ + {{ include('employee/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/employee/show.html.twig b/templates/employee/show.html.twig new file mode 100644 index 0000000..8a33418 --- /dev/null +++ b/templates/employee/show.html.twig @@ -0,0 +1,54 @@ +{% extends 'base.html.twig' %} + +{% block title %}Employee{% endblock %} + +{% block body %} +

Employee

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id{{ employee.id }}
Nickname{{ employee.nickname }}
Roles{{ employee.roles ? employee.roles|json_encode : '' }}
Password{{ employee.password }}
FirstName{{ employee.firstName }}
LastName{{ employee.lastName }}
Tel{{ employee.tel }}
Address{{ employee.address }}
Mail{{ employee.mail }}
+ + back to list + + edit + + {{ include('employee/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/faq/_delete_form.html.twig b/templates/faq/_delete_form.html.twig new file mode 100644 index 0000000..530fd2e --- /dev/null +++ b/templates/faq/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/faq/_form.html.twig b/templates/faq/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/faq/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/faq/edit.html.twig b/templates/faq/edit.html.twig new file mode 100644 index 0000000..e80b5a3 --- /dev/null +++ b/templates/faq/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit FAQ{% endblock %} + +{% block body %} +

Edit FAQ

+ + {{ include('faq/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('faq/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/faq/index.html.twig b/templates/faq/index.html.twig new file mode 100644 index 0000000..7d6b0cb --- /dev/null +++ b/templates/faq/index.html.twig @@ -0,0 +1,39 @@ +{% extends 'base.html.twig' %} + +{% block title %}FAQ index{% endblock %} + +{% block body %} +

FAQ index

+ + + + + + + + + + + + + {% for faq in faqs %} + + + + + + + + {% else %} + + + + {% endfor %} + +
IdQuestionAnswerUpdateDateactions
{{ faq.id }}{{ faq.question }}{{ faq.answer }}{{ faq.updateDate ? faq.updateDate|date('Y-m-d') : '' }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/faq/new.html.twig b/templates/faq/new.html.twig new file mode 100644 index 0000000..716a893 --- /dev/null +++ b/templates/faq/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New FAQ{% endblock %} + +{% block body %} +

Create new FAQ

+ + {{ include('faq/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/faq/show.html.twig b/templates/faq/show.html.twig new file mode 100644 index 0000000..bafb197 --- /dev/null +++ b/templates/faq/show.html.twig @@ -0,0 +1,34 @@ +{% extends 'base.html.twig' %} + +{% block title %}FAQ{% endblock %} + +{% block body %} +

FAQ

+ + + + + + + + + + + + + + + + + + + + +
Id{{ faq.id }}
Question{{ faq.question }}
Answer{{ faq.answer }}
UpdateDate{{ faq.updateDate ? faq.updateDate|date('Y-m-d') : '' }}
+ + back to list + + edit + + {{ include('faq/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/intern/_delete_form.html.twig b/templates/intern/_delete_form.html.twig new file mode 100644 index 0000000..d9a3bbb --- /dev/null +++ b/templates/intern/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/intern/_form.html.twig b/templates/intern/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/intern/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/intern/edit.html.twig b/templates/intern/edit.html.twig new file mode 100644 index 0000000..589b452 --- /dev/null +++ b/templates/intern/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit Intern{% endblock %} + +{% block body %} +

Edit Intern

+ + {{ include('intern/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('intern/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/intern/index.html.twig b/templates/intern/index.html.twig new file mode 100644 index 0000000..b8c3a7f --- /dev/null +++ b/templates/intern/index.html.twig @@ -0,0 +1,53 @@ +{% extends 'base.html.twig' %} + +{% block title %}Intern index{% endblock %} + +{% block body %} +

Intern index

+ + + + + + + + + + + + + + + + + + + + {% for intern in interns %} + + + + + + + + + + + + + + + {% else %} + + + + {% endfor %} + +
IdNicknameRolesPasswordFirstNameLastNameTelAddressMailCoverLetterResumeactions
{{ intern.id }}{{ intern.nickname }}{{ intern.roles ? intern.roles|json_encode : '' }}{{ intern.password }}{{ intern.firstName }}{{ intern.lastName }}{{ intern.tel }}{{ intern.address }}{{ intern.mail }}{{ intern.coverLetter }}{{ intern.resume }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/intern/new.html.twig b/templates/intern/new.html.twig new file mode 100644 index 0000000..9f998fd --- /dev/null +++ b/templates/intern/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New Intern{% endblock %} + +{% block body %} +

Create new Intern

+ + {{ include('intern/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/intern/show.html.twig b/templates/intern/show.html.twig new file mode 100644 index 0000000..7741d47 --- /dev/null +++ b/templates/intern/show.html.twig @@ -0,0 +1,62 @@ +{% extends 'base.html.twig' %} + +{% block title %}Intern{% endblock %} + +{% block body %} +

Intern

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id{{ intern.id }}
Nickname{{ intern.nickname }}
Roles{{ intern.roles ? intern.roles|json_encode : '' }}
Password{{ intern.password }}
FirstName{{ intern.firstName }}
LastName{{ intern.lastName }}
Tel{{ intern.tel }}
Address{{ intern.address }}
Mail{{ intern.mail }}
CoverLetter{{ intern.coverLetter }}
Resume{{ intern.resume }}
+ + back to list + + edit + + {{ include('intern/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/message/_delete_form.html.twig b/templates/message/_delete_form.html.twig new file mode 100644 index 0000000..c225863 --- /dev/null +++ b/templates/message/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/message/_form.html.twig b/templates/message/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/message/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/message/edit.html.twig b/templates/message/edit.html.twig new file mode 100644 index 0000000..dde7265 --- /dev/null +++ b/templates/message/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit Message{% endblock %} + +{% block body %} +

Edit Message

+ + {{ include('message/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('message/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/message/index.html.twig b/templates/message/index.html.twig new file mode 100644 index 0000000..0aff18b --- /dev/null +++ b/templates/message/index.html.twig @@ -0,0 +1,37 @@ +{% extends 'base.html.twig' %} + +{% block title %}Message index{% endblock %} + +{% block body %} +

Message index

+ + + + + + + + + + + + {% for message in messages %} + + + + + + + {% else %} + + + + {% endfor %} + +
IdContentSendingDateactions
{{ message.id }}{{ message.content }}{{ message.sendingDate ? message.sendingDate|date('Y-m-d H:i:s') : '' }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/message/new.html.twig b/templates/message/new.html.twig new file mode 100644 index 0000000..5ee1626 --- /dev/null +++ b/templates/message/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New Message{% endblock %} + +{% block body %} +

Create new Message

+ + {{ include('message/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/message/show.html.twig b/templates/message/show.html.twig new file mode 100644 index 0000000..575f7ab --- /dev/null +++ b/templates/message/show.html.twig @@ -0,0 +1,30 @@ +{% extends 'base.html.twig' %} + +{% block title %}Message{% endblock %} + +{% block body %} +

Message

+ + + + + + + + + + + + + + + + +
Id{{ message.id }}
Content{{ message.content }}
SendingDate{{ message.sendingDate ? message.sendingDate|date('Y-m-d H:i:s') : '' }}
+ + back to list + + edit + + {{ include('message/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/skill/_delete_form.html.twig b/templates/skill/_delete_form.html.twig new file mode 100644 index 0000000..a5d89c4 --- /dev/null +++ b/templates/skill/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/skill/_form.html.twig b/templates/skill/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/skill/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/skill/edit.html.twig b/templates/skill/edit.html.twig new file mode 100644 index 0000000..16d97d1 --- /dev/null +++ b/templates/skill/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit Skill{% endblock %} + +{% block body %} +

Edit Skill

+ + {{ include('skill/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('skill/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/skill/index.html.twig b/templates/skill/index.html.twig new file mode 100644 index 0000000..658e606 --- /dev/null +++ b/templates/skill/index.html.twig @@ -0,0 +1,35 @@ +{% extends 'base.html.twig' %} + +{% block title %}Skill index{% endblock %} + +{% block body %} +

Skill index

+ + + + + + + + + + + {% for skill in skills %} + + + + + + {% else %} + + + + {% endfor %} + +
IdLabelactions
{{ skill.id }}{{ skill.label }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/skill/new.html.twig b/templates/skill/new.html.twig new file mode 100644 index 0000000..2ff534a --- /dev/null +++ b/templates/skill/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New Skill{% endblock %} + +{% block body %} +

Create new Skill

+ + {{ include('skill/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/skill/show.html.twig b/templates/skill/show.html.twig new file mode 100644 index 0000000..fa12f07 --- /dev/null +++ b/templates/skill/show.html.twig @@ -0,0 +1,26 @@ +{% extends 'base.html.twig' %} + +{% block title %}Skill{% endblock %} + +{% block body %} +

Skill

+ + + + + + + + + + + + +
Id{{ skill.id }}
Label{{ skill.label }}
+ + back to list + + edit + + {{ include('skill/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/user_app/_delete_form.html.twig b/templates/user_app/_delete_form.html.twig new file mode 100644 index 0000000..804fbbf --- /dev/null +++ b/templates/user_app/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/user_app/_form.html.twig b/templates/user_app/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/user_app/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/user_app/edit.html.twig b/templates/user_app/edit.html.twig new file mode 100644 index 0000000..346e18e --- /dev/null +++ b/templates/user_app/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit UserApp{% endblock %} + +{% block body %} +

Edit UserApp

+ + {{ include('user_app/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('user_app/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/user_app/index.html.twig b/templates/user_app/index.html.twig new file mode 100644 index 0000000..b2c562e --- /dev/null +++ b/templates/user_app/index.html.twig @@ -0,0 +1,49 @@ +{% extends 'base.html.twig' %} + +{% block title %}UserApp index{% endblock %} + +{% block body %} +

UserApp index

+ + + + + + + + + + + + + + + + + + {% for user_app in user_apps %} + + + + + + + + + + + + + {% else %} + + + + {% endfor %} + +
IdNicknameRolesPasswordFirstNameLastNameTelAddressMailactions
{{ user_app.id }}{{ user_app.nickname }}{{ user_app.roles ? user_app.roles|json_encode : '' }}{{ user_app.password }}{{ user_app.firstName }}{{ user_app.lastName }}{{ user_app.tel }}{{ user_app.address }}{{ user_app.mail }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/user_app/new.html.twig b/templates/user_app/new.html.twig new file mode 100644 index 0000000..8a65e8d --- /dev/null +++ b/templates/user_app/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New UserApp{% endblock %} + +{% block body %} +

Create new UserApp

+ + {{ include('user_app/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/user_app/show.html.twig b/templates/user_app/show.html.twig new file mode 100644 index 0000000..931539c --- /dev/null +++ b/templates/user_app/show.html.twig @@ -0,0 +1,54 @@ +{% extends 'base.html.twig' %} + +{% block title %}UserApp{% endblock %} + +{% block body %} +

UserApp

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id{{ user_app.id }}
Nickname{{ user_app.nickname }}
Roles{{ user_app.roles ? user_app.roles|json_encode : '' }}
Password{{ user_app.password }}
FirstName{{ user_app.firstName }}
LastName{{ user_app.lastName }}
Tel{{ user_app.tel }}
Address{{ user_app.address }}
Mail{{ user_app.mail }}
+ + back to list + + edit + + {{ include('user_app/_delete_form.html.twig') }} +{% endblock %} From c93e5af9e3ce4affca0631e469097104970b2c36 Mon Sep 17 00:00:00 2001 From: allavenavr Date: Thu, 21 Nov 2024 17:52:50 +0100 Subject: [PATCH 26/71] index de l'appli --- src/Controller/IndexController.php | 18 ++ templates/index/index.html.twig | 297 +++++++++++++++++++++++++++++ 2 files changed, 315 insertions(+) create mode 100644 src/Controller/IndexController.php create mode 100644 templates/index/index.html.twig diff --git a/src/Controller/IndexController.php b/src/Controller/IndexController.php new file mode 100644 index 0000000..0bc7e55 --- /dev/null +++ b/src/Controller/IndexController.php @@ -0,0 +1,18 @@ +render('index/index.html.twig', [ + 'controller_name' => 'IndexController', + ]); + } +} \ No newline at end of file diff --git a/templates/index/index.html.twig b/templates/index/index.html.twig new file mode 100644 index 0000000..08175d5 --- /dev/null +++ b/templates/index/index.html.twig @@ -0,0 +1,297 @@ + + + + + + Job Portal + + + + + + + +
+
+
+ + HegreSphere +
+ + +
+
+ +
+ + +
+

+ Trouvez votre stage de rêve ! +

+

+ Connectez les talents aux opportunités : votre clé vers le succès professionnel +

+
+
+ + + + +
+
+
+
+ + +

+ +850 Stages +

+
+
+ + +

+ 1500 Candidats +

+
+
+ + +

+ +500 Entreprises +

+
+
+
+
+
+
+

+ Propositions de stages récentes +

+ + Voir tout + +
+
+
+
+
+ 10 min ago +
+
+

+ Forward Security Director +

+

+ Bauch, Schuppe and Schulist Co +

+
+ + + + Hotels & Tourism + + + + + Full time + + + + + $40000-$42000 + + + + + New York, USA + +
+
+
+ +
+
+
+
+ 12 min ago +
+
+

+ Regional Creative Facilitator +

+

+ Wisozk - Becker Co +

+
+ + + + Media + + + + + Part time + + + + + $28000-$32000 + + + + + Los Angeles, USA + +
+
+
+ +
+
+
+
+ 15 min ago +
+
+

+ Internal Integration Planner +

+

+ Metz, Quigley and Feest Inc. +

+
+ + + + Construction + + + + + Full time + + + + + $48000-$50000 + + + + + Texas, USA + +
+
+
+ +
+
+
+
+ 26 min ago +
+
+

+ District Intranet Director +

+

+ VonRueden - Weber Co +

+
+ + + + Commerce + + + + + Full time + + + + + $42000-$46000 + + + + + Florida, USA + +
+
+
+ +
+
+
+
+ 26 min ago +
+
+

+ Corporate Tactics Facilitator +

+

+ Cormier, Turner and Bailey Inc +

+
+ + + + Commerce + + + + + Full time + + + + + $38000-$40000 + + + + + Boston, USA + +
+
+
+ +
+
+
+ + \ No newline at end of file From c84c7c4c4931eac80e7b3e14ab0e4e28a6687ee8 Mon Sep 17 00:00:00 2001 From: barillote Date: Thu, 17 Oct 2024 17:52:40 +0200 Subject: [PATCH 27/71] =?UTF-8?q?remise=20=C3=A0=20z=20de=20la=20branche?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .idea/.gitignore diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml From ac42fb9f85aed994b8318e3a887f7c5894372331 Mon Sep 17 00:00:00 2001 From: allavenavr Date: Thu, 17 Oct 2024 17:56:46 +0200 Subject: [PATCH 28/71] tqtencore tjr --- src/Entity/Announcement.php | 83 +++++++---------- src/Entity/Intern.php | 179 +++++++++++++----------------------- src/Entity/Obtaining.php | 36 ++++++++ src/Entity/Skill.php | 17 ++-- 4 files changed, 137 insertions(+), 178 deletions(-) create mode 100644 src/Entity/Obtaining.php diff --git a/src/Entity/Announcement.php b/src/Entity/Announcement.php index 6360da7..41bcf91 100644 --- a/src/Entity/Announcement.php +++ b/src/Entity/Announcement.php @@ -5,7 +5,6 @@ namespace App\Entity; use App\Repository\AnnouncementRepository; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; -use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: AnnouncementRepository::class)] @@ -22,32 +21,30 @@ class Announcement #[ORM\Column(length: 255)] private ?string $description = null; - #[ORM\Column(type: Types::DATE_MUTABLE)] - private ?\DateTimeInterface $creationDate = null; - #[ORM\ManyToOne(inversedBy: 'announcements')] #[ORM\JoinColumn(nullable: false)] private ?Company $company = null; - #[ORM\Column(length: 255,nullable: false)] - private ?string $status = "notVerified"; + #[ORM\ManyToOne(inversedBy: 'announcements')] + #[ORM\JoinColumn(nullable: false)] + private ?Status $status = null; /** - * @var ?Collection + * @var Collection */ - #[ORM\OneToMany(targetEntity: InternApplication::class, mappedBy: 'application')] - private ?Collection $applicants; + #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'favorites')] + private Collection $internsfav; /** - * @var ?Collection + * @var Collection */ - #[ORM\OneToMany(targetEntity: InternFavorite::class, mappedBy: 'announcement')] - private ?Collection $favoritesInterns; + #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'applications')] + private Collection $applicants; public function __construct() { + $this->internsfav = new ArrayCollection(); $this->applicants = new ArrayCollection(); - $this->favoritesInterns = new ArrayCollection(); } public function getId(): ?int @@ -91,7 +88,7 @@ class Announcement return $this; } - public function getStatus(): ?string + public function getStatus(): ?Status { return $this->status; } @@ -104,74 +101,56 @@ class Announcement } /** - * @return Collection + * @return Collection */ - public function getApplicants(): Collection + public function getInternsfav(): Collection { - return $this->applicants; + return $this->internsfav; } - public function addApplicants(InternApplication $applicants): static + public function addInternfav(Intern $intern): static { - if (!$this->applicants->contains($applicants)) { - $this->applicants->add($applicants); - $applicants->setApplication($this); + if (!$this->internsfav->contains($intern)) { + $this->internsfav->add($intern); + $intern->addFavorite($this); } return $this; } - public function removeApplicants(InternApplication $applicants): static + public function removeInternfav(Intern $intern): static { - if ($this->applicants->removeElement($applicants)) { - // set the owning side to null (unless already changed) - if ($applicants->getApplication() === $this) { - $applicants->setApplication(null); - } + if ($this->internsfav->removeElement($intern)) { + $intern->removeFavorite($this); } return $this; } /** - * @return Collection + * @return Collection */ - public function getFavoritesInterns(): Collection + public function getApplicants(): Collection { - return $this->favoritesInterns; + return $this->applicants; } - public function addFavoritesIntern(InternFavorite $favoritesIntern): static + public function addApplicant(Intern $applicant): static { - if (!$this->favoritesInterns->contains($favoritesIntern)) { - $this->favoritesInterns->add($favoritesIntern); - $favoritesIntern->setAnnouncement($this); + if (!$this->applicants->contains($applicant)) { + $this->applicants->add($applicant); + $applicant->addApplication($this); } return $this; } - public function removeFavoritesIntern(InternFavorite $favoritesIntern): static + public function removeApplicant(Intern $applicant): static { - if ($this->favoritesInterns->removeElement($favoritesIntern)) { - // set the owning side to null (unless already changed) - if ($favoritesIntern->getAnnouncement() === $this) { - $favoritesIntern->setAnnouncement(null); - } + if ($this->applicants->removeElement($applicant)) { + $applicant->removeApplication($this); } return $this; } - - public function getCreationDate(): ?\DateTimeInterface - { - return $this->creationDate; - } - - public function setCreationDate(\DateTimeInterface $creationDate): static - { - $this->creationDate = $creationDate; - - return $this; - } } diff --git a/src/Entity/Intern.php b/src/Entity/Intern.php index 2ca1f8e..b03dcd8 100644 --- a/src/Entity/Intern.php +++ b/src/Entity/Intern.php @@ -19,35 +19,30 @@ class Intern extends UserApp private ?string $resume = null; /** - * @var Collection + * @var Collection */ - #[ORM\OneToMany(targetEntity: InternDegree::class, mappedBy: 'intern')] - private Collection $degrees; + #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'interns')] + #[ORM\JoinTable(name: 'favorites')] + private Collection $favorites; /** - * @var Collection + * @var Collection */ - #[ORM\OneToMany(targetEntity: InternSkill::class, mappedBy: 'intern')] - private Collection $skills; - - /** - * @var Collection - */ - #[ORM\OneToMany(targetEntity: InternApplication::class, mappedBy: 'intern')] + #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'applicants')] + #[ORM\JoinTable(name: 'applications')] private Collection $applications; /** - * @var Collection + * @var Collection */ - #[ORM\OneToMany(targetEntity: InternFavorite::class, mappedBy: 'intern')] - private Collection $favorites; + #[ORM\ManyToMany(targetEntity: Skill::class, inversedBy: 'interns')] + private Collection $skills; public function __construct() { - $this->degrees = new ArrayCollection(); - $this->skills = new ArrayCollection(); - $this->applications = new ArrayCollection(); $this->favorites = new ArrayCollection(); + $this->applications = new ArrayCollection(); + $this->skills = new ArrayCollection(); } public function getCoverLetter(): ?string @@ -75,122 +70,74 @@ class Intern extends UserApp } /** - * @return Collection - */ - public function getDegrees(): Collection - { - return $this->degrees; - } - - public function addDegree(InternDegree $degree): static - { - if (!$this->degrees->contains($degree)) { - $this->degrees->add($degree); - $degree->setIntern($this); - } - - return $this; - } - - public function removeDegree(InternDegree $degree): static - { - if ($this->degrees->removeElement($degree)) { - // set the owning side to null (unless already changed) - if ($degree->getIntern() === $this) { - $degree->setIntern(null); - } - } - - return $this; - } - - /** - * @return Collection - */ - public function getSkills(): Collection - { - return $this->skills; - } - - public function addSkill(InternSkill $skill): static - { - if (!$this->skills->contains($skill)) { - $this->skills->add($skill); - $skill->setIntern($this); - } - - return $this; - } - - public function removeSkill(InternSkill $skill): static - { - if ($this->skills->removeElement($skill)) { - // set the owning side to null (unless already changed) - if ($skill->getIntern() === $this) { - $skill->setIntern(null); - } - } - - return $this; - } - - /** - * @return Collection - */ - public function getApplications(): Collection - { - return $this->applications; - } - - public function addApplication(InternApplication $application): static - { - if (!$this->applications->contains($application)) { - $this->applications->add($application); - $application->setIntern($this); - } - - return $this; - } - - public function removeApplication(InternApplication $application): static - { - if ($this->applications->removeElement($application)) { - // set the owning side to null (unless already changed) - if ($application->getIntern() === $this) { - $application->setIntern(null); - } - } - - return $this; - } - - /** - * @return Collection + * @return Collection */ public function getFavorites(): Collection { return $this->favorites; } - public function addFavorite(InternFavorite $favorite): static + public function addFavorite(Announcement $favorite): static { if (!$this->favorites->contains($favorite)) { $this->favorites->add($favorite); - $favorite->setIntern($this); } return $this; } - public function removeFavorite(InternFavorite $favorite): static + public function removeFavorite(Announcement $favorite): static { - if ($this->favorites->removeElement($favorite)) { - // set the owning side to null (unless already changed) - if ($favorite->getIntern() === $this) { - $favorite->setIntern(null); - } + $this->favorites->removeElement($favorite); + + return $this; + } + + /** + * @return Collection + */ + public function getApplications(): Collection + { + return $this->applications; + } + + public function addApplication(Announcement $application): static + { + if (!$this->applications->contains($application)) { + $this->applications->add($application); } return $this; } + + public function removeApplication(Announcement $application): static + { + $this->applications->removeElement($application); + + return $this; + } + + /** + * @return Collection + */ + public function getSkills(): Collection + { + return $this->skills; + } + + public function addSkill(Skill $skill): static + { + if (!$this->skills->contains($skill)) { + $this->skills->add($skill); + } + + return $this; + } + + public function removeSkill(Skill $skill): static + { + $this->skills->removeElement($skill); + + return $this; + } } diff --git a/src/Entity/Obtaining.php b/src/Entity/Obtaining.php new file mode 100644 index 0000000..cecb3c1 --- /dev/null +++ b/src/Entity/Obtaining.php @@ -0,0 +1,36 @@ +id; + } + + public function getDate(): ?\DateTimeInterface + { + return $this->date; + } + + public function setDate(\DateTimeInterface $date): static + { + $this->date = $date; + + return $this; + } +} diff --git a/src/Entity/Skill.php b/src/Entity/Skill.php index 7752cfe..47bea20 100644 --- a/src/Entity/Skill.php +++ b/src/Entity/Skill.php @@ -19,9 +19,9 @@ class Skill private ?string $label = null; /** - * @var Collection + * @var Collection */ - #[ORM\OneToMany(targetEntity: InternSkill::class, mappedBy: 'skill')] + #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'skills')] private Collection $interns; public function __construct() @@ -47,30 +47,27 @@ class Skill } /** - * @return Collection + * @return Collection */ public function getInterns(): Collection { return $this->interns; } - public function addIntern(InternSkill $intern): static + public function addIntern(Intern $intern): static { if (!$this->interns->contains($intern)) { $this->interns->add($intern); - $intern->setSkill($this); + $intern->addSkill($this); } return $this; } - public function removeIntern(InternSkill $intern): static + public function removeIntern(Intern $intern): static { if ($this->interns->removeElement($intern)) { - // set the owning side to null (unless already changed) - if ($intern->getSkill() === $this) { - $intern->setSkill(null); - } + $intern->removeSkill($this); } return $this; From e083dc1cecc1ef9197c1bd8f2b2a8ddabe5f4045 Mon Sep 17 00:00:00 2001 From: Romain Date: Sun, 10 Nov 2024 15:41:01 +0100 Subject: [PATCH 29/71] ajout diplome et message + gestion des relations --- src/Entity/Announcement.php | 90 +++++++++++----------- src/Entity/Intern.php | 147 ++++++++++++++++++++++++------------ src/Entity/Skill.php | 17 +++-- 3 files changed, 158 insertions(+), 96 deletions(-) diff --git a/src/Entity/Announcement.php b/src/Entity/Announcement.php index 41bcf91..5cf1c55 100644 --- a/src/Entity/Announcement.php +++ b/src/Entity/Announcement.php @@ -30,21 +30,21 @@ class Announcement private ?Status $status = null; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'favorites')] - private Collection $internsfav; + #[ORM\OneToMany(targetEntity: InternApplication::class, mappedBy: 'application')] + private Collection $applicants; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'applications')] - private Collection $applicants; + #[ORM\OneToMany(targetEntity: InternFavorite::class, mappedBy: 'announcement')] + private Collection $favoritesInterns; public function __construct() { - $this->internsfav = new ArrayCollection(); $this->applicants = new ArrayCollection(); + $this->favoritesInterns = new ArrayCollection(); } public function getId(): ?int @@ -101,54 +101,60 @@ class Announcement } /** - * @return Collection - */ - public function getInternsfav(): Collection - { - return $this->internsfav; - } - - public function addInternfav(Intern $intern): static - { - if (!$this->internsfav->contains($intern)) { - $this->internsfav->add($intern); - $intern->addFavorite($this); - } - - return $this; - } - - public function removeInternfav(Intern $intern): static - { - if ($this->internsfav->removeElement($intern)) { - $intern->removeFavorite($this); - } - - return $this; - } - - /** - * @return Collection + * @return Collection */ public function getApplicants(): Collection { return $this->applicants; } - public function addApplicant(Intern $applicant): static + public function addApplicants(InternApplication $applicants): static { - if (!$this->applicants->contains($applicant)) { - $this->applicants->add($applicant); - $applicant->addApplication($this); + if (!$this->applicants->contains($applicants)) { + $this->applicants->add($applicants); + $applicants->setApplication($this); } return $this; } - public function removeApplicant(Intern $applicant): static + public function removeApplicants(InternApplication $applicants): static { - if ($this->applicants->removeElement($applicant)) { - $applicant->removeApplication($this); + if ($this->applicants->removeElement($applicants)) { + // set the owning side to null (unless already changed) + if ($applicants->getApplication() === $this) { + $applicants->setApplication(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getFavoritesInterns(): Collection + { + return $this->favoritesInterns; + } + + public function addFavoritesIntern(InternFavorite $favoritesIntern): static + { + if (!$this->favoritesInterns->contains($favoritesIntern)) { + $this->favoritesInterns->add($favoritesIntern); + $favoritesIntern->setAnnouncement($this); + } + + return $this; + } + + public function removeFavoritesIntern(InternFavorite $favoritesIntern): static + { + if ($this->favoritesInterns->removeElement($favoritesIntern)) { + // set the owning side to null (unless already changed) + if ($favoritesIntern->getAnnouncement() === $this) { + $favoritesIntern->setAnnouncement(null); + } } return $this; diff --git a/src/Entity/Intern.php b/src/Entity/Intern.php index b03dcd8..2ca1f8e 100644 --- a/src/Entity/Intern.php +++ b/src/Entity/Intern.php @@ -19,30 +19,35 @@ class Intern extends UserApp private ?string $resume = null; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'interns')] - #[ORM\JoinTable(name: 'favorites')] - private Collection $favorites; + #[ORM\OneToMany(targetEntity: InternDegree::class, mappedBy: 'intern')] + private Collection $degrees; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'applicants')] - #[ORM\JoinTable(name: 'applications')] + #[ORM\OneToMany(targetEntity: InternSkill::class, mappedBy: 'intern')] + private Collection $skills; + + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: InternApplication::class, mappedBy: 'intern')] private Collection $applications; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Skill::class, inversedBy: 'interns')] - private Collection $skills; + #[ORM\OneToMany(targetEntity: InternFavorite::class, mappedBy: 'intern')] + private Collection $favorites; public function __construct() { - $this->favorites = new ArrayCollection(); - $this->applications = new ArrayCollection(); + $this->degrees = new ArrayCollection(); $this->skills = new ArrayCollection(); + $this->applications = new ArrayCollection(); + $this->favorites = new ArrayCollection(); } public function getCoverLetter(): ?string @@ -70,73 +75,121 @@ class Intern extends UserApp } /** - * @return Collection + * @return Collection */ - public function getFavorites(): Collection + public function getDegrees(): Collection { - return $this->favorites; + return $this->degrees; } - public function addFavorite(Announcement $favorite): static + public function addDegree(InternDegree $degree): static { - if (!$this->favorites->contains($favorite)) { - $this->favorites->add($favorite); + if (!$this->degrees->contains($degree)) { + $this->degrees->add($degree); + $degree->setIntern($this); } return $this; } - public function removeFavorite(Announcement $favorite): static + public function removeDegree(InternDegree $degree): static { - $this->favorites->removeElement($favorite); - - return $this; - } - - /** - * @return Collection - */ - public function getApplications(): Collection - { - return $this->applications; - } - - public function addApplication(Announcement $application): static - { - if (!$this->applications->contains($application)) { - $this->applications->add($application); + if ($this->degrees->removeElement($degree)) { + // set the owning side to null (unless already changed) + if ($degree->getIntern() === $this) { + $degree->setIntern(null); + } } return $this; } - public function removeApplication(Announcement $application): static - { - $this->applications->removeElement($application); - - return $this; - } - /** - * @return Collection + * @return Collection */ public function getSkills(): Collection { return $this->skills; } - public function addSkill(Skill $skill): static + public function addSkill(InternSkill $skill): static { if (!$this->skills->contains($skill)) { $this->skills->add($skill); + $skill->setIntern($this); } return $this; } - public function removeSkill(Skill $skill): static + public function removeSkill(InternSkill $skill): static { - $this->skills->removeElement($skill); + if ($this->skills->removeElement($skill)) { + // set the owning side to null (unless already changed) + if ($skill->getIntern() === $this) { + $skill->setIntern(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getApplications(): Collection + { + return $this->applications; + } + + public function addApplication(InternApplication $application): static + { + if (!$this->applications->contains($application)) { + $this->applications->add($application); + $application->setIntern($this); + } + + return $this; + } + + public function removeApplication(InternApplication $application): static + { + if ($this->applications->removeElement($application)) { + // set the owning side to null (unless already changed) + if ($application->getIntern() === $this) { + $application->setIntern(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getFavorites(): Collection + { + return $this->favorites; + } + + public function addFavorite(InternFavorite $favorite): static + { + if (!$this->favorites->contains($favorite)) { + $this->favorites->add($favorite); + $favorite->setIntern($this); + } + + return $this; + } + + public function removeFavorite(InternFavorite $favorite): static + { + if ($this->favorites->removeElement($favorite)) { + // set the owning side to null (unless already changed) + if ($favorite->getIntern() === $this) { + $favorite->setIntern(null); + } + } return $this; } diff --git a/src/Entity/Skill.php b/src/Entity/Skill.php index 47bea20..7752cfe 100644 --- a/src/Entity/Skill.php +++ b/src/Entity/Skill.php @@ -19,9 +19,9 @@ class Skill private ?string $label = null; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'skills')] + #[ORM\OneToMany(targetEntity: InternSkill::class, mappedBy: 'skill')] private Collection $interns; public function __construct() @@ -47,27 +47,30 @@ class Skill } /** - * @return Collection + * @return Collection */ public function getInterns(): Collection { return $this->interns; } - public function addIntern(Intern $intern): static + public function addIntern(InternSkill $intern): static { if (!$this->interns->contains($intern)) { $this->interns->add($intern); - $intern->addSkill($this); + $intern->setSkill($this); } return $this; } - public function removeIntern(Intern $intern): static + public function removeIntern(InternSkill $intern): static { if ($this->interns->removeElement($intern)) { - $intern->removeSkill($this); + // set the owning side to null (unless already changed) + if ($intern->getSkill() === $this) { + $intern->setSkill(null); + } } return $this; From 9ec6a67a922456fae972ae605095466b1f270428 Mon Sep 17 00:00:00 2001 From: Romain Date: Mon, 11 Nov 2024 16:00:51 +0100 Subject: [PATCH 30/71] tqt encore ++ --- src/Controller/AnnouncementController.php | 39 ----------------------- src/Entity/Announcement.php | 24 +++++++++++--- src/Entity/Obtaining.php | 36 --------------------- src/Form/AnnouncementType.php | 4 +++ templates/announcement/list.html.twig | 3 +- 5 files changed, 26 insertions(+), 80 deletions(-) delete mode 100644 src/Entity/Obtaining.php diff --git a/src/Controller/AnnouncementController.php b/src/Controller/AnnouncementController.php index 150595b..9ca78fc 100644 --- a/src/Controller/AnnouncementController.php +++ b/src/Controller/AnnouncementController.php @@ -3,7 +3,6 @@ namespace App\Controller; use App\Entity\Announcement; -use App\Entity\InternApplication; use App\Form\AnnouncementType; use App\Repository\AnnouncementRepository; use Doctrine\ORM\EntityManagerInterface; @@ -66,9 +65,6 @@ class AnnouncementController extends AbstractController { $this->entityManager->persist($announcement); $this->entityManager->flush(); - - $this->addFlash('success', 'Annonce modifiéé avec succès.'); - return $this->redirectToRoute('app_announcement_list'); } return $this->render('announcement/add.html.twig', [ @@ -85,39 +81,4 @@ class AnnouncementController extends AbstractController return $this->redirectToRoute('app_announcement_list'); } - - #[Route('/apply/{id}', name: '_apply')] - public function applyToAnnouncement(int $id): Response - { - - $announcement = $this->announcementRepository->find($id); - - $user = $this->getUser(); - - $existingCandidature = $this->entityManager->getRepository(InternApplication::class)->findOneBy([ - 'intern' => $user, - 'announcement' => $announcement - ]); - - if($existingCandidature) { - $this->addFlash('error', 'Vous avez déjà postulé à cette annonce.'); - return $this->redirectToRoute('app_announcement_list'); - } - $application = new InternApplication(); - $application->setIntern($user); - $application->setIntern($announcement); - $application->setApplicationDate(new \DateTime()); - - $this->entityManager->persist($application); - $this->entityManager->flush(); - - $this->addFlash('success', 'Votre candidature a été envoyée avec succès.'); - return $this->redirectToRoute('annonce_list', ['id' => $announcement->getId()]); - } - - #[Route('/filterByCompany', name: '_filterByCompany')] - public function filterByCompany(int $id): Response - { - return $this->redirectToRoute('annonce_list', ['id' => $id]); - } } diff --git a/src/Entity/Announcement.php b/src/Entity/Announcement.php index 5cf1c55..94cf1a6 100644 --- a/src/Entity/Announcement.php +++ b/src/Entity/Announcement.php @@ -5,6 +5,7 @@ namespace App\Entity; use App\Repository\AnnouncementRepository; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: AnnouncementRepository::class)] @@ -30,16 +31,19 @@ class Announcement private ?Status $status = null; /** - * @var Collection + * @var ?Collection */ #[ORM\OneToMany(targetEntity: InternApplication::class, mappedBy: 'application')] - private Collection $applicants; + private ?Collection $applicants; /** - * @var Collection + * @var ?Collection */ #[ORM\OneToMany(targetEntity: InternFavorite::class, mappedBy: 'announcement')] - private Collection $favoritesInterns; + private ?Collection $favoritesInterns; + + #[ORM\Column(type: Types::DATE_MUTABLE)] + private ?\DateTimeInterface $creationDate = null; public function __construct() { @@ -159,4 +163,16 @@ class Announcement return $this; } + + public function getCreationDate(): ?\DateTimeInterface + { + return $this->creationDate; + } + + public function setCreationDate(\DateTimeInterface $creationDate): static + { + $this->creationDate = $creationDate; + + return $this; + } } diff --git a/src/Entity/Obtaining.php b/src/Entity/Obtaining.php deleted file mode 100644 index cecb3c1..0000000 --- a/src/Entity/Obtaining.php +++ /dev/null @@ -1,36 +0,0 @@ -id; - } - - public function getDate(): ?\DateTimeInterface - { - return $this->date; - } - - public function setDate(\DateTimeInterface $date): static - { - $this->date = $date; - - return $this; - } -} diff --git a/src/Form/AnnouncementType.php b/src/Form/AnnouncementType.php index 21a844d..ef1255f 100644 --- a/src/Form/AnnouncementType.php +++ b/src/Form/AnnouncementType.php @@ -22,6 +22,10 @@ class AnnouncementType extends AbstractType 'class' => Company::class, 'choice_label' => 'id', ]) + ->add('status', EntityType::class, [ + 'class' => Status::class, + 'choice_label' => 'id', + ]) ->add('submit', SubmitType::class) ; } diff --git a/templates/announcement/list.html.twig b/templates/announcement/list.html.twig index 91cfb8d..d1d3c02 100644 --- a/templates/announcement/list.html.twig +++ b/templates/announcement/list.html.twig @@ -13,7 +13,8 @@

{{ ann.title }}

{{ ann.company.name }}

{{ ann.description }}

- ------------------------------ + +

{{ ann.creationDate }}

{% endfor %} From 2be0e352ef54e78616190563ca7bd12c0fa31ce1 Mon Sep 17 00:00:00 2001 From: barillote Date: Thu, 21 Nov 2024 15:59:55 +0100 Subject: [PATCH 31/71] moins confiant mais on est la --- config/packages/security.yaml | 41 ++++++++---- migrations/Version20241017134137.php | 67 ------------------- migrations/Version20241017142722.php | 52 --------------- migrations/Version20241017152949.php | 46 ------------- migrations/Version20241121141451.php | 38 +++++++++++ migrations/Version20241121141722.php | 40 +++++++++++ migrations/Version20241121141818.php | 31 +++++++++ migrations/Version20241121141912.php | 32 +++++++++ migrations/Version20241121142119.php | 34 ++++++++++ migrations/Version20241121142432.php | 31 +++++++++ migrations/Version20241121145353.php | 32 +++++++++ src/Controller/RegistrationController.php | 39 +++++++++-- src/Controller/SecurityController.php | 81 ++--------------------- src/Entity/Announcement.php | 9 ++- src/Entity/Employee.php | 2 +- src/Entity/Intern.php | 4 +- src/Entity/Status.php | 78 ---------------------- src/Entity/UserApp.php | 31 +++++++-- src/Form/RegistrationFormType.php | 15 +++-- src/Repository/StatusRepository.php | 43 ------------ src/Security/EmailVerifier.php | 52 +++++++++++++++ templates/registration/register.html.twig | 24 +++---- templates/security/login.html.twig | 65 +++++++++--------- 23 files changed, 435 insertions(+), 452 deletions(-) delete mode 100644 migrations/Version20241017134137.php delete mode 100644 migrations/Version20241017142722.php delete mode 100644 migrations/Version20241017152949.php create mode 100644 migrations/Version20241121141451.php create mode 100644 migrations/Version20241121141722.php create mode 100644 migrations/Version20241121141818.php create mode 100644 migrations/Version20241121141912.php create mode 100644 migrations/Version20241121142119.php create mode 100644 migrations/Version20241121142432.php create mode 100644 migrations/Version20241121145353.php delete mode 100644 src/Entity/Status.php delete mode 100644 src/Repository/StatusRepository.php create mode 100644 src/Security/EmailVerifier.php diff --git a/config/packages/security.yaml b/config/packages/security.yaml index ce8f2b7..7c33053 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -1,34 +1,47 @@ security: # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords password_hashers: - Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' + Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'plaintext' # à mettre en auto pour sécuriser les mdp # https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider providers: # used to reload user from session & other features (e.g. switch_user) - app_user_provider: + app_intern_provider: entity: - class: App\Entity\User + class: App\Entity\Intern property: nickname + + app_employee_provider: + entity: + class: App\Entity\Employee + property: nickname + # used to reload user from session & other features (e.g. switch_user) + # used to reload user from session & other features (e.g. switch_user) firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false - main: + intern: lazy: true - provider: app_user_provider - custom_authenticator: App\Security\UserAuthenticator + provider: app_intern_provider + form_login: + login_path: app_login + check_path: app_login + enable_csrf: true + logout: + path: app_logout + # where to redirect after logout + # target: app_any_route + employee: + lazy: true + provider: app_employee_provider + form_login: + login_path: app_login + check_path: app_login + enable_csrf: true logout: path: app_logout # where to redirect after logout # target: app_any_route - - remember_me: - secret: '%kernel.secret%' - lifetime: 604800 - path: / - # by default, the feature is enabled by checking a checkbox in the - # login form, uncomment the following line to always enable it. - #always_remember_me: true # activate different ways to authenticate # https://symfony.com/doc/current/security.html#the-firewall diff --git a/migrations/Version20241017134137.php b/migrations/Version20241017134137.php deleted file mode 100644 index 0dc3e3c..0000000 --- a/migrations/Version20241017134137.php +++ /dev/null @@ -1,67 +0,0 @@ -addSql('CREATE SEQUENCE announcement_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE company_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE userApp_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE TABLE announcement (id INT NOT NULL, title VARCHAR(255) NOT NULL, description VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE company (id INT NOT NULL, name VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE employee (id INT NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE intern (id INT NOT NULL, cover_letter TEXT NOT NULL, resume VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE userApp (id INT NOT NULL, nickname VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, DISCRIMINATOR VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_NICKNAME ON userApp (nickname)'); - $this->addSql('CREATE TABLE messenger_messages (id BIGSERIAL NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0 ON messenger_messages (queue_name)'); - $this->addSql('CREATE INDEX IDX_75EA56E0E3BD61CE ON messenger_messages (available_at)'); - $this->addSql('CREATE INDEX IDX_75EA56E016BA31DB ON messenger_messages (delivered_at)'); - $this->addSql('COMMENT ON COLUMN messenger_messages.created_at IS \'(DC2Type:datetime_immutable)\''); - $this->addSql('COMMENT ON COLUMN messenger_messages.available_at IS \'(DC2Type:datetime_immutable)\''); - $this->addSql('COMMENT ON COLUMN messenger_messages.delivered_at IS \'(DC2Type:datetime_immutable)\''); - $this->addSql('CREATE OR REPLACE FUNCTION notify_messenger_messages() RETURNS TRIGGER AS $$ - BEGIN - PERFORM pg_notify(\'messenger_messages\', NEW.queue_name::text); - RETURN NEW; - END; - $$ LANGUAGE plpgsql;'); - $this->addSql('DROP TRIGGER IF EXISTS notify_trigger ON messenger_messages;'); - $this->addSql('CREATE TRIGGER notify_trigger AFTER INSERT OR UPDATE ON messenger_messages FOR EACH ROW EXECUTE PROCEDURE notify_messenger_messages();'); - $this->addSql('ALTER TABLE employee ADD CONSTRAINT FK_5D9F75A1BF396750 FOREIGN KEY (id) REFERENCES userApp (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE intern ADD CONSTRAINT FK_A5795F36BF396750 FOREIGN KEY (id) REFERENCES userApp (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('DROP SEQUENCE announcement_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE company_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE userApp_id_seq CASCADE'); - $this->addSql('ALTER TABLE employee DROP CONSTRAINT FK_5D9F75A1BF396750'); - $this->addSql('ALTER TABLE intern DROP CONSTRAINT FK_A5795F36BF396750'); - $this->addSql('DROP TABLE announcement'); - $this->addSql('DROP TABLE company'); - $this->addSql('DROP TABLE employee'); - $this->addSql('DROP TABLE intern'); - $this->addSql('DROP TABLE userApp'); - $this->addSql('DROP TABLE messenger_messages'); - } -} diff --git a/migrations/Version20241017142722.php b/migrations/Version20241017142722.php deleted file mode 100644 index 73818a8..0000000 --- a/migrations/Version20241017142722.php +++ /dev/null @@ -1,52 +0,0 @@ -addSql('CREATE SEQUENCE status_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE TABLE status (id INT NOT NULL, label VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('ALTER TABLE announcement ADD company_id INT NOT NULL'); - $this->addSql('ALTER TABLE announcement ADD status_id INT NOT NULL'); - $this->addSql('ALTER TABLE announcement ADD CONSTRAINT FK_4DB9D91C979B1AD6 FOREIGN KEY (company_id) REFERENCES company (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE announcement ADD CONSTRAINT FK_4DB9D91C6BF700BD FOREIGN KEY (status_id) REFERENCES status (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('CREATE INDEX IDX_4DB9D91C979B1AD6 ON announcement (company_id)'); - $this->addSql('CREATE INDEX IDX_4DB9D91C6BF700BD ON announcement (status_id)'); - $this->addSql('ALTER TABLE employee ADD company_id INT NOT NULL'); - $this->addSql('ALTER TABLE employee ADD CONSTRAINT FK_5D9F75A1979B1AD6 FOREIGN KEY (company_id) REFERENCES company (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('CREATE INDEX IDX_5D9F75A1979B1AD6 ON employee (company_id)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('ALTER TABLE announcement DROP CONSTRAINT FK_4DB9D91C6BF700BD'); - $this->addSql('DROP SEQUENCE status_id_seq CASCADE'); - $this->addSql('DROP TABLE status'); - $this->addSql('ALTER TABLE announcement DROP CONSTRAINT FK_4DB9D91C979B1AD6'); - $this->addSql('DROP INDEX IDX_4DB9D91C979B1AD6'); - $this->addSql('DROP INDEX IDX_4DB9D91C6BF700BD'); - $this->addSql('ALTER TABLE announcement DROP company_id'); - $this->addSql('ALTER TABLE announcement DROP status_id'); - $this->addSql('ALTER TABLE employee DROP CONSTRAINT FK_5D9F75A1979B1AD6'); - $this->addSql('DROP INDEX IDX_5D9F75A1979B1AD6'); - $this->addSql('ALTER TABLE employee DROP company_id'); - } -} diff --git a/migrations/Version20241017152949.php b/migrations/Version20241017152949.php deleted file mode 100644 index 1282d23..0000000 --- a/migrations/Version20241017152949.php +++ /dev/null @@ -1,46 +0,0 @@ -addSql('CREATE TABLE favorites (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); - $this->addSql('CREATE INDEX IDX_E46960F5525DD4B4 ON favorites (intern_id)'); - $this->addSql('CREATE INDEX IDX_E46960F5913AEA17 ON favorites (announcement_id)'); - $this->addSql('CREATE TABLE applications (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); - $this->addSql('CREATE INDEX IDX_F7C966F0525DD4B4 ON applications (intern_id)'); - $this->addSql('CREATE INDEX IDX_F7C966F0913AEA17 ON applications (announcement_id)'); - $this->addSql('ALTER TABLE favorites ADD CONSTRAINT FK_E46960F5525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE favorites ADD CONSTRAINT FK_E46960F5913AEA17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE applications ADD CONSTRAINT FK_F7C966F0525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE applications ADD CONSTRAINT FK_F7C966F0913AEA17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('ALTER TABLE favorites DROP CONSTRAINT FK_E46960F5525DD4B4'); - $this->addSql('ALTER TABLE favorites DROP CONSTRAINT FK_E46960F5913AEA17'); - $this->addSql('ALTER TABLE applications DROP CONSTRAINT FK_F7C966F0525DD4B4'); - $this->addSql('ALTER TABLE applications DROP CONSTRAINT FK_F7C966F0913AEA17'); - $this->addSql('DROP TABLE favorites'); - $this->addSql('DROP TABLE applications'); - } -} diff --git a/migrations/Version20241121141451.php b/migrations/Version20241121141451.php new file mode 100644 index 0000000..d51cde4 --- /dev/null +++ b/migrations/Version20241121141451.php @@ -0,0 +1,38 @@ +addSql('DROP SEQUENCE status_id_seq CASCADE'); + $this->addSql('DROP TABLE status'); + $this->addSql('ALTER TABLE userapp ADD is_verified BOOLEAN NOT NULL'); + $this->addSql('ALTER TABLE userapp ALTER roles SET NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('CREATE SEQUENCE status_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE status (id INT NOT NULL, label VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('ALTER TABLE userApp DROP is_verified'); + $this->addSql('ALTER TABLE userApp ALTER roles DROP NOT NULL'); + } +} diff --git a/migrations/Version20241121141722.php b/migrations/Version20241121141722.php new file mode 100644 index 0000000..6259ec7 --- /dev/null +++ b/migrations/Version20241121141722.php @@ -0,0 +1,40 @@ +addSql('ALTER TABLE userapp ALTER first_name DROP NOT NULL'); + $this->addSql('ALTER TABLE userapp ALTER last_name DROP NOT NULL'); + $this->addSql('ALTER TABLE userapp ALTER tel DROP NOT NULL'); + $this->addSql('ALTER TABLE userapp ALTER address DROP NOT NULL'); + $this->addSql('ALTER TABLE userapp ALTER mail DROP NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE userApp ALTER first_name SET NOT NULL'); + $this->addSql('ALTER TABLE userApp ALTER last_name SET NOT NULL'); + $this->addSql('ALTER TABLE userApp ALTER tel SET NOT NULL'); + $this->addSql('ALTER TABLE userApp ALTER address SET NOT NULL'); + $this->addSql('ALTER TABLE userApp ALTER mail SET NOT NULL'); + } +} diff --git a/migrations/Version20241121141818.php b/migrations/Version20241121141818.php new file mode 100644 index 0000000..7eb43e8 --- /dev/null +++ b/migrations/Version20241121141818.php @@ -0,0 +1,31 @@ +addSql('CREATE SCHEMA public'); + } +} diff --git a/migrations/Version20241121141912.php b/migrations/Version20241121141912.php new file mode 100644 index 0000000..fbc5345 --- /dev/null +++ b/migrations/Version20241121141912.php @@ -0,0 +1,32 @@ +addSql('ALTER TABLE userapp ALTER is_verified DROP NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE userApp ALTER is_verified SET NOT NULL'); + } +} diff --git a/migrations/Version20241121142119.php b/migrations/Version20241121142119.php new file mode 100644 index 0000000..44746a0 --- /dev/null +++ b/migrations/Version20241121142119.php @@ -0,0 +1,34 @@ +addSql('ALTER TABLE intern ALTER cover_letter DROP NOT NULL'); + $this->addSql('ALTER TABLE intern ALTER resume DROP NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE intern ALTER cover_letter SET NOT NULL'); + $this->addSql('ALTER TABLE intern ALTER resume SET NOT NULL'); + } +} diff --git a/migrations/Version20241121142432.php b/migrations/Version20241121142432.php new file mode 100644 index 0000000..8226230 --- /dev/null +++ b/migrations/Version20241121142432.php @@ -0,0 +1,31 @@ +addSql('CREATE SCHEMA public'); + } +} diff --git a/migrations/Version20241121145353.php b/migrations/Version20241121145353.php new file mode 100644 index 0000000..439bd80 --- /dev/null +++ b/migrations/Version20241121145353.php @@ -0,0 +1,32 @@ +addSql('ALTER TABLE employee ALTER company_id DROP NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE employee ALTER company_id SET NOT NULL'); + } +} diff --git a/src/Controller/RegistrationController.php b/src/Controller/RegistrationController.php index 88a4a84..b078d9d 100644 --- a/src/Controller/RegistrationController.php +++ b/src/Controller/RegistrationController.php @@ -2,9 +2,10 @@ namespace App\Controller; -use App\Entity\User; +use App\Entity\Employee; +use App\Entity\Intern; +use App\Entity\UserApp; use App\Form\RegistrationFormType; -use App\Security\UserAuthenticator; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\SecurityBundle\Security; @@ -13,12 +14,13 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; use Symfony\Component\Routing\Attribute\Route; +#[Route('/register', name: 'app_register')] class RegistrationController extends AbstractController { - #[Route('/register', name: 'app_register')] + #[Route('/intern', name: '_intern')] public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, Security $security, EntityManagerInterface $entityManager): Response { - $user = new User(); + $user = new Intern(); $form = $this->createForm(RegistrationFormType::class, $user); $form->handleRequest($request); @@ -34,7 +36,34 @@ class RegistrationController extends AbstractController // do anything else you need here, like send an email - return $security->login($user, UserAuthenticator::class, 'main'); + return $security->login($user, 'form_login', 'intern'); + } + + return $this->render('registration/register.html.twig', [ + 'registrationForm' => $form, + ]); + } + + #[Route('/employee', name: '_employee')] + public function registerEmployee(Request $request, UserPasswordHasherInterface $userPasswordHasher, Security $security, EntityManagerInterface $entityManager): Response + { + $user = new Employee(); + $form = $this->createForm(RegistrationFormType::class, $user); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + /** @var string $plainPassword */ + $plainPassword = $form->get('plainPassword')->getData(); + + // encode the plain password + $user->setPassword($userPasswordHasher->hashPassword($user, $plainPassword)); + + $entityManager->persist($user); + $entityManager->flush(); + + // do anything else you need here, like send an email + + return $security->login($user, 'form_login', 'employee'); } return $this->render('registration/register.html.twig', [ diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php index 25c2c56..76bf5c4 100644 --- a/src/Controller/SecurityController.php +++ b/src/Controller/SecurityController.php @@ -2,13 +2,9 @@ namespace App\Controller; -use App\Form\ResetPasswordRequestFormType; -use App\Repository\UserRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; -use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Http\Authentication\AuthenticationUtils; class SecurityController extends AbstractController @@ -16,16 +12,16 @@ class SecurityController extends AbstractController #[Route(path: '/login', name: 'app_login')] public function login(AuthenticationUtils $authenticationUtils): Response { - // if ($this->getUser()) { - // return $this->redirectToRoute('target_path'); - // } - // get the login error if there is one $error = $authenticationUtils->getLastAuthenticationError(); + // last username entered by the user $lastUsername = $authenticationUtils->getLastUsername(); - return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]); + return $this->render('security/login.html.twig', [ + 'last_username' => $lastUsername, + 'error' => $error, + ]); } #[Route(path: '/logout', name: 'app_logout')] @@ -33,71 +29,4 @@ class SecurityController extends AbstractController { throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.'); } - - #[Route('/mot-de-passe-oublie', name: 'forgotten_password')] - public function forgottenPassword( - Request $request, - UserRepository $userRepository, - JWTService $jwt, - SendEmailService $mail - ) : Response - { - $form = $this->createForm(ResetPasswordRequestFormType::class); - - $form->handleRequest($request); - - if($form->isSubmitted() && $form->isValid()) { - // Le formulaire est envoyé ET valide - // On va aller chercher l'utilisateur dans la base - $user = $userRepository->findOneByEmail($form->get('email')->getData()); - - // On verifie si on a un utilisateur - if($user) { - // On a un utilisateur - // On génère un JWT - // Générer le token - // Header - $header = [ - 'typ' => 'JWT', - 'alg' => 'HS256' - ]; - - //Payload - $payload = [ - 'user_id' => $user->getId() - ]; - - //On Génère le token - $token = $jwt->generate($header, $payload, $this->getParameter('app.jwtsecret')); - - // On génère l'URL vers reset_password - $url = $this->generateUrl('reset_password', ['token' => $token], - UrlGeneratorInterface::ABSOLUTE_URL); - - // Envoyer l'e-mail - $mail->send( - 'no-reply@openblog.test', - $user->getEmail(), - 'Récupération de votre mode de passe sur le site OpenBlog', - 'password_reset', - compact('user','url') // ['user' => $user, 'url'=>$url] - ); - - $this->addFlash('success', 'Email envoyé avec succès'); - return $this->redirectToRoute('app_login'); - - } - // $user est null - $this->addFlash('danger', 'Un problème est survenu'); - return $this->redirectToRoute('app_login'); - - } - - - return $this->render('security/reset_password_request.html.twig', ['requestPassForm' => $form->createView()]); - } - //#[Route('/mot-de-passe-oublie/{token}', name: 'reset_password')] - //public function resetPassword(): Response{ - - //}; } diff --git a/src/Entity/Announcement.php b/src/Entity/Announcement.php index 94cf1a6..10e9d9d 100644 --- a/src/Entity/Announcement.php +++ b/src/Entity/Announcement.php @@ -26,9 +26,8 @@ class Announcement #[ORM\JoinColumn(nullable: false)] private ?Company $company = null; - #[ORM\ManyToOne(inversedBy: 'announcements')] - #[ORM\JoinColumn(nullable: false)] - private ?Status $status = null; + #[ORM\Column(length: 255)] + private ?string $status = 'notVerified'; /** * @var ?Collection @@ -92,12 +91,12 @@ class Announcement return $this; } - public function getStatus(): ?Status + public function getStatus(): ?string { return $this->status; } - public function setStatus(?Status $status): static + public function setStatus(?string $status): static { $this->status = $status; diff --git a/src/Entity/Employee.php b/src/Entity/Employee.php index 393a529..42f71b3 100644 --- a/src/Entity/Employee.php +++ b/src/Entity/Employee.php @@ -9,7 +9,7 @@ use Doctrine\ORM\Mapping as ORM; class Employee extends UserApp { #[ORM\ManyToOne(inversedBy: 'employees')] - #[ORM\JoinColumn(nullable: false)] + #[ORM\JoinColumn(nullable: true)] private ?Company $company = null; public function getCompany(): ?Company diff --git a/src/Entity/Intern.php b/src/Entity/Intern.php index 2ca1f8e..daaf428 100644 --- a/src/Entity/Intern.php +++ b/src/Entity/Intern.php @@ -12,10 +12,10 @@ use Doctrine\ORM\Mapping as ORM; class Intern extends UserApp { - #[ORM\Column(type: Types::TEXT)] + #[ORM\Column(type: Types::TEXT,nullable: true)] private ?string $coverLetter = null; - #[ORM\Column(length: 255)] + #[ORM\Column(length: 255,nullable: true)] private ?string $resume = null; /** diff --git a/src/Entity/Status.php b/src/Entity/Status.php deleted file mode 100644 index e672f8c..0000000 --- a/src/Entity/Status.php +++ /dev/null @@ -1,78 +0,0 @@ - - */ - #[ORM\OneToMany(targetEntity: Announcement::class, mappedBy: 'status')] - private Collection $announcements; - - public function __construct() - { - $this->announcements = new ArrayCollection(); - } - - public function getId(): ?int - { - return $this->id; - } - - public function getLabel(): ?string - { - return $this->label; - } - - public function setLabel(string $label): static - { - $this->label = $label; - - return $this; - } - - /** - * @return Collection - */ - public function getAnnouncements(): Collection - { - return $this->announcements; - } - - public function addAnnouncement(Announcement $announcement): static - { - if (!$this->announcements->contains($announcement)) { - $this->announcements->add($announcement); - $announcement->setStatus($this); - } - - return $this; - } - - public function removeAnnouncement(Announcement $announcement): static - { - if ($this->announcements->removeElement($announcement)) { - // set the owning side to null (unless already changed) - if ($announcement->getStatus() === $this) { - $announcement->setStatus(null); - } - } - - return $this; - } -} diff --git a/src/Entity/UserApp.php b/src/Entity/UserApp.php index 5c68f4f..8f87ba6 100644 --- a/src/Entity/UserApp.php +++ b/src/Entity/UserApp.php @@ -4,6 +4,7 @@ namespace App\Entity; use App\Repository\UserRepository; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\UserInterface; @@ -13,6 +14,7 @@ use Symfony\Component\Security\Core\User\UserInterface; #[ORM\DiscriminatorColumn(name: 'DISCRIMINATOR', type: 'string')] #[ORM\DiscriminatorMap(['employee' => Employee::class, 'intern' => Intern::class])] #[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_NICKNAME', fields: ['nickname'])] +#[UniqueEntity(fields: ['nickname'], message: 'Il y a déjà un compte avec ces identifiants !')] class UserApp implements UserInterface, PasswordAuthenticatedUserInterface { #[ORM\Id] @@ -26,8 +28,8 @@ class UserApp implements UserInterface, PasswordAuthenticatedUserInterface /** * @var list The user roles */ - #[ORM\Column(nullable: true)] - private ?array $roles = null; + #[ORM\Column] + private array $roles = ["ROLE_USER"]; /** * @var string The hashed password @@ -35,21 +37,24 @@ class UserApp implements UserInterface, PasswordAuthenticatedUserInterface #[ORM\Column] private ?string $password = null; - #[ORM\Column(length: 255)] + #[ORM\Column(length: 255, nullable: true)] private ?string $firstName = null; - #[ORM\Column(length: 255)] + #[ORM\Column(length: 255, nullable: true)] private ?string $lastName = null; - #[ORM\Column(length: 255)] + #[ORM\Column(length: 255,nullable: true)] private ?string $tel = null; - #[ORM\Column(length: 255)] + #[ORM\Column(length: 255,nullable: true)] private ?string $address = null; - #[ORM\Column(length: 255)] + #[ORM\Column(length: 255,nullable: true)] private ?string $mail = null; + #[ORM\Column(nullable: true)] + private bool $isVerified = false; + public function getId(): ?int { return $this->id; @@ -184,6 +189,18 @@ class UserApp implements UserInterface, PasswordAuthenticatedUserInterface return $this; } + + public function isVerified(): bool + { + return $this->isVerified; + } + + public function setVerified(bool $isVerified): static + { + $this->isVerified = $isVerified; + + return $this; + } } diff --git a/src/Form/RegistrationFormType.php b/src/Form/RegistrationFormType.php index 9fe1e5a..264b544 100644 --- a/src/Form/RegistrationFormType.php +++ b/src/Form/RegistrationFormType.php @@ -2,9 +2,11 @@ namespace App\Form; -use App\Entity\User; +use App\Entity\UserApp; +use Doctrine\DBAL\Types\StringType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\PasswordType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -18,12 +20,11 @@ class RegistrationFormType extends AbstractType { $builder ->add('nickname') - ->add('email') ->add('agreeTerms', CheckboxType::class, [ 'mapped' => false, 'constraints' => [ new IsTrue([ - 'message' => 'You should agree to our terms.', + 'message' => 'Vous devez accepter les conditions d\'utilisation.', ]), ], ]) @@ -34,11 +35,11 @@ class RegistrationFormType extends AbstractType 'attr' => ['autocomplete' => 'new-password'], 'constraints' => [ new NotBlank([ - 'message' => 'Please enter a password', + 'message' => 'Merci d\'entrer votre mot de passe.', ]), new Length([ - 'min' => 8, - 'minMessage' => 'Your password should be at least {{ limit }} characters', + 'min' => 6, + 'minMessage' => 'Votre mot de passe doit avoir au moins {{ limit }} caractères', // max length allowed by Symfony for security reasons 'max' => 4096, ]), @@ -50,7 +51,7 @@ class RegistrationFormType extends AbstractType public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ - 'data_class' => User::class, + 'data_class' => UserApp::class, ]); } } diff --git a/src/Repository/StatusRepository.php b/src/Repository/StatusRepository.php deleted file mode 100644 index ea2e260..0000000 --- a/src/Repository/StatusRepository.php +++ /dev/null @@ -1,43 +0,0 @@ - - */ -class StatusRepository extends ServiceEntityRepository -{ - public function __construct(ManagerRegistry $registry) - { - parent::__construct($registry, Status::class); - } - -// /** -// * @return Status[] Returns an array of Status objects -// */ -// public function findByExampleField($value): array -// { -// return $this->createQueryBuilder('v') -// ->andWhere('v.exampleField = :val') -// ->setParameter('val', $value) -// ->orderBy('v.id', 'ASC') -// ->setMaxResults(10) -// ->getQuery() -// ->getResult() -// ; -// } - -// public function findOneBySomeField($value): ?Status -// { -// return $this->createQueryBuilder('v') -// ->andWhere('v.exampleField = :val') -// ->setParameter('val', $value) -// ->getQuery() -// ->getOneOrNullResult() -// ; -// } -} diff --git a/src/Security/EmailVerifier.php b/src/Security/EmailVerifier.php new file mode 100644 index 0000000..0768c22 --- /dev/null +++ b/src/Security/EmailVerifier.php @@ -0,0 +1,52 @@ +verifyEmailHelper->generateSignature( + $verifyEmailRouteName, + (string) $user->getId(), + (string) $user->getMail() + ); + + $context = $email->getContext(); + $context['signedUrl'] = $signatureComponents->getSignedUrl(); + $context['expiresAtMessageKey'] = $signatureComponents->getExpirationMessageKey(); + $context['expiresAtMessageData'] = $signatureComponents->getExpirationMessageData(); + + $email->context($context); + + $this->mailer->send($email); + } + + /** + * @throws VerifyEmailExceptionInterface + */ + public function handleEmailConfirmation(Request $request, UserApp $user): void + { + $this->verifyEmailHelper->validateEmailConfirmationFromRequest($request, (string) $user->getId(), (string) $user->getMail()); + + $user->setVerified(true); + + $this->entityManager->persist($user); + $this->entityManager->flush(); + } +} diff --git a/templates/registration/register.html.twig b/templates/registration/register.html.twig index 19b63c7..7b064ed 100644 --- a/templates/registration/register.html.twig +++ b/templates/registration/register.html.twig @@ -1,27 +1,19 @@ {% extends 'base.html.twig' %} -{% block title %}M'inscrire{% endblock %} +{% block title %}Inscription{% endblock %} {% block body %} -

M'inscrire

+

Inscription

{{ form_errors(registrationForm) }} {{ form_start(registrationForm) }} -
- {{ form_row(registrationForm.nickname) }} -
-
- {{ form_row(registrationForm.plainPassword, { - label: 'Password' - }) }} -
-
- {{ form_row(registrationForm.email) }} - {{ form_row(registrationForm.agreeTerms) }} -
+ {{ form_row(registrationForm.nickname) }} + {{ form_row(registrationForm.plainPassword, { + label: 'Password' + }) }} + {{ form_row(registrationForm.agreeTerms) }} - + {{ form_end(registrationForm) }} -

Déjà inscrit(e) ? Me connecter

{% endblock %} diff --git a/templates/security/login.html.twig b/templates/security/login.html.twig index e7c0e1e..f711f6f 100644 --- a/templates/security/login.html.twig +++ b/templates/security/login.html.twig @@ -1,42 +1,41 @@ {% extends 'base.html.twig' %} -{% block title %}Me connecter{% endblock %} +{% block title %}Connexion{% endblock %} {% block body %} -
- {% if error %} -
{{ error.messageKey|trans(error.messageData, 'security') }}
- {% endif %} + + {% if error %} +
{{ error.messageKey|trans(error.messageData, 'security') }}
+ {% endif %} - {% if app.user %} -
- Vous êtes déjà connecté(e) en tant que {{ app.user.userIdentifier }}, Se déconnecter -
- {% endif %} + {% if app.user %} +
+ You are logged in as {{ app.user.userIdentifier }}, Logout +
+ {% endif %} -

Me connecter

-
- - -
-
- - -
- +

Connexion à votre compte

+ + + + -
- -
+ - -

Mot de passe oublié

-

Pas encore inscrit(e) ? M'inscrire

-
+ {# + Uncomment this section and add a remember_me option below your firewall to activate remember me functionality. + See https://symfony.com/doc/current/security/remember_me.html + +
+ + +
+ #} + + + {% endblock %} From ddf458e44c58150943c10a7a00aabcd9ffbba03a Mon Sep 17 00:00:00 2001 From: barillote Date: Thu, 21 Nov 2024 16:17:24 +0100 Subject: [PATCH 32/71] roles --- migrations/Version20241121151633.php | 31 +++++++++++++++++++++++ src/Controller/RegistrationController.php | 2 ++ src/Entity/UserApp.php | 2 +- 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 migrations/Version20241121151633.php diff --git a/migrations/Version20241121151633.php b/migrations/Version20241121151633.php new file mode 100644 index 0000000..b9a833a --- /dev/null +++ b/migrations/Version20241121151633.php @@ -0,0 +1,31 @@ +addSql('CREATE SCHEMA public'); + } +} diff --git a/src/Controller/RegistrationController.php b/src/Controller/RegistrationController.php index b078d9d..50e84c2 100644 --- a/src/Controller/RegistrationController.php +++ b/src/Controller/RegistrationController.php @@ -28,6 +28,7 @@ class RegistrationController extends AbstractController /** @var string $plainPassword */ $plainPassword = $form->get('plainPassword')->getData(); + $user->setRoles(['ROLE_INTERN']); // encode the plain password $user->setPassword($userPasswordHasher->hashPassword($user, $plainPassword)); @@ -55,6 +56,7 @@ class RegistrationController extends AbstractController /** @var string $plainPassword */ $plainPassword = $form->get('plainPassword')->getData(); + $user->setRoles(['ROLE_EMPLOYEE']); // encode the plain password $user->setPassword($userPasswordHasher->hashPassword($user, $plainPassword)); diff --git a/src/Entity/UserApp.php b/src/Entity/UserApp.php index 8f87ba6..7dabaa2 100644 --- a/src/Entity/UserApp.php +++ b/src/Entity/UserApp.php @@ -29,7 +29,7 @@ class UserApp implements UserInterface, PasswordAuthenticatedUserInterface * @var list The user roles */ #[ORM\Column] - private array $roles = ["ROLE_USER"]; + private array $roles = []; /** * @var string The hashed password From a6d83640bd4bd791bb5dd2953f48fc3a3e5c12da Mon Sep 17 00:00:00 2001 From: barillote Date: Thu, 21 Nov 2024 17:07:24 +0100 Subject: [PATCH 33/71] login --- migrations/Version20241121141451.php | 38 -------------------------- migrations/Version20241121141722.php | 40 ---------------------------- migrations/Version20241121141818.php | 31 --------------------- migrations/Version20241121141912.php | 32 ---------------------- migrations/Version20241121142119.php | 34 ----------------------- migrations/Version20241121142432.php | 31 --------------------- migrations/Version20241121145353.php | 32 ---------------------- migrations/Version20241121151633.php | 31 --------------------- 8 files changed, 269 deletions(-) delete mode 100644 migrations/Version20241121141451.php delete mode 100644 migrations/Version20241121141722.php delete mode 100644 migrations/Version20241121141818.php delete mode 100644 migrations/Version20241121141912.php delete mode 100644 migrations/Version20241121142119.php delete mode 100644 migrations/Version20241121142432.php delete mode 100644 migrations/Version20241121145353.php delete mode 100644 migrations/Version20241121151633.php diff --git a/migrations/Version20241121141451.php b/migrations/Version20241121141451.php deleted file mode 100644 index d51cde4..0000000 --- a/migrations/Version20241121141451.php +++ /dev/null @@ -1,38 +0,0 @@ -addSql('DROP SEQUENCE status_id_seq CASCADE'); - $this->addSql('DROP TABLE status'); - $this->addSql('ALTER TABLE userapp ADD is_verified BOOLEAN NOT NULL'); - $this->addSql('ALTER TABLE userapp ALTER roles SET NOT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('CREATE SEQUENCE status_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE TABLE status (id INT NOT NULL, label VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('ALTER TABLE userApp DROP is_verified'); - $this->addSql('ALTER TABLE userApp ALTER roles DROP NOT NULL'); - } -} diff --git a/migrations/Version20241121141722.php b/migrations/Version20241121141722.php deleted file mode 100644 index 6259ec7..0000000 --- a/migrations/Version20241121141722.php +++ /dev/null @@ -1,40 +0,0 @@ -addSql('ALTER TABLE userapp ALTER first_name DROP NOT NULL'); - $this->addSql('ALTER TABLE userapp ALTER last_name DROP NOT NULL'); - $this->addSql('ALTER TABLE userapp ALTER tel DROP NOT NULL'); - $this->addSql('ALTER TABLE userapp ALTER address DROP NOT NULL'); - $this->addSql('ALTER TABLE userapp ALTER mail DROP NOT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('ALTER TABLE userApp ALTER first_name SET NOT NULL'); - $this->addSql('ALTER TABLE userApp ALTER last_name SET NOT NULL'); - $this->addSql('ALTER TABLE userApp ALTER tel SET NOT NULL'); - $this->addSql('ALTER TABLE userApp ALTER address SET NOT NULL'); - $this->addSql('ALTER TABLE userApp ALTER mail SET NOT NULL'); - } -} diff --git a/migrations/Version20241121141818.php b/migrations/Version20241121141818.php deleted file mode 100644 index 7eb43e8..0000000 --- a/migrations/Version20241121141818.php +++ /dev/null @@ -1,31 +0,0 @@ -addSql('CREATE SCHEMA public'); - } -} diff --git a/migrations/Version20241121141912.php b/migrations/Version20241121141912.php deleted file mode 100644 index fbc5345..0000000 --- a/migrations/Version20241121141912.php +++ /dev/null @@ -1,32 +0,0 @@ -addSql('ALTER TABLE userapp ALTER is_verified DROP NOT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('ALTER TABLE userApp ALTER is_verified SET NOT NULL'); - } -} diff --git a/migrations/Version20241121142119.php b/migrations/Version20241121142119.php deleted file mode 100644 index 44746a0..0000000 --- a/migrations/Version20241121142119.php +++ /dev/null @@ -1,34 +0,0 @@ -addSql('ALTER TABLE intern ALTER cover_letter DROP NOT NULL'); - $this->addSql('ALTER TABLE intern ALTER resume DROP NOT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('ALTER TABLE intern ALTER cover_letter SET NOT NULL'); - $this->addSql('ALTER TABLE intern ALTER resume SET NOT NULL'); - } -} diff --git a/migrations/Version20241121142432.php b/migrations/Version20241121142432.php deleted file mode 100644 index 8226230..0000000 --- a/migrations/Version20241121142432.php +++ /dev/null @@ -1,31 +0,0 @@ -addSql('CREATE SCHEMA public'); - } -} diff --git a/migrations/Version20241121145353.php b/migrations/Version20241121145353.php deleted file mode 100644 index 439bd80..0000000 --- a/migrations/Version20241121145353.php +++ /dev/null @@ -1,32 +0,0 @@ -addSql('ALTER TABLE employee ALTER company_id DROP NOT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('ALTER TABLE employee ALTER company_id SET NOT NULL'); - } -} diff --git a/migrations/Version20241121151633.php b/migrations/Version20241121151633.php deleted file mode 100644 index b9a833a..0000000 --- a/migrations/Version20241121151633.php +++ /dev/null @@ -1,31 +0,0 @@ -addSql('CREATE SCHEMA public'); - } -} From 9efc4931f93dca5f07f15ee781df83d4f360bb72 Mon Sep 17 00:00:00 2001 From: barillote Date: Thu, 21 Nov 2024 17:16:41 +0100 Subject: [PATCH 34/71] formregister --- migrations/Version20241121153037.php | 31 +++++++++++++++++ src/Entity/Announcement.php | 4 +-- src/Form/RegistrationFormType.php | 42 ++++++++++++++++++----- templates/registration/register.html.twig | 5 ++- 4 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 migrations/Version20241121153037.php diff --git a/migrations/Version20241121153037.php b/migrations/Version20241121153037.php new file mode 100644 index 0000000..9a792b8 --- /dev/null +++ b/migrations/Version20241121153037.php @@ -0,0 +1,31 @@ +addSql('CREATE SCHEMA public'); + } +} diff --git a/src/Entity/Announcement.php b/src/Entity/Announcement.php index 10e9d9d..757de84 100644 --- a/src/Entity/Announcement.php +++ b/src/Entity/Announcement.php @@ -26,8 +26,8 @@ class Announcement #[ORM\JoinColumn(nullable: false)] private ?Company $company = null; - #[ORM\Column(length: 255)] - private ?string $status = 'notVerified'; + #[ORM\Column(nullable: false)] + private ?string $status = null; /** * @var ?Collection diff --git a/src/Form/RegistrationFormType.php b/src/Form/RegistrationFormType.php index 264b544..012084f 100644 --- a/src/Form/RegistrationFormType.php +++ b/src/Form/RegistrationFormType.php @@ -3,11 +3,12 @@ namespace App\Form; use App\Entity\UserApp; -use Doctrine\DBAL\Types\StringType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\PasswordType; +use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraints\IsTrue; @@ -19,15 +20,38 @@ class RegistrationFormType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options): void { $builder - ->add('nickname') - ->add('agreeTerms', CheckboxType::class, [ - 'mapped' => false, - 'constraints' => [ - new IsTrue([ - 'message' => 'Vous devez accepter les conditions d\'utilisation.', - ]), - ], + ->add('nickname', TextType::class, [ + 'label' => 'Utilisateur : ', ]) + ->add('firstname', TextType::class, [ + 'label' => 'Prénom : ', + 'required' => true, + 'constraints' => [ + new NotBlank(), + ] + ]) + ->add('lastname', TextType::class, [ + 'label' => 'Nom : ', + 'required' => true, + 'constraints' => [ + new NotBlank(), + ] + ]) + ->add('mail', EmailType::class, [ + 'label' => 'Email : ', + 'required' => true, + 'constraints' => [ + new NotBlank(), + ] + ]) +// ->add('agreeTerms', CheckboxType::class, [ +// 'mapped' => false, +// 'constraints' => [ +// new IsTrue([ +// 'message' => 'Vous devez accepter les conditions d\'utilisation.', +// ]), +// ], +// ]) ->add('plainPassword', PasswordType::class, [ // instead of being set onto the object directly, // this is read and encoded in the controller diff --git a/templates/registration/register.html.twig b/templates/registration/register.html.twig index 7b064ed..38c6dc9 100644 --- a/templates/registration/register.html.twig +++ b/templates/registration/register.html.twig @@ -9,10 +9,13 @@ {{ form_start(registrationForm) }} {{ form_row(registrationForm.nickname) }} + {{ form_row(registrationForm.firstname) }} + {{ form_row(registrationForm.lastname) }} + {{ form_row(registrationForm.mail) }} {{ form_row(registrationForm.plainPassword, { label: 'Password' }) }} - {{ form_row(registrationForm.agreeTerms) }} +{# {{ form_row(registrationForm.agreeTerms) }}#} {{ form_end(registrationForm) }} From 93696823620ce85488129246beaa531e24e263a4 Mon Sep 17 00:00:00 2001 From: Romain Date: Sat, 23 Nov 2024 15:58:29 +0100 Subject: [PATCH 35/71] adaptation page index et page register --- public/images/fond_site.png | Bin 0 -> 400873 bytes src/Controller/IndexController.php | 10 +- templates/base.html.twig | 58 +++- templates/index/index.html.twig | 359 +++++----------------- templates/registration/register.html.twig | 59 +++- 5 files changed, 166 insertions(+), 320 deletions(-) create mode 100644 public/images/fond_site.png diff --git a/public/images/fond_site.png b/public/images/fond_site.png new file mode 100644 index 0000000000000000000000000000000000000000..f26fa808909f20ec6ac98a59faf20f85b10499ea GIT binary patch literal 400873 zcmV(;K-<5GP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z00(qQO+^Rj3l$C%2h+h^$N&I<07*naRCwC#U2Bf)Dh|d{FJLsY|FwF4B!J%-LQ?5I zW$E72m4GqkWq&vT|M~C#N-3ojIRCp!SP&{B5FC*gF<%^IeljctfHO+4MUrq*3M{2i zDX>*@T8h6$Xgx{kVLj*d++X5E$Hp$Y%1w7diD&~Y<@^m;beiHn z^ExuPkI`9$#3P7#{l>v@6;Zj2$ZUkQzGTxK{ql0N!3&!HCIMhY;ScEJUFwf8_4rF)dLLaH0Qf*(zhlLCXoPMT{es-4EDGqw=_Cs9QI8Ga zNAruYg%B0zw(OtZS#aqWB43z&35jGj=yaL?Ed(4h{S`DV=lvZL4VTo!9S@q3=C`!U zAEA`GG4U?f#y@8kwQzJWda3L3P~|Su33CHyoPdl+MTnio&I?wjH^%^=T=3*Cq|gk| zDBF5w&|@?5hJmhFObg%C2c|rj$+}YRH2pRU<0G_n;rpu^$N7QhMx{7Or^MN+=}p{z ztr1e!yK7v2eb@g?`+c<6WZUc|ZTnlchMmFm3w{1C{TsACFdi6EJ=&4bEhFjb2+jDs zPm*1xQAHsBUryrj zf0<}7eUt{Bd`@~J(UX|8;Q!i<6AR>>$?R45nn>zzJmg#{Wbg2KVH3WKCe+m2oE(Q1VSD!Ab3gW^Y)&*Pvmhcy#;L@?pF7{H3EAk?JzVklft7v zNYY<0E5G5>%GXc|drc2q#%*S}3t02X5InH{eh&$>{!`IK=sd8b3X9ASy?3_9FQa^P zvkB1|OSlWeW!vjVW~_*(KJJK}>@ykP)0W%1pNgdv1gNlVU$NZpe@0%3gw27hn9VFh z1LG9S{lb12Dt<&J3wy`0J%&x3<@GVQ-R_hdF&sC(%jIYq$rXLBmj1m6fd^=69`rx8 z`_ey83+VGi=bOh>e?h-=H?A(woz+HSnB82|I~5@4AtUmmdd}AIRR*;kg>+B#NBrNT zl~F~13HuES{UvQOMYG{Q>jdXYkkq2(=G_V?(@JLYr_6unN5~>k_#l?@{>jDlQXugR z)t}4?L=v_|Qc)k8qspd8wIM+vYNf#W!7kmWKN%oiBCI*POZ%gHv|R7VW@$5|a49Uh@V!y&P-J5Vr7^eG;zaETqo!V{kav$l=G($Y zHcRJXPdTqc=!a#ol z!jOpvRr{DV7^z<{_fTk7=|MPoJ}O<^)Zh$`7QQ7gGL?-)a~a{u0){4jIDlw|>LZ{3 zDiKI^Mf*X2{DHtyxT7$wP^0$0gD~-20E&ZeHYJWcHFJIzdZzS372Fi5t{ zLU-6R?Q5(V5`uSeM{6K>J|~nx&NueU1M)SnB6F@VQR()p`UA%vwiWZNf}1H54xL$# zISgG2{jynvGq(_Esr6ADv|s*>t#_9(TbtIG-iiW$n9%&w7pTS)f|UrZp1WDGQemG~ zU?-<9e}GnCJy|80% zYu`4qqA%};VYVYJtxQUuVR*I`E!8(Z0qh0uFHs^gUZ&J*#&5B_zw};8c9++q&#r)> z36rV)F0^M}x-Wg{OL>|dpkchgFp#r^_C12M+qc(e%U1k`Nv(g#@z*G=VZ3fF8$9J7 zn}nSr-%;>DspRkh?lvlrDOu%VoaRd`mmso)R-Z+O3y-qt7CQDUyaS0K2X9g^bi@;tbv92?%K~PK|?lHh8!`qD>y(*Ag zH{8Sh_9~3L2{l*HGew^hLTM=Iw?rAfg}m_*?eHEpi%@f$=o#ASMK{mwbx7ItZWzaT zp8`z7~1Zu(3Y>_U;>YIs)rfTU?*!?6MtZi|E;0=iu z`GXRJplzMZH?km{kWuha`{x+N(o|WQIOw;u#h1SHmuX=gm>HU=|FU9N&%Z`ENh~s?zA(8~pKG+Cq!sA! z&(Phg&u#0@FmSO3Lq!m;gEjY<$#JN%C~~b1{`h-Q@1z?w0Uk}zrH(KGmJ!IR|~EL`#ur={4&Z$%iSA0{q(r7p;8<_+7zn0nY@jgTYK_4 z^z6mAT@?fQ7DNJchAY+hH_1c@O_W(SGmUGec^KkMfI-k)FC)(NoxbA@m?cq#fl}Z+ zg2UY%4G3tga^1hha^c7_A_fh%mNB9n{+6vVF)uL8U4*k#5c)iugJQj?n=e;l5|tLZ z$nYZ~Tv~2&nR{>l#^~-Kxl0u$%QVpot-Mcr2QQ@;w$$DAy^>|E7k%xXFMa7ZQ+f`t zfi_rU#&{%4+gzW|Q{L+Mlk_`RpCS5OpEhuL0P&71k+e&v(o-p>YWxuzn(=ffS%#mE zV&)Oe<#dOws4FX4(+PzZLXs;8rOO?{0$Iq^F>!B1TxaMOSUkz}(Ww;$N>%n$c~*M7 znEz8G_6YnzynzJDxLCwx;Tm*F#K@t@$nw8ssK1>sd>CykpvQ>pWP-Q&&e@n(KnqN%UI=|dj`cEaep~g;S4nFm$b1?n{7G5zQj^v1>^`*i*Z+N*?e8;u~5A zq1Fg8iXue3a*-j`+=Evzv=#15ZW>g$5y#$$v+pBJJ_37huT4wW(6H7p$way zOJg(Jp#NpGL4<%aQH$t*QAx2BTg`-hICd0Txyr+B9KxtzQ*acRNSqX7&(?X*2lo}6{vl0K-sU%s`fg(kNmK%&DK+&E}OG8g4Cvwc8v zyoVKBO_Ey}w?aexP&P19FH&R~BvIO=aRIUAm0_`|!Z(y-Hq^rAunnR0r$+2^ne|zx zU|R39gB_jE!?%|=)vr#m`=DnvCFNvz$=3}J5ngyZgEd>PA;^=}f3WO|PEAVNEXGa% znikuaM7f)~%vGb!U`{Iff=88awl>9?$T+YJEFHt6f&KhvM(76!(+?Xhx5ne!ubYLO zS}6Z6x;0HZqXZP&k9U~gO;?P9VZwJru>YIA;%;rP`40cog1#5rZFFsASy=Edm-(eH z30gI?`pd*;0rP>($z7H`W5I))V;DLr{Ec(Drt0d z@l^y%?FCCuOC=_m$PzSZ-i+pl9K4B!4k9q?hZ5t7ebF#`+w zA8NHmmp{~R-^Xk$_Frs>&(Q$#nTliE5b}K;7kLe%}1Pfr!BX%HJc(w-E>|jL7C02pUR=yUG z&El;;JWs59_l>~;ykKxB`eGzo&%}AXLUBoPqqn0in5CRXwq;FeB)V+qF+n-^(hWh! zcrH~lyl#awo~CWgAX4z{DU8hOr7|I_o8-+e+ z*xZISXAaG1zRZoHEw}WpE|M7xqpDgs7(fj|Bxo{$LAkpiVwgxq;*^p($n_bu#{tlJ9K}dEuG6+aONYq@Jm_({5)W>( znO)`h&tIXmiOO!UHB$f${|G3`Kd0frCxPON9QK;5;x`04o5KBA?>BWRe#2~eb`rG# z=WQ@_;ig22MMsx7^o*8)@gyf>ri~1^yz1V+NFl$K{tTkFg`!WB|9QInwSqzSDEp=(MQ)S#GxW^Rzle0-B&3ho zP0G?h!s|8J-M73`GK4@pg&jwGU5;(ZHVc<48XT*9Bvg$f?g7!I6aZx1#yv^{dVtqB zfR}|p8NyYUSb4VtU->;V9t%1fHQCCv<6{R$%NUWQYqMKI{uy;#W_6c{4&4ys>x%!t zC(0WYa#<&+W_37cjr7SIZ-?v`J{PK*xT%Z?`dt>mV=;|5yZkmI&f?(@e@qM88Lo^U z!d1-)1~$yemyqlh@@zoQXkU>0rJ^Rk@-oOZKbP#4`8^uQ(n1LLZ>j1<3B&3e(J7O$ z((4~vTro2fj@xqVn4z3k(4RzX|74}6=(7iJ+}g+Q+baEBrFLyko3@sh zdJQ%~AfM^(nplOS|JJo7_So6iM`KEk+h%7Ny*6F@ho z+cz~=D)!rI^`N}-p|(bjr9+vIlMt7eP#@7K#sJbgH-3ROo!+Ec?8PL+KXQ57oT4;L#hIiTF}Me z(1Scbg>s7FM<0F=gE4*POJcOh*W68mS`4@4KC2h=`Lv)5fpKRUdGvc)bxF9{A53xN z^|jXYh3kd}MDKt0M?H%!x~;EXTEJw)GTE{G^k`xtLi^&0e+%_0Nk2$;e)40`!rssW zZ6u&)WxKwK(Es@^L4O;;^h*zYo)}P<_T6vdeUmt|Da{IfyZGOukF@Dyi{6WSY|`!c z1$Elcnm#=0;wAgk@H&N>iii`=huZ#vMGUQ1{THd#WkGNJ#Ce(ZL>XJjK^g=yf%W0Y z2yS>b{m>11V06(iw3G%4G!IgFl4DSuGbg`ftTdNe$@HNO_+G0S@E8gplrlI8dPNu% zzl-y^`Rly5EG70kW|aC_v_nUBnNiaBk>@jCaww3`M05L0{g2NyN)q4A3b(Mpq>j$m z6H2@i;LH-4v1yyaoX3bW6VCjwitc^<+}Nc^4DW7pXAca$MY7GrKdLHRf&VNF-Kvj7 z4`!N}W-W^c4$!!+7Fx9zeLjTN-|x}gzenJCD-RU?;i^x4p7kcdzx1V2{?UH8+3k3L zP1Zhjh9R4a@$>3i^gO5iZIg2z#}ejm0lTj*8|rU)c&Hle#*=Q`^A(yp zVR2Ls4(LLMp)D^^9GU^8Wa6Mzk@D1z(sA(1zUL$DCT6+}(l#|YDxE;U5WE-Z;(sk7 z?b0hEXp{7OSoAGEGlQNvxRev-Gq6*<*j$ZnUR=9|Lfu$j<6Q(x@03mQ6J{3lUuwg3 zQ1nl^PEJj+E{E3?aN~@1C~W;))JJC1@ev~b1`TJyoA9LHqH42m?4E>jq^GLiqQrlX z{!q)z?rYy11okQVLoNEHzfV)6_SL>Cj$UV1<2)Dw?wduPCZplG4u0;trpO#R`RM~O z?y01>IYy^_D!TcS<1~E!`sNvsaURDJWlJgwu`>OzBN^Q+s6VFRoa23o*joQ(Eh0Ul zYuwlnIMY3P0>0J7J}^SS&%$<@x>>gnuuxSZ6nk8`z0B zyQ~8#qCn_-tblVLl%?Py`g1B?1)xW*AkOfgREEiY+c1E+(U@d;F9}oRAB6RW(DTGb z{|Cgs!xMwxk*SkM1Cjs1KKiAHC}Uy>8g<0w0s1N!`hg>gz9afevy}0+1RlrB|QRw{wEJFMLs&dA>QeYjXj~I?blZ&~o4-Pl62NY>?;Rc#U3k--NKQ6LTT$ zSs(JgaHknR*6a3Ttg6>HG+)@udWwlHU3hUH@Ya5<6)YV!i>W-F;=PmW^b7O zkT1vig|s)jhdqr#&vS=y_&Ui)@?4J)n4(OGES3T|Z0+9yIuGfSgG-#YF#`}j2R$za zI}g{zIjOU!Uo5jL@hY2IFE_*D5i=R)Tm%YTZo5~41JIdPfKPx?i=Dp>s-yo06D|htSJ6+^StogBV7#r7< zNHh zP1-m)Xfk->#t(hJbd54?fe8*@@b7NQL`;@Hsed*LwfICmsrzJQ0lqD^E4rv0CdwZbdzwG8jMpXW}>rq zls{3cD;3w8?%Zf}^9aDrMNVTjXZEy>25OICbA<49|9eQEHJ~R4;s90~XE{$z@!_L) zF8AnE{GHJAL@~EGbQ`uxy`>&9N$s^PupYJ^sL+1d@wgr2d48u?tKet2?uQfSQ{kl{ zJ}hVZ6zKd^n6}r%>C-m$iDFiKNUxfZUnR_MCk-zHd58QR!=o3S1s#X|#f<(@n*9Fj zqt5D=-bnH0*cUrA37x;oKdURO|C~MMJGFetrqwf|%uE-&?B}9|ZwYyRJlGkRUTIqS zC@=y65IggWG ztT*zXPO$T$a;}NSACjj(pwc@taX`1=_dyB9!2wZ@XT!AP4hC~Mc6^k#rH)@;?9Y>T zOvmwqhKaG|Z)HOD0-`5aeChYn%qIMe-~E2+4^i6x`bTMU$LAj)2|brj2ZMd-b+jY; z_lA(?dv{6phdc){VmFMp%m*F|g`0+MsvZI?oKUEhlpD`b0Qpn~`QtfOXy4X}!+Nj0 zT@4W|t@0H9IjEfm3bx1`(`h=^6aaF4CmDSGtS@CGiYB>n zm*f_N`w`fDB6w|;yiaaQ@>{-%U{k1WJCsE7hCv(F!qzWmL3`mgW^6s3>9$*>7W!s0 z{1BZ-mrwf*^?%@4AF>k$u;w%L)FwTekFGT;a!h;k{2>AvDdf%57*N^{jhaXz>u;C2 z-e=>aytG?nS^TUh83iDo-4AW!4klSy#JwCX>T_8XB4nVVrqR7t$8o`!GmA=XKCxuco&HMWHI;8FfZAs zUio-0O!}D!*(-zvjX8A1fV-&?9UwQ1VP!7OJQ6(4(W0rL!mC#3^^OYf!?B+x{Os6n zbi?5ryXi9_&u$qSh}?hjN0wtM0BRaWzEk1I|D`Z=pK0%pxelvslsCB~|743YDN)B@ z8<)Jn@a?dq`w{2)Amg|%z#zwkg19|53~`3-J<&qMybDx}Sn0n8sI4Ay^(97Tgx){;t;wkiep2T@RR1qA z+PcZTd&m5_*ypRoJQXYO(4i!kC6s~<4}W+Y<&?X;hCHAQz33sslW~xz{+Q@yW9+#0 z0~KX$XeZ!r+d?d6kJyL5rOz34|6POTak@R^S+E{A$6b4abAV0?A)bSg(SNdMzuG*H zh2p3xB=>ee#Pg6LaGi6q{M-sL7kQ$F$37$MQ*q5fX*03Pi7@APouu)eXy1)=9YKbE zyu`-{4>KY(AxwlCjK8*%2@f~L_n1xL;iqOzo3~;SWcj!0V*JDhM0jqfMW0$>h&X?! zi+LBQ7|^r2`}lW`ieQfTofUcoxx0sN>F5utpCXqZ;&YfO0&KnqiccO=@xBb51&$!%oOxouzFU%16&JCyWb%GFQfSD@qc12Jyxg&LwAhguU7a=25DHTyr=zd2Q1%J z-QO?pvx503U0@_npOeKGL717!|x7h;-Y+3=7^VPHJJ!`fk}XM9jMF>yIkf znS##Y`4CS8x!Wb}QATfoAF-flO3XAF=yJEFlGER&(CR!K19OwYs#?(elQCXn{S*xS za16lpT77l}jHdIte{X!c0on?r7_eZnxr)Xa0=yhyQ5jR*L~wL*X2bF9wYSy@TJ8JG zpfKc<)`C8d?cZX)h@bAqSQGpFFRQP0=nc}a=$8gWe}kPrOYyfR^r4yl*AiWQu#c4E z(XZHn`qFNScV#{%&|9SWQl9RI2AxScS+M-ji`eHJa1OFX!O>2dh{9=$bd39 z*o}*(81LatVd;y6pDheOc5q`ei^E4fh6^*qz?$6~Nqte6e}{1N@W!cS0%^P_EO_~7 z3_INla(Y8B(kR#&%nVYP&Fwx$xU&v)zL2v4ek@kT1UL?ZzLkvl?{wY`7_Z9%WI`|P zo+$nPi|~tq$)$oHSOK0lqkpyGo-x9}%7FX_lmn?Y=eZ;8r-P%-W1~|-xrlc{c^Pg= z+6s9mmz|lfUdDN*u>E(BtHn)m@OWgN&r)FCUsG;#p=ewu*2@gv(sZUQ?-1?ZrQuxq z7qMCBfpEuS#14}BQ&s(vN#-Y3t03Zz=tK=Ye?LlpJAJ;Lq}4e6HEi(9EX{~>St*J0 z8zj_o^2D0N+DJASF_cPoq0q{jA|ICC(^cTIExI7b&7d@n_9*@qVfxkW8kvAypZH*C zJg6t2=ZP6&bKOvh;YS1A7IU2_Myls306u`Oe`v&R_~GH!`d?cR_X?E*ps={5?GD*8 zqnk~WAZ)Nv{Q`Py*8f+QmzyaFR~4u<@@FL4t67oaJF{Dw$VD=n#mA+G#YK1;w^whk zS8gU*W}|JTK`wt^AK+1M#b#2Uj_GtZ^n3$4Y)c@RZ`$@2ah-Li=><(EH2%JB^re%$ zu+XRdqbF+Fj=MTM1u#bA@2~2YVuE!ibT>G2dj#U=G1D*IMcY~xqa*UEgPek+v5qhm z`X<0yk2Lh0`f`DdC3^gZdKqW!vd5vveQ2Te`1}`H2U|SDd>&y6a-x z>SoMImW?+qcl4R8p*5CbWd+{~J@b%fBrGAw!2Y-wdLDlcT&_2UqRbbVAK(j> z*#_zcjM0CaUkevyGO=dKSHjR4jV~+iYm5GB%7m*Ds}Tw!6dnQHk>Hm3c03w&Ir`oW z^E~V=(HC5bO?7fg$Y;8$^=x05C`?%0FT-Z0ZHT@NW4^n!KEeJGO>o&Dp*{~3Y=2y0 zxBCraAkbL-HwHehVBmwm=N0I=Y`|POvr~!>sa02RP|OBdQs(i` zB2r?~@~Ux-awsf@Z<7M8N^D}y@pn#LrW|;FljQ#(;qbu|B!b*`@#A&k@zDf+t9Tqp zQxO%%%{|M6$YofnIVjNLuqfUAQ`4OvbxhVS2x&}&MdwcEcr2!4#g00Dfbn#!gu6(` z_Y~!xED6?NXbwF;f);#F+xSZqd=?=d4l}-t)Q%|7pR}rR_`)x!>X!mCcE%_69mK?X zd4?5h=%%k@_L5#q?pgDHOUSkXi==kLeFXcXu)erdrV6^)4o=1^b<6fY8$D*aC5BRw z-i2b?_wudsak^4z5TSIk?}XFc4Gksd9-33@J59dJ|K zoRH^Hyz`30Q?=4RAAz0+yRkpx@%3U@IXoG|5G$W@m)rxanFDK1!MDNUznyUTWk@i5 z@L=V_YFvPT2jD^F%%m{z=prq%oAK!55t@q*^gor5KF?)&uYY~;mT_yk*|d@g7~0H% z^-s8Lk|t>0?jW`T%;bBTyuE>|5JU?Ax)9%#C!yOH>iLxNx6u1EnEBG8SUP@RRkUcl zHe$QV`#60|^uU*1KpuoVS|Ux@_!-0A!50uPC>)h3=s2~`pu%(!YpEk2yT1=3$nGbm`i<9tV0prx=N)yj1^Cw%(bFi|B z*^b3}0$dI&ki(kMc$JcEPw@4q62FROaIsb9Q@wFpt+4d#kOB%o>iN3_BfrYUqe(uA zN8hM2FQP%J%$Y@p2z6eFVI?u0@*QNtEi<;9X)WLEB`(<=Xytx+D-FYz+}HV&eezFJuxmeBL_n>mmqVeO z1eComL4xCE#Mq12-q)Rfo>0^$pD5 zpd;7%BND6=pISBu~ZDVK?2W+ArkCpy!K-=F9uUmW~?-T-`>Q0MZ+< zs$1*f3?6TNo^8J567!|UX(k-`p0HqZ-e2UMMeJ@<(X6QDQ3GR45v-HKZVsa!5+KiX zm@y=hbu*y-t3P`L6F;^hK=@~gU?=iJL}nY(MZw+qvv(UCIwnscaTX@FsGKefDPEN^ zXS4C_QC=V+m^w}YIM2TkjrKQcaTjS&a@^xqfXrP2y6^6Uo~P^9FcykIj}VW$BFR^x z+C|b0(DQVqezw%sd>KdqB~J3J36U`G?S)BpTP&{V5dK^g)sxD2b`^&HWApnv@rZZ= zuv**NtkK9Xs@z-Sqfz%UL^w}QyISsETG-qQXllaVQuD`=h|7K+Sh@EJdhK()yI|L6 z$pkj&s~iKOmvqhrIrmdyr~76J9;YqP^TpuYP0Eb%=zQCLl!Dkps}c}r^wklh`4{MY z4KIW;Ct;rE7LYeur>EJ&_Vrq;Xm`zTGcYD-4oDocNgB%#zL`@-kXpu2lg%|Sv!*=Z z1c081S!)n+*s1K^K?h0CeWLDWNEhb?{2@9gX?n0Uny*_?=!UM-aRfR$`WgN(eS8P% zb+jSmIhALlurU3urI^Q%*Xl-L4aDS3y(i2#;5+U4ZC;C4xcqo*;>Y=@(~&s0MP20y z#+gVDbHA?{)g@ii0A0%&i%M+&zpVx4=t=1pkch3~UGwwq3H~bFkWcXY!$!D?IZP-T>epjicLz2Pky$+Q zch4`k(GYsh=FDuKg#z{t8hlQ?#HrX9ZDuY5LNi(OZu7RWC)y6o z*t8mMis3WmT@BuA>E^cd{R~pNZg0u(U+|ccH9RMkBTX$fv62-41r@vlzJ6ZD=XdAhA4AlOLF%_cKS8o5qp&|%m4Y4i0llLHpx%Yu~> zzhpu+qbRJ4r6IRvA(_W^WoO(3v!-buX{Gi!`Fxg!?!pC@FvVsY&Tvuu5Rh2k>AywN z$LZ67pw~g_VGU;No!^E^XQbFN2;XDT`kW%&cqT=W@+iAsydfUzHHbffMpCQTs_y!daPMl(0Ua-HQGTM$ft zV+Fr(73mtrb?Qw_3qXT6$-xRSEHJ2|z#j9Dr%pv!SQ#KHcbaP=(-O}`T3`0ycP@8} zgo%f9=qUa90Rzb`cp%ZVz=MeDVYVgcx$GK0sQ#F%y%uUZ|7QBhqOJ?0`yyj^zhhx` zUCA;*zH$b40D{a9e%hS^kHr2L=^cLQNvj_ED1~XfvMA|}M;B?Qc64|SiIxIDH$;0F zv^Z1F#-p=!|57dr>xwG1V>%bUBPF|WHQex_*4>yzCY0tvacSjR<9>42d3rnE)Wapv zdAYS9!{{Pi>orrB?B_7|fOn<_GojO4Q0bf1F-u#Z=QmYoTKFNYLe)6gEiycpBqoj2 z`~Z!L?L&S-AUyXyQnA+V4GPL&#`9$a5VvN(z;htf#AiTAx`4A~%(;b7b^p?Es`E(P zILO+u=|QcU2oXBZRg^{S2UX}{(Ht`xo2^GA^}Ibhh)Y(9wvwzlld*=y-wiiR-hgc1%-iBTFjs<+}fpCQ`C}$~23;d{Mo=T*%TJNMc_e3!F{5b>Hg~h zy9m5D$qs%*_JVrW{%tYNATw#N9ep`GNge3fSKIW|ETCs`0H6uh+K6irFWYDYz)}FQ z)Q?J$rEb+(0*43XuhAqAkvvq-x-4H}gy~l+9RaPsUuiCkr|7w0m+77+py%RDephOc z7kWb=(kqAB&-xCdYXVM(-7I6!H&Vj9mD7R02G=EP6VU8RuvF7m&OXmmet7OxSiE5q z*>#>A6LZzr72)VG=r2$@7(J~W+Z817(M_f*MvH2otLHuL;b-Z#fLqgxH2TwoQenu< zOe$Z@hf^mO_|d2)opn1d^t!Z4i=u3I$eIXvgr0dbtJaZ5LhvNoQo+0E_N5;o8-Y!F-+y-%fb$N6+w>!V1!qwi`igVraGAAQ&A z?4-A0k~C@KryiCpL-tTasHL4Mx6Qj6rZ>rZN@uU{){jwF+mkwp_bOK4X^Jo8oo6R{ zz{7Hi{o7;Xk0 zv-u^dLC=NUx3W6J4e8gd^?}osm@v|fvL#gaLe(OvWNNYD6tv;X+jd9`n6Z~QD8x6G zrjXdr0n21v2QlK0#i>ZajJ%i@;MGJH?aV z>1-G3{*mQ@Ml;ZJIrTQobEGoRQ~JIXb@;}mD(M1zbG}352%cZey9j}^kub=_Y@$$-Tj?b_h(qb+<9JO$%fPu{wMR~V{ijadN1U`q z4Jq=w1CN%&0;&)Od-^#|ZqgW;l7Wcnxn(P@vojsLuE>mUFD4YYHvfb242sdAu1ET8 zQY^ZO`?!mr@oD|@pIdKQRtJ1}~U_e>pKBeJ38V^Hupp%QuXGz?Q* zT+N)N%Y_7x&?B^zESm}q0kxakc9ZhBB%cpZ-{a%jjV7NHz&t> z-2ygOQD&SG^cQyT+v$TkS-}QOgt^3~xQH>h0gtZ#iQwpRn4`!uZS|MDK}{+NIYqPB zlxx!5lspjoDsK%!2Ei`9Sg*f9S+pk4;+H=S#N@jVn7X?H=}xpnZ*NgVa`hbV5`x z)YhzcE-8Y-tQF^aI9`+6LYCPA5y8@vh zS>R3`3JF(6`;*RE!SkDmZAP30E)VTQ_)RMvCZ2p4)Wz`OFF~BWn%Uytze&$9i)X7W zs{h+ady?aN94USVpOvJQfgT6{{X9mK0>frhc7d+w%>l_q@&ysHYg5iI?CO7$wqOH# z2Lgg@sGi!v!_#=Q8615^AZr*HNj~scUZQ!faF>@9QvPc#Cu`o_8dPg;Ik8KjsE7)GT zj?l)AeYgeqAyhhF+JzYMsLXFCc4*fGHQX{#rDVdG({crD;u2DYQ0SQk7SJ!a9>JrH zN&$H#;P#fz8LQrDqa%faNJVW7llsyXx(-iUyL&s)xKGx9MhknzMc* z;UgwrECmqU2x?53D+zSF2MyCM5jIIYH4ZFT!wO<&akS8Gp0a(pH>kcY@yLf2w@l)% z4+KF7y@(oa6=vS9ezyJ&eLfI1#+tQ2|D;iH2W|2JCu~1l%l2z16<$_K`O)g&B;SN+ zDU7CDiIIN>eO~+gYFwL%(v%tz40p?n_?nk~RmeN&Bg1U2b|2Y?@t(STIjc?k+*;W+{|{6=*CfEPA4>UqqQftx?6obNMi?ZaAj?D7PwoUi!!5(++F?(gl;i0%*b%e~2z7;^U4NH@;z zRKLW;tEG}U!|ZtYJ>)jr$m}vQ+B+kV;%Bh8;!uQVnma0w#sjOZ#nLPyu@4deGCN4FInQPD3HP5EydG|%;q4FHTrxY>Ja??TN9#H zw-0YWlrnQH&&EPOUhSPU9sKlz5ZuTI$$6c>0{2b-e@M4ZM^|PSZ6aAqtzQ~CEYB;0 zeYr-qSrB}esPDrQ?(?h7O6?w4jMEl38h;5(*54IU?uG8NhqG_EAp}P=ZjH7@w2fLW zPeT}5;Y1nqa5X4Jo8hkqA?9hS0-n>1cJBa{RW&8ks_X&lUZFq^#c6bte0!gn3GTgf z45Re~l5S=&1b)RYv@`jz+eKO3<=)F~1g+4u1L`)gK2LuWlpa<}?k*9P zvr|KEk>zQU4VQwq?DbDE2EU6MxkGMtzq7V~ok(m0q_zcUjqV836lU}q>*vHiirQ5# z-c@=mWk0M#q&bXc1fS0eNj+96&gQr@-Hzb+AXh8>*A7LKJ^(%A=+)oSa7a);%XpKq zeSa%_xVCV29VguMehFb{3)?S+O=iAXk^Ge-5PjLyv}LFRt;vnE41s$z3icpoL(+k# zgX1KZDc9}qX#1|G=}_pqiNdb_OYn8)W7Foyj_^bvD*;#sA=6$0F|(+pp_j&=1H&9> z2Ili2KekO*zZkE7EAeUx9H0FS_IJbTnPb_r35GQvMUPh(F0v#+4Q8g|4lG-4;4i_@ z1KTpkhZJmz4$PLyS+s!@>6FWr0LII>a=Z}}7&U)(-3zhTG66jU1j%<%ZsYjlCgX$- z)+BvoqBLi(AUQ{<8`5QVqsb@JuFaR%KsbC*~nb9bSAFL0>Z8)@% zUz9~ic9y(ksV1hJXMG^Ig{)-SS^`rN<)Y{TAuSZcV04b40A50oX^tLBf}Jf)cWg_N z6Q~V&dZ5N4Wb9SS&5J=sxCjqUSk{XfF4Mg$+5OAc-=I&y@1L^mpN_SkcbhMlr*S7) z-Vc=xTt+2YGs+FscmNH}k+&mjv244f#_BghnH{k#4cl4=dpSj)x90SY32@g$#G3BC zTN}3BXC<>bj)zTCQ`Rx-j3?AQt$4I5ff|C~e0Ih_>lld^wP6r6{h=yajc?O;61sR} z!$*{uS?xCEts6S4;HPj*`RXDrDzx<^vkMlpp_m0Of@tC;BD;P-K6QvU@L&oY-ARw5 zk|C4BJFC=U0bIdc*$_X|DD^!f>QU%GN*P~`)D6y}S>ww_1_J3Rs`Z-8Nqm`_< zH)Z|8Fr!~3?9N)RwbkX>3H;~ghA>5Pwe)fgU8oYMpI*mzQE5Bo6pTCw&VAHn!pctQv4r!Xm@&?zyIRa60$>H6KaLN4 zK_`;}5-F^$MZ*&pSK5j}V8GC}tz}(Es1s#uL}h)K7CL+u0suA2CIFZ7Ru=H&!eqIJE>qIn zB=;j=VX~rp`A3X0K~7{Rm9kU8NekX1FtUasJv}3igxPCV#;EIiD5|&x3t}@3U0#+8 z(fb!_lhW3YN;krziyxI>$l+;&{y^`g?jQTQu#Pmw+ zoa1sn5X_}X5JYE}QjoYBQ1oZK9`tO*IGFAnSnrUYa?Tj3e8A4FvkJ`E=@xPeEp%8K z4q>52dZ$=8w+paHiw+7qk$cFgMwU!uyVV++!^Hv|KcZWt=RqimO{Xs%bUPIKDtbEh znNnM(gy;Au4Bgf6V<%oK;x@WNIZJVT*C1x6CMMP#8WRCJU6xe!FAV!XQ%7ZVhB}NsxhCqB4fUqQMFnYJA;f|2#3(JWS-d1*hmYp_Ftjx`3AZ$Uy;Q4GZjF7m zXUVB4;N43|cE`=s! ze-F*bGW-3=T16)_SyqW_sTgR%+HTsLn(%K5{A9(4GZ;sJi9LlDkB(1K%hWY+13cRJ zEWkFU@;=N&O=SV5pcV@OR8G&nbKfWoD-)HmMq;z^5_baV_t0~U6Auaida|=At35GV zOo97DXiuAi3K~XG5Yb=>{L~80gP_ElEL3a`aDhmes=TL)(!brsOFs32)8D-IOkutA zJUztqdLgsoZ=!f-KH8Ox_~iC^zw|-cVn-EgZrtD{i0)@V7PE`iib5hIteI@+bBeyd z^UB;>3lW8YPWs!%s0)yanB_@*AgLIDdFKzUI2_ka_!|}$W?Td?4~-Xng@(cnQ{GZC zF(NSd3e0h5xn{A9j>Pa7pH^xiFtkyp`kf45Dd({m=4pN;DXC)#Izk|zpB4x2XUH;? z$N29B8iL@11iK)}TPvBPuX!*>pI6qy@yPG$Alg5?OFjnL)DJiC=UHW3tz07W0{`1p zU@pe`C@g=;o_&5<;8zWj&(WLo5C}5Zeid;D0*|(nqRT@SDmpUi%hk^p;25l1RWxj` zey2u0&c-Y(A^g?OGle{jLRd(;^nye46}pHt?}ueaC%3`ZH%W~!h|qoom1OgnJuQ?s zO$MHjg>N!}@dn(SQ-zf++SsjA{Y|gE(YvkCn=T@7If?GT!ylx?Y$pUyZfbt% zH&EPu+cwFE$ace^+<@wOvtdFD}Gx${j2n9J=oF8<0-C#ib1|{Fpg(&06gKw zt&_I77gvRuacj}Y30e{+mu?ubut);0PD$%8c(YO($n^^85VeQ*$n$an_ZW*5(u(Lw zfycB__z8z-7qbJ_-awFfv{SB&!8)Iy09{%pj7^)(rQJ`a`|ZcBK0z;ay8al&`0S0v zg7E>DEzmu9^h!-{mhHys!17CyY&|SUh5*}0au8fQ`d&z!kAbmB1Zjp+Q$tioB`^c2 zv0%#>-wuur{FzZ_6n4{1K_GF^MfXvL!>Uj6kg(|iCv*Lr*|)@JIC%pNe$O)!F9=92 z@3c6IwQsMY7WNTwE)V!%>~Pwe;&$XPd8rj>OKtX4qD{8{8a3^|&`bDD^lEhZFViI} z;8L+a^vArsvl*{t`Z#4RlZyacc#Br^)=w zX{hwwEzF}ubs@L)g0aaqoZz8MnV&aOeEdUNvbkOTDfx&D5=jP;#LnyQDuXWI#E7BP z2;JibJ0I-!J$&cz4YEgv1)wGw)#8de69z}VVPG;>uN*dz76(U$c%jVFT&*n(dGmax zhO<~Lcy2;ar7wMHGktW6;a3Z{QjgmQ^I5=;`(}pAKSz_u+=hhLm_5@@|7vfzL`kFs z-5(1jV3bY-G)$B=#-mfrJ`{wsL~C7sYnAqZ`11%-w>syX33T}wE1w6B`b#7Y_Hm+K zTtX-3LMy9pSLbqP!b#)lo>V#&2aSA~8W=PXPlSADIu3@;sA_2>$(->w(bII(dUl=d z<5OZ7#rBb6Kc|Zs@%JnbFRtQ0Pd5Ut0v%j3$u`!jm=@hwqL-O-VE*|Sxv|eM$Wno0 z2{jwFL23b*1;|ypCM5@JcuCtcGtICT=I`srEtnog6{`kI^n`tf9t(fGQYj(?mVO2Y zDM4B#&5}a#i2Q*-Of4l{UMbd*9FtvN$;O*Mif*1qv?gMuNA>;!62FDcF#WrWxW5)V zw~Ssyw|#i^ssRMU?@0@%h8 z1LRo`0hX(<1%!+BdbfU&D5@SlL4Qb)v*v=XCuPtuIGcSTCyHglNPrszH=eu}y%3~a zd>hQ=Hes}ZS-VI`m>bqxVn`>LSfKisK2LbZUA&Zi#xeZIyMh#iAGq8`bhr=WV4*Hfs;G(@6#UHh*dx_ksO zBN(mj!q85vbJ5ki0hIQY58A7qDDYocuRaRT-oMYbQ45a?^-+4h@7rt6jRm}r_JFVU zj{FCJUAM?-Bk=~4=Pjgzjs2}suru~UGX^Uv*lVIC2KN?fMu5=z?_e?*iGbN9GU&KU z*bw03_dOGl3qzmA4>Nes%+`Z40gbmti72_81-9dtw_vQIOlqeQg$sC98EBsvVZfmE z+gG45usjKoCklM1YJZK|{?9!fGunVDy16d34a+ zklkPA;p?6s3KT@zpDg6I@dwg59O*=4%lWrs5nMs81*eYl_OZB*i6Z+@l=wntV)SZ7 zH1H}GgH@>f*S2r3?E1LQLov;iY` z+hDi&*H@`A#6j+ks!Pu9W;vAG7fv5sW-k?H1Z#%@K(~$ZFz*89rg@u8ZbI|&H3Id# zK(~+wOkilW=OlRQE398SNBvUThxNOj>?M}ZcE1NmL?`ak|4+;!S;YMw*sCF;3GvfL z7uWqtfR{@TquIY}4E|y`G73Jlfnz*>f}2k>(B4h`s)fc}3K(JguWLZSbl!DPbA3!#}@U`%bg(8!RnzYsidm(usfLraC zXtT}v!UF#mjk@0+j94eV$n|E^3nZ3tH!9g}|R~@w??@zrGQV))5BT!so2r z2gzPTj1O>f-{jawLpuPrfT}H=mos1z>sM;&tOXiogDgM*=%*#vP98CAc#BQW2p&Ko z5-)**SPy#kY%P%SGnOgon3o2A=E1Uz15X6mAr9_io?pbF8&)zH*$pu^!K>UW`XKk1AQ!G?I%Ydvxi@%S|gb zknJzE(jTb8u1ZbV*?C_K#Z|^Ekq(X?mvu%Jup)*1jm~&Ug)kVRJToN}y!msSRLvNPc`2#Y-J2CTTSmSSSx0mCYB^HQ(&T5X|%1}3gbso8h8@8;+S z6Nx_ed9YwXE&|(fBKrz8OR2$2sUx9PQYgA*iC}jcU3M&0&a-DaOkmX?TyNJ*K=^?tXPO=zdUjV07OmWxg5TFS-h>rEaQ~;!_9aYv5r*nKn2>_Y(N+ON zuE)G58^|>N%+76Dk=o?OgV&9Az?GR(u&Mv0eG{{MP5ZUeL@o0_3RkXMk zQN*<+0cV?H=y{Z2j65z=yeTy?d{?5b^zP(R9nBLl63oty(~Q|t6|FqT2{2hu`RSX47i#;z;NDL3^NdWuEKz{SPJz%&Z z>n{#6U+8J`ih|)Ff*}KuNNLMr_WT+#TjFdRTw7sxNSA4;~33}ee z`K4Oi3|+?1^CHt5E2KYlW9iH1~Xt5U++;nR{gw;#98&#=VUM^jw^&*eB}eBKyb5$*$ zL+xy>`3$o_vJbk@YxE>249?##tZalTXV|f6FvHu$qb0`b#YwQ=%E|^(gnSn>A5aWE zC-#+A3+CeQbIRPB_zp*^k#b^K5VG6ihT#b0Zw34xc36r=s&r#1Q-_OE-f{A0ar_t3_1buQ%gMZ-QRik<`bMUk zD@12%_tdm}MYc^GCiGm2{SjU0)!*Bp&{|f6(cw#BC9)6T$ZdmEE4r_DC^$G_(ax+G zAlKfu0X+qTH=^hpd)p-oIW{!;^lqw-66mz#Q5e>2<;=mkj9r&4r=ePWi~(H5)jS-y zYns+J~jq1`cotUta83aRD3VS6Uy{c$r)mpT2W}YZzwrihE!J zSWuYR`w}x?#s~2|w3yt?!$BLa}daZ0PXcx#it#;qk& zs2r$T#FuS1MKE-OcT3^H1!Hd7jJbL`gf3|qWX)x22Xbh{7GzpgPFDYcJVQ~5f~Vl* zy%6Al+a91hD4f!)X_el8m`Fb*uqpgCAAClRQL}8rh#j^!Rw~$__|25v1uUhMA9IQJ zl_4R3CF$O#>)Yf>x-mm_^R!{^crA!)`l)vLb0aWYIo9HUV&~v;IaEm~hVhm@3#}1$GjHXKJghk7qZl7g~ zpjdeb5Ny4%HQO0OEzg|$kTC({J(WJP%zc$ZDQYpb`ho+?W2SBy>UBHK z7qo3}+NOB)6&;k#71ke|k0v5eRXb!s>E(Crpb4w3Am9ujS7$eA5Sac+2ZBiaO zZPwR>(Pi5_Ha9`SvWi27PqWiC7#(!Q2VKB9>udzm7_}0zn6@l=c#LE${@&`WZnFaW z`Be~uUDItP-i0tPRNbaHe*Fyu;ZpYm7_EGfvfMY?eotaD+&XdbndQ!<@q=Xg-l|$Z z-WDE|na7LL{Rv6|LSr3dux6fhDu+|*Y^AOfq#pfUT0`5tK`O!CAueEm*#i&3g{~#? zOdi_^X9ADz(6cEiwVsfG-$PYx>te}`fLNxnG@B+BcxSUdHY5>{hdxn}Fy{k8^gYY)TNSrRYL zPckdEjPZ3f27;P1 zOw9N>TyUZUM`TwT%xTYEl4g+dt2)}%7hi0d4G~~XH+DnUNb-xH*svQ`aX%_Ou=?6o zw$74{WVoV~q3Gs*YkzQIfMiE!4$i2{(K(B<^)^`Ad6lA*Gr|i7YZEb0x|jgZ<1Ijq(!t0G(U=2$rJmic-Zz9afDDCX=wm>`s4x{5gfl%kU+8ZCKs*GK-w4!rX z)8ux{Y<=eF!6A`>o`>QD+rC#tFnS=c!5r6Z6t6l%c(`Z_=(>^-i`&9Qp!)p zyZGm52rKLKA(^J2%7mjqFnT+3>&Roj|2SG3H754Q3RITmRcul@3HY zLV3=yZy`wIv!cu9G}54FV%8#SqqA{=rH4W;Cbt8bIX8(lt8zUUx?ks~K8FQae*ryP zqZzHgGp%dFQ^M_{f#qOkt3#4N&scTDhXzs|)!hSqmmw_?T0WwPwxckpB&bR04vHen z<|DJhMDH{NC)Zstvrlp5Q-(j&%D6N?O-j;RC=c7K#N(_9GbE#<1%-@C&UTumhPx{K zX2xSv>Y~UC=xd7mTTp4!_G3kgu&)#zT|7Hvojx`}i_K7LZ`z)B{k3UyYhXXxLtXqK zz-208(0xu@z(P#G*px^?&rtXgW5TR++N*=&g_+RS4JS76C^1+lG|bjQU`?jfHZn`J zAHsN6X&7=kWLVmRQRfhG6hx1vO`Iz^s{RToMwdbD3=HjWSbWJL53}E+zFdErYp|t0 zx~Wf$wmN1Pb(+8{?H!~l{410M6E28@&WHmx)M?;`jtc0G)--O%w zu15RzQkx}j8sN?34(=^96-auW>-aGL?)tpLQ29~{trho+WWKiXaEv=FC#+9l=*A7I zUnwE`B1TuOn@CBBWHR)0N34mf>lydBgoE)d3rK>NMGc!K1=bHn5qLA7Sv=SYwpV+J zW=l(Vd)Z}o2$pc7E@IiK-KQ~|3sOx`3_VYIeG~3)rkIs@vWuwnii$0CQ=){dFkU9O zM&JgJ{-Y$@Pi$$QfG@2CM}zIBa@(|P8j5`abj?U(pY0;}Uug4lN)#DQ=2S1OE@uA; zsM#xw&+)|G(smFh!`$-?TdWr~AJ(dALy{bGTX&MdyI!l-6lsgB|Ss>Tva zThl&s*>Nm#F|*nNv?45k9q za!Ts#HT3y2vfg--YEKhbSAH+q-Y`6x$tKWi^C*e40}EGz0@hqMP*KuUX|ZKcpQD$i z+g&Mp<${UOl+wzhVcvx{M$2*5ze3Lfh9(L)|2#vWn}NnhkwmFUXQ@%q>hsl5yTe|e zocLSkiSY1H*4JG4;WTs((JZ#Sv6lIcA}pZ^A6?M7Mvtk-JbAr3qA;g7`>cXZgi zrA^nozG z!DW>Q{Q@g;9Sn8H1Rg=pgX#~6R;O)$pLQk$nG92w+{Db%R%;W%W259TEjr`j5IPe^ z67o0dd}nRF=J-x494{~#fb3%>OAlG#Q%Jw{tanKB4SfUKB`_QkVkTmt0j(5P(@t1gcMv7*)*Hp} zcye&^IbQeGATAU7wO6IgER)j^ocit!t4M+5q0}_oA-pC z1JO=cm3m_>LZpciEdLo}hr-YSgel8VFRh>8O#LHi3P+#2M`f%J9C{X^C^ook)rM)V zLe}#D*Vz6_nwD-F=2s7tnnDJ?WYNTe*3*ZhM<*|0l0rMDn2WB?%^#*6n*qk#Yeg^X zE7%csL^DC^A$D^cO@YQMa+zzd$#=b`u_3n^>^F@nYJ(v!P;Q(Wbg#hkWcu|os-hd| z_5vdzV^M;+varWjuIc(FyrQNP&Y{FA}?O&xWB5!-|CwFe#Im*NCe9 zHNvjA2?TDzJ{BFjAGBTO>ZJMN8evn(vcyIX9uj zL&lrH?UGwE%V$^3A5V&1)qQ~Om?NfuVVKArGPW>>ESxA=ds^AjN&%DaW?_aF`m8)N z**51L{Lq?Y0tct4@0|=zHb^_+5-=!IollK4Jw+!6TAb*8v_uT&YmsjbmCmqK@*ArX zS}7tPa};h>o5nMeci<2Fx~Mh)6N_>53K|Q%2)(tm2qMgx>55*72a@;c35k;>SQTr{ z%=4!6Iwd@H+nake=(7o0tvzdn5%{L{LcD>Xry-LguK9e#Lj5Lyc^E|Zl!H47ateU zHIQubgWpMLp7w0k3i#g)N0-R;Y16>C;}#*tUg((>sbJ{b!O+zbsUgn>oPRt~Zjr*P zX%;Buyi5f7!vmOZ#&emxqe;~wnKCka%#>NMt)>HJ;kApfS6iA_aVzqd*3nj2@E@jm zJ*p;2^!W8YGTI_ClkA3}6GB`sr}%|Dibwz0p^8}=MZn!mw@wPM{4$@$YHRt-X9MdN z*1T+4+Ukn@LAugsDd0zm7@{UZYogM~A6Ql}a84p(&7L~)E&<1`1oSLC4dg;s)6fTk zjZ$I)hf&6dOv97u2u@;ek>;?xhuu4+;nFHGYO+?g4GRcLsQyYJu1VM*T&S-8YOZTZf+g#(5HjmNi|;_8!VRD2XZc z?Db=%U@0YsQ=8!Cg=#!cNzsz#N@`Dar)bd!_FQOGubx1qqur9IRwGvC!m!_iG_9eu zDYQ_Ywp*RcL3HSkwWh3T`l5;&UkhBd(dYqx8Io)1gv36}Z()y%x|@D1qmj&?D27Zo zw@7AWY2}h>t6dZ^vR$W|#z($eK)t;=iNlWjb0ZM+6gn>^x2OAn+7&1M9_Nga z6K!VWXI@Xj1E&SvP#UG!nz%)TAG%!qI_&V%6TwXRX*bo0Ze9pK7+L81DtC!K8!YxT zjno<$WnNyxt72B8uP&=Iw&Um4?hfr}nXl!Dp15 zNp#KQ8v^F2)XyA>2GS`pHjP$dM2?1~+-ayQrhQI1eTdpoF|VxQ2xdWoQn!f{c?9%P z0f55dbXy!X**xiCy(GI{{=s}m4zL3*zN#5@HOK)ojyiL}e^l>) zPop|&z87{dPeRHBdu~FJt02kD(YuYgceayY@LMZ>3}}k9_B8XLfr9j(gk^8nC6(t@ zl!1Y>ZX@}$+@-#-CRFF`7%x@hBb0=mA(3WljWa!5;%N1k634ZDHq#Ig%|N`R*vqQR zWfMf~h!z*NSR@pKu@#rV|0Q}!?oM1Lxyu3iHF_@wQeiMvgPo+BM+#L&5xrpNZ|;H! zH4!OJyQ`4qaN@e%Jzcx{_PdbA8O6CARx==}I{hu6*V8f*hA+!j3jOLXL~Ffz0`Jb< z)a;g~57?Tfpq$=_Kc&)mi`rZub2E60-<+a$X<7#v^Q?uNN{rO)W&TsNsz(cH9(k!V zMTi}nY2lWquaPjuT(hT;pyWn@2;0j40e9_OmiwQlkrB3pI0s60USTRnW{2`FTD1l5 z5bAjtJc63zv=%z7G8l~NMQyyOIXt=)ei${kX2iC;Q;A7G$w9D1dYX>(AOCfaj)n%+^vAV5P}nPd5(;hm!UlJl8kjl4sv$9fSx&N@z1RaT{7~t3 zk{IlGAmWQcdJ%^xMQ%!aex6KYaYAr&5&#+3b%6j z*K~c;-L&a!L(h82xKgZEe76@7x0WHjfVbSz=P*;D(0f?Nh^9bYC_>>oXJ^w*?I*G@ z+y@tgE5ljnlAcO#5ieGneIl5Z+*9UHW_@(&G0^Uv13dxy zzv6Ic7Wz6_? zqW70C?*NbP|Ef4Aq6jF)5Jc-k|8*ZJs*HI<-ORu?UvvA%KHis!lLyO+KoT>{Fcq=+ zCqgO$)e7jgJz!@*b2)*2McBi6xy>$$rQkN4EkQd`jU*vK81neKb`S{5E^Sa{=r`53 zEE5)ykTa8q9%5a@m%hR>v!G|*QWf>D*gQLtgSFS`d{7*kmFvSi^1?%+P9CeijZ*Hy zs7SH%k(sEUqI|hYs2cSTG3};uUX%3$l!j9iS}*|}vn*qJ&6zkp%$BXv&2$l0y+L+x zezDC^L#Xa@J*Utq?HLw~nJBXCZjv_;cD2Zi5g2+!3qC|FE5vnjp=bJzW4*?YR!lwF zSe=8rhg<22Erz2fV;M8~Q8%s{YfB`Yx#BT=+X#?tFA>lISXp0=0< z5$;QH==On^x`;c*1m@wa6=H%W4R_WciC~CkuyOqdWek_X@j)EK4Y1D@*-M7K|2>go z5819%lmiDWirv}g2i5eU<@Scfwr-JG#2ppc*{?}~;m>LMaWkh}-#wKZ({^iNOVP3B zLO+FK1|hrLpalPA!d?1B6X@MD{xhnuYXO7w?JpQiKfV_wfg;M7g$DGVrDc`9PME+v z(7-Grt~jP28qb8WZMpWsQ*f>opY_ZX;7*Y{W1wE^X@sr)p&tuPF#Eztlw}xNNyY6o zU~f->5J2~|!_q9xFRGcWV>#;K4i$~9p(%&IR6QpOz;divo|fDz(}Q4o+>6$bGejn4 zELuhLz{oJ;`DYidw}Ko6`ieqY^Rw7yglUkvqVnvVZ0lfXU>RwiB9bu|L{)8msF?1p z(N0DtU&F1#K!Vv@DcPaG&l8!snHl1d;Ej7IKN>S=y}yl|P$L0~2J$AtBp#+buDUJI zCMlE+J@Z%Qp{@_o0?OMnLYVCqb;pL>rXt0P5^iy@m-EFM3zW%fz}beL?Xtv9c4qK|a`WUnl3l2_o?!iJu8VFvCTD9=hG>{F}xn@MA5bbj+H;~+`#@(m{RS(a8- z-lDlc>4a!5v5?^Pic#Y|$w~SS_ryW#l6$%0bImuy&`X`_sp`Ole2%L99@dzz6oHCM zLLc*}`m)+IB~j_i;s|@;>InFW?bB4--P%>ds^!f4YZPF+&RZ~^pp^;|S;I;RkPimD zCb_?n-Z{(9*CJbw0c@-i8MYkF>06r|xatzJ6Ma4Bq0r|Y=xaY4fWz(e^r%K>q4Bk7 z0s!h5!48NTDs=!wuXM0qTO|&q&k~#c4bMtT7`yq3H`;oikgAF%oOqhNf~3TiHv^d) z^hrc7X_W*0J4FZk+W-uIO`o#$acp-oVcG(ml(hLC+q$Sl?~* zRt>aD9TgP)u&0p+lrVVpe5kH@?9j6~xhID^_W%b?~SL5WcQ zLy^rMnx?z5S<*X;47WI31o?VFDUr?f&U$CGB1$X#Kvdam(7i$%pLS&#LwIQ1<;n_W zHh-du#T?q!o_;ZV472l<^;ZAZmKstu#mdP(c9T^5R>h_RK>L`l!d@_7X0WW!hy|DJ z)u)YYxnj}=V|p`S?=&p~#g-oQ86Y>2>|5PIxTcMbw0CEJH*gtJ=t`wsP^TSMFj8IS z3=EA9j|l;$DTzw&US`dzPO$um0?qf{Nxxi2pD=j3SM(9KtHnv>xQIB{hhZBA>?Vcz z(l(m05Xhf)*QQ1dPb5>?{l*LlF&1`gLDEA9heJ*B{IxTAx)*zZ)a2x@fM5oW^Q52> zDl)fS-L}z;_E;uQr1Di-eaZSw|pVIR3Y3uMYs2Oxj*F^yH? zhNHJK$>6ND0x1_%@VZ4g7dcKz_dbKoNfY+Id8+EASY!geN z&-6*#1!SpSibpe%xqj`lJ2uy8XbSC~HO&&XG|mL>EK#Bf8H{B43ezDY~3hND__(2vl39~5kuu>;F?!Z6{2Jh7W^ zx>wZU-fol*C^;u5+*QENqE%0@EWE-iIqU!20`7EF@+JnshIFlVsZTEh zbc{RY+2f$kUuK*V>nhq;oyFxZ5fXR2B)YlX8oV(K`p8myU4OwwyH}n+7lrw!p>9LK z4C^;gPLau)d%!gP?dwx+&sxkL+*I)#n`fOlQ!=)c^@&Y8^tK`Jl$h4TU<1^|BaE@Q ztxnT``5rYs)D&iQq&g`MYrvYqP!Q40!UC80wHzpo7ct<$>Z8U-OBN2rXA{XxHW@SN z=!6w%NKz|^mfQRicZPyK9F)a;%{y=};v(w= zr3gV$Ww8dN4XeqgP;4!vs!f~GsUJF7E!plMV=-z7J!?0W;R@wfTS#S%GC7m6z!Hv! zn{=HKl#r!?$ymaIPu<&Y{+X$Dd@$#WueGSn!IJ@!!8Y@6zo5$(YZkVP`> zt#HB$4^5U<6UTW8AD#`Y?ua&XzOZ-5yRYfa%z$Pkl`kNpV9Z$id>b}lo4IJ%P|^?v z>Mprxs@bnmwTX;+*KY$8tZK%)tUOxTgQsv>3f?RfXvNsEANf3(TJO+3liBBKIyJ zZU#1vMVndQ!C9*9Oh5CT=2eS)KzmKn%X~(YLyWh9%_Ww~^d4@k;+M9Oz1ZttK^O~T zWQ4KsbrQ@;+3J))`6)b_2O*5+Gmuh=paznhg6s(>B2lhGkYKSY024!pg4*6mac6@- zex#;(H`TIC><%cAZWXia=9kAis4UR1OQsW`2Rrnd5vvn<0CY8z@Q6o&Ryv|S0_GII zmDR3!Z+#8`5%}$M?F-0`k&^rMW_RCp+c)KwIm&bj(hVxq-e713uD4c0ETsnc)LLVW zDDO&v)>3%>D&2)520F<8()}%9MK*gEtiIdTIjXozkr9d|C^RX?pIl9Ms(Q#Pa}l}l z?oyu6-vp^+$2MAr-0V&!`=cO=N;^xzR#lnH^urj$Kr+KrBHOhF#`PxI2}uBtJV$G} zyQfYWfA-_xeo*redUiH+YC?uIv!w}DkaF&>ZwDhr8nPlFZ)i3p*gOjc%O-a)2KN(A z61i#uyJj88sQ$8_GM!U&vj#cKe(0zf)jTkT84t=B!(iCcJ+LF5qE(FT{n+siQZYV8W^``tEIHN8+=F8XHF&er=JKs`zed+dz`V{L(w9wY?6 zW!Sx**0ZvoGC9nK@kG!o|#Dx(zH4hs_hF58+Nc zhLgo@%IcZOLlZe$3x~Au^=A6^$Nr#+B^L@TGxosD{^!`0U3P6;`HpQac6)k#$$@uAF{G{rvF^ z1ES|d7a;m&K8n_b(i^$)CA5fIQJK(=r9O!@0=l162t^E7j@kDM8P7JMXfpIW35$w= zZn-(ue2Psk&B5BFr248;?e#MlliJ+YJDY?Uiy~bQdU)}=y&#%&Z|oGxyK5yz+x>ay zc^RaBS7Uffk?<38qGwR)woda!8gtB+YPTzDXg`V7oT~9OeT5{XkCd4Eo zwx4k&U!O5-OQM=|r-5WoFbSNQC)pd&nsz;>Q zcPYcq)<;0|D-aw3J!g^Q1mCFY)9;;raLIwl6|qbk(dQ(qaFq;jl-$Y=ya3rZezIb{ zjb3G_B{rpy|1>M%Og-Q-%?q;(Wqs*k%0SP7B`Fwzm$L_#X$v&Ujb`_h3n#hJjHTxA zmb0E1pt|vG9rBzLc(mtwkM$2%7g}Eo?B|%U2AKh!T@?mf({b%{Xav`ZhIx#=4q8Ws z05i@!O1DKvR|NMAYzAU|B0wqq;ym(U-w}>WKx1-t2QVBKd*}}~@u|~75cooGGCZ-@ zo>5@U%I={{xB%4JnbPT&AB`p5bRq)U*hXq4bl|ujm2wtqZX%tQw%Amlw^&L@Sz^=V zXJ|%lBjvn|_=}2<(b9lmHiK70S}E@~0mjmWb6Rk(YE%S7FCBKNwRpC250JI~8=~iA zb(qn80Q0ud-RR`rt*Ol<7k|Ffccd_OPTp7*Etau}*WF*1Vrm=cvN+bmDL%>U6K0dK zVQKGSV&SXhky4&sN2|&JXHgnKlL;t|&Vd+uZ$#CMulr8yGhNe-G?!LA+aw^+bNw4= zMJPlapvqC9Eh>SSdA0i^Ritoz4vo`odnr|Z`hwMrdCj8Jt!KR+$qk2zqwA@46ZsEb zF>{Ko4NOllvGlK~8gkUTb3? zKW+%tJ5=gQ@hW_rONmwjry^L~Zk^S{gv+qIP4_m!J9^x`J?m;619x}e3Da5F*tajr zVJH;;0-ev%R}D0cZyM|gF`NOx_}AR#R(Nz`CXDA_2r|!a1ZuVMy#Rn>v{qsl+z-BS zMGbenSN^eyHOW`Doyt;$R2J|dogldzr9#St9KP~$T7ZcMQYC+h}i>U0{KL_5jYH>F%tZK1c_aQ9;i~IcE{XA))9y??7Us*mflS-hlo?aP!p>53R!NU}#{t zFo`rjL%`bs*$q%>M{tmUXbRE-)|sKIrU;liO?@6{J?erfC;{+l~md{LJE=xX4T=1)0g0Z-? z;(fawRGOt7fzMT_3oUN-;NYg*4Z0VPF6pHqk1|ia)oNg-tm1)0VxhPrv#>fp#TZw%ns%!=__6Z_6IxM@t$raFP2k;2gZtuTb4n7=JL4Vx1@rrG+e6F}F_ zm4>IaMR)yGc0(?DT(Sz`$zXQY7FT7)xb@pjAgGp%AxqE;Ks5rxtOn@s6yGFJyCy79}9 z>IJr;FWlgTp#Zeg7=)T1{XNu6rlThI9q*xV9L{dFdJ7|;OL9KUpCwjtVf#?GzCX2c zzK%Qyv$VNNm;&51x}k1KD`%K&PBhcv3!&#z44Ki`KReFlI9EU4U++gZlY+2qy!U#` zjUm0RwjXvVih!P(Y_|SPHVZA~uYKp1ck@SNj0e)cl%UYsqNlOq1uQiTKy7+lwapLw zS5`ee9#S_3bk?Ef!>nTmTBN7}^1|YGDwQ8-S-VcvA0{lK7trsJGM1jh(8A4}U$;z* zmpfmW%8wD-GU#LB-iw+4cdXEEZA3jxJfx9^$y*R7Dls2dcXWuDU}fD zzlAwYaUIsy?2$s2hs&06_O@NiJA_%TV*>umy^bJbhJS*zSLs8xMGhWwZF_*`1~OqY zi$(0D<_Y${&IT;yk-!eTHO0=rRocNNKkjvm>8 zhRxBT4(fqw*0(@(+qz7JYWw|HP?J_};sg)!5CJN{-F}xI269HGU@3s@OyYVz^w|LX z+`01y*>^#(j&SZrUGxI6^Wm{Vq4g7!Y4%wy&K)rpPHtRr)capQ5}N3i4o4B}EWPc1 z=rr^}*&fnvV0p(m+UtUd&Kx3`bP${6yF#tnER%+Ppd^e9tVER3G}QhmLHNk+GyKJP zSy|CZ++kPjfGvue-fA7QvC!3P#r%4b6&Jwm&><`@R~8t5vBj`GGCisL>$a@~7lW`) zDAOi%U1$gd+!s#)X9R33J!W(W&@X(qZi-ex# zL#(&(b?mqRJEgc3am@625C;>g1J+EZ&4fl|53xXD9~uf*9OR&IIz;wu+A09je;W+l zd?E6%h;umva@?7;c$(T$1xle|NHyaTb0hGTj!!`WQnVta#*tBK5n_H*Te1};+3jaD ze+PyH`hl~ykZvD)!F;1KQNtH4|HFCP=vpHuT+ZPx^LS3r+X0*PX)dYrCbqfwsG%Ds z`6tL$H(mFqI)i5VB4P-pb8Z{^cgE*>n0&L#87&s{OcfxlX}NkHR*AQEG3*l70o^kpWz%gjhAts5sy51Tuf>VJ)+h&R z=CIqUX`Sjp7T5}rLzuzC>>&?OaGRQBw~hg$cd>6bVU3Imypkq z*(liOt|j9^b-0l!F_~&4P6&gGROb74nEJ~U10acA0n_0xrTkpe!t)x;cHGak?P|%h z*w2VrkYmK`myeb|LKJ~*G(e??ZxypqPHOh||20HOB4`zWf{3#)p?THRO@pN#^IGI8 z#v~jA8-%lor%$TLg`t6$HA~D=9QZAYM9_&g#=;h~$8@$i>p5Mh zj$l?4xti%D47sJmGhCJiJC|}o&pouHlzs^zw$nEXlH-~?O24d zD}>#uRsnMsI>Ia)6}lmvrl7mHq*Fm;I8@JvhLCp{nw@!4+onPPrvptLDvC{a=9Jm_ z4!8;$NDX8Tu%*`nWo5ydJ&RP#9x_UCfIDAUqVJ+`)*3+1M}9Q)z$>NuDg-_Ib!09x z(K4bgS8(@H;xbIu(Hwn?0zs{Ulf@(^ta-5H-tdSIlIa~A7jz9W_^J~1q zUVXe)k(oAL6FR8dW?0A0SEwb5A3%$BW~zF22RiE|zo^htDp|G-`HO_b?ZSesc0HuU z=7i-%M4MaH!sEy_fs8$isMFdo<-PUa~rvz8(OL(lAtPzA)E^rvWbXn6B2d8<5p`{zXf z`g!_Y(uNe9_h%Ss6G#(i29H`fXp8LbLg$-gh3O3_8 z#7%t<2Rm2WM?GwODx6&*SFAkoR0;HNBJsRCuZey#FAc0d zPEW=LVYk}yK7+)Ns`&f)+`OA1XC@6=oG2egNyNd>RYVq#+%f*rdXeaYHNSVHIZxVA z1^YU54rGsk=nZ6S>xf4q=sB31UbUoN6b9vluatnrXifVj5^OWlZSroTU>4L%jGR#Q zP|PmhF)Do*Iv0R0`)S5iHMd`XJ((t$z5VTJrQ~{8hT8`!-lai4(W~=?Z>?3p+?e+# zO*ka4DVkf@BMI_)b}kw}M9>9URzZy$!-j--a7p>yD%&B?V>^?lapF9znTa34apvh# zkb{f+R5QN=mLs;b_GozqG* z?ar_<$%(;$IQ>+yYWARRED|M`ZkMZ(4yscL4P{}Ye$=Jm!yt_?feP=oUu>tN9&tfC z4M|C^^RDHRz~ojsM^#T?8OW&_XSq#x^)-!%X=i&7L%3JHVa=yw#Iai4H9_^%RMW<4 zH}Zg!r^!^Ybt+Eln@nOX#<|Zep1SZ1Kw3)Z$W)wPHEV*zaQIA;HJg~CN)2CF?0*x5 z@C4n)XfI5>n)J64cWQNuZAzR^Dg+%Jh!lqC6R7kMbKDO`U)T`~_rgY#-oI#r`o3P6 zI-e(_)K3g9QgJbv7fmmh!T!e8VXW)x|{*gz@TRVDbc>bqF$7rskeyBxDOF< z{1iw5ScXjiYHV0G-3ieXy#c$~k$8f={{4Jyu69shtqiA@U1R|}IZ`xif7cR)wW@)$ zuib9(^q*ZXVeW-_q^O|27`T%pm{U|%v}aUd3~tk$^G zy!*x{j!RLmJjrt1lG;?lV2l)~B{W3SvERX~_mTqlzZVjIlv)SH{-7wdGSN1AsGu|4 zQ{q@dGd&tt7T>o}AhKDZw7sbPNYAY-1xoq3q`bX~zivZ*YHrNPJXx<%gQI#C7XS{A z4Wcf?=wG6guvVS7CIfC@DgYTRPB{ZT25kEZBh6)j)il_QMMMtJZBaLYarY3^ZV^Xb zcd&CeGX^9ZfiGg*wx+`4C3PHg>Etr9aQsFf{u0JNo74zfd=+dYNszP|pj z$8opt>FzT%tkiobbXIv`Q%6%@yOL3M9*T&AY))Q+X_U*E8%Nbi+&u=i4}?C05`B&Q zgvvb7Orz3rsK0%uBo1GfeLw{F& zgb-Wr8|3cRYQ9aLMFa+={vz1?A0X~yNN0%rJ>tUg>~!<$kq5@hGU!zz;fr^_7s#|I zB@z(TIDl1Zf|leO0DWu4XX)cR5v!$}gNFk)n)jsTGb&>&!Dn>y9$MDHHRu6+E^&u9 zgTI;)D}i8%cs3Y0g+wbxX01R*T~t7dB< zMX5%zlv6jU<7oA%g+YlX7krBb#w7zPWiP5I7`i@Wcy#qZkqyeG(*`{g9;6lO1%xQW z*{eFsEzq+h;d?vLxx#lJU=cobQO4{TTc?w3cgT20r%7?^ zvkj;`&M{7g(WmSyyWPPX(1-0(GcsY=0!N^0(^>-+-b{ZKQU(Rt2OG2Vqly08EGP20 z8&I>U3UgR5r2Z0OmcOmCc~)YXfliJ_=CEQtrU00**Qe`Yxp_x(fK^Z6!m*QS-vpvn z>vN!8{YxJr2i;ABzB#5jIGA=ERa|<@q!p=5@+uXYY33MTy1_% zA1CyzkKW-M;w^OBj*o%Tt42O3RR?+yFB0Ds<7(qma!GTbV5j*UZ_pCRg`v!-?Rek#c&&{->GG>(_W}Kz^eVB%d zM7a@SsGxS=5(HU4qK()Ga2IHdGjCe%o+3Rp?UNN(-#%&4`h5_DN^UaW^RzrO-#?~4 z(7_q>Y@D`XhZG=RX~0NHehWC5?B^fGk20tE1F&AP-JyPhhH4|ZHEWmQm8Zqesnmue z4>PYJj_gijT6DcY20NBcU)m(z(t{l=NNsouA2{q=gR_P_ z#<0GXSeyhsy*w#Fa`5Dr?xR89SYxC<7@g;0p$#R~Vc-|pP?tzU&w*V!%2)sRxe2a& zOcTF?OeF(<55fCnrANhhqfF<3kWGTe2kF+{G0QwP9Vwh>$OTH!+5z+|W(<~7*u@p3 zQvhfgVdaLZ#JnT9P~e+Dc{HKvE$f2#Yw?W_kAWy?tr+XK^jcDgBib0;Hp6TUdTwyi0}aglJ&$aiSb%bzyKD>hy}Tw$sF_!+=31^?ho#hh5_C&Rhf+zysYE0r?{N^omtW!_X%BP1thn`F8 zqC8gGb~=FfstU$)L>W}Ix_3wtwqw4@Inh)?Blty)XQ_XyE14TFJBaTM#C(}%ku%7T zZJS>t+bs0lPQIZE^9tXCl|N2&0x~K`Kb2_vM56jodYYl>wNdIWK{3`;>qoR~Zd&dp zXwuCj%D(|TFn8Rv5Kj?KzLK+t2|d3GbBUp6-NBRDUr2qV3CPl|0|$PEnFMnA0B_as zfB?q+v~&orZGy{EE^Nz#g*<96qgi66Uul|taTABr9-quKpeu0U_3MR8=z0fkd z1v#2koBY<)Y-XOFr<*|e0ANw&3|5FkE-SL{rcamuC6oNUjr59TwQLRuHk==O9!adB zA+JA4Dbv!;hy9PA`_+^g_j6KA%_I->gP}a0kCN~ZL-Es*4(8TS%sQvH*N(D#yp)S# z_zrLU8f0qpQoCm$2+Q6C9a+w1yBJUpb;u{cXjEd5w+)NaF|+-?I~MC|^KptqS`Lj) z7Pc&c;OI6@#;O5BiuhO)gEDZiP-^oS>^O1@2RB_0u$Z5(oK>F|VTwvFXb*QqKy^G| zXZ=BinCl_VJQwjRdZ_ammwOg{0-xlr!xKntR~h!FrMqm<+!%y@TVV~0W@CpDT7`a7LT~`4a(>fsS0sZ6+=Dg9fo~d}ns<&w2 z{MH^tyLllu5-UT_Pc&*H%2$T7%WZPEqttz&fc^3~K}mPeH<=Rrt^()l-{Y+q%=9l~ zmv^g-hjinm-S(l3#(mOxN)*I#|I498F}R!My>1J}BW0K}C7`)rr`^L(lDW5%RLx5& zB~56{z&+Ci+q|WtwR{q_tEgV~ABPF#TsK%U>yMF`QfMpnlj`faJz|73HLxy6Tahv4lB6acHI2-j{JUH0QMZF$%N4bmkY3BA$0oU+g z3&4Wfk=pM1YD}4$Z5t3>oX~SQ!R6*0^dq2o*1}w_#JUS`C&$?fLnMGwf&c|*^*+xOA@l~opdNnB(9>p z<_+KR2@4Drhy8z{fMl*uROA!pynD=a>9dDlafM7Tv~WrzI|K@1RQ^mE6;q(QP-`i;Z! zqRbcPp`Z;*v$|q<#sIMN`N*!QXk=07aQ_!*A%QZ3vY>G07Vu5&Xg4Opgi;M*z_Mk{ zg>1!y)^oD6HZF&TAk!Pm83^p5(v&BV=4Vw=dk%s#dKEDoGvVzB0J6b4v}d(z$qxj% zi3+8hM@e8ibmM@7Ny<{gUa-U5@+gUlQCE=q3@Iw~oah=hQ=JS7yduAauZ2(_W3i{{ zcyz4~^H%z)<>x47-CFdfv}2$Kp*nDy-W$kLwzs7pqIk+?-$__&O~%;yn+NHu0tGm3 z)U`@&ITn0Vj`y&HEg5Rf0j;d**NhVjvwKPJr-`y6=(*4#84KTZJJnj4l#nBTeiP;gucd(w>vCKy~ zuI*X`?%_PMkI_XBa=RC3l-Msr_7b_~mIiRa$R({@b-Ok64$k0Ml8$ZY*vccwwR1Be zH$qT;`6V;bbulnEms`PthoD}%VH}|3S>XLSmTqp9Qs@O4%EGctCzdW}lQolvUSHyx zEtF|L8M;1XR-9k@Mg8vvweO(@J^On2(kI9;Lgf3B?OtR#GY4Z@qGC^qGv<})>+1x6 zl)$OFUFjcR8_#Iz-csPv+3{LI`A!N(T8%=(m{FME)|i4nJp^~wH)CEii=-CFZCf3T zP?Tjhi$}Ng8s|Zt)CD5+Gsi*FG1nrf6!{&5;dlBlSYt|s2^1{iNj;)w11YOtA!f7o zc>^w;i(nWZ8=}``)w7e^fxHZ@1Un=0aGZ2S%!!ZhYji}1xCAIuc2u}JW;K49tEb_| zCs;&b=o4b@3V^PUb`VF84?g|}#A#`eX*n5}+G7y_3LXp!^%_{^;Vgl46{2C*=PyA< zMYE}*w};K831H}|XKd$_u(l=mebte=`;GmEdbCGraCR|3n0havDw6tTkeWWPk)iee z=;%$(7&D*#{-x1^=q=){ZmZGBFan{y_jenc@-OV-suj6TY<$_eDynJygO{{KYtcTM zfu0L7OH8B1&u2XZ+5(xJR5wwIapo~46YBNx0+=LnLz$f-uLC%n`&bfs-drl%l6OQg zdXc*n7|=6>qgQPCFe4Jo6F%ggJ|LLuRG+oz=<#BoYXO2gm$apGk@;&B!b3gS`LIMt z*g#KE%`VQ*Vn?B_%9r}ur`rH=`zfi7n?J~ViLLAUP8x&#do}Qr`pW|BmL8ZHVrI;f#jZ)kar#;N+&ZR!{q*2$2YT*+s5sXbNWhECMb1T_Xo1;! zx&~HVHPF~nRa>2h3)L{~6F)sW0Yxy|;mZwiE)67R!L?ZZ1`_gII>^kgt?YbCJxaQz z0dW*r7rXisr{_X$`8-aQ?)bUrrow758#nXNAq%?d2yPoxAVDEHq$<>YZhJL9hlchT zMjS<|+fAfEpt|-GdsKN)Eo{>sISl+(IGQ`{;t?y>6yueK%AExMFT0)i@?y^_9kWF9 zt;yJXwyTQDT05tqQcAszlr5R1jKPahp;ley|X?J(9r$p85LTFWv8-3D^J{AX7^TaqZQU7Vw)t5YA z(*nTH7e?H|q;ulH-G-`H{qIS5?n_@PMz6UBL)Qm0mQ^u``4K|3otC%!2QSo_mWFL&8_t3@wb~10eruZ;ob=%H5mr|Hf#8o4!!_+;(U$y>?J>#jnqX&7d;BT?h5D<#jQMpM zz!IfGmd-C%kGQdgA%(+G-iZMahc-;nbfu=4zHBD`(k2Rr9gs0I!?QZq^B0gOY$p>< zO_ULM;#Vm&b|B0*G`BF#EvKwr=FeQS=1X2s?Ua+aYwuvMp)ys9gEi9!3R+G>*RiPc zY}V>sF5}2s*PNGbxKd9vBWub~QQRXghl>t@} z=Xi{AYaf@h5Vzj_d#Ek;J7QT~PyG&UA>_dVW2UxQFQ;sAt7h8+Kfv zT|(Ho)%y+GNfhm56tVwtMoD*l3NNDO>R1qCqQatYAkp$_D*^RMm;EOXQnqkQi7SqjZI zv^7+i>0r!luGC+yrO?idHt&wiISI3-893Q5jldQAaG2*aAn+}C_LtsFen(4pLDFkr zaV4O$lRy7@=tOaIn7LQvO0r9o5pOu2f1-L1AqTe{=~w=YV9;Hf+sYQ#qC#A5H;T%$ z=yvp322RHeNW6qK<8+Qp?T74drHe@Ty^@tuNHh?AXpnaePWCDKHeQ3CyV1t{!EQU`!au!%Z^V z4XREYdIqxpaJ(>Yv@9Y5wR<|Kd=H?7SyNkL&wbrv}$3!Td;*%L#c;#poob98qv(K?ZOZAfF?k%M#0{Dlkkul z8Oz&P!h54V5BSar2Mw49hvbZtLzz@5b*9m%H0wUB(R;V>Fzy-c42cFW37Jfw0O)%u z-b%rS{GXzmA{DmMXfl)w6&5h_fV8-$t*{x9b)QEvdyx>HI!7&OCDr|MNz+|H)=Xza z42r^ln||l6DmZ%bQoC@4v?*3dtNPW|4Sz2xZ*vzIU&0dh9y@bzipDuI)3e(bDfG+5 z6!kUgugpYy<3JqeOzdG3M%4#=w5?YFD`Pu~gLD_Roy;GMy|HUCFOY@jX3&~3OGYUE zb#vIthT#LNuyKwVta*skCeV$NV(d34(ox4Gh@~je=C1GUX(L5xJmkHpq zHBO7>x6Ab>j_hKhms7m4P>DAuKE?o84jFo7l`A$?cRLt+3mmshaa7Q+p&-Lsv0ou= zH{>zTQi=x4YQ((s<1GYuEjB1TpfFl%=vD%Kg|(}+;NyzN^B8VqX9`!8gB}HaoZ8&_ z8$t`6ht??A0-GsFeFW`RWEHSUbOP81fJESPY%;Zf3jw+MHInD(>e16fpH{BtvOAnD z#oIK*Bfw|he=*EhN^~|2AU3SOf&D!THb$fcde7`9lAOLX_9*kJ7c%=uhnpz@j2}B` z7$q&9CKlsB%I6o)1;yo;%R8$RuB6ViRFBZ16#@GrjtRRvEhe`Fh%l{_wIiDn1x|nm zXHsInj`;iC0)zDQ4?u5hqR5B*wN4kk(@9s_>Y@+y0h`xzg>%TA_{kGqfS1fEGG(X= zE`9^_=OuR-YUDW2jlO<^V8q&=<+UWL)2N2(w)*6IErTL((~H!yc5fR#Uq{ z=~QN0)hy!ydtY!L@8Zt+2{THc2<{F)>tVw1o+=8;Ug93yHMr ztR{cgUe=QJgT`NXIHTwPV3cN3g4vL$oL>-ZIi%g23woNR53Wbcb)E43#xH}@lTB<| z?9pGxqj}sR_tk{};ySz{Cupc?oY}0xjHbZm6dzz`^%?)Pxq)S-#z-Z0z|cCM0h>!O zoP{z}gmuh3fSw6*Tboir&#hHhD0IhuiEcVL$=9Y4IAbC@J*^2vwCe)}ut<(#=nZ`S z!dlbg;OGW;VuzZs@;p#Z0+Ip)hikdOuE?vWO9RrlVCV`g1lDQHpgv>;@V8L?N~Fb; z%?M%a>%Gr_~x2Z3u;fQkKmcF&Z1x)K=gP*LvWE-#JEnX7##W&9AU=fC9pRl zx{@oN8!*Wx6>!AB@sfZdv1#j64y?J0$A$_(mxdlHOdF1#ogiJB`UDzU38EYII2)@= z*(L)=75q9e)Q}3-5aUClUIPIrx9okZ0na+XiI1`*rGN2`J2)LrYjk&p9jsyY zml_leyiV2h=O2l6koicT>VCAh^8Fiz_W<`~Stg_~!>LE0{RdkGI^wT-kQ{bMU$SbG7}v>vuVuxZo#5)Z}P6Ofh2bEZ3gNHGKXM$q0haJW7%`nmbC^GMP* z5hs}0fzle4Zo{6kNw_K_LD(t=WNh}sc{bRZNwPs>_oa<9gM6gV;ApdjF-Ju*>7Rxa zW?Hv{p~Y@lZJ`TY8`^`iBwp` z@fytP!wMucU=xWAYOmSQ`Ukz+sQ5U>`p6e$Gr0Xi0?e zBedUNg>mZXT$xx0M)yjY}o2`ltG-+cyHkBCQz(gVX^#6JW}-P zR@^P;(7>mWQg-3pTUIt)2NqMc5Y`=vV%TiMOGKj_E0%`ZlttNwwlcuv2IJ+XxqK(U z%F+jl4@Q|8>{0ymzEo7jfc~I0fiM1$fqES9x1d6Heji01D}KN?9!vy;c_PRkTA-+_ z2&U`aw51e0q30HQT!G-yftj-x(HvDEax4TJ1vJYEa`v;B&!x3`8^m2`7atxcba3X! zW)1dZK6;~IgY-M((#0re;A7W+IZuR^;g=i{a10}(Pg6XihXJ*-aiQPl+0kKSlTI}^ zjL7_2-+K15d1^=P>3sCjgtcO|r^$Jz7<0*th01eI5v#U@niHj4kaz~S4Ed(a>?`mu zh=128U-mGi*z4Oz&ipTywnBpm%h{R3ZP&T-Q9lEIdt$nyUnjNT2t>J<&~q`MXZomZ zyE5Lc;ym10Le^uHS(GRU2Dvk2%yv#XG!hU5Y3u>6iWTC?2^jiIrRb3%Y^j4-4~6)t zK|JORi+B1(5n<6qghf+{nfT%#m627_9`5$?=ThC@!(T43YfQCjNN?O$4;sV=m&zlA+}-u7w! z-*g;w;mJQ_d@)J}ILyj6L_S7f5qI)VFo+wB?bpv;I(dwK(Uh_f$dg8#i{%zTid{m3 znPy#em%kK|r#e0PxHy3gJrk&l<&W@a)1#*FBE)8O*bK>6C{@;wubQ27cyA!~IFjIq|%Z z%6sl3K+8?qcq6!(OA2+AI?zNL>#wbAQ%?; zb%u`^FG)4>s39tAj}*U%%o(QjLT)ITqr!$}<y2g zDk`O4cgU;K4=SlBw^{2ZvH4|v8&*KNA5*>A!o)?5eXS1MHwGe9pu*5J__D`_gE=4? zN+wlf-(lGIn-1pMVkzqA5ArtSO^!!7O}gf6=c3pzqmpEc219!OY@$X2unZ=+QJ zFklo;(5OLzMCT`zkxY1#F8h zddm0^%ohuQ{+0;Ng%RzHXcrk6jU=PYV${&Ck5ff&n@M*j^q(tJmVn{TYooB5X*5;H zgTgjUyBk-?+S2M#2e8M`CSuwg+1~am;zmG$V!_B&Y~;{$LvM+H*_#j%oc0oo&TMhuE=%MS2^xOFDFa_6+?x721kJc z$hOrxj(-$$RI^_=2t84)O2u_+Ly+1kl-X_m`o11Z!c(ql>&swwr~QX|cQfAP?3XwPZxtS*z2>1^|2<*L={%XAU8hNQJfn*-M~ChlE{ zfe&T%Dv$t*b?Ig(cV@|UmL#E}V7g4mF{7N`flC9P@f_Qv>(|ofijz7%hwDaY0o9lp z>g}i4hWB z$4~gOEcE3kY1#I-tHif!Wh>d;coKT{u^)NbvVcxoKd?o1Ma4q5GO(fPDkF+BJfaaN z_oe%9P&p)Y&K27-DmQ_c;`P4ixGPp02cR9C#@mTv&F7c`b_xeyXymccS{Vk!Ju>M= z#M%%!GsW~(t}hj@T%I)SJ}4^v&icQWuI#(EUT$Kula1|TPTICha3}0w&w{0)XN^ou zaf`9$(Z=xY6t}J=7*EpN%VQP!N!0@Esm;~WoMtY7nou%FGrf+O`D~cH;5^XnaIBTi zwFR{?X7^M=X1CF{hV&<_&zQ%4sZ&*kxtC^NQIkfsFHd{5-Mb-RCqC^_%S$=`bc$!j zA^@L%20d#A^;RKoK}9}^fb*{5`iDxe zMF*3NDBAqY-nt4D<`BW*DWgK1Pr%yIQ^jvfJA|Qn*sRA=tPZN>0!ra6H0N&b8m``-G z4DsP7PuplpsYo**l80oQsV^JnfJF*Di#efIj#mcxtVOVC3Vt;F=};!n!fQ~x^tO9h zS5}6kO~?nQfSyHV9Cqf~{DDO+0M7#RL1G1tl7v2T)#K1WMl%pL{W^pvC#FI-yZUzm z$hzp*6S9^@HKnef%!`@Vj*rh4Dz?{zH23kB6wY4gQ2mzZaOcx^76*KYG^UE=nF6;^ zn|6XtoWX7R=AW zjvRvr11aaEfWDT3mjJB?j-0mZ9+u!>l+#tWlrf#*x`jBd?gzlNozLQ*-c}1iX1;a z-Z|>}>*I+1VPgO?H*)KdN(ReOwm`)5?Q@ar-)gr$eqlYHIH1>XDh5joxU?_68uWHDdwB?REr} zvn_+{bOQ*qu$* z_6nc(_Y`k66xK5snd)5qBX9<*(k@7O=bSb+$+Jd#nlSmykOZ#nqu7ds;R7M&6xKXq znWH%X+Y=#l3RlSGvTNUDQVb66MHF^vSkF3Sz-6t5BlGlt1tUTQlIVS>Blo^yZ`}{? zJJfys=y<5!T4OH|cv1E;2QDCODCc9F7Q&7pwTblZBOBGY6OA3idP1J$xZ-;yo#OKA(>)v@DHYIGJbsIK@Ku&pXdT5yTYAQAB^6r z<-$HzoF)-NN-;CD>UGY^>H#3rT58A-9n^KJMqE_5+5{TBNO3~(ubBdL`dS9+l*rj~ z=-I9zlE26lfSjv47U+3PDu*&l(z*%t<{39@sWk6O`MuG4r;RR^J5@A) zKI64`Bs0QAgIA*PTrfT zqo|_#Qb2AX2GvdMI|Z5w6L1d>tO=&sd1|hq7GdE%lTG(>X#%kvfMLAxi~yRKJlNUC zpdI`0DPjf_s_IRV==SxDZ>}t&)M{pwWdINO<%-FE@i7^M&>i5T_dnKNlM z^O4x=U966MLTT=G;gIv8(~e6+J-P*zh=m8<()6@*bX=@LsO9Xj?R}NJRr2(M82H}* zrq)pZpMP2bZ%7c_EG3#9V1^WS06prMRh!2WF$A%WM*Y=xMXi+3Bt@HHkg6EDYnEAl zwL7`2m9fTDonqjKz1$(s5Kc*{=po9N$yXnvx`Rw{RUwi4l8WdWRS))Q8(kk!zT6{m zCS#T!?fj)rVnBC^91K7&ejpwL20fTU&&_Dyc-)LOF*Ab*iRnBar=CNdBLAR&*gu?5 zn(1bAEb}7RkdK0)$>W=5QZBKAI<1X>RlXwsv@3-Hi!tCw0-a6T|4t;V#lvr zOT(E)g=M3!rs;jhTM2^~^U{sBM!|cDaFa5$t*VQeHMrI?{yq}E_Wpb`>nltz_+J{4 zxi(w2Hj3plW`Gu3bE2L_n#-zWSLr^FG-PEBw|Miyx$P2^+xaObCWux z9yxiP*oK6X%=e>wppsk93EW7}zF-EXED`*IdIoAzSFcWtCbn6a4r3IP^3(7@AL zTGR0GVjW+A6qv6;_XpR2KXnWFQYs*ChCXxO zr#o*tREU&L*~Wct)#?kV3BlmxdSVF;fG^$n5NH#Xj9xBQKQ!hw<&z0R3|ij;RuVgz zys+aKU9W|<+h%=*lh3MSmN(NN-2;~EzkB&kGIPz_u~2%=^HD#r*2L8+i@AYL)VqUm zmdRRhC;)XsP*kIBsflcR% zzKg_6l}NcHt+E1G_G)HFHSbaA_TRr2a}OT)>QFP5pXkmq;Xyl=!;^?Ss?s0Wb33k?xg9l-xz??wXDD$!Mf$|EJM`Ny=yLYR zvr-jmMp6XnyA2N)T@Rr2gFcR9Xvlq0K_4MpKI)i&@vCC{YOA1>^OGPTq3#M`lVCaz zsXw2U-krD6H?R;@gqvb@-*cW#wkp#p zDR5$*#x+_Z^$3J0`A9Ckfm@0-O8jc=(I%RIy3a;w5KCVuYzYZqt)dmx$Q37S7`m{Q z5SnvF15>mOTs{9ap5r=ZGhJaw^Z*7I9gi3eZSCdrXSm;&u3LJV9F>wq zA+K`e#*dTKU?XASw!#+KlvUMrbMu@-$Zk*%Uq(Lraifvm@?2VzLNlH0+Vqu^KW5yU z5U#=&04TD2D;~^PI=iUc!)AiCSeN21{5ivmeW7I-9rQ2SsC>L0(b2HJRrYHrZg{jk z8+3X3880l7A8Z3!^k2i^K&(6~`NC8s-|EeSYfj6bQ}^4bH_*=?SN2OfQ(lY>*3qy? z$fbr77sw;hE{J+V_IFa=*p8RkXxRp*d6%StkPTE(PuoqVZoPvf0hb}`PR2shEbO_# zM3Js~6mRvmEYEJ6U!PbgnbidBAo(Q$VpLlA59%!&%c3-oMxVmD5$LM{N|+RnN=D z&T~SDaOTE?75gHrHLNLnOQ%#hqKOy};-|@*39)sM^E*>OWCO8u?F02BE9zECY4APm zKmD*=D5ZV?+r<##iQm{Wn!aemBX2Mm#I1u|NIEF}069R$ze&GdFXc8%2=;lIyqA#3 zs8yV$Ct&@tQ0nZC3?9v&VfZTN`;^}Q>zVXpP3F9?At_i{tr`}{BTW+~Ft%luWUvc7 zT|R`s<-^W1QJqw>UkK`mXm2(|M;lhhzc5V7rgT0S!r8!up-U-h-ZwL56hQLr!-w)Ka5u4kFZ%J-b&I_$cC?^|bjwyQg#}N1h8~?4arlNB$zW&nl?B1C z_bMeP$=|_6*xpP1JLef<>iy(GL#}`S;~4bQwewIUDCQ9y@2kMRy8j|E##!QKfJ8PJ zrw$Tqfz-cblDD)DfH-TgLyY@+OokCEdlMIj>6-T&kk_nsBLVWPRJ2U1dS8@T8lW?2dGSd>eBFL*5wF74vaNX zFcpr~yPv&&4iM$8uqug%*GUFrq}uOn_HNMm0SUuT#lU=1j?3`r=G8`ZGn-yMd%rA>K=>2JPff` zLzUXILf(UOHj$V*dsT@U-px87j|y!dn}Q`I5<_JKgAMksK0j}u^DtMNEp!$1`IWSa z7(2Ym%9sK^=>H4`J++uUM67j|0O;ikJX!O%&FcF#um}LdRO+WI^`(%4&0Xf0uoOAC z4-;wld&iZh|6|cnqw07CNKYTS30MK^gjGW4}d;lNfSc0d1aq6sf>)%P9 zWhI+lXJ*xs5Gu*{vaw-dW_BvDlen8L3);~vG;DXTc}0A7QU`%S&~3l&{*#k2j&U9o z(iz$6b8zRz-q@Up>XfVbdWIwoa4)l3C z$yM?_YA4aJhhCN{Ks%^wQOvX#IDh|o+UO;M@0uR%hWqU_ex7t!)`ZP%o zqWy0s|5T>Hl~*2(W@-i=(&Yk#7698Ty0@fJ;A4C{i z3Ucl=~K(hzG}ka3Pv|i?MKBPqwFR~u9cs39T-4Zf$y-`4=cU&#kV7%E#^F(LnAb@yh4aV>|-KW>) zv17U>9*ny1Jq}>7;ir;BiGiw-Acs-~0Y11!C+w8PVco0dM>SjZsf@ ztE?gD+VGQ|`*9y+rNF_u;ZOVYXdTU&;mrK@Ge^XVY0l%gw>o}wF z(Qc09Yrs@63eROMOk>Noz^by^V5%xeV$hjNJ-m~H$>&Be07*9^F2|9_lPJ26FQCsN zckVjKD<0Y~d*mx#EZ8Q!gK&4JyKXhvOefh9F%XMsT z(yIN^-=TFp+T6iT=R^K?w+8#`nuH>4H5aNsihSLXEmTRSHRQ?bP*xuyC+0}2d&Mm_ z9xrfmc#w&XZ4jWoIImV(W5Q3O$A%yjka+ZYCt-amkC{%@3)R!=pUIZ1)j+a$(J#9@ zk8y4s+c_2#=V<}c2vF$#g3!lL2aZW6>@ot#2CfH68}6O#?|OU1Qca>0PD9e}K^2&4 zFqr}vPl9XrlbaeCiyJwF6_D9jIZho7f6;NU<2)3lV&fIqVum_GB& z)zf$q+o#|a3mN%M9r3L!Y6PNP)v%|ByeB}bd%AU^>{|;C)~(2E8Son?f-o!6^AhSB z!%+V2E8az8Y-D(k(p{GzThaFs3|>yCrw?V3@0X||ua~<@NknJ}`f+*vGEHou z2bPiBweiK8zhn?KA}2QGJtT9K!=3g|fUgj+FUI7C982loqj4=sAR+K_EPU3cOKX0! zoJ5$X%TnR=+43Rt)-&3UfMRlxt!1Oh$OA0pyk@gLY{Rd{e+!(2p!+YEm1xzMsJ{xUj`?k$SbRV_GIj7)p5@q zb8ZakJ+>4CP~y>GXB`km5M{?X@iR+zq_{lpQnMn8SJ*d*{>br(MTNz8kl zgvA^vPw7@IGva~0{}Aw24{>Ctd8^8OBnF}(KHDeEd#?-h7y_F{e)Sk|(n2bg&Q>QD zD7R{MD}7u-*I9SzXOtqT_>Wh83%#@!nKpn+uYWPUr)Iy#BH&-2=fn<>=+O7J6Q0mB z$J3x_Tio3aC#Ls_s6o3BJhGY5eq06%->$YDe`g$I9fv}hY7)OaCg8FKVA`&s>)n>` z3OfB7M1sAE4~u0i%!Kx=_5=e|{wOaVw00b-)u)G%-0fLe%Eq<=MV*26uA|SE-sZ)A6Mj+dNV1{nbVOH$-U@6`xZN@f%NvrxdX#`#HM0wmnEWtq;$DzR~&F+nOKm z8~0IfgS%{_&(m*~eWD8Q0;%a*FQ8HFwHdVxH@Uoo#3i9dBXN$1@z=9h^BH+Ivus83 zj$ml;8Ha6)$YD6>&{&WOsMlf3G*vZd?k6+6D9p!|NXz7Rf4987GF9Xr>)KtD&KxYM zV#$e$tzK0fgX(slFm&@4PKdgN$et0m&CNev9a0{j8+XV{?O$g5wPl1~@?-a!p}UJ}4^TeRrann`#q<`dw%sB^fOwmW$Gwg;bx=so7Y?d=Q z<{vPI?kU1#iQy{<7-+O?hvcHaeJG7w zi+_>BY6|+renb;i$dV7ab6z)b=lYb}FcoqFA_OU$A$VtYf0SoVjg1wEQIiW)oGPbJ za%7G`RN@d-&=s++fb6U&Jgzk8NTl55W5Ty}uCZ*%2@k8gTb7wjyq7w@ebr@M&p!bV zDCn84o>s<+KCN*f`M`bU=dhY!^*>l}f7iTUsQbaTVUw|B@~K0!iOMrsLD!4YEBzA}pF)jgA=R zLgAp+8bV{KK*G+mix3Y`SY9bIMqo(3y@g1VOnshDnD@hh~A|EpGW%QZxs{1#{AM@(< z|Mh8J^l~y4AHNT5nSikD(2e7)B&bjsijs~=x{v?1D@bPT(yxc@H_&2Zhitkz1%)P@ ztXh$S_Ly$gIxy2p;Doggb!>A-#)1>{87r*ZYSi{r$$gCNdm!?6sgoa)M|H*QXf%pR zq(OIwS{Mw?$CZMi>EMXK=&AWaPSwSk0tY;@h;fEdcG^WMH;^3~3wjn9u}C8gW|kXt zk+hAlu(0O7eoCa;nrq1@2D9R>y!lqrpqqHezrO?d?5qKC3;^nk;2jU&C+|8kYggxP zN&l{IqSrznXUtv6yir#@<@A{WEnq87G@Gr2n+mdL1&9Vm46hhh}L zIj^rXL?*J(Fb{HxsEI}ZT&2F0K)LD+6Exq0U3%94;NC-p0XVAHamJz=!HSh8K&E<{ zU4&%PdS74*uRRNfavsWZH1v}j)D zARdi?)v-6*k(xbS^DQ_#Yk^%P;2x_QeZ;Nn8yCRhOAfJHSbC}0NR4A`6X6l4*T#KC zMRa&ai|;#swXbcvUwVLL*u<)V@+1&jjYsxu#ok0-p{^s549zqtkIHuB!A$F(FuSsv zL>VTr`U{Jhna?bCgh!W-@`8~kDGbWNs?wI)A93^y2o`~ieNskfm}x5lO1%J<^6VRhK+>P#z#Q9T6)neEQM7!ZEym)T#HJsb zJlBZl7EmCnG!^^8+BI43mYqgMcO{*F_oVcrlRDdi2#6*dag7~E_XNCmqSrK`5R;F* zjsO-3PG9vPCJq+fyiwQKWf}Dmb?AEpJr}a#+LIUqi-YAuBGC0&+qt0tYj9S^+3(nw zI>6FNA;5gRpm7JoARV>25Va0^O!Z%=c_V*mJ|y}7W$Y)2@r?MDcwpN1mS zrNMXy{=4dAVClUmUEt9WHMzA9me=$~BYRKlijGB%hE1W+kZRjoXvUN0K6@aq=}|!@ zX(>GvNzJ1BYOT5LV9s}JcCqif9hy(16*86nxLh46A(>$!|Ce4tPP?<6Ux%{h-xCtQ zuG~yg6Ix>l`YE$d>c9+(c0q>piXmSb2HIIHSxfsN&pLPkjS{X{3o3gI424A@XR@!g zGMqA&8gW5%QVSj?$aU)o$FUpWOciGX%Y$y^?uN>YM*k9u1vn56cEepme(Oi2Bp?|I zi=sPu)yUi4w;0;X&}LDqmJAW(7+~4(1Ym2CJ*n=laRJ{P>gO;_bahbxT~v*Y}|F|xg9}u z{-PH)7P4E{_grc6LMH7N_E{7RO&{X98%ym&qxy2ZlXI=E(2OsA9sgvE1eY;820gbu zA0Oz&J_#KyZ72&}=p95FuwE%t8ms_`5J})pi9*axm~YFfO6N(^C+Xx~7e!#{fwO4# zh~1ZLgt>KKow_mxwkUi2+`1KG)>x)hP6WY~YpC^<+GU9%G4bwPM(ZTi*R2HfTRvE@E~su@~#%lc-A?F`j9niL}zyp_7FWW{XL^X_^$K zUH7@SaOYJup(?QQXn}t8>oJpR;aB?5pRt7T0BT1)gdPPMOW@7|*OmNvmOmJZ?;wW3;t=QZX6HMbxdbqV3 zrJ#(OBTU~5Pb#stcOSlE#BC}=8s|meAo7_q12(Y*A=9qTb;Yh*6pC(LG-KH0JPbLI zW~@~o`6&H%=sWz155N4t^($_z{8qW9tgTbGh58Z1!8#KtEI z>sTA&nj*b6k3rrIde)<@4rzWDUV~bDmKLJUkDG3&EcB-9h%=XzL)AzGDD6^RL0kMZ zizUI8`6}I$VNXrutjikvc!c7M97MzlQgXYh!4!=pd0S!Vet0zVCJh7#h@2D1>%ubpRm2T+`#SK;|vAM_6jnx&b-e#pqk?a}y zK+Q-)?7dTsV8byrZHw}%45Qo8pP)$tBazR>rWsCL1|{Mk%>m-~ageA)YkaYZ zx>$X}l>MMecx zj36u3XP8|nMTL%;83O07&q&Nk0yA5RE0C_U) z#s0INkAdp7fNbi|cKcs_r_%RB7mmEmHzrPs^m6Fh9{RSxQPmdmO!xnrRJF&R4mMW_ zE%h8({j&p_9Yv?=A~j?LtRN8HqZWc6_&0W2OyLT%KR0Sk^s zIsvo;CzfY#Dg+SSyTyH8;kL>-N%(kfuvGfmrU;4S@z9f(~;F z+fHNX_8iH5+_*~09dXXPE|lVLEt5%Nrvj{NQId9gy>lOJa4>2+2s zYbV{Zsc{26*^qNOsi|4Zh0S=WvqzMloqzo-xLU7Zh8j54w!f^bGHC}bpj@dsQo|UT zG}!x?Ke^|?-Joz=Lnu;F8825_M^JXM+Law`nH(L|F-4gJO7K~gMgU@Cuc$_liekT6 z1x!o)gc*dWQgjM#SKYp7-_Lm8sd!YKAF?RJ=qyiFi<

!s2~wB- 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

+
+
Selectionner vos diplômes +

Vos compétences :

    @@ -31,6 +35,10 @@ Aucune pour le moment {% endif %}
+
+ Selectionner vos compétences +
Date: Thu, 12 Dec 2024 14:41:59 +0100 Subject: [PATCH 54/71] message --- src/Controller/MessageController.php | 5 +++++ src/Form/MessageType.php | 10 ++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Controller/MessageController.php b/src/Controller/MessageController.php index f46276b..55eb5ba 100644 --- a/src/Controller/MessageController.php +++ b/src/Controller/MessageController.php @@ -30,6 +30,10 @@ final class MessageController extends AbstractController $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { + + $message->setSendingDate(new \DateTime()); + $message->setSender($this->getUser()); + $entityManager->persist($message); $entityManager->flush(); @@ -57,6 +61,7 @@ final class MessageController extends AbstractController $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { + $message->setSendingDate(new \DateTime()); $entityManager->flush(); return $this->redirectToRoute('app_message_index', [], Response::HTTP_SEE_OTHER); diff --git a/src/Form/MessageType.php b/src/Form/MessageType.php index b1208d9..a83cdda 100644 --- a/src/Form/MessageType.php +++ b/src/Form/MessageType.php @@ -15,16 +15,10 @@ class MessageType extends AbstractType { $builder ->add('content') - ->add('sendingDate', null, [ - 'widget' => 'single_text', - ]) - ->add('sender', EntityType::class, [ - 'class' => UserApp::class, - 'choice_label' => 'id', - ]) + ->add('receiver', EntityType::class, [ 'class' => UserApp::class, - 'choice_label' => 'id', + 'choice_label' => 'nickname', ]) ; } From 12ac37c97e17959ce9f5e25d501ab7fa1c87efd2 Mon Sep 17 00:00:00 2001 From: bourgoino Date: Thu, 17 Oct 2024 16:38:47 +0200 Subject: [PATCH 55/71] estebouche attrape ! --- migrations/Version20241017125351.php | 48 ++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 migrations/Version20241017125351.php diff --git a/migrations/Version20241017125351.php b/migrations/Version20241017125351.php new file mode 100644 index 0000000..e9561a5 --- /dev/null +++ b/migrations/Version20241017125351.php @@ -0,0 +1,48 @@ +addSql('DROP SEQUENCE user_id_seq CASCADE'); + $this->addSql('CREATE SEQUENCE "userApp_id_seq" INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE "userApp" (id INT NOT NULL, nickname VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_NICKNAME ON "userApp" (nickname)'); + $this->addSql('ALTER TABLE employee DROP CONSTRAINT fk_5d9f75a1bf396750'); + $this->addSql('ALTER TABLE intern DROP CONSTRAINT fk_a5795f36bf396750'); + $this->addSql('DROP TABLE employee'); + $this->addSql('DROP TABLE "user"'); + $this->addSql('DROP TABLE intern'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('DROP SEQUENCE "userApp_id_seq" CASCADE'); + $this->addSql('CREATE SEQUENCE user_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE employee (id INT NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE "user" (id INT NOT NULL, nickname VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, discriminator VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX uniq_identifier_nickname ON "user" (nickname)'); + $this->addSql('CREATE TABLE intern (id INT NOT NULL, cover_letter TEXT NOT NULL, resume VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('ALTER TABLE employee ADD CONSTRAINT fk_5d9f75a1bf396750 FOREIGN KEY (id) REFERENCES "user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern ADD CONSTRAINT fk_a5795f36bf396750 FOREIGN KEY (id) REFERENCES "user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('DROP TABLE "userApp"'); + } +} From f244e51aa765c1c194844d0a4a738f9e0a7d69ea Mon Sep 17 00:00:00 2001 From: allavenavr Date: Thu, 17 Oct 2024 17:56:46 +0200 Subject: [PATCH 56/71] ya des entite tkt --- migrations/Version20241017134137.php | 67 ++++++++++++++++++++++++++++ migrations/Version20241017142722.php | 52 +++++++++++++++++++++ migrations/Version20241017152949.php | 46 +++++++++++++++++++ 3 files changed, 165 insertions(+) create mode 100644 migrations/Version20241017134137.php create mode 100644 migrations/Version20241017142722.php create mode 100644 migrations/Version20241017152949.php diff --git a/migrations/Version20241017134137.php b/migrations/Version20241017134137.php new file mode 100644 index 0000000..0dc3e3c --- /dev/null +++ b/migrations/Version20241017134137.php @@ -0,0 +1,67 @@ +addSql('CREATE SEQUENCE announcement_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE company_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE userApp_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE announcement (id INT NOT NULL, title VARCHAR(255) NOT NULL, description VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE company (id INT NOT NULL, name VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE employee (id INT NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE intern (id INT NOT NULL, cover_letter TEXT NOT NULL, resume VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE userApp (id INT NOT NULL, nickname VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, DISCRIMINATOR VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_NICKNAME ON userApp (nickname)'); + $this->addSql('CREATE TABLE messenger_messages (id BIGSERIAL NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0 ON messenger_messages (queue_name)'); + $this->addSql('CREATE INDEX IDX_75EA56E0E3BD61CE ON messenger_messages (available_at)'); + $this->addSql('CREATE INDEX IDX_75EA56E016BA31DB ON messenger_messages (delivered_at)'); + $this->addSql('COMMENT ON COLUMN messenger_messages.created_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('COMMENT ON COLUMN messenger_messages.available_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('COMMENT ON COLUMN messenger_messages.delivered_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql('CREATE OR REPLACE FUNCTION notify_messenger_messages() RETURNS TRIGGER AS $$ + BEGIN + PERFORM pg_notify(\'messenger_messages\', NEW.queue_name::text); + RETURN NEW; + END; + $$ LANGUAGE plpgsql;'); + $this->addSql('DROP TRIGGER IF EXISTS notify_trigger ON messenger_messages;'); + $this->addSql('CREATE TRIGGER notify_trigger AFTER INSERT OR UPDATE ON messenger_messages FOR EACH ROW EXECUTE PROCEDURE notify_messenger_messages();'); + $this->addSql('ALTER TABLE employee ADD CONSTRAINT FK_5D9F75A1BF396750 FOREIGN KEY (id) REFERENCES userApp (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern ADD CONSTRAINT FK_A5795F36BF396750 FOREIGN KEY (id) REFERENCES userApp (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('DROP SEQUENCE announcement_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE company_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE userApp_id_seq CASCADE'); + $this->addSql('ALTER TABLE employee DROP CONSTRAINT FK_5D9F75A1BF396750'); + $this->addSql('ALTER TABLE intern DROP CONSTRAINT FK_A5795F36BF396750'); + $this->addSql('DROP TABLE announcement'); + $this->addSql('DROP TABLE company'); + $this->addSql('DROP TABLE employee'); + $this->addSql('DROP TABLE intern'); + $this->addSql('DROP TABLE userApp'); + $this->addSql('DROP TABLE messenger_messages'); + } +} diff --git a/migrations/Version20241017142722.php b/migrations/Version20241017142722.php new file mode 100644 index 0000000..73818a8 --- /dev/null +++ b/migrations/Version20241017142722.php @@ -0,0 +1,52 @@ +addSql('CREATE SEQUENCE status_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE status (id INT NOT NULL, label VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('ALTER TABLE announcement ADD company_id INT NOT NULL'); + $this->addSql('ALTER TABLE announcement ADD status_id INT NOT NULL'); + $this->addSql('ALTER TABLE announcement ADD CONSTRAINT FK_4DB9D91C979B1AD6 FOREIGN KEY (company_id) REFERENCES company (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE announcement ADD CONSTRAINT FK_4DB9D91C6BF700BD FOREIGN KEY (status_id) REFERENCES status (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('CREATE INDEX IDX_4DB9D91C979B1AD6 ON announcement (company_id)'); + $this->addSql('CREATE INDEX IDX_4DB9D91C6BF700BD ON announcement (status_id)'); + $this->addSql('ALTER TABLE employee ADD company_id INT NOT NULL'); + $this->addSql('ALTER TABLE employee ADD CONSTRAINT FK_5D9F75A1979B1AD6 FOREIGN KEY (company_id) REFERENCES company (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('CREATE INDEX IDX_5D9F75A1979B1AD6 ON employee (company_id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE announcement DROP CONSTRAINT FK_4DB9D91C6BF700BD'); + $this->addSql('DROP SEQUENCE status_id_seq CASCADE'); + $this->addSql('DROP TABLE status'); + $this->addSql('ALTER TABLE announcement DROP CONSTRAINT FK_4DB9D91C979B1AD6'); + $this->addSql('DROP INDEX IDX_4DB9D91C979B1AD6'); + $this->addSql('DROP INDEX IDX_4DB9D91C6BF700BD'); + $this->addSql('ALTER TABLE announcement DROP company_id'); + $this->addSql('ALTER TABLE announcement DROP status_id'); + $this->addSql('ALTER TABLE employee DROP CONSTRAINT FK_5D9F75A1979B1AD6'); + $this->addSql('DROP INDEX IDX_5D9F75A1979B1AD6'); + $this->addSql('ALTER TABLE employee DROP company_id'); + } +} diff --git a/migrations/Version20241017152949.php b/migrations/Version20241017152949.php new file mode 100644 index 0000000..1282d23 --- /dev/null +++ b/migrations/Version20241017152949.php @@ -0,0 +1,46 @@ +addSql('CREATE TABLE favorites (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); + $this->addSql('CREATE INDEX IDX_E46960F5525DD4B4 ON favorites (intern_id)'); + $this->addSql('CREATE INDEX IDX_E46960F5913AEA17 ON favorites (announcement_id)'); + $this->addSql('CREATE TABLE applications (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); + $this->addSql('CREATE INDEX IDX_F7C966F0525DD4B4 ON applications (intern_id)'); + $this->addSql('CREATE INDEX IDX_F7C966F0913AEA17 ON applications (announcement_id)'); + $this->addSql('ALTER TABLE favorites ADD CONSTRAINT FK_E46960F5525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE favorites ADD CONSTRAINT FK_E46960F5913AEA17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE applications ADD CONSTRAINT FK_F7C966F0525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE applications ADD CONSTRAINT FK_F7C966F0913AEA17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE favorites DROP CONSTRAINT FK_E46960F5525DD4B4'); + $this->addSql('ALTER TABLE favorites DROP CONSTRAINT FK_E46960F5913AEA17'); + $this->addSql('ALTER TABLE applications DROP CONSTRAINT FK_F7C966F0525DD4B4'); + $this->addSql('ALTER TABLE applications DROP CONSTRAINT FK_F7C966F0913AEA17'); + $this->addSql('DROP TABLE favorites'); + $this->addSql('DROP TABLE applications'); + } +} From 65f5c8cce4772c772e328bb52af095f5bd09f0b6 Mon Sep 17 00:00:00 2001 From: allavenavr Date: Thu, 17 Oct 2024 17:56:46 +0200 Subject: [PATCH 57/71] tqtencore tjr --- src/Entity/Intern.php | 179 +++++++++++++++--------------------------- src/Entity/Skill.php | 17 ++-- 2 files changed, 70 insertions(+), 126 deletions(-) diff --git a/src/Entity/Intern.php b/src/Entity/Intern.php index daaf428..70c8477 100644 --- a/src/Entity/Intern.php +++ b/src/Entity/Intern.php @@ -19,35 +19,30 @@ class Intern extends UserApp private ?string $resume = null; /** - * @var Collection + * @var Collection */ - #[ORM\OneToMany(targetEntity: InternDegree::class, mappedBy: 'intern')] - private Collection $degrees; + #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'interns')] + #[ORM\JoinTable(name: 'favorites')] + private Collection $favorites; /** - * @var Collection + * @var Collection */ - #[ORM\OneToMany(targetEntity: InternSkill::class, mappedBy: 'intern')] - private Collection $skills; - - /** - * @var Collection - */ - #[ORM\OneToMany(targetEntity: InternApplication::class, mappedBy: 'intern')] + #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'applicants')] + #[ORM\JoinTable(name: 'applications')] private Collection $applications; /** - * @var Collection + * @var Collection */ - #[ORM\OneToMany(targetEntity: InternFavorite::class, mappedBy: 'intern')] - private Collection $favorites; + #[ORM\ManyToMany(targetEntity: Skill::class, inversedBy: 'interns')] + private Collection $skills; public function __construct() { - $this->degrees = new ArrayCollection(); - $this->skills = new ArrayCollection(); - $this->applications = new ArrayCollection(); $this->favorites = new ArrayCollection(); + $this->applications = new ArrayCollection(); + $this->skills = new ArrayCollection(); } public function getCoverLetter(): ?string @@ -75,122 +70,74 @@ class Intern extends UserApp } /** - * @return Collection - */ - public function getDegrees(): Collection - { - return $this->degrees; - } - - public function addDegree(InternDegree $degree): static - { - if (!$this->degrees->contains($degree)) { - $this->degrees->add($degree); - $degree->setIntern($this); - } - - return $this; - } - - public function removeDegree(InternDegree $degree): static - { - if ($this->degrees->removeElement($degree)) { - // set the owning side to null (unless already changed) - if ($degree->getIntern() === $this) { - $degree->setIntern(null); - } - } - - return $this; - } - - /** - * @return Collection - */ - public function getSkills(): Collection - { - return $this->skills; - } - - public function addSkill(InternSkill $skill): static - { - if (!$this->skills->contains($skill)) { - $this->skills->add($skill); - $skill->setIntern($this); - } - - return $this; - } - - public function removeSkill(InternSkill $skill): static - { - if ($this->skills->removeElement($skill)) { - // set the owning side to null (unless already changed) - if ($skill->getIntern() === $this) { - $skill->setIntern(null); - } - } - - return $this; - } - - /** - * @return Collection - */ - public function getApplications(): Collection - { - return $this->applications; - } - - public function addApplication(InternApplication $application): static - { - if (!$this->applications->contains($application)) { - $this->applications->add($application); - $application->setIntern($this); - } - - return $this; - } - - public function removeApplication(InternApplication $application): static - { - if ($this->applications->removeElement($application)) { - // set the owning side to null (unless already changed) - if ($application->getIntern() === $this) { - $application->setIntern(null); - } - } - - return $this; - } - - /** - * @return Collection + * @return Collection */ public function getFavorites(): Collection { return $this->favorites; } - public function addFavorite(InternFavorite $favorite): static + public function addFavorite(Announcement $favorite): static { if (!$this->favorites->contains($favorite)) { $this->favorites->add($favorite); - $favorite->setIntern($this); } return $this; } - public function removeFavorite(InternFavorite $favorite): static + public function removeFavorite(Announcement $favorite): static { - if ($this->favorites->removeElement($favorite)) { - // set the owning side to null (unless already changed) - if ($favorite->getIntern() === $this) { - $favorite->setIntern(null); - } + $this->favorites->removeElement($favorite); + + return $this; + } + + /** + * @return Collection + */ + public function getApplications(): Collection + { + return $this->applications; + } + + public function addApplication(Announcement $application): static + { + if (!$this->applications->contains($application)) { + $this->applications->add($application); } return $this; } + + public function removeApplication(Announcement $application): static + { + $this->applications->removeElement($application); + + return $this; + } + + /** + * @return Collection + */ + public function getSkills(): Collection + { + return $this->skills; + } + + public function addSkill(Skill $skill): static + { + if (!$this->skills->contains($skill)) { + $this->skills->add($skill); + } + + return $this; + } + + public function removeSkill(Skill $skill): static + { + $this->skills->removeElement($skill); + + return $this; + } } diff --git a/src/Entity/Skill.php b/src/Entity/Skill.php index 7752cfe..47bea20 100644 --- a/src/Entity/Skill.php +++ b/src/Entity/Skill.php @@ -19,9 +19,9 @@ class Skill private ?string $label = null; /** - * @var Collection + * @var Collection */ - #[ORM\OneToMany(targetEntity: InternSkill::class, mappedBy: 'skill')] + #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'skills')] private Collection $interns; public function __construct() @@ -47,30 +47,27 @@ class Skill } /** - * @return Collection + * @return Collection */ public function getInterns(): Collection { return $this->interns; } - public function addIntern(InternSkill $intern): static + public function addIntern(Intern $intern): static { if (!$this->interns->contains($intern)) { $this->interns->add($intern); - $intern->setSkill($this); + $intern->addSkill($this); } return $this; } - public function removeIntern(InternSkill $intern): static + public function removeIntern(Intern $intern): static { if ($this->interns->removeElement($intern)) { - // set the owning side to null (unless already changed) - if ($intern->getSkill() === $this) { - $intern->setSkill(null); - } + $intern->removeSkill($this); } return $this; From 0e2a2f25f6311c7d8b9a32988f283eaf36b93ab4 Mon Sep 17 00:00:00 2001 From: Romain Date: Sun, 10 Nov 2024 15:41:01 +0100 Subject: [PATCH 58/71] ajout diplome et message + gestion des relations --- src/Entity/Intern.php | 147 ++++++++++++++++++++++++++++-------------- src/Entity/Skill.php | 17 +++-- 2 files changed, 110 insertions(+), 54 deletions(-) diff --git a/src/Entity/Intern.php b/src/Entity/Intern.php index 70c8477..daaf428 100644 --- a/src/Entity/Intern.php +++ b/src/Entity/Intern.php @@ -19,30 +19,35 @@ class Intern extends UserApp private ?string $resume = null; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'interns')] - #[ORM\JoinTable(name: 'favorites')] - private Collection $favorites; + #[ORM\OneToMany(targetEntity: InternDegree::class, mappedBy: 'intern')] + private Collection $degrees; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Announcement::class, inversedBy: 'applicants')] - #[ORM\JoinTable(name: 'applications')] + #[ORM\OneToMany(targetEntity: InternSkill::class, mappedBy: 'intern')] + private Collection $skills; + + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: InternApplication::class, mappedBy: 'intern')] private Collection $applications; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Skill::class, inversedBy: 'interns')] - private Collection $skills; + #[ORM\OneToMany(targetEntity: InternFavorite::class, mappedBy: 'intern')] + private Collection $favorites; public function __construct() { - $this->favorites = new ArrayCollection(); - $this->applications = new ArrayCollection(); + $this->degrees = new ArrayCollection(); $this->skills = new ArrayCollection(); + $this->applications = new ArrayCollection(); + $this->favorites = new ArrayCollection(); } public function getCoverLetter(): ?string @@ -70,73 +75,121 @@ class Intern extends UserApp } /** - * @return Collection + * @return Collection */ - public function getFavorites(): Collection + public function getDegrees(): Collection { - return $this->favorites; + return $this->degrees; } - public function addFavorite(Announcement $favorite): static + public function addDegree(InternDegree $degree): static { - if (!$this->favorites->contains($favorite)) { - $this->favorites->add($favorite); + if (!$this->degrees->contains($degree)) { + $this->degrees->add($degree); + $degree->setIntern($this); } return $this; } - public function removeFavorite(Announcement $favorite): static + public function removeDegree(InternDegree $degree): static { - $this->favorites->removeElement($favorite); - - return $this; - } - - /** - * @return Collection - */ - public function getApplications(): Collection - { - return $this->applications; - } - - public function addApplication(Announcement $application): static - { - if (!$this->applications->contains($application)) { - $this->applications->add($application); + if ($this->degrees->removeElement($degree)) { + // set the owning side to null (unless already changed) + if ($degree->getIntern() === $this) { + $degree->setIntern(null); + } } return $this; } - public function removeApplication(Announcement $application): static - { - $this->applications->removeElement($application); - - return $this; - } - /** - * @return Collection + * @return Collection */ public function getSkills(): Collection { return $this->skills; } - public function addSkill(Skill $skill): static + public function addSkill(InternSkill $skill): static { if (!$this->skills->contains($skill)) { $this->skills->add($skill); + $skill->setIntern($this); } return $this; } - public function removeSkill(Skill $skill): static + public function removeSkill(InternSkill $skill): static { - $this->skills->removeElement($skill); + if ($this->skills->removeElement($skill)) { + // set the owning side to null (unless already changed) + if ($skill->getIntern() === $this) { + $skill->setIntern(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getApplications(): Collection + { + return $this->applications; + } + + public function addApplication(InternApplication $application): static + { + if (!$this->applications->contains($application)) { + $this->applications->add($application); + $application->setIntern($this); + } + + return $this; + } + + public function removeApplication(InternApplication $application): static + { + if ($this->applications->removeElement($application)) { + // set the owning side to null (unless already changed) + if ($application->getIntern() === $this) { + $application->setIntern(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getFavorites(): Collection + { + return $this->favorites; + } + + public function addFavorite(InternFavorite $favorite): static + { + if (!$this->favorites->contains($favorite)) { + $this->favorites->add($favorite); + $favorite->setIntern($this); + } + + return $this; + } + + public function removeFavorite(InternFavorite $favorite): static + { + if ($this->favorites->removeElement($favorite)) { + // set the owning side to null (unless already changed) + if ($favorite->getIntern() === $this) { + $favorite->setIntern(null); + } + } return $this; } diff --git a/src/Entity/Skill.php b/src/Entity/Skill.php index 47bea20..7752cfe 100644 --- a/src/Entity/Skill.php +++ b/src/Entity/Skill.php @@ -19,9 +19,9 @@ class Skill private ?string $label = null; /** - * @var Collection + * @var Collection */ - #[ORM\ManyToMany(targetEntity: Intern::class, mappedBy: 'skills')] + #[ORM\OneToMany(targetEntity: InternSkill::class, mappedBy: 'skill')] private Collection $interns; public function __construct() @@ -47,27 +47,30 @@ class Skill } /** - * @return Collection + * @return Collection */ public function getInterns(): Collection { return $this->interns; } - public function addIntern(Intern $intern): static + public function addIntern(InternSkill $intern): static { if (!$this->interns->contains($intern)) { $this->interns->add($intern); - $intern->addSkill($this); + $intern->setSkill($this); } return $this; } - public function removeIntern(Intern $intern): static + public function removeIntern(InternSkill $intern): static { if ($this->interns->removeElement($intern)) { - $intern->removeSkill($this); + // set the owning side to null (unless already changed) + if ($intern->getSkill() === $this) { + $intern->setSkill(null); + } } return $this; From 1567570d126dd015cd07933f44131dc96da9f906 Mon Sep 17 00:00:00 2001 From: Romain Date: Mon, 11 Nov 2024 16:00:51 +0100 Subject: [PATCH 59/71] tqt encore ++ --- src/Entity/Obtaining.php | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 src/Entity/Obtaining.php diff --git a/src/Entity/Obtaining.php b/src/Entity/Obtaining.php deleted file mode 100644 index cecb3c1..0000000 --- a/src/Entity/Obtaining.php +++ /dev/null @@ -1,36 +0,0 @@ -id; - } - - public function getDate(): ?\DateTimeInterface - { - return $this->date; - } - - public function setDate(\DateTimeInterface $date): static - { - $this->date = $date; - - return $this; - } -} From cb867ba8bbc3b4301ab6ad2902c47a247a526fb1 Mon Sep 17 00:00:00 2001 From: barillote Date: Thu, 21 Nov 2024 15:59:55 +0100 Subject: [PATCH 60/71] moins confiant mais on est la --- migrations/Version20241017134137.php | 67 ---------------------------- migrations/Version20241017142722.php | 52 --------------------- migrations/Version20241017152949.php | 46 ------------------- 3 files changed, 165 deletions(-) delete mode 100644 migrations/Version20241017134137.php delete mode 100644 migrations/Version20241017142722.php delete mode 100644 migrations/Version20241017152949.php diff --git a/migrations/Version20241017134137.php b/migrations/Version20241017134137.php deleted file mode 100644 index 0dc3e3c..0000000 --- a/migrations/Version20241017134137.php +++ /dev/null @@ -1,67 +0,0 @@ -addSql('CREATE SEQUENCE announcement_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE company_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE userApp_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE TABLE announcement (id INT NOT NULL, title VARCHAR(255) NOT NULL, description VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE company (id INT NOT NULL, name VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE employee (id INT NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE intern (id INT NOT NULL, cover_letter TEXT NOT NULL, resume VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE userApp (id INT NOT NULL, nickname VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, DISCRIMINATOR VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_NICKNAME ON userApp (nickname)'); - $this->addSql('CREATE TABLE messenger_messages (id BIGSERIAL NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0 ON messenger_messages (queue_name)'); - $this->addSql('CREATE INDEX IDX_75EA56E0E3BD61CE ON messenger_messages (available_at)'); - $this->addSql('CREATE INDEX IDX_75EA56E016BA31DB ON messenger_messages (delivered_at)'); - $this->addSql('COMMENT ON COLUMN messenger_messages.created_at IS \'(DC2Type:datetime_immutable)\''); - $this->addSql('COMMENT ON COLUMN messenger_messages.available_at IS \'(DC2Type:datetime_immutable)\''); - $this->addSql('COMMENT ON COLUMN messenger_messages.delivered_at IS \'(DC2Type:datetime_immutable)\''); - $this->addSql('CREATE OR REPLACE FUNCTION notify_messenger_messages() RETURNS TRIGGER AS $$ - BEGIN - PERFORM pg_notify(\'messenger_messages\', NEW.queue_name::text); - RETURN NEW; - END; - $$ LANGUAGE plpgsql;'); - $this->addSql('DROP TRIGGER IF EXISTS notify_trigger ON messenger_messages;'); - $this->addSql('CREATE TRIGGER notify_trigger AFTER INSERT OR UPDATE ON messenger_messages FOR EACH ROW EXECUTE PROCEDURE notify_messenger_messages();'); - $this->addSql('ALTER TABLE employee ADD CONSTRAINT FK_5D9F75A1BF396750 FOREIGN KEY (id) REFERENCES userApp (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE intern ADD CONSTRAINT FK_A5795F36BF396750 FOREIGN KEY (id) REFERENCES userApp (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('DROP SEQUENCE announcement_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE company_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE userApp_id_seq CASCADE'); - $this->addSql('ALTER TABLE employee DROP CONSTRAINT FK_5D9F75A1BF396750'); - $this->addSql('ALTER TABLE intern DROP CONSTRAINT FK_A5795F36BF396750'); - $this->addSql('DROP TABLE announcement'); - $this->addSql('DROP TABLE company'); - $this->addSql('DROP TABLE employee'); - $this->addSql('DROP TABLE intern'); - $this->addSql('DROP TABLE userApp'); - $this->addSql('DROP TABLE messenger_messages'); - } -} diff --git a/migrations/Version20241017142722.php b/migrations/Version20241017142722.php deleted file mode 100644 index 73818a8..0000000 --- a/migrations/Version20241017142722.php +++ /dev/null @@ -1,52 +0,0 @@ -addSql('CREATE SEQUENCE status_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE TABLE status (id INT NOT NULL, label VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('ALTER TABLE announcement ADD company_id INT NOT NULL'); - $this->addSql('ALTER TABLE announcement ADD status_id INT NOT NULL'); - $this->addSql('ALTER TABLE announcement ADD CONSTRAINT FK_4DB9D91C979B1AD6 FOREIGN KEY (company_id) REFERENCES company (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE announcement ADD CONSTRAINT FK_4DB9D91C6BF700BD FOREIGN KEY (status_id) REFERENCES status (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('CREATE INDEX IDX_4DB9D91C979B1AD6 ON announcement (company_id)'); - $this->addSql('CREATE INDEX IDX_4DB9D91C6BF700BD ON announcement (status_id)'); - $this->addSql('ALTER TABLE employee ADD company_id INT NOT NULL'); - $this->addSql('ALTER TABLE employee ADD CONSTRAINT FK_5D9F75A1979B1AD6 FOREIGN KEY (company_id) REFERENCES company (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('CREATE INDEX IDX_5D9F75A1979B1AD6 ON employee (company_id)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('ALTER TABLE announcement DROP CONSTRAINT FK_4DB9D91C6BF700BD'); - $this->addSql('DROP SEQUENCE status_id_seq CASCADE'); - $this->addSql('DROP TABLE status'); - $this->addSql('ALTER TABLE announcement DROP CONSTRAINT FK_4DB9D91C979B1AD6'); - $this->addSql('DROP INDEX IDX_4DB9D91C979B1AD6'); - $this->addSql('DROP INDEX IDX_4DB9D91C6BF700BD'); - $this->addSql('ALTER TABLE announcement DROP company_id'); - $this->addSql('ALTER TABLE announcement DROP status_id'); - $this->addSql('ALTER TABLE employee DROP CONSTRAINT FK_5D9F75A1979B1AD6'); - $this->addSql('DROP INDEX IDX_5D9F75A1979B1AD6'); - $this->addSql('ALTER TABLE employee DROP company_id'); - } -} diff --git a/migrations/Version20241017152949.php b/migrations/Version20241017152949.php deleted file mode 100644 index 1282d23..0000000 --- a/migrations/Version20241017152949.php +++ /dev/null @@ -1,46 +0,0 @@ -addSql('CREATE TABLE favorites (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); - $this->addSql('CREATE INDEX IDX_E46960F5525DD4B4 ON favorites (intern_id)'); - $this->addSql('CREATE INDEX IDX_E46960F5913AEA17 ON favorites (announcement_id)'); - $this->addSql('CREATE TABLE applications (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); - $this->addSql('CREATE INDEX IDX_F7C966F0525DD4B4 ON applications (intern_id)'); - $this->addSql('CREATE INDEX IDX_F7C966F0913AEA17 ON applications (announcement_id)'); - $this->addSql('ALTER TABLE favorites ADD CONSTRAINT FK_E46960F5525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE favorites ADD CONSTRAINT FK_E46960F5913AEA17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE applications ADD CONSTRAINT FK_F7C966F0525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE applications ADD CONSTRAINT FK_F7C966F0913AEA17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('ALTER TABLE favorites DROP CONSTRAINT FK_E46960F5525DD4B4'); - $this->addSql('ALTER TABLE favorites DROP CONSTRAINT FK_E46960F5913AEA17'); - $this->addSql('ALTER TABLE applications DROP CONSTRAINT FK_F7C966F0525DD4B4'); - $this->addSql('ALTER TABLE applications DROP CONSTRAINT FK_F7C966F0913AEA17'); - $this->addSql('DROP TABLE favorites'); - $this->addSql('DROP TABLE applications'); - } -} From c5cec0fa0404902b604af408339e88d55e824c4e Mon Sep 17 00:00:00 2001 From: allavenavr Date: Thu, 28 Nov 2024 14:40:29 +0100 Subject: [PATCH 61/71] plus qu'un --- migrations/Version20241114132304.php | 110 +++++++++++++++++++++++++++ migrations/Version20241121135116.php | 32 ++++++++ migrations/Version20241121140219.php | 38 +++++++++ 3 files changed, 180 insertions(+) create mode 100644 migrations/Version20241114132304.php create mode 100644 migrations/Version20241121135116.php create mode 100644 migrations/Version20241121140219.php diff --git a/migrations/Version20241114132304.php b/migrations/Version20241114132304.php new file mode 100644 index 0000000..e87512c --- /dev/null +++ b/migrations/Version20241114132304.php @@ -0,0 +1,110 @@ +addSql('CREATE SEQUENCE degree_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE faq_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE intern_application_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE intern_degree_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE intern_favorite_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE intern_skill_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE message_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE skill_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE degree (id INT NOT NULL, label VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE faq (id INT NOT NULL, question TEXT NOT NULL, answer TEXT DEFAULT NULL, update_date DATE NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE intern_application (id INT NOT NULL, application_id INT DEFAULT NULL, intern_id INT DEFAULT NULL, application_date DATE NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_4EDBBCC83E030ACD ON intern_application (application_id)'); + $this->addSql('CREATE INDEX IDX_4EDBBCC8525DD4B4 ON intern_application (intern_id)'); + $this->addSql('CREATE TABLE intern_degree (id INT NOT NULL, degree_id INT DEFAULT NULL, intern_id INT DEFAULT NULL, graduation_date DATE NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_E68CCB23B35C5756 ON intern_degree (degree_id)'); + $this->addSql('CREATE INDEX IDX_E68CCB23525DD4B4 ON intern_degree (intern_id)'); + $this->addSql('CREATE TABLE intern_favorite (id INT NOT NULL, announcement_id INT DEFAULT NULL, intern_id INT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_A709862E913AEA17 ON intern_favorite (announcement_id)'); + $this->addSql('CREATE INDEX IDX_A709862E525DD4B4 ON intern_favorite (intern_id)'); + $this->addSql('CREATE TABLE intern_skill (id INT NOT NULL, skill_id INT DEFAULT NULL, intern_id INT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_75E1C4DC5585C142 ON intern_skill (skill_id)'); + $this->addSql('CREATE INDEX IDX_75E1C4DC525DD4B4 ON intern_skill (intern_id)'); + $this->addSql('CREATE TABLE message (id INT NOT NULL, sender_id INT DEFAULT NULL, receiver_id INT DEFAULT NULL, content TEXT NOT NULL, sending_date TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_B6BD307FF624B39D ON message (sender_id)'); + $this->addSql('CREATE INDEX IDX_B6BD307FCD53EDB6 ON message (receiver_id)'); + $this->addSql('CREATE TABLE skill (id INT NOT NULL, label VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('ALTER TABLE intern_application ADD CONSTRAINT FK_4EDBBCC83E030ACD FOREIGN KEY (application_id) REFERENCES announcement (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern_application ADD CONSTRAINT FK_4EDBBCC8525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern_degree ADD CONSTRAINT FK_E68CCB23B35C5756 FOREIGN KEY (degree_id) REFERENCES degree (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern_degree ADD CONSTRAINT FK_E68CCB23525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern_favorite ADD CONSTRAINT FK_A709862E913AEA17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern_favorite ADD CONSTRAINT FK_A709862E525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern_skill ADD CONSTRAINT FK_75E1C4DC5585C142 FOREIGN KEY (skill_id) REFERENCES skill (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern_skill ADD CONSTRAINT FK_75E1C4DC525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE message ADD CONSTRAINT FK_B6BD307FF624B39D FOREIGN KEY (sender_id) REFERENCES userApp (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE message ADD CONSTRAINT FK_B6BD307FCD53EDB6 FOREIGN KEY (receiver_id) REFERENCES userApp (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE favorites DROP CONSTRAINT fk_e46960f5525dd4b4'); + $this->addSql('ALTER TABLE favorites DROP CONSTRAINT fk_e46960f5913aea17'); + $this->addSql('ALTER TABLE applications DROP CONSTRAINT fk_f7c966f0525dd4b4'); + $this->addSql('ALTER TABLE applications DROP CONSTRAINT fk_f7c966f0913aea17'); + $this->addSql('DROP TABLE favorites'); + $this->addSql('DROP TABLE applications'); + $this->addSql('ALTER TABLE announcement ADD creation_date DATE NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('DROP SEQUENCE degree_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE faq_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE intern_application_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE intern_degree_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE intern_favorite_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE intern_skill_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE message_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE skill_id_seq CASCADE'); + $this->addSql('CREATE TABLE favorites (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); + $this->addSql('CREATE INDEX idx_e46960f5913aea17 ON favorites (announcement_id)'); + $this->addSql('CREATE INDEX idx_e46960f5525dd4b4 ON favorites (intern_id)'); + $this->addSql('CREATE TABLE applications (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); + $this->addSql('CREATE INDEX idx_f7c966f0913aea17 ON applications (announcement_id)'); + $this->addSql('CREATE INDEX idx_f7c966f0525dd4b4 ON applications (intern_id)'); + $this->addSql('ALTER TABLE favorites ADD CONSTRAINT fk_e46960f5525dd4b4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE favorites ADD CONSTRAINT fk_e46960f5913aea17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE applications ADD CONSTRAINT fk_f7c966f0525dd4b4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE applications ADD CONSTRAINT fk_f7c966f0913aea17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE intern_application DROP CONSTRAINT FK_4EDBBCC83E030ACD'); + $this->addSql('ALTER TABLE intern_application DROP CONSTRAINT FK_4EDBBCC8525DD4B4'); + $this->addSql('ALTER TABLE intern_degree DROP CONSTRAINT FK_E68CCB23B35C5756'); + $this->addSql('ALTER TABLE intern_degree DROP CONSTRAINT FK_E68CCB23525DD4B4'); + $this->addSql('ALTER TABLE intern_favorite DROP CONSTRAINT FK_A709862E913AEA17'); + $this->addSql('ALTER TABLE intern_favorite DROP CONSTRAINT FK_A709862E525DD4B4'); + $this->addSql('ALTER TABLE intern_skill DROP CONSTRAINT FK_75E1C4DC5585C142'); + $this->addSql('ALTER TABLE intern_skill DROP CONSTRAINT FK_75E1C4DC525DD4B4'); + $this->addSql('ALTER TABLE message DROP CONSTRAINT FK_B6BD307FF624B39D'); + $this->addSql('ALTER TABLE message DROP CONSTRAINT FK_B6BD307FCD53EDB6'); + $this->addSql('DROP TABLE degree'); + $this->addSql('DROP TABLE faq'); + $this->addSql('DROP TABLE intern_application'); + $this->addSql('DROP TABLE intern_degree'); + $this->addSql('DROP TABLE intern_favorite'); + $this->addSql('DROP TABLE intern_skill'); + $this->addSql('DROP TABLE message'); + $this->addSql('DROP TABLE skill'); + $this->addSql('ALTER TABLE announcement DROP creation_date'); + } +} diff --git a/migrations/Version20241121135116.php b/migrations/Version20241121135116.php new file mode 100644 index 0000000..c932e51 --- /dev/null +++ b/migrations/Version20241121135116.php @@ -0,0 +1,32 @@ +addSql('ALTER TABLE userapp ALTER roles DROP NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE userApp ALTER roles SET NOT NULL'); + } +} diff --git a/migrations/Version20241121140219.php b/migrations/Version20241121140219.php new file mode 100644 index 0000000..28107a4 --- /dev/null +++ b/migrations/Version20241121140219.php @@ -0,0 +1,38 @@ +addSql('ALTER TABLE announcement DROP CONSTRAINT fk_4db9d91c6bf700bd'); + $this->addSql('DROP INDEX idx_4db9d91c6bf700bd'); + $this->addSql('ALTER TABLE announcement ADD status VARCHAR(255) NOT NULL'); + $this->addSql('ALTER TABLE announcement DROP status_id'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE announcement ADD status_id INT NOT NULL'); + $this->addSql('ALTER TABLE announcement DROP status'); + $this->addSql('ALTER TABLE announcement ADD CONSTRAINT fk_4db9d91c6bf700bd FOREIGN KEY (status_id) REFERENCES status (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('CREATE INDEX idx_4db9d91c6bf700bd ON announcement (status_id)'); + } +} From a52c5adb83091114d711157753f86716fa517674 Mon Sep 17 00:00:00 2001 From: Romain Date: Sat, 30 Nov 2024 15:51:55 +0100 Subject: [PATCH 62/71] profil + routes --- migrations/Version20241114132304.php | 110 --------------------------- migrations/Version20241121135116.php | 32 -------- migrations/Version20241121140219.php | 38 --------- 3 files changed, 180 deletions(-) delete mode 100644 migrations/Version20241114132304.php delete mode 100644 migrations/Version20241121135116.php delete mode 100644 migrations/Version20241121140219.php diff --git a/migrations/Version20241114132304.php b/migrations/Version20241114132304.php deleted file mode 100644 index e87512c..0000000 --- a/migrations/Version20241114132304.php +++ /dev/null @@ -1,110 +0,0 @@ -addSql('CREATE SEQUENCE degree_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE faq_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE intern_application_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE intern_degree_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE intern_favorite_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE intern_skill_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE message_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE skill_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE TABLE degree (id INT NOT NULL, label VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE faq (id INT NOT NULL, question TEXT NOT NULL, answer TEXT DEFAULT NULL, update_date DATE NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE intern_application (id INT NOT NULL, application_id INT DEFAULT NULL, intern_id INT DEFAULT NULL, application_date DATE NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_4EDBBCC83E030ACD ON intern_application (application_id)'); - $this->addSql('CREATE INDEX IDX_4EDBBCC8525DD4B4 ON intern_application (intern_id)'); - $this->addSql('CREATE TABLE intern_degree (id INT NOT NULL, degree_id INT DEFAULT NULL, intern_id INT DEFAULT NULL, graduation_date DATE NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_E68CCB23B35C5756 ON intern_degree (degree_id)'); - $this->addSql('CREATE INDEX IDX_E68CCB23525DD4B4 ON intern_degree (intern_id)'); - $this->addSql('CREATE TABLE intern_favorite (id INT NOT NULL, announcement_id INT DEFAULT NULL, intern_id INT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_A709862E913AEA17 ON intern_favorite (announcement_id)'); - $this->addSql('CREATE INDEX IDX_A709862E525DD4B4 ON intern_favorite (intern_id)'); - $this->addSql('CREATE TABLE intern_skill (id INT NOT NULL, skill_id INT DEFAULT NULL, intern_id INT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_75E1C4DC5585C142 ON intern_skill (skill_id)'); - $this->addSql('CREATE INDEX IDX_75E1C4DC525DD4B4 ON intern_skill (intern_id)'); - $this->addSql('CREATE TABLE message (id INT NOT NULL, sender_id INT DEFAULT NULL, receiver_id INT DEFAULT NULL, content TEXT NOT NULL, sending_date TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_B6BD307FF624B39D ON message (sender_id)'); - $this->addSql('CREATE INDEX IDX_B6BD307FCD53EDB6 ON message (receiver_id)'); - $this->addSql('CREATE TABLE skill (id INT NOT NULL, label VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('ALTER TABLE intern_application ADD CONSTRAINT FK_4EDBBCC83E030ACD FOREIGN KEY (application_id) REFERENCES announcement (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE intern_application ADD CONSTRAINT FK_4EDBBCC8525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE intern_degree ADD CONSTRAINT FK_E68CCB23B35C5756 FOREIGN KEY (degree_id) REFERENCES degree (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE intern_degree ADD CONSTRAINT FK_E68CCB23525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE intern_favorite ADD CONSTRAINT FK_A709862E913AEA17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE intern_favorite ADD CONSTRAINT FK_A709862E525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE intern_skill ADD CONSTRAINT FK_75E1C4DC5585C142 FOREIGN KEY (skill_id) REFERENCES skill (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE intern_skill ADD CONSTRAINT FK_75E1C4DC525DD4B4 FOREIGN KEY (intern_id) REFERENCES intern (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE message ADD CONSTRAINT FK_B6BD307FF624B39D FOREIGN KEY (sender_id) REFERENCES userApp (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE message ADD CONSTRAINT FK_B6BD307FCD53EDB6 FOREIGN KEY (receiver_id) REFERENCES userApp (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE favorites DROP CONSTRAINT fk_e46960f5525dd4b4'); - $this->addSql('ALTER TABLE favorites DROP CONSTRAINT fk_e46960f5913aea17'); - $this->addSql('ALTER TABLE applications DROP CONSTRAINT fk_f7c966f0525dd4b4'); - $this->addSql('ALTER TABLE applications DROP CONSTRAINT fk_f7c966f0913aea17'); - $this->addSql('DROP TABLE favorites'); - $this->addSql('DROP TABLE applications'); - $this->addSql('ALTER TABLE announcement ADD creation_date DATE NOT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('DROP SEQUENCE degree_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE faq_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE intern_application_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE intern_degree_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE intern_favorite_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE intern_skill_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE message_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE skill_id_seq CASCADE'); - $this->addSql('CREATE TABLE favorites (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); - $this->addSql('CREATE INDEX idx_e46960f5913aea17 ON favorites (announcement_id)'); - $this->addSql('CREATE INDEX idx_e46960f5525dd4b4 ON favorites (intern_id)'); - $this->addSql('CREATE TABLE applications (intern_id INT NOT NULL, announcement_id INT NOT NULL, PRIMARY KEY(intern_id, announcement_id))'); - $this->addSql('CREATE INDEX idx_f7c966f0913aea17 ON applications (announcement_id)'); - $this->addSql('CREATE INDEX idx_f7c966f0525dd4b4 ON applications (intern_id)'); - $this->addSql('ALTER TABLE favorites ADD CONSTRAINT fk_e46960f5525dd4b4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE favorites ADD CONSTRAINT fk_e46960f5913aea17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE applications ADD CONSTRAINT fk_f7c966f0525dd4b4 FOREIGN KEY (intern_id) REFERENCES intern (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE applications ADD CONSTRAINT fk_f7c966f0913aea17 FOREIGN KEY (announcement_id) REFERENCES announcement (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE intern_application DROP CONSTRAINT FK_4EDBBCC83E030ACD'); - $this->addSql('ALTER TABLE intern_application DROP CONSTRAINT FK_4EDBBCC8525DD4B4'); - $this->addSql('ALTER TABLE intern_degree DROP CONSTRAINT FK_E68CCB23B35C5756'); - $this->addSql('ALTER TABLE intern_degree DROP CONSTRAINT FK_E68CCB23525DD4B4'); - $this->addSql('ALTER TABLE intern_favorite DROP CONSTRAINT FK_A709862E913AEA17'); - $this->addSql('ALTER TABLE intern_favorite DROP CONSTRAINT FK_A709862E525DD4B4'); - $this->addSql('ALTER TABLE intern_skill DROP CONSTRAINT FK_75E1C4DC5585C142'); - $this->addSql('ALTER TABLE intern_skill DROP CONSTRAINT FK_75E1C4DC525DD4B4'); - $this->addSql('ALTER TABLE message DROP CONSTRAINT FK_B6BD307FF624B39D'); - $this->addSql('ALTER TABLE message DROP CONSTRAINT FK_B6BD307FCD53EDB6'); - $this->addSql('DROP TABLE degree'); - $this->addSql('DROP TABLE faq'); - $this->addSql('DROP TABLE intern_application'); - $this->addSql('DROP TABLE intern_degree'); - $this->addSql('DROP TABLE intern_favorite'); - $this->addSql('DROP TABLE intern_skill'); - $this->addSql('DROP TABLE message'); - $this->addSql('DROP TABLE skill'); - $this->addSql('ALTER TABLE announcement DROP creation_date'); - } -} diff --git a/migrations/Version20241121135116.php b/migrations/Version20241121135116.php deleted file mode 100644 index c932e51..0000000 --- a/migrations/Version20241121135116.php +++ /dev/null @@ -1,32 +0,0 @@ -addSql('ALTER TABLE userapp ALTER roles DROP NOT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('ALTER TABLE userApp ALTER roles SET NOT NULL'); - } -} diff --git a/migrations/Version20241121140219.php b/migrations/Version20241121140219.php deleted file mode 100644 index 28107a4..0000000 --- a/migrations/Version20241121140219.php +++ /dev/null @@ -1,38 +0,0 @@ -addSql('ALTER TABLE announcement DROP CONSTRAINT fk_4db9d91c6bf700bd'); - $this->addSql('DROP INDEX idx_4db9d91c6bf700bd'); - $this->addSql('ALTER TABLE announcement ADD status VARCHAR(255) NOT NULL'); - $this->addSql('ALTER TABLE announcement DROP status_id'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('ALTER TABLE announcement ADD status_id INT NOT NULL'); - $this->addSql('ALTER TABLE announcement DROP status'); - $this->addSql('ALTER TABLE announcement ADD CONSTRAINT fk_4db9d91c6bf700bd FOREIGN KEY (status_id) REFERENCES status (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('CREATE INDEX idx_4db9d91c6bf700bd ON announcement (status_id)'); - } -} From ebb799bcb849b555602316818069393c9054b607 Mon Sep 17 00:00:00 2001 From: bourgoino Date: Thu, 28 Nov 2024 16:58:42 +0100 Subject: [PATCH 63/71] laisse la --- src/Entity/Company.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/Company.php b/src/Entity/Company.php index ae8ccaa..1a3bd2f 100644 --- a/src/Entity/Company.php +++ b/src/Entity/Company.php @@ -62,7 +62,7 @@ class Company return $this; } - public function getAddress(): ?string + public function getAddress(): ?stringz { return $this->address; } From 549d0c5bfc7f0e5c19cf896ab7fc4bda79880bd4 Mon Sep 17 00:00:00 2001 From: bourgoino Date: Fri, 6 Dec 2024 08:06:44 +0100 Subject: [PATCH 64/71] la derniere goute de pluie d'eau froide --- src/Entity/Company.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/Company.php b/src/Entity/Company.php index 1a3bd2f..ae8ccaa 100644 --- a/src/Entity/Company.php +++ b/src/Entity/Company.php @@ -62,7 +62,7 @@ class Company return $this; } - public function getAddress(): ?stringz + public function getAddress(): ?string { return $this->address; } From d6d0a9bbad3c10c8cb0254f29969885cee03cb4e Mon Sep 17 00:00:00 2001 From: bourgoino Date: Mon, 9 Dec 2024 15:47:20 +0100 Subject: [PATCH 65/71] fixation beton --- migrations/Version20241017125351.php | 48 ---------------------------- 1 file changed, 48 deletions(-) delete mode 100644 migrations/Version20241017125351.php diff --git a/migrations/Version20241017125351.php b/migrations/Version20241017125351.php deleted file mode 100644 index e9561a5..0000000 --- a/migrations/Version20241017125351.php +++ /dev/null @@ -1,48 +0,0 @@ -addSql('DROP SEQUENCE user_id_seq CASCADE'); - $this->addSql('CREATE SEQUENCE "userApp_id_seq" INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE TABLE "userApp" (id INT NOT NULL, nickname VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_NICKNAME ON "userApp" (nickname)'); - $this->addSql('ALTER TABLE employee DROP CONSTRAINT fk_5d9f75a1bf396750'); - $this->addSql('ALTER TABLE intern DROP CONSTRAINT fk_a5795f36bf396750'); - $this->addSql('DROP TABLE employee'); - $this->addSql('DROP TABLE "user"'); - $this->addSql('DROP TABLE intern'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('DROP SEQUENCE "userApp_id_seq" CASCADE'); - $this->addSql('CREATE SEQUENCE user_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE TABLE employee (id INT NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE "user" (id INT NOT NULL, nickname VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, tel VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, discriminator VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX uniq_identifier_nickname ON "user" (nickname)'); - $this->addSql('CREATE TABLE intern (id INT NOT NULL, cover_letter TEXT NOT NULL, resume VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('ALTER TABLE employee ADD CONSTRAINT fk_5d9f75a1bf396750 FOREIGN KEY (id) REFERENCES "user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE intern ADD CONSTRAINT fk_a5795f36bf396750 FOREIGN KEY (id) REFERENCES "user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('DROP TABLE "userApp"'); - } -} From c1a79f7621dc02410b7fa380ec6155c0588d34e1 Mon Sep 17 00:00:00 2001 From: bourgoino Date: Thu, 12 Dec 2024 16:48:06 +0100 Subject: [PATCH 66/71] messagerio de jannero TATATATADATA --- src/Controller/MessageController.php | 43 +++++++++++++--- src/Repository/MessageRepository.php | 25 ++++++++++ templates/base.html.twig | 1 + templates/message/conversation.html.twig | 26 ++++++++++ templates/message/index.html.twig | 62 ++++++++++++------------ templates/message/new.html.twig | 24 +++++++-- templates/message/show.html.twig | 42 ++++++++-------- 7 files changed, 161 insertions(+), 62 deletions(-) create mode 100644 templates/message/conversation.html.twig diff --git a/src/Controller/MessageController.php b/src/Controller/MessageController.php index 55eb5ba..a722587 100644 --- a/src/Controller/MessageController.php +++ b/src/Controller/MessageController.php @@ -3,8 +3,10 @@ namespace App\Controller; use App\Entity\Message; +use App\Entity\UserApp; use App\Form\MessageType; use App\Repository\MessageRepository; +use App\Repository\UserRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; @@ -17,31 +19,58 @@ final class MessageController extends AbstractController #[Route(name: 'app_message_index', methods: ['GET'])] public function index(MessageRepository $messageRepository): Response { + $user = $this->getUser(); + $messages = $messageRepository->findByUser($user); // Recherche de tous les messages reçus ou envoyés par l'utilisateur + return $this->render('message/index.html.twig', [ - 'messages' => $messageRepository->findAll(), + 'messages' => $messages, ]); } - #[Route('/new', name: 'app_message_new', methods: ['GET', 'POST'])] - public function new(Request $request, EntityManagerInterface $entityManager): Response + #[Route('/conversation/{id}', name: 'app_message_conversation', methods: ['GET'])] + public function conversation(Message $message, MessageRepository $messageRepository): Response + { + $user = $this->getUser(); + $otherUser = $message->getSender() === $user ? $message->getReceiver() : $message->getSender(); + + // Récupérer tous les messages échangés entre l'utilisateur actuel et l'autre participant + $conversation = $messageRepository->findByConversation($user, $otherUser); + + return $this->render('message/conversation.html.twig', [ + 'conversation' => $conversation, + 'receiverId' => $otherUser->getId(), + 'receiver' => $otherUser, + ]); + } + + + #[Route('/new/{receiverId}', name: 'app_message_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager, ?int $receiverId = null, UserRepository $userRepository): Response { $message = new Message(); + + // Pré-remplir le destinataire si disponible + if ($receiverId) { + $receiver = $userRepository->find($receiverId); + if ($receiver) { + $message->setReceiver($receiver); + } + } + $form = $this->createForm(MessageType::class, $message); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $message->setSendingDate(new \DateTime()); $message->setSender($this->getUser()); $entityManager->persist($message); $entityManager->flush(); - return $this->redirectToRoute('app_message_index', [], Response::HTTP_SEE_OTHER); + return $this->redirectToRoute('app_message_index'); } return $this->render('message/new.html.twig', [ - 'message' => $message, 'form' => $form, ]); } @@ -83,4 +112,6 @@ final class MessageController extends AbstractController return $this->redirectToRoute('app_message_index', [], Response::HTTP_SEE_OTHER); } + + } diff --git a/src/Repository/MessageRepository.php b/src/Repository/MessageRepository.php index e7f1849..33f1713 100644 --- a/src/Repository/MessageRepository.php +++ b/src/Repository/MessageRepository.php @@ -3,6 +3,7 @@ namespace App\Repository; use App\Entity\Message; +use App\Entity\UserApp; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; @@ -16,6 +17,30 @@ class MessageRepository extends ServiceEntityRepository parent::__construct($registry, Message::class); } + public function findByUser(UserApp $user): array + { + return $this->createQueryBuilder('m') + ->where('m.sender = :user OR m.receiver = :user') + ->setParameter('user', $user) + ->orderBy('m.sendingDate', 'ASC') + ->getQuery() + ->getResult(); + } + + public function findByConversation(UserApp $user1, UserApp $user2): array + { + return $this->createQueryBuilder('m') + ->where('(m.sender = :user1 AND m.receiver = :user2) OR (m.sender = :user2 AND m.receiver = :user1)') + ->setParameter('user1', $user1) + ->setParameter('user2', $user2) + ->orderBy('m.sendingDate', 'ASC') + ->getQuery() + ->getResult(); + } + + + + // /** // * @return Message[] Returns an array of Message objects // */ diff --git a/templates/base.html.twig b/templates/base.html.twig index e6b7994..15387a1 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -73,6 +73,7 @@

Téléphone: +33 1 23 45 67 89

+ diff --git a/templates/message/conversation.html.twig b/templates/message/conversation.html.twig new file mode 100644 index 0000000..98c8cf4 --- /dev/null +++ b/templates/message/conversation.html.twig @@ -0,0 +1,26 @@ +{% extends 'base.html.twig' %} + +{% block title %}Conversation{% endblock %} + +{% block body %} + +{% endblock %} diff --git a/templates/message/index.html.twig b/templates/message/index.html.twig index 0aff18b..4c7da31 100644 --- a/templates/message/index.html.twig +++ b/templates/message/index.html.twig @@ -1,37 +1,39 @@ {% extends 'base.html.twig' %} -{% block title %}Message index{% endblock %} +{% block title %}Boîte de Réception{% endblock %} {% block body %} -

Message index

+
+

Boîte de Réception

- - - - - - - - - - - {% for message in messages %} - - - - - - - {% else %} - - - - {% endfor %} - -
IdContentSendingDateactions
{{ message.id }}{{ message.content }}{{ message.sendingDate ? message.sendingDate|date('Y-m-d H:i:s') : '' }} - show - edit -
no records found
+ + + + +
+ {% for message in messages %} + {% if message.receiver == app.user or message.sender == app.user %} +
+
+
+

De : {{ message.sender.nickname }}

+

{{ message.sendingDate|date('d/m/Y H:i') }}

+
+ + Voir la Conversation + +
+

{{ message.content }}

+
+ {% endif %} + {% else %} +

Vous n'avez reçu aucun message.

+ {% endfor %} +
+
{% endblock %} diff --git a/templates/message/new.html.twig b/templates/message/new.html.twig index 5ee1626..6cb60da 100644 --- a/templates/message/new.html.twig +++ b/templates/message/new.html.twig @@ -1,11 +1,27 @@ {% extends 'base.html.twig' %} -{% block title %}New Message{% endblock %} +{% block title %}Nouveau Message{% endblock %} {% block body %} -

Create new Message

+
+

Écrire un Nouveau Message

- {{ include('message/_form.html.twig') }} +
+ {{ form_start(form) }} +
+ + {{ form_widget(form.receiver, {'attr': {'class': 'w-full p-3 border rounded'}}) }} +
- back to list +
+ + {{ form_widget(form.content, {'attr': {'class': 'w-full p-3 border rounded', 'rows': 6}}) }} +
+ + + {{ form_end(form) }} +
+
{% endblock %} diff --git a/templates/message/show.html.twig b/templates/message/show.html.twig index 575f7ab..df1a969 100644 --- a/templates/message/show.html.twig +++ b/templates/message/show.html.twig @@ -1,30 +1,28 @@ {% extends 'base.html.twig' %} -{% block title %}Message{% endblock %} +{% block title %}Voir le Message{% endblock %} {% block body %} -

Message

+
+

Message de {{ message.sender.nickname }}

- - - - - - - - - - - - - - - -
Id{{ message.id }}
Content{{ message.content }}
SendingDate{{ message.sendingDate ? message.sendingDate|date('Y-m-d H:i:s') : '' }}
+
+
+

De : {{ message.sender.nickname }}

+

Reçu le : {{ message.sendingDate|date('d/m/Y H:i') }}

+
- back to list +
+

{{ message.content }}

+
- edit - - {{ include('message/_delete_form.html.twig') }} + + +
+
{% endblock %} From 9074447216d535f9e876edfdcf5255c088ebe511 Mon Sep 17 00:00:00 2001 From: bourgoino Date: Thu, 12 Dec 2024 17:08:34 +0100 Subject: [PATCH 67/71] mhh meuwhhhh --- src/Entity/UserApp.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Entity/UserApp.php b/src/Entity/UserApp.php index 8f87ba6..db1376b 100644 --- a/src/Entity/UserApp.php +++ b/src/Entity/UserApp.php @@ -52,9 +52,6 @@ class UserApp implements UserInterface, PasswordAuthenticatedUserInterface #[ORM\Column(length: 255,nullable: true)] private ?string $mail = null; - #[ORM\Column(nullable: true)] - private bool $isVerified = false; - public function getId(): ?int { return $this->id; From 3c117d8e4cf531accbf1c7fe29764df535c3ce7a Mon Sep 17 00:00:00 2001 From: bourgoino Date: Thu, 3 Apr 2025 14:14:24 +0200 Subject: [PATCH 68/71] le film de minecraft --- composer.lock | 797 +++++++++++++++++++++++++++----------------------- 1 file changed, 433 insertions(+), 364 deletions(-) diff --git a/composer.lock b/composer.lock index f6218a8..57b814a 100644 --- a/composer.lock +++ b/composer.lock @@ -182,29 +182,29 @@ }, { "name": "doctrine/collections", - "version": "2.2.2", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" + "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", - "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", + "url": "https://api.github.com/repos/doctrine/collections/zipball/2eb07e5953eed811ce1b309a7478a3b236f2273d", + "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d", "shasum": "" }, "require": { "doctrine/deprecations": "^1", - "php": "^8.1" + "php": "^8.1", + "symfony/polyfill-php84": "^1.30" }, "require-dev": { "doctrine/coding-standard": "^12", "ext-json": "*", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.11" + "phpunit/phpunit": "^10.5" }, "type": "library", "autoload": { @@ -248,7 +248,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.2.2" + "source": "https://github.com/doctrine/collections/tree/2.3.0" }, "funding": [ { @@ -264,20 +264,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T06:56:21+00:00" + "time": "2025-03-22T10:17:19+00:00" }, { "name": "doctrine/dbal", - "version": "3.9.3", + "version": "3.9.4", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba" + "reference": "ec16c82f20be1a7224e65ac67144a29199f87959" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/61446f07fcb522414d6cfd8b1c3e5f9e18c579ba", - "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/ec16c82f20be1a7224e65ac67144a29199f87959", + "reference": "ec16c82f20be1a7224e65ac67144a29199f87959", "shasum": "" }, "require": { @@ -293,15 +293,13 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.12.6", - "phpstan/phpstan-strict-rules": "^1.6", - "phpunit/phpunit": "9.6.20", - "psalm/plugin-phpunit": "0.18.4", + "phpstan/phpstan": "2.1.1", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "9.6.22", "slevomat/coding-standard": "8.13.1", "squizlabs/php_codesniffer": "3.10.2", "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/console": "^4.4|^5.4|^6.0|^7.0", - "vimeo/psalm": "4.30.0" + "symfony/console": "^4.4|^5.4|^6.0|^7.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -361,7 +359,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.9.3" + "source": "https://github.com/doctrine/dbal/tree/3.9.4" }, "funding": [ { @@ -377,7 +375,7 @@ "type": "tidelift" } ], - "time": "2024-10-10T17:56:43+00:00" + "time": "2025-01-16T08:28:55+00:00" }, { "name": "doctrine/deprecations", @@ -426,62 +424,64 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.13.1", + "version": "2.14.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "2740ad8b8739b39ab37d409c972b092f632b025a" + "reference": "ca6a7350b421baf7fbdefbf9f4993292ed18effb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/2740ad8b8739b39ab37d409c972b092f632b025a", - "reference": "2740ad8b8739b39ab37d409c972b092f632b025a", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca6a7350b421baf7fbdefbf9f4993292ed18effb", + "reference": "ca6a7350b421baf7fbdefbf9f4993292ed18effb", "shasum": "" }, "require": { - "doctrine/cache": "^1.11 || ^2.0", "doctrine/dbal": "^3.7.0 || ^4.0", - "doctrine/persistence": "^2.2 || ^3", + "doctrine/persistence": "^3.1 || ^4", "doctrine/sql-formatter": "^1.0.1", - "php": "^7.4 || ^8.0", - "symfony/cache": "^5.4 || ^6.0 || ^7.0", - "symfony/config": "^5.4 || ^6.0 || ^7.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "php": "^8.1", + "symfony/cache": "^6.4 || ^7.0", + "symfony/config": "^6.4 || ^7.0", + "symfony/console": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0", "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/doctrine-bridge": "^5.4.46 || ^6.4.3 || ^7.0.3", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" + "symfony/doctrine-bridge": "^6.4.3 || ^7.0.3", + "symfony/framework-bundle": "^6.4 || ^7.0", + "symfony/service-contracts": "^2.5 || ^3" }, "conflict": { "doctrine/annotations": ">=3.0", + "doctrine/cache": "< 1.11", "doctrine/orm": "<2.17 || >=4.0", - "twig/twig": "<1.34 || >=2.0 <2.4" + "symfony/var-exporter": "< 6.4.1 || 7.0.0", + "twig/twig": "<2.13 || >=3.0 <3.0.4" }, "require-dev": { "doctrine/annotations": "^1 || ^2", + "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^12", "doctrine/deprecations": "^1.0", "doctrine/orm": "^2.17 || ^3.0", "friendsofphp/proxy-manager-lts": "^1.0", - "phpunit/phpunit": "^9.5.26", - "psalm/plugin-phpunit": "^0.18.4", - "psalm/plugin-symfony": "^5", + "phpstan/phpstan": "2.1.1", + "phpstan/phpstan-phpunit": "2.0.3", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^9.6.22", "psr/log": "^1.1.4 || ^2.0 || ^3.0", - "symfony/phpunit-bridge": "^6.1 || ^7.0", - "symfony/property-info": "^5.4 || ^6.0 || ^7.0", - "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.0", - "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0", - "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", - "symfony/string": "^5.4 || ^6.0 || ^7.0", - "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0", - "symfony/validator": "^5.4 || ^6.0 || ^7.0", - "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0", - "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0", - "twig/twig": "^1.34 || ^2.12 || ^3.0", - "vimeo/psalm": "^5.15" + "symfony/doctrine-messenger": "^6.4 || ^7.0", + "symfony/messenger": "^6.4 || ^7.0", + "symfony/phpunit-bridge": "^7.2", + "symfony/property-info": "^6.4 || ^7.0", + "symfony/security-bundle": "^6.4 || ^7.0", + "symfony/stopwatch": "^6.4 || ^7.0", + "symfony/string": "^6.4 || ^7.0", + "symfony/twig-bridge": "^6.4 || ^7.0", + "symfony/validator": "^6.4 || ^7.0", + "symfony/var-exporter": "^6.4.1 || ^7.0.1", + "symfony/web-profiler-bundle": "^6.4 || ^7.0", + "symfony/yaml": "^6.4 || ^7.0", + "twig/twig": "^2.13 || ^3.0.4" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -526,7 +526,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.13.1" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.14.0" }, "funding": [ { @@ -542,26 +542,26 @@ "type": "tidelift" } ], - "time": "2024-11-08T23:27:54+00:00" + "time": "2025-03-22T17:28:21+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.3.1", + "version": "3.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0" + "reference": "e858ce0f5c12b266dce7dce24834448355155da7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", - "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/e858ce0f5c12b266dce7dce24834448355155da7", + "reference": "e858ce0f5c12b266dce7dce24834448355155da7", "shasum": "" }, "require": { "doctrine/doctrine-bundle": "^2.4", "doctrine/migrations": "^3.2", - "php": "^7.2|^8.0", + "php": "^7.2 || ^8.0", "symfony/deprecation-contracts": "^2.1 || ^3", "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" }, @@ -569,27 +569,21 @@ "composer/semver": "^3.0", "doctrine/coding-standard": "^12", "doctrine/orm": "^2.6 || ^3", - "doctrine/persistence": "^2.0 || ^3 ", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "phpstan/phpstan-symfony": "^1.3", - "phpunit/phpunit": "^8.5|^9.5", - "psalm/plugin-phpunit": "^0.18.4", - "psalm/plugin-symfony": "^3 || ^5", + "doctrine/persistence": "^2.0 || ^3", + "phpstan/phpstan": "^1.4 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpstan/phpstan-symfony": "^1.3 || ^2", + "phpunit/phpunit": "^8.5 || ^9.5", "symfony/phpunit-bridge": "^6.3 || ^7", - "symfony/var-exporter": "^5.4 || ^6 || ^7", - "vimeo/psalm": "^4.30 || ^5.15" + "symfony/var-exporter": "^5.4 || ^6 || ^7" }, "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Bundle\\MigrationsBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Doctrine\\Bundle\\MigrationsBundle\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -618,7 +612,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.1" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.1" }, "funding": [ { @@ -634,7 +628,7 @@ "type": "tidelift" } ], - "time": "2024-05-14T20:32:18+00:00" + "time": "2025-01-27T22:48:22+00:00" }, { "name": "doctrine/event-manager", @@ -967,16 +961,16 @@ }, { "name": "doctrine/migrations", - "version": "3.8.2", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "5007eb1168691225ac305fe16856755c20860842" + "reference": "325b61e41d032f5f7d7e2d11cbefff656eadc9ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/5007eb1168691225ac305fe16856755c20860842", - "reference": "5007eb1168691225ac305fe16856755c20860842", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/325b61e41d032f5f7d7e2d11cbefff656eadc9ab", + "reference": "325b61e41d032f5f7d7e2d11cbefff656eadc9ab", "shasum": "" }, "require": { @@ -996,7 +990,7 @@ "require-dev": { "doctrine/coding-standard": "^12", "doctrine/orm": "^2.13 || ^3", - "doctrine/persistence": "^2 || ^3", + "doctrine/persistence": "^2 || ^3 || ^4", "doctrine/sql-formatter": "^1.0", "ext-pdo_sqlite": "*", "fig/log-test": "^1", @@ -1050,7 +1044,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.8.2" + "source": "https://github.com/doctrine/migrations/tree/3.9.0" }, "funding": [ { @@ -1066,20 +1060,20 @@ "type": "tidelift" } ], - "time": "2024-10-10T21:35:27+00:00" + "time": "2025-03-26T06:48:45+00:00" }, { "name": "doctrine/orm", - "version": "3.3.1", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "b1f8253105aa5382c495e5f9f8ef34e297775428" + "reference": "c9557c588b3a70ed93caff069d0aa75737f25609" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/b1f8253105aa5382c495e5f9f8ef34e297775428", - "reference": "b1f8253105aa5382c495e5f9f8ef34e297775428", + "url": "https://api.github.com/repos/doctrine/orm/zipball/c9557c588b3a70ed93caff069d0aa75737f25609", + "reference": "c9557c588b3a70ed93caff069d0aa75737f25609", "shasum": "" }, "require": { @@ -1154,27 +1148,27 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.3.1" + "source": "https://github.com/doctrine/orm/tree/3.3.2" }, - "time": "2024-12-19T07:08:14+00:00" + "time": "2025-02-04T19:43:15+00:00" }, { "name": "doctrine/persistence", - "version": "3.4.0", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff" + "reference": "45004aca79189474f113cbe3a53847c2115a55fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/0ea965320cec355dba75031c1b23d4c78362e3ff", - "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/45004aca79189474f113cbe3a53847c2115a55fa", + "reference": "45004aca79189474f113cbe3a53847c2115a55fa", "shasum": "" }, "require": { "doctrine/event-manager": "^1 || ^2", - "php": "^7.2 || ^8.0", + "php": "^8.1", "psr/cache": "^1.0 || ^2.0 || ^3.0" }, "conflict": { @@ -1182,11 +1176,10 @@ }, "require-dev": { "doctrine/coding-standard": "^12", - "doctrine/common": "^3.0", "phpstan/phpstan": "1.12.7", "phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5.38 || ^9.5", + "phpunit/phpunit": "^9.6", "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" }, "type": "library", @@ -1236,7 +1229,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.4.0" + "source": "https://github.com/doctrine/persistence/tree/4.0.0" }, "funding": [ { @@ -1252,20 +1245,20 @@ "type": "tidelift" } ], - "time": "2024-10-30T19:48:12+00:00" + "time": "2024-11-01T21:49:07+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "b784cbde727cf806721451dde40eff4fec3bbe86" + "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/b784cbde727cf806721451dde40eff4fec3bbe86", - "reference": "b784cbde727cf806721451dde40eff4fec3bbe86", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8", + "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8", "shasum": "" }, "require": { @@ -1275,8 +1268,7 @@ "doctrine/coding-standard": "^12", "ergebnis/phpunit-slow-test-detector": "^2.14", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.24" + "phpunit/phpunit": "^10.5" }, "bin": [ "bin/sql-formatter" @@ -1306,22 +1298,22 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.1" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2" }, - "time": "2024-10-21T18:21:57+00:00" + "time": "2025-01-24T11:45:48+00:00" }, { "name": "egulias/email-validator", - "version": "4.0.2", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", - "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", "shasum": "" }, "require": { @@ -1367,7 +1359,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" }, "funding": [ { @@ -1375,20 +1367,20 @@ "type": "github" } ], - "time": "2023-10-06T06:47:41+00:00" + "time": "2025-03-06T22:45:56+00:00" }, { "name": "monolog/monolog", - "version": "3.8.1", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", "shasum": "" }, "require": { @@ -1466,7 +1458,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.8.1" + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" }, "funding": [ { @@ -1478,7 +1470,7 @@ "type": "tidelift" } ], - "time": "2024-12-05T17:15:07+00:00" + "time": "2025-03-24T10:02:05+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -2079,16 +2071,16 @@ }, { "name": "symfony/asset-mapper", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/asset-mapper.git", - "reference": "bb1c2f5f394c84ce5b1ac8c94d0ac213ae3ce5f8" + "reference": "f30a77372995afb0f9323903b52e8e6527d12451" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/bb1c2f5f394c84ce5b1ac8c94d0ac213ae3ce5f8", - "reference": "bb1c2f5f394c84ce5b1ac8c94d0ac213ae3ce5f8", + "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/f30a77372995afb0f9323903b52e8e6527d12451", + "reference": "f30a77372995afb0f9323903b52e8e6527d12451", "shasum": "" }, "require": { @@ -2138,7 +2130,7 @@ "description": "Maps directories of assets & makes them available in a public directory with versioned filenames.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset-mapper/tree/v7.1.9" + "source": "https://github.com/symfony/asset-mapper/tree/v7.1.11" }, "funding": [ { @@ -2154,20 +2146,20 @@ "type": "tidelift" } ], - "time": "2024-11-20T11:08:58+00:00" + "time": "2025-01-27T10:57:12+00:00" }, { "name": "symfony/cache", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "18e0ba45a50032aa53dfebf830ec2980bb131591" + "reference": "3828c0375578ff3ca1ddc54cc5c6fa4cc89fb3fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/18e0ba45a50032aa53dfebf830ec2980bb131591", - "reference": "18e0ba45a50032aa53dfebf830ec2980bb131591", + "url": "https://api.github.com/repos/symfony/cache/zipball/3828c0375578ff3ca1ddc54cc5c6fa4cc89fb3fb", + "reference": "3828c0375578ff3ca1ddc54cc5c6fa4cc89fb3fb", "shasum": "" }, "require": { @@ -2235,7 +2227,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.1.9" + "source": "https://github.com/symfony/cache/tree/v7.1.11" }, "funding": [ { @@ -2251,7 +2243,7 @@ "type": "tidelift" } ], - "time": "2024-11-20T10:42:04+00:00" + "time": "2025-01-27T10:57:12+00:00" }, { "name": "symfony/cache-contracts", @@ -2273,12 +2265,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -2480,16 +2472,16 @@ }, { "name": "symfony/console", - "version": "v7.1.8", + "version": "v7.1.10", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5" + "reference": "bb06e2d7f8dd9dffe5eada8a5cbe0f68f1482db7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ff04e5b5ba043d2badfb308197b9e6b42883fcd5", - "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5", + "url": "https://api.github.com/repos/symfony/console/zipball/bb06e2d7f8dd9dffe5eada8a5cbe0f68f1482db7", + "reference": "bb06e2d7f8dd9dffe5eada8a5cbe0f68f1482db7", "shasum": "" }, "require": { @@ -2553,7 +2545,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.8" + "source": "https://github.com/symfony/console/tree/v7.1.10" }, "funding": [ { @@ -2569,20 +2561,20 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:23:19+00:00" + "time": "2024-12-09T07:30:10+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "900d2eac6e33aef743bdc10dd8c75d012215fd08" + "reference": "5ebf7d4dfda126b442450effaec421a106c010de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/900d2eac6e33aef743bdc10dd8c75d012215fd08", - "reference": "900d2eac6e33aef743bdc10dd8c75d012215fd08", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5ebf7d4dfda126b442450effaec421a106c010de", + "reference": "5ebf7d4dfda126b442450effaec421a106c010de", "shasum": "" }, "require": { @@ -2633,7 +2625,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.1.9" + "source": "https://github.com/symfony/dependency-injection/tree/v7.1.11" }, "funding": [ { @@ -2649,7 +2641,7 @@ "type": "tidelift" } ], - "time": "2024-11-25T15:44:54+00:00" + "time": "2025-01-10T09:29:52+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2670,12 +2662,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -2720,21 +2712,21 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "893cc4fa0f218d6e88efbe58397e2b42167648e1" + "reference": "b0247c25b71409c23c0cf3e090030950a86cc61b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/893cc4fa0f218d6e88efbe58397e2b42167648e1", - "reference": "893cc4fa0f218d6e88efbe58397e2b42167648e1", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b0247c25b71409c23c0cf3e090030950a86cc61b", + "reference": "b0247c25b71409c23c0cf3e090030950a86cc61b", "shasum": "" }, "require": { "doctrine/event-manager": "^2", - "doctrine/persistence": "^3.1", + "doctrine/persistence": "^3.1|^4", "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", @@ -2808,7 +2800,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.9" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.11" }, "funding": [ { @@ -2824,20 +2816,20 @@ "type": "tidelift" } ], - "time": "2024-11-25T12:02:18+00:00" + "time": "2025-01-27T10:57:12+00:00" }, { "name": "symfony/doctrine-messenger", - "version": "v7.1.6", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "b2f548cdc9c85258493e022aefa53a44e5b9dfa3" + "reference": "a7813f3cfc8c66bd5930f15fcf591a1dee27b089" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/b2f548cdc9c85258493e022aefa53a44e5b9dfa3", - "reference": "b2f548cdc9c85258493e022aefa53a44e5b9dfa3", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/a7813f3cfc8c66bd5930f15fcf591a1dee27b089", + "reference": "a7813f3cfc8c66bd5930f15fcf591a1dee27b089", "shasum": "" }, "require": { @@ -2880,7 +2872,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v7.1.6" + "source": "https://github.com/symfony/doctrine-messenger/tree/v7.1.11" }, "funding": [ { @@ -2896,7 +2888,7 @@ "type": "tidelift" } ], - "time": "2024-10-18T09:46:03+00:00" + "time": "2025-01-07T09:23:14+00:00" }, { "name": "symfony/dotenv", @@ -2974,16 +2966,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.1.7", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "010e44661f4c6babaf8c4862fe68c24a53903342" + "reference": "f4d1fd1bcb4bce9983d034111b7ea3edc88e1a57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/010e44661f4c6babaf8c4862fe68c24a53903342", - "reference": "010e44661f4c6babaf8c4862fe68c24a53903342", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/f4d1fd1bcb4bce9983d034111b7ea3edc88e1a57", + "reference": "f4d1fd1bcb4bce9983d034111b7ea3edc88e1a57", "shasum": "" }, "require": { @@ -3029,7 +3021,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.1.7" + "source": "https://github.com/symfony/error-handler/tree/v7.1.11" }, "funding": [ { @@ -3045,7 +3037,7 @@ "type": "tidelift" } ], - "time": "2024-11-05T15:34:55+00:00" + "time": "2025-01-07T09:23:14+00:00" }, { "name": "symfony/event-dispatcher", @@ -3147,12 +3139,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -3335,16 +3327,16 @@ }, { "name": "symfony/finder", - "version": "v7.1.6", + "version": "v7.1.10", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8" + "reference": "b8b526e051ac0b33feabbec7893adcab96b23bf3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2cb89664897be33f78c65d3d2845954c8d7a43b8", - "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8", + "url": "https://api.github.com/repos/symfony/finder/zipball/b8b526e051ac0b33feabbec7893adcab96b23bf3", + "reference": "b8b526e051ac0b33feabbec7893adcab96b23bf3", "shasum": "" }, "require": { @@ -3379,7 +3371,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.6" + "source": "https://github.com/symfony/finder/tree/v7.1.10" }, "funding": [ { @@ -3395,20 +3387,20 @@ "type": "tidelift" } ], - "time": "2024-10-01T08:31:23+00:00" + "time": "2024-12-30T18:59:46+00:00" }, { "name": "symfony/flex", - "version": "v2.4.7", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402" + "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/92f4fba342161ff36072bd3b8e0b3c6c23160402", - "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402", + "url": "https://api.github.com/repos/symfony/flex/zipball/8ce1acd9842abe0e9b4c4a0bd3f259859516c018", + "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018", "shasum": "" }, "require": { @@ -3447,7 +3439,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.4.7" + "source": "https://github.com/symfony/flex/tree/v2.5.0" }, "funding": [ { @@ -3463,7 +3455,7 @@ "type": "tidelift" } ], - "time": "2024-10-07T08:51:54+00:00" + "time": "2025-03-03T07:50:46+00:00" }, { "name": "symfony/form", @@ -3564,16 +3556,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v7.1.6", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "1d616d762905091e798d64c53ffe3840ccfc3d89" + "reference": "1eae7a4e095a2a3851cb41ac2aea9aa60fba1df8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1d616d762905091e798d64c53ffe3840ccfc3d89", - "reference": "1d616d762905091e798d64c53ffe3840ccfc3d89", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1eae7a4e095a2a3851cb41ac2aea9aa60fba1df8", + "reference": "1eae7a4e095a2a3851cb41ac2aea9aa60fba1df8", "shasum": "" }, "require": { @@ -3692,7 +3684,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.1.6" + "source": "https://github.com/symfony/framework-bundle/tree/v7.1.11" }, "funding": [ { @@ -3708,27 +3700,27 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2025-01-29T07:13:42+00:00" }, { "name": "symfony/http-client", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "2ec49720a38a8041673ba4c42512bfd845218c56" + "reference": "71632c1f13b36cb4c23ccdd255946dc02753afef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/2ec49720a38a8041673ba4c42512bfd845218c56", - "reference": "2ec49720a38a8041673ba4c42512bfd845218c56", + "url": "https://api.github.com/repos/symfony/http-client/zipball/71632c1f13b36cb4c23ccdd255946dc02753afef", + "reference": "71632c1f13b36cb4c23ccdd255946dc02753afef", "shasum": "" }, "require": { "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "~3.4.3|^3.5.1", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -3786,7 +3778,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.1.9" + "source": "https://github.com/symfony/http-client/tree/v7.1.11" }, "funding": [ { @@ -3802,7 +3794,7 @@ "type": "tidelift" } ], - "time": "2024-11-27T11:52:45+00:00" + "time": "2025-01-28T15:50:57+00:00" }, { "name": "symfony/http-client-contracts", @@ -3884,16 +3876,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "82765842fb599c7ed839b650214680c7ee5779be" + "reference": "7ced01aa123612666a7a4fb72c627f969c01fa8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/82765842fb599c7ed839b650214680c7ee5779be", - "reference": "82765842fb599c7ed839b650214680c7ee5779be", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7ced01aa123612666a7a4fb72c627f969c01fa8d", + "reference": "7ced01aa123612666a7a4fb72c627f969c01fa8d", "shasum": "" }, "require": { @@ -3941,7 +3933,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.1.9" + "source": "https://github.com/symfony/http-foundation/tree/v7.1.11" }, "funding": [ { @@ -3957,20 +3949,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T18:58:36+00:00" + "time": "2025-01-17T10:33:21+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "649d0e23c571344ef1153d4ffb2564f534b85a45" + "reference": "576eb3368037dd139f67b8ac71db56c3f69f7d66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/649d0e23c571344ef1153d4ffb2564f534b85a45", - "reference": "649d0e23c571344ef1153d4ffb2564f534b85a45", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/576eb3368037dd139f67b8ac71db56c3f69f7d66", + "reference": "576eb3368037dd139f67b8ac71db56c3f69f7d66", "shasum": "" }, "require": { @@ -4055,7 +4047,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.9" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.11" }, "funding": [ { @@ -4071,7 +4063,7 @@ "type": "tidelift" } ], - "time": "2024-11-27T12:55:11+00:00" + "time": "2025-01-29T07:34:05+00:00" }, { "name": "symfony/intl", @@ -4161,16 +4153,16 @@ }, { "name": "symfony/mailer", - "version": "v7.1.6", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd" + "reference": "e3790ddd7448cc6797fbd06749db70d147992321" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/69c9948451fb3a6a4d47dc8261d1794734e76cdd", - "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e3790ddd7448cc6797fbd06749db70d147992321", + "reference": "e3790ddd7448cc6797fbd06749db70d147992321", "shasum": "" }, "require": { @@ -4221,7 +4213,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.1.6" + "source": "https://github.com/symfony/mailer/tree/v7.1.11" }, "funding": [ { @@ -4237,7 +4229,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-01-27T10:57:12+00:00" }, { "name": "symfony/messenger", @@ -4327,16 +4319,16 @@ }, { "name": "symfony/mime", - "version": "v7.1.6", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "caa1e521edb2650b8470918dfe51708c237f0598" + "reference": "c252e20d1179dd35a5bfdb4a61a2084387ce97f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/caa1e521edb2650b8470918dfe51708c237f0598", - "reference": "caa1e521edb2650b8470918dfe51708c237f0598", + "url": "https://api.github.com/repos/symfony/mime/zipball/c252e20d1179dd35a5bfdb4a61a2084387ce97f4", + "reference": "c252e20d1179dd35a5bfdb4a61a2084387ce97f4", "shasum": "" }, "require": { @@ -4391,7 +4383,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.6" + "source": "https://github.com/symfony/mime/tree/v7.1.11" }, "funding": [ { @@ -4407,7 +4399,7 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2025-01-27T10:57:12+00:00" }, { "name": "symfony/monolog-bridge", @@ -5267,6 +5259,82 @@ ], "time": "2024-09-09T11:45:10+00:00" }, + { + "name": "symfony/polyfill-php84", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/e5493eb51311ab0b1cc2243416613f06ed8f18bd", + "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd", + "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\\Php84\\": "" + }, + "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.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/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-09T12:04:04+00:00" + }, { "name": "symfony/process", "version": "v7.1.8", @@ -5330,16 +5398,16 @@ }, { "name": "symfony/property-access", - "version": "v7.1.6", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "975d7f7fd8fcb952364c6badc46d01a580532bf9" + "reference": "83e46f0266186e76929257426ddaa151248781c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/975d7f7fd8fcb952364c6badc46d01a580532bf9", - "reference": "975d7f7fd8fcb952364c6badc46d01a580532bf9", + "url": "https://api.github.com/repos/symfony/property-access/zipball/83e46f0266186e76929257426ddaa151248781c6", + "reference": "83e46f0266186e76929257426ddaa151248781c6", "shasum": "" }, "require": { @@ -5386,7 +5454,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.1.6" + "source": "https://github.com/symfony/property-access/tree/v7.1.11" }, "funding": [ { @@ -5402,31 +5470,33 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-01-10T14:50:02+00:00" }, { "name": "symfony/property-info", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "e9a7b2a4984457c3849afd2b1a1ec7f2994cb1b5" + "reference": "df9002f8381cc074300dc2bf9726075e4bf00458" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/e9a7b2a4984457c3849afd2b1a1ec7f2994cb1b5", - "reference": "e9a7b2a4984457c3849afd2b1a1ec7f2994cb1b5", + "url": "https://api.github.com/repos/symfony/property-info/zipball/df9002f8381cc074300dc2bf9726075e4bf00458", + "reference": "df9002f8381cc074300dc2bf9726075e4bf00458", "shasum": "" }, "require": { "php": ">=8.2", "symfony/string": "^6.4|^7.0", - "symfony/type-info": "^7.1" + "symfony/type-info": "~7.1.9|^7.2.2" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/dependency-injection": "<6.4" + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/serializer": "<6.4" }, "require-dev": { "phpdocumentor/reflection-docblock": "^5.2", @@ -5469,7 +5539,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.1.9" + "source": "https://github.com/symfony/property-info/tree/v7.1.11" }, "funding": [ { @@ -5485,20 +5555,20 @@ "type": "tidelift" } ], - "time": "2024-11-27T09:50:41+00:00" + "time": "2025-01-27T10:57:12+00:00" }, { "name": "symfony/routing", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "a27bb8e0cc3ca4baf17159d053910c9736c3aa4c" + "reference": "07f6463a8ff4377944222b69b126bd5495e9d44e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/a27bb8e0cc3ca4baf17159d053910c9736c3aa4c", - "reference": "a27bb8e0cc3ca4baf17159d053910c9736c3aa4c", + "url": "https://api.github.com/repos/symfony/routing/zipball/07f6463a8ff4377944222b69b126bd5495e9d44e", + "reference": "07f6463a8ff4377944222b69b126bd5495e9d44e", "shasum": "" }, "require": { @@ -5550,7 +5620,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.9" + "source": "https://github.com/symfony/routing/tree/v7.1.11" }, "funding": [ { @@ -5566,7 +5636,7 @@ "type": "tidelift" } ], - "time": "2024-11-13T16:12:35+00:00" + "time": "2025-01-17T10:33:21+00:00" }, { "name": "symfony/runtime", @@ -5649,16 +5719,16 @@ }, { "name": "symfony/security-bundle", - "version": "v7.1.6", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "7df1d3d431be03fbeb1b162eebca424005b48cdd" + "reference": "4012dbc0884fc7cbf555615a5aaa16f7c0d3f222" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/7df1d3d431be03fbeb1b162eebca424005b48cdd", - "reference": "7df1d3d431be03fbeb1b162eebca424005b48cdd", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/4012dbc0884fc7cbf555615a5aaa16f7c0d3f222", + "reference": "4012dbc0884fc7cbf555615a5aaa16f7c0d3f222", "shasum": "" }, "require": { @@ -5735,7 +5805,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v7.1.6" + "source": "https://github.com/symfony/security-bundle/tree/v7.1.11" }, "funding": [ { @@ -5751,20 +5821,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-12-31T17:57:35+00:00" }, { "name": "symfony/security-core", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "294426c17d484f47a576ca092c132f3afba17a19" + "reference": "0931c6bb15b696e1a4da8405c255b3a8673dcb3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/294426c17d484f47a576ca092c132f3afba17a19", - "reference": "294426c17d484f47a576ca092c132f3afba17a19", + "url": "https://api.github.com/repos/symfony/security-core/zipball/0931c6bb15b696e1a4da8405c255b3a8673dcb3c", + "reference": "0931c6bb15b696e1a4da8405c255b3a8673dcb3c", "shasum": "" }, "require": { @@ -5821,7 +5891,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.1.9" + "source": "https://github.com/symfony/security-core/tree/v7.1.11" }, "funding": [ { @@ -5837,7 +5907,7 @@ "type": "tidelift" } ], - "time": "2024-11-27T09:50:41+00:00" + "time": "2025-01-27T10:57:12+00:00" }, { "name": "symfony/security-csrf", @@ -5909,16 +5979,16 @@ }, { "name": "symfony/security-http", - "version": "v7.1.8", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "e11ea7f98fba4921a6c847a0c6a77d1befa9698f" + "reference": "c5ef4cb3bb013cf02c1d8459d1c51bc9f616cd80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/e11ea7f98fba4921a6c847a0c6a77d1befa9698f", - "reference": "e11ea7f98fba4921a6c847a0c6a77d1befa9698f", + "url": "https://api.github.com/repos/symfony/security-http/zipball/c5ef4cb3bb013cf02c1d8459d1c51bc9f616cd80", + "reference": "c5ef4cb3bb013cf02c1d8459d1c51bc9f616cd80", "shasum": "" }, "require": { @@ -5977,7 +6047,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.1.8" + "source": "https://github.com/symfony/security-http/tree/v7.1.11" }, "funding": [ { @@ -5993,20 +6063,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:40:27+00:00" + "time": "2025-01-28T15:50:57+00:00" }, { "name": "symfony/serializer", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "39ec8beb1b8149c96785abad0e9ee390375a3e58" + "reference": "cb88edf0d4d63472c50b5f77bcb3227a103966e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/39ec8beb1b8149c96785abad0e9ee390375a3e58", - "reference": "39ec8beb1b8149c96785abad0e9ee390375a3e58", + "url": "https://api.github.com/repos/symfony/serializer/zipball/cb88edf0d4d63472c50b5f77bcb3227a103966e6", + "reference": "cb88edf0d4d63472c50b5f77bcb3227a103966e6", "shasum": "" }, "require": { @@ -6076,7 +6146,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.1.9" + "source": "https://github.com/symfony/serializer/tree/v7.1.11" }, "funding": [ { @@ -6092,7 +6162,7 @@ "type": "tidelift" } ], - "time": "2024-11-14T21:24:44+00:00" + "time": "2025-01-29T07:13:42+00:00" }, { "name": "symfony/service-contracts", @@ -6118,12 +6188,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -6179,16 +6249,16 @@ }, { "name": "symfony/stimulus-bundle", - "version": "v2.22.1", + "version": "v2.23.0", "source": { "type": "git", "url": "https://github.com/symfony/stimulus-bundle.git", - "reference": "e13034d428354023c82a1db108d40fdf6cec2d36" + "reference": "254f4e05cbaa349d4ae68b9b2e6a22995e0887f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/e13034d428354023c82a1db108d40fdf6cec2d36", - "reference": "e13034d428354023c82a1db108d40fdf6cec2d36", + "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/254f4e05cbaa349d4ae68b9b2e6a22995e0887f9", + "reference": "254f4e05cbaa349d4ae68b9b2e6a22995e0887f9", "shasum": "" }, "require": { @@ -6228,7 +6298,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/stimulus-bundle/tree/v2.22.1" + "source": "https://github.com/symfony/stimulus-bundle/tree/v2.23.0" }, "funding": [ { @@ -6244,7 +6314,7 @@ "type": "tidelift" } ], - "time": "2024-12-06T14:30:33+00:00" + "time": "2025-01-16T21:55:09+00:00" }, { "name": "symfony/stopwatch", @@ -6508,12 +6578,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -6569,16 +6639,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.1.9", + "version": "v7.1.10", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "67ea8a59432307efb0fdcae0d8512e7c4a9e4c01" + "reference": "c027c54611cd194273b924c8d24d9706695171ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/67ea8a59432307efb0fdcae0d8512e7c4a9e4c01", - "reference": "67ea8a59432307efb0fdcae0d8512e7c4a9e4c01", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/c027c54611cd194273b924c8d24d9706695171ff", + "reference": "c027c54611cd194273b924c8d24d9706695171ff", "shasum": "" }, "require": { @@ -6658,7 +6728,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.1.9" + "source": "https://github.com/symfony/twig-bridge/tree/v7.1.10" }, "funding": [ { @@ -6674,7 +6744,7 @@ "type": "tidelift" } ], - "time": "2024-11-25T12:02:18+00:00" + "time": "2024-12-19T14:23:39+00:00" }, { "name": "symfony/twig-bundle", @@ -6762,16 +6832,16 @@ }, { "name": "symfony/type-info", - "version": "v7.1.8", + "version": "v7.1.10", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "51535dde21c7abf65c9d000a30bb15f6478195e6" + "reference": "8f980bdd1d6a2834503afbfcf3f39de8133e48fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/51535dde21c7abf65c9d000a30bb15f6478195e6", - "reference": "51535dde21c7abf65c9d000a30bb15f6478195e6", + "url": "https://api.github.com/repos/symfony/type-info/zipball/8f980bdd1d6a2834503afbfcf3f39de8133e48fe", + "reference": "8f980bdd1d6a2834503afbfcf3f39de8133e48fe", "shasum": "" }, "require": { @@ -6824,7 +6894,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.1.8" + "source": "https://github.com/symfony/type-info/tree/v7.1.10" }, "funding": [ { @@ -6840,20 +6910,20 @@ "type": "tidelift" } ], - "time": "2024-11-07T15:49:33+00:00" + "time": "2024-12-11T12:11:39+00:00" }, { "name": "symfony/ux-turbo", - "version": "v2.22.1", + "version": "v2.23.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-turbo.git", - "reference": "97718ea4bca26f0db843c3c0de338d6900c5a002" + "reference": "db96cf04d70a8c820671ce55530e8bf641ada33f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/97718ea4bca26f0db843c3c0de338d6900c5a002", - "reference": "97718ea4bca26f0db843c3c0de338d6900c5a002", + "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/db96cf04d70a8c820671ce55530e8bf641ada33f", + "reference": "db96cf04d70a8c820671ce55530e8bf641ada33f", "shasum": "" }, "require": { @@ -6922,7 +6992,7 @@ "turbo-stream" ], "support": { - "source": "https://github.com/symfony/ux-turbo/tree/v2.22.1" + "source": "https://github.com/symfony/ux-turbo/tree/v2.23.0" }, "funding": [ { @@ -6938,20 +7008,20 @@ "type": "tidelift" } ], - "time": "2024-12-05T14:25:02+00:00" + "time": "2025-02-06T08:47:30+00:00" }, { "name": "symfony/validator", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "ff71d77da404c700f8b05ba426eb9e6f8d22771b" + "reference": "bb226e43829a6554cf891bd7c176dc73d49bc6c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/ff71d77da404c700f8b05ba426eb9e6f8d22771b", - "reference": "ff71d77da404c700f8b05ba426eb9e6f8d22771b", + "url": "https://api.github.com/repos/symfony/validator/zipball/bb226e43829a6554cf891bd7c176dc73d49bc6c1", + "reference": "bb226e43829a6554cf891bd7c176dc73d49bc6c1", "shasum": "" }, "require": { @@ -7019,7 +7089,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.1.9" + "source": "https://github.com/symfony/validator/tree/v7.1.11" }, "funding": [ { @@ -7035,20 +7105,20 @@ "type": "tidelift" } ], - "time": "2024-11-27T09:50:41+00:00" + "time": "2025-01-28T15:50:57+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.1.8", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8" + "reference": "a563c5aeacb98cd46f9885a63cf241ea7794b307" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8", - "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a563c5aeacb98cd46f9885a63cf241ea7794b307", + "reference": "a563c5aeacb98cd46f9885a63cf241ea7794b307", "shasum": "" }, "require": { @@ -7102,7 +7172,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.8" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.11" }, "funding": [ { @@ -7118,7 +7188,7 @@ "type": "tidelift" } ], - "time": "2024-11-08T15:46:42+00:00" + "time": "2025-01-17T11:38:41+00:00" }, { "name": "symfony/var-exporter", @@ -7281,16 +7351,16 @@ }, { "name": "symfony/yaml", - "version": "v7.1.6", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" + "reference": "4921b8c1db90c13ba2ee0520080ef6800912b018" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", - "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4921b8c1db90c13ba2ee0520080ef6800912b018", + "reference": "4921b8c1db90c13ba2ee0520080ef6800912b018", "shasum": "" }, "require": { @@ -7332,7 +7402,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.6" + "source": "https://github.com/symfony/yaml/tree/v7.1.11" }, "funding": [ { @@ -7348,24 +7418,24 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-01-07T12:50:05+00:00" }, { "name": "twig/extra-bundle", - "version": "v3.17.0", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "9746573ca4bc1cd03a767a183faadaf84e0c31fa" + "reference": "9df5e1dbb6a68c0665ae5603f6f2c20815647876" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/9746573ca4bc1cd03a767a183faadaf84e0c31fa", - "reference": "9746573ca4bc1cd03a767a183faadaf84e0c31fa", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/9df5e1dbb6a68c0665ae5603f6f2c20815647876", + "reference": "9df5e1dbb6a68c0665ae5603f6f2c20815647876", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1.0", "symfony/framework-bundle": "^5.4|^6.4|^7.0", "symfony/twig-bundle": "^5.4|^6.4|^7.0", "twig/twig": "^3.2|^4.0" @@ -7410,7 +7480,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.17.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.20.0" }, "funding": [ { @@ -7422,28 +7492,27 @@ "type": "tidelift" } ], - "time": "2024-09-26T19:22:23+00:00" + "time": "2025-02-08T09:47:15+00:00" }, { "name": "twig/twig", - "version": "v3.17.1", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "677ef8da6497a03048192aeeb5aa3018e379ac71" + "reference": "3468920399451a384bef53cf7996965f7cd40183" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/677ef8da6497a03048192aeeb5aa3018e379ac71", - "reference": "677ef8da6497a03048192aeeb5aa3018e379ac71", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/3468920399451a384bef53cf7996965f7cd40183", + "reference": "3468920399451a384bef53cf7996965f7cd40183", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php81": "^1.29" + "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { "phpstan/phpstan": "^2.0", @@ -7490,7 +7559,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.17.1" + "source": "https://github.com/twigphp/Twig/tree/v3.20.0" }, "funding": [ { @@ -7502,7 +7571,7 @@ "type": "tidelift" } ], - "time": "2024-12-12T09:58:10+00:00" + "time": "2025-02-13T08:34:43+00:00" }, { "name": "webmozart/assert", @@ -7633,16 +7702,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.12.1", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + "reference": "024473a478be9df5fdaca2c793f2232fe788e414" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414", "shasum": "" }, "require": { @@ -7681,7 +7750,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" }, "funding": [ { @@ -7689,20 +7758,20 @@ "type": "tidelift" } ], - "time": "2024-11-08T17:47:46+00:00" + "time": "2025-02-12T12:17:51+00:00" }, { "name": "nikic/php-parser", - "version": "v5.3.1", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", - "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", "shasum": "" }, "require": { @@ -7745,9 +7814,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" }, - "time": "2024-10-08T18:51:32+00:00" + "time": "2024-12-30T11:07:19+00:00" }, { "name": "phar-io/manifest", @@ -9461,16 +9530,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "fd006641cf28ab702684b8cb0645bea95bc1691a" + "reference": "7361d8f7e7eecbca17efe68ca1ee677bf23cfe5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/fd006641cf28ab702684b8cb0645bea95bc1691a", - "reference": "fd006641cf28ab702684b8cb0645bea95bc1691a", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7361d8f7e7eecbca17efe68ca1ee677bf23cfe5a", + "reference": "7361d8f7e7eecbca17efe68ca1ee677bf23cfe5a", "shasum": "" }, "require": { @@ -9508,7 +9577,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.1.9" + "source": "https://github.com/symfony/dom-crawler/tree/v7.1.11" }, "funding": [ { @@ -9524,20 +9593,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T15:09:09+00:00" + "time": "2025-01-27T10:57:12+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.61.0", + "version": "v1.62.1", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18" + "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a3b7f14d349f8f44ed752d4dde2263f77510cc18", - "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/468ff2708200c95ebc0d85d3174b6c6711b8a590", + "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590", "shasum": "" }, "require": { @@ -9600,7 +9669,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.61.0" + "source": "https://github.com/symfony/maker-bundle/tree/v1.62.1" }, "funding": [ { @@ -9616,7 +9685,7 @@ "type": "tidelift" } ], - "time": "2024-08-29T22:50:23+00:00" + "time": "2025-01-15T00:21:40+00:00" }, { "name": "symfony/phpunit-bridge", @@ -9702,16 +9771,16 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v7.1.9", + "version": "v7.1.11", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "6f26474e0e8ff746cb0abaddf9ebe0b067172fb1" + "reference": "328b2728bb5d85d0d38b18d1458834098202afe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6f26474e0e8ff746cb0abaddf9ebe0b067172fb1", - "reference": "6f26474e0e8ff746cb0abaddf9ebe0b067172fb1", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/328b2728bb5d85d0d38b18d1458834098202afe2", + "reference": "328b2728bb5d85d0d38b18d1458834098202afe2", "shasum": "" }, "require": { @@ -9763,7 +9832,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.1.9" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.1.11" }, "funding": [ { @@ -9779,7 +9848,7 @@ "type": "tidelift" } ], - "time": "2024-11-19T10:11:44+00:00" + "time": "2025-01-07T09:23:14+00:00" }, { "name": "theseer/tokenizer", From 57a8eba23843c256f3e91cd714b2ea148df03e70 Mon Sep 17 00:00:00 2001 From: bourgoino Date: Tue, 8 Apr 2025 08:11:56 +0200 Subject: [PATCH 69/71] =?UTF-8?q?S=C3=A9lection=20de=20comp=C3=A9tences.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/InternController.php | 48 +++++++++++++ src/Controller/ProfileController.php | 13 ++++ templates/degree/index.html.twig | 24 +++---- templates/intern/index.html.twig | 14 ++++ templates/profile/intern.html.twig | 7 +- templates/skill/index.html.twig | 101 ++++++++++++++++----------- 6 files changed, 153 insertions(+), 54 deletions(-) diff --git a/src/Controller/InternController.php b/src/Controller/InternController.php index 0ada2cc..c8f0cb6 100644 --- a/src/Controller/InternController.php +++ b/src/Controller/InternController.php @@ -5,6 +5,8 @@ namespace App\Controller; use App\Entity\Degree; use App\Entity\Intern; use App\Entity\InternDegree; +use App\Entity\InternSkill; +use App\Entity\Skill; use App\Form\InternType; use App\Repository\InternRepository; use Doctrine\ORM\EntityManagerInterface; @@ -108,4 +110,50 @@ final class InternController extends AbstractController return $this->redirectToRoute('app_profile'); } + + #[Route('/skills/add', name:'app_intern_add_skills', methods:['POST'])] + public function addSkills(Request $request, EntityManagerInterface $entityManager): Response + { + $intern = $this->getUser(); + + if (!$intern instanceof Intern) { + throw $this->createAccessDeniedException("Seuls les stagiaires peuvent sélectionner des compétences."); + } + + $selectedSkillIds = $request->request->all('selected_skills'); + + if ($selectedSkillIds == []) { + $this->addFlash('error', "Aucune sélection valide n'a été effectuée."); + return $this->redirectToRoute('app_skill_index'); + } + + $skillRepository = $entityManager->getRepository(Skill::class); + $internSkillRepository = $entityManager->getRepository(InternSkill::class); + + foreach ($selectedSkillIds as $skillId) { + $skill = $skillRepository->find($skillId); + + if (!$skill) continue; + + $existingInternSkill = $internSkillRepository->findOneBy([ + 'intern' => $intern, + 'skill' => $skill + ]); + + if (!$existingInternSkill) { + $internSkill = new InternSkill(); + $internSkill->setIntern($intern); + $internSkill->setSkill($skill); + + $entityManager->persist($internSkill); + } + } + + $entityManager->flush(); + + $this->addFlash('success', 'Les compétences ont été ajoutées avec succès.'); + + return $this->redirectToRoute('app_profile'); + } + } diff --git a/src/Controller/ProfileController.php b/src/Controller/ProfileController.php index d25e351..7f84be2 100644 --- a/src/Controller/ProfileController.php +++ b/src/Controller/ProfileController.php @@ -4,6 +4,7 @@ namespace App\Controller; use App\Entity\UserApp; use App\Form\UserAppType; +use App\Repository\SkillRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; @@ -51,4 +52,16 @@ class ProfileController extends AbstractController 'user_app' => $userApp, ]); } + + #[Route('/profile/pickSkill', name: 'app_profile_pickSkill', methods: ['GET'])] + public function pickSkill(UserApp $userApp): Response + { + + return $this->render('skill/index.html.twig', [ + 'user_app' => $userApp, + ]); + } + + + } \ No newline at end of file diff --git a/templates/degree/index.html.twig b/templates/degree/index.html.twig index a6016d5..906f149 100644 --- a/templates/degree/index.html.twig +++ b/templates/degree/index.html.twig @@ -34,19 +34,19 @@ {% endif %} {% if 'ROLE_ADMIN' in app.user.roles %} - - - Modifier - + + + Modifier + - -
- - - -
+ +
+ + + +
{% endif %} diff --git a/templates/intern/index.html.twig b/templates/intern/index.html.twig index 02c128a..29708b1 100644 --- a/templates/intern/index.html.twig +++ b/templates/intern/index.html.twig @@ -48,4 +48,18 @@ {% endfor %} +

Vos compétences :

+
    + {% if app.user.skills|length > 0 %} + {% for internSkill in app.user.skills %} +
  • {{ internSkill.skill.label }}
  • + {% endfor %} + {% else %} +
  • Aucune compétence sélectionnée
  • + {% endif %} +
+ + Sélectionner vos compétences + {% endblock %} diff --git a/templates/profile/intern.html.twig b/templates/profile/intern.html.twig index d74a3ff..21b4313 100644 --- a/templates/profile/intern.html.twig +++ b/templates/profile/intern.html.twig @@ -27,8 +27,8 @@

Vos compétences :

    {% if app.user.skills|length > 0 %} - {% for comp in app.user.skills %} -
  • {{ comp.label }}
  • + {% for internSkill in app.user.skills %} +
  • {{ internSkill.skill.label }}
  • {% endfor %} {% else %}
    @@ -37,9 +37,10 @@

Selectionner vos compétences + href="{{ path('app_skill_index',{id: app.user.id}) }}"> Sélectionner vos compétences + {% endblock %} From 806044e990d04296e4aa57fa95881833652248c6 Mon Sep 17 00:00:00 2001 From: bourgoino Date: Tue, 8 Apr 2025 08:41:10 +0200 Subject: [PATCH 70/71] =?UTF-8?q?S=C3=A9lection=20de=20comp=C3=A9tences.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/AnnouncementController.php | 12 +++- src/Entity/Favoris.php | 29 ++++++++- templates/announcement/index.html.twig | 77 +++++++++-------------- templates/announcement/show.html.twig | 29 +++------ 4 files changed, 76 insertions(+), 71 deletions(-) diff --git a/src/Controller/AnnouncementController.php b/src/Controller/AnnouncementController.php index 699d90b..707e1fc 100644 --- a/src/Controller/AnnouncementController.php +++ b/src/Controller/AnnouncementController.php @@ -20,7 +20,6 @@ final class AnnouncementController extends AbstractController $user = $this->getUser(); $announcements = []; - // Récupérer les paramètres de recherche $companyName = $request->query->get('company_name'); $location = $request->query->get('location'); $category = $request->query->get('category'); @@ -47,18 +46,27 @@ final class AnnouncementController extends AbstractController $announcements = $announcementRepository->findBy(['status' => 'Verified']); } - // Filtrer les annonces en fonction des critères de recherche if ($companyName || $location || $category) { $announcements = $announcementRepository->searchAnnouncements($companyName, $location, $category); } + $favorites = []; + if (in_array('ROLE_INTERN', $user->getRoles())) { + $favorites = array_map( + fn($f) => $f->getAnnouncement()->getId(), + $user->getFavorites()->toArray() + ); + } + return $this->render('announcement/index.html.twig', [ 'announcements' => $announcements, + 'favorites' => $favorites, 'showNonValidated' => $request->query->get('show_non_validated', false), ]); } + #[Route('/new', name: 'app_announcement_new', methods: ['GET', 'POST'])] public function new(Request $request, EntityManagerInterface $entityManager): Response { diff --git a/src/Entity/Favoris.php b/src/Entity/Favoris.php index 26f1023..be05f56 100644 --- a/src/Entity/Favoris.php +++ b/src/Entity/Favoris.php @@ -2,6 +2,8 @@ namespace App\Entity; +use App\Entity\UserApp; +use App\Entity\Announcement; use App\Repository\FavorisRepository; use Doctrine\ORM\Mapping as ORM; @@ -13,15 +15,38 @@ class Favoris #[ORM\Column] private ?int $id = null; + #[ORM\ManyToOne(inversedBy: 'favoris')] + #[ORM\JoinColumn(nullable: false)] + private ?UserApp $user = null; + + #[ORM\ManyToOne(inversedBy: 'favoris')] + #[ORM\JoinColumn(nullable: false)] + private ?Announcement $announcement = null; + public function getId(): ?int { return $this->id; } - public function setId(int $id): static + public function getUser(): ?UserApp { - $this->id = $id; + return $this->user; + } + public function setUser(?UserApp $user): static + { + $this->user = $user; + return $this; + } + + public function getAnnouncement(): ?Announcement + { + return $this->announcement; + } + + public function setAnnouncement(?Announcement $announcement): static + { + $this->announcement = $announcement; return $this; } } diff --git a/templates/announcement/index.html.twig b/templates/announcement/index.html.twig index 0920dd6..debc235 100644 --- a/templates/announcement/index.html.twig +++ b/templates/announcement/index.html.twig @@ -7,84 +7,66 @@

Liste des Annonces

{% if 'ROLE_ADMIN' in app.user.roles %} - -
- - -
+
+ + +
{% endif %} {% if 'ROLE_EMPLOYEE' in app.user.roles %} - - + {% endif %} -
- - - + + +
{% for announcement in announcements %}
- -
+
{% if announcement.status == 'notVerified' %} Non validée {% else %} Validée {% endif %} + +
+ +
-

{{ announcement.title }}

- -

{{ announcement.company.name }}

-
- - Date du stage : {{ announcement.date }} + Date du stage : {{ announcement.date }}
- -
- - {{ announcement.company.address }} + {{ announcement.company.address }}
- - + Détails
@@ -94,4 +76,3 @@
{% endblock %} - diff --git a/templates/announcement/show.html.twig b/templates/announcement/show.html.twig index 09e50e1..c9e39e5 100644 --- a/templates/announcement/show.html.twig +++ b/templates/announcement/show.html.twig @@ -52,25 +52,16 @@ {{ announcement.creationDate | date('d/m/Y') }} - {% if 'ROLE_ADMIN' in app.user.roles %} - - -
- - Modifier l'annonce - - - {% if announcement.status == 'notVerified' %} -
- -
- {% endif %} -
- - {% endif %} + +
+ +
From 643d5d451a107a142135e4c8951069f29c3cfc16 Mon Sep 17 00:00:00 2001 From: bourgoino Date: Tue, 8 Apr 2025 08:41:54 +0200 Subject: [PATCH 71/71] =?UTF-8?q?S=C3=A9lection=20de=20comp=C3=A9tences.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/InternFavoriteController.php | 136 ++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 src/Controller/InternFavoriteController.php diff --git a/src/Controller/InternFavoriteController.php b/src/Controller/InternFavoriteController.php new file mode 100644 index 0000000..1a04b22 --- /dev/null +++ b/src/Controller/InternFavoriteController.php @@ -0,0 +1,136 @@ +getUser()->getIntern(); + + $existing = $repo->findOneBy([ + 'intern' => $intern, + 'announcement' => $announcement + ]); + + if ($existing) { + $em->remove($existing); + } else { + $favorite = new InternFavorite(); + $favorite->setIntern($intern); + $favorite->setAnnouncement($announcement); + $em->persist($favorite); + } + + $em->flush(); + + return $this->redirectToRoute('app_announcement_index'); + } + + #[Route('/announcement/{id}/favorite/toggle', name: 'app_favorite_toggle', methods: ['POST'])] + public function toggle(Announcement $announcement, EntityManagerInterface $em, Security $security): RedirectResponse + { + $user = $security->getUser(); + + if (!$user instanceof Intern) { + throw new AccessDeniedHttpException('Seuls les stagiaires peuvent ajouter aux favoris.'); + } + + $favorite = $em->getRepository(InternFavorite::class)->findOneBy([ + 'intern' => $user, + 'announcement' => $announcement + ]); + + if ($favorite) { + $em->remove($favorite); + } else { + $favorite = new InternFavorite(); + $favorite->setIntern($user); + $favorite->setAnnouncement($announcement); + $em->persist($favorite); + } + + $em->flush(); + + return new RedirectResponse($_SERVER['HTTP_REFERER'] ?? '/'); + } + + #[Route('/announcement/{id}', name: 'app_announcement_show')] + public function show(Announcement $announcement, InternFavoriteRepository $internFavoriteRepository): Response + { + $user = $this->getUser(); + $isFavorite = false; + + if (in_array('ROLE_INTERN', $user->getRoles())) { + $favorite = $internFavoriteRepository->findOneBy([ + 'announcement' => $announcement, + 'intern' => $user, + ]); + + $isFavorite = $favorite ? true : false; + } + + return $this->render('announcement/show.html.twig', [ + 'announcement' => $announcement, + 'isFavorite' => $isFavorite, + ]); + } + + #[Route('/favorite/add/{id}', name: 'app_favorite_add')] + public function addFavorite(Announcement $announcement, EntityManagerInterface $entityManager): Response + { + $user = $this->getUser(); + + // Vérifier si l'intern a déjà ce favori + $existingFavorite = $entityManager->getRepository(InternFavorite::class)->findOneBy([ + 'announcement' => $announcement, + 'intern' => $user, + ]); + + if (!$existingFavorite) { + $favorite = new InternFavorite(); + $favorite->setAnnouncement($announcement); + $favorite->setIntern($user); + + $entityManager->persist($favorite); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_announcement_show', ['id' => $announcement->getId()]); + } + + #[Route('/favorite/remove/{id}', name: 'app_favorite_remove')] + public function removeFavorite(Announcement $announcement, EntityManagerInterface $entityManager): Response + { + $user = $this->getUser(); + + $favorite = $entityManager->getRepository(InternFavorite::class)->findOneBy([ + 'announcement' => $announcement, + 'intern' => $user, + ]); + + if ($favorite) { + $entityManager->remove($favorite); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_announcement_show', ['id' => $announcement->getId()]); + } +}